nginx

无论是个人还是小型企业在配置php开发环境时会选择LAMP,其中A即apache服务器组件。不过近来通过阅读几篇apache与nginx比较文章,发现nginx同样适合php开发,并且某些方面超越apache,尤其是服务器负载严重时。今天第一次折腾nginx,发现有些基本的配置还是有必要记录下来。

本文包含以下内容:

  • 第一页:Windows下php与nginx的安装、php的配置

  • 第二页:Windows下nginx的配置

  • 第三页:Windows下nginx与php的运行

  • 第四页:Linux下nginx与php的安装与配置

  • 第五页:Linux下用spawn-fcgi运行php-cgi

  • 第六页:Linux下用php-fpm运行php-cgi

I. Windows side

参考原文:《windows nginx php配置》From 小小子

◇ 环境介绍

笔者的系统环境如下

  • OS: Windows Server 2008 R2 DataCenter Edition
◇ 必要组件下载
◇ 安装

Windows下的nginx不以服务形式运行,只需将压缩包解压至任意目录即可。这里举例为

<code class="plain">D:\Program Files (x86)\</code>

选择的php5也以压缩包方式,解压至

<code class="plain">D:\Program Files (x86)\php5</code>

如果此时双击nginx.exe运行,用浏览器打开localhost访问的话,能看到下面的效果。

配置成功

◇ 配置php

由于之前只介绍了linux下php的安装,这里首先来对php进行配置;而对于apache2下以模块加载php的方式运行则与linux类似,这里不再赘述,仅对fast-cgi说明。

笔者以前文提到的路径作为php运行路径,扩展路径采用默认php5文件夹下ext目录为例。

在环境变量(如何寻找?)中添加php和扩展的路径,这里举例为

<code class="plain">D:\Program Files (x86)\php5</code>

<code class="plain">D:\Program Files (x86)\php5\ext</code>

添加举例如下,前后顺序没影响,注意用分号“;”隔开其他路径,更改后需要重启生效。

<code class="plain">OTHER_PATH;D:\Program Files (x86)\php5;D:\Program Files (x86)\php5\ext</code>

首先复制php.ini-recommanded为php.ini进行编辑。

设置时均把原先注释“#”去掉,找到extension_dir,设置为

<code class="plain">
extension_dir = ext
</code>

Windows下的php在运行时,强调时区设置,找到date.timezone,设置为UTC+8

<code class="plain">
date.timezone = Asia/Shanghai
</code>

更多时区支持,访问这个官方页面查找。

以cgi方式运行php,还需要设置以下几项:

<code class="plain">
enable_dl = On
cgi.force_redirect = 0
cgi.fix_pathinfo=1
fastcgi.impersonate = 1
cgi.rfc2616_headers = 1 
</code>

找到环境变量设置:右键计算机(XP为我的电脑)->属性->左侧高级设置(XP没有此步)->高级设置->环境变量->系统环境变量->找到PATH

◇ 配置nginx

找到nginx下conf目录内的nginx.conf文件,打开编辑,同样去掉设置项前面的注释“#”,同时注意每项后面的分号“;”。

设置监听端口,没安装其他服务的话,默认80即可:

<code class="plain">listen 80;</code>

设置服务器名字,本地调试用保持默认localhost即可:

<code class="plain">server_name localhost;</code>

打开错误日志文件:

<code class="plain">error_log logs/error.log;</code>

更改线程数,开发调试设置小一点即可:

<code class="plain">worker_connections 16;</code>

设置默认字符集:

<code class="plain">charset utf-8;</code>

找到location内的root,这是虚拟目录的根目录,举例这里为D:\wordspace\www;这里注意路径分割符使用URL的斜杠“/”,如果路径带有空格等特殊字符,需要加上引号:

<code class="plain">root D:/wordspace/www</code>

注意:笔者这里遇到个问题,location后的“/”表示当前nginx所在目录,将root写在里面会造成根目录必须设置在其中。解决方法是将原来的root注释掉或者删除。在location外面加上需要的路径即可:

<code class="plain">root YOUR_PATH;</code>

找到”location ~ .php$“,去掉注释:

<code class="plain">
location ~ \.php${
    root    html;
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_index   index.php
    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    include fastcgi_params;
}
</code>

如果这里将fast-cgi的处理路径设置为”D:/wordspace/www”为例,将上面这段改成:

