Apache确实很好很强大,可是配置起来也很困难。默认加载的东西太多,又拿捏不准那些可以删除。最近从周围的VPS兄弟们口中听到的都是nginx,考虑到apache那吓人的RAM和我那更吓人的RAM配置。我决定尝试一下——nginx+PHP(php-cgi)+MySQL。

其实在这个组合里,nginx只是取代了LAMP组合中的Apache。PHP还是PHP,不同的是原来PHP是由Apache以模块的方式加载的,现在则是由php自带的php-cgi模块运行起来并监听某端口。nginx自己处理静态的数据,php脚本则通过这个监听端口传递给php-cgi去处理。MySQL呢还是MySQL,仍然是由PHP通过库的方式调用。

这套组合安装很简单:

配置很简单,但是细节很重要。PHP的配置不用说,和Apache的没两样。MySQL也是一样。需要做的主要有

  • 配置nginx

  • 配置并启动php-cgi

配置nginx:

  • 打开/etc/nginx/conf/nginx.conf;(话说nginx真是瞄准了apache啊,配置目录结构都一样)

  • 修改位于Server段里的location段里的root参数,这个是默认服务器文档目录

  • 取消掉location ~ .php$段的注释;修改里面的fastcgi_param SCRIPT_FILENAME为/path/to/your/httpd/root/$fastcgi_script_name。这里尤其注意,因为默认配置里没有全路径,搞得php-cgi没有得到正确的路径

启动php-cgi:

直接采用php-cgi -b 9000启动即可,请在启动前导出环境变量PHP_FCGI_CHILDREN,取值为php-cgi可以fork的子进程,详情参考文末的UPDATE。默认情况下php-cgi是交互模式的(真变态),你可能需要加上美丽的&使之退到后台去。这里采用的监听9000端口是nginx的默认配置,因为前面没有修改,所以这里也没有修改。

当然,如果你和我一样,觉得这种启动php-cgi的方式不优雅,可以以daemon服务的方式启动他。当然很多发行版上是没有这个daemon的脚本的,这里我写了一个,可供大家参考(适用于ArchLinux这类采用BSD风格sysinit的发行版,SysV风格的需要调整部分文件路径):

UPDATE:

如果你发现php-cgi的进程莫名其妙的自己就退出了,那么可能是因为php-cgi执行的脚本请求超过其处理能力导致的。解决方法就是让php-cgi自己fork几个子进程出来处理之。很抱歉的告诉你,php-cgi没有这样的参数,而是通过环境变量PHP_FCGI_CHILDREN来指定可以fork的子进程数量。这个时候php-cgi执行后会生成一个父进程,这个进程用于管理子进程,本身不处理PHP脚本。PHP脚本会被这个父进程分发给各个子进程处理。