无论是个人还是小型企业在配置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
◇ 必要组件下载
php5
◇ 安装
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()验证效果即可。