配置nginx使期支持PHP
作者:lyglpp | 来源:互联网 | 2014-05-28 09:40
安装Nginx及php在这里就不多说了,毕竟网上教程已经很全面了。无论是rpm、apt-get还是下载源码安装只要按照步骤走就可以了,(PHP我是使用dpkg?Pphp5-cgi然后再apt-getinstallphp5-cgi进行安装的,平台是Ubuntu)这里要说一下的是php支持模式,这部分
安装
Nginx及
php在这里就不多说了,毕竟网上教程已经很全面了。无论是rpm、apt-get还是下载源码安装只要按照步骤走就可以了,(PHP我是使用dpkg
?P php5-cgi然后再apt-get install php5-cgi进行安装的,平台是
Ubuntu)这里要说一下的是php支持模式,这部分为转帖
1) 目前各种服务器HTTP Server对PHP的支持一共有三种:
a.通过HTTPServer内置的模块来实现,
例如Apache的mod_php5,类似的Apache内置的mod_perl可以对perl支持;
b.通过CGI来实现,这个就好比之前perl的CGI,该种方式的缺点是性能差,因为每次服务器遇到这些脚本都需要重新启动脚本解析器来执行脚本然后将结果返回给服务器;另一方面就是不太安全;该方面几乎很少使用了。
c.最新出现一种叫做FastCGI。所谓FastCGI就是对CGI的改进。它一般采用C/S结构,一般脚本处理器会启动一个或者多个daemon进程,每次HTTPServer遇到脚本的时候,直接交付给FastCGI的进程来执行,然后将得到的结果(通常为html)返回给浏览器。
>该种方法的问题存在一个小问题是当遇到大流量的频繁请求的话,脚本处理器的daemon进程可能会超负荷从而变得很慢,甚至发生内存泄漏;
>但是比较起Apache的内置模块的方式的优点是由于Server和脚本解析器完全分开各负其责,因此服务器不再臃肿,可以专心地进行静态文件响应或者将动态脚本解析器的结果返回给用户客户端。所以比较起Apache的内置模块方式,有时候性能要提高很多。有人测试可能会达到
Apache+mod_php的5~10倍。
2)使用FastCGI方式现在常见的有两种stack:ligthttpd+spawn-fcgi; 另外一种是nginx+PHP-FPM(也可以用spawn-fcgi) 。
a.如上面所说该两种结构都采用FastCGI对PHP支持,因此HTTPServer完全解放出来,可以更好地进行响应和并发处理。因此lighttpd和nginx都有small,
but powerful和efficient的美誉。
b.
该两者还可以分出一个好坏来,spawn-fcgi由于是lighttpd的一部分,因此安装了lighttpd一般就会使用spawn-fcgi对
php支持,但是目前有用户说ligttpd的spwan-fcgi在高并发访问的时候,会出现上面说的内存泄漏甚至自动重启fastcgi。即:PHP
脚本处理器当机,这个时候如果用户访问的话,可能就会出现白页(即PHP不能被解析或者出错)。
另一个:首先nginx不像lighttpd本身含带了fastcgi(spawn-fcgi),因此它完全是轻量级的,必须借助第三方的FastCGI
处理器才可以对PHP进行解析,因此其实这样看来nginx是非常灵活的,它可以和任何第三方提供解析的处理器实现连接从而实现对PHP的解析(在
nginx.conf中很容易设置)。
nginx可以使用spwan-fcgi(需要一同安装lighttpd,但是需要为nginx避开端口,一些较早的blog有这方面安装的教程),但是由于spawn-fcgi具有上面所述的用户逐渐发现的缺陷,现在慢慢减少使用nginx+spawn-fcgi组合了。
c. 由于spawn-fcgi的缺陷,现在出现了新的第三方(目前还是,听说正在努力不久将来加入到PHP
core中)的PHP的FastCGI处理器,叫做PHP-FPM(具体可以google)。它和spawn-fcgi比较起来有如下优点:
由于它是作为PHP的patch补丁来开发的,安装的时候需要和php源码一起编译,也就是说编译到php
core中了,因此在性能方面要优秀一些;
同时它在处理高并发方面也优于spawn-fcgi,至少不会自动重启fastcgi处理器。具体采用的算法和设计可以google了解。
因此,如上所说由于nginx的轻量和灵活性,因此目前性能优越,越来越多人逐渐使用这个组合:nginx+PHP/PHP-FPM 。
3)因此总结:
目前在HTTPServer这块基本可以看到有三种stack比较流行:
>Apache+mod_php5
>lighttp+spawn-fcgi
>nginx+PHP-FPM
好了,以上为转帖部分,下面回归正题,这里主要介绍lighttp+spawn-fcgi来控制php。而php-fpm的安装主要是在配置php时加上参数--enable-fpm就ok了,当然是用源码包也可以,但我没有安装成功~Nginx、PHP及Lighttpd的安装这里就不多说了,下面还是说一下设置Nginx可以解析PHP的问题。这个问题困扰了我N天之久,通过坚持不懈的实验及搜索,总结如下:
Nginx目录结构如下:
/usr/local/nginx/conf 配置目录
/usr/local/nginx/html 默认的网站根目录
/usr/local/nginx/logs 日志和pid文件目录
/usr/local/nginx/sbin 执行文件目录
/etc/nginx也有配置文件,但是基本不用修改,我开始查网上去修改那些文件后测试一点用也没有。。
在介绍nginx配置文件之前还要注意安装好PHP后修改一些文件:
/usr/local/nginx/conf #vi fastcgi_params
#fastcgi_params
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with
--enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
还需要在PHP-CGI的配置文件(Ubuntu
上此配置文件位于/etc/php5/cgi/php.ini)中,打开cgi.fix_pathinfo选项:
设置 cgi.fix_pathinfo=1;
这样php-cgi方能正常使用SCRIPT_FILENAME这个变量。
接下来看nginx的配置,使PHP利用FastCGI进程执行
主要就是修改/usr/local/nginx/conf/nginx.conf,下面预设就有一个nginx.conf.default,将它cp为nginx.conf之后修改里面的配置,下面是个实例:
#user nobody;
worker_processes 8;
error_log logs/error.log;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr
- $remote_user [$time_local] "$request" '
'$status
$request_time $body_bytes_sent "$http_referer" '
'"$http_user_agent"
"$http_x_forwarded_for" "$upstream_addr"';
sendfile on;
keepalive_timeout 65;
gzip on;
server
{ #这是重点,开始配置虚拟主机
listen 8080;