<code class="plain">
location ~ \.php${
    root    D:/wordspace/www;
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_index   index.php
    fastcgi_param  SCRIPT_FILENAME  scripts$fastcgi_script_name;
    include fastcgi_params;
}
</code>
◇ 运行

nginx的运行直接双击nginx.exe即可。

然而在cmd下运行php-cgi.exe会留有一个窗口,老外提供的解决办法是使用RunHiddenConsole.exe

分别创建两个批处理文件来负责”开启php”和”关闭php/nginx”,注意功能是引号内说明。

start_php.bat内容如下,注意替换自己的路径:

<code class="plain">
@echo off
echo Starting PHP FastCGI...
RunHiddenConsole.exe D:\Program Files (x86)\php5 -b 127.0.0.1:9000 -c D:\Program Files (x86)\php5\php.ini
</code>

stop_nginx_php.bat:

<code class="plain">
@echo off
echo Stopping nginx...
taskkill /F /IM nginx.exe > nul
echo Stopping PHP FastCGI...
taskkill /F /IM php-cgi.exe > nul
exit
</code>

以后只需要双击这两个文件即可,开机启动只需要创建快捷方式或直接拖进startup文件夹即可。

最后在虚拟主机目录下用phpinfo()来验证一下是否正常运行。没问题的话可以看到如下的效果。

配置成功

II. Linux side

笔者的系统环境如下

  • OS: Ubuntu 10.10 x64
◇ 必要组件下载
  • php5-cgi

  • spawn-fcgi(用以cgi模式运行php的组件)

  • php5-fpm(同上,配置更简洁,推荐)

  • nginx

◇ 安装

以下内容,主要参考这篇位于ubuntu中文维基上的文章;这里只介绍必要的安装,其他组件可以选择安装。

题外话:最后那个屏蔽渣雷的user-agent看得某乐了……XD

如果想从源码编译,可以参考这篇文章:Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)

从源安装,这里注意nginx并不是撰文时最新版本,需要最新版的同学还是去官方网站下载吧。

<code class="bash">sudo apt-get install php5-cgi spawn-fcgi php5-fpm nginx</code>
◇ 配置

linux下的nginx配置与apache一样,服务器设置与虚拟主机是分开的。

nginx的设置文件位于:

<code class="bash">/etc/nginx/nginx.conf</code>

其下的虚拟主机配置位于:

<code class="bash">/etc/nginx/sites-available</code>

默认安装好服务器不需要更改。而直接编辑下面的:

<code class="bash">sites-available/default</code>

找到:

<code class="plain">
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
</code>

将前面的注释“#”去掉,注意”/var/www/nginx-default”为虚拟主机的根目录。如笔者设置为/var/www,则将其改为/var/www。

◇ 运行

启动nginx:

<code class="bash">sudo /etc/init.d/nginx start</code>

启动spawn-fcgi:

<code class="bash">spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-user -f /usr/bin/php-cgi</code>
  • -a address 地址

  • -p port 端口

  • -C Children 子进程数 调试时不需要太多

  • -u user 执行用户

  • -f filename 文件名

建立启动脚本,以下摘自那篇维基:

为了让php-cgi开机自启动:

<code class="bash">
cd /etc/init.d
cp nginx php-cgi
vim php-cgi
</code>

替换nginx为php-cgi

并修改相应部分为: > >

<code class="bash">DAEMON=/usr/bin/spawn-fcgi
DAEMON_OPTS="-a 127.0.0.1 -p 9000 -C 10 -u www-data -f /usr/bin/php-cgi"
...
stop)
echo -n "Stopping $DESC: "
pkill -9 php-cgi
echo "$NAME."
</code>

然后运行rcconf设置php-cgi为开机自启动

但是在某这边尝试后无法开机启动,应该是脚本问题,解决方法,可以参考这位朋友重新写的脚本当然,最终某还是没搞定……orz

另外一个解决办法是,采用php-fpm,翻到下一页继续介绍。

利用php-fpm来运行php-cgi,优点是配置方便,和php类似。安装:

<code class="bash">sudo apt-get install php5-fpm</code>

运行:

<code class="bash">sudo /etc/init.d/php5-fpm start</code>

可以看到这里已经有启动脚本。需要注意的是,此时加载的php设置位于

<code class="bash">/etc/php5/fpm/php.ini</code>

配置完成后用phpinfo()验证效果即可。

配置成功