Nginx系列2之Nginx+php
preface
公司所有的大多数业务都泡在LNMP平台上,所以对PHP+Nginx有点了解,那么就做个小小的总结吧。
what's FastCGi
FastCGI是一个可伸缩,高速的在HTTP server和动态脚本语言间通信的接口。FastCGI支持多种脚本语言和HTTP server。
FCGI是由CGI发展改进而来的。传统的CGI接口方式的性能很差。每次HTTP服务器遇到动态程序时都需要重新启动脚本解释器来执行解析,然后将结果返回给HTTP服务器,这在处理高并发访问时几乎是不可用的。另外传统的CGI接口方式安全性也很差,现在很少使用了。
FCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解释器分开,同时在脚本解释器上启动一个或者多个脚本解释器守护进程。当HTTP服务器遇到动态程序时,可以将其直接交付给FCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一的处理静态请求或者动态脚本的结果返回给客户端,这就很大程度上提高了响应速度。
Nginx + FCGI运行原理
Nginx 不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FCGI接口来调用。FCGI接口在linux是socket(这个socket是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FCGI的wrapper(wrapper可以理解为启动另一个程序的程序)。这个wrapper绑定在某个固定的socket上,如端口或者文件的socket,当Nginx将cgi请求发送给这个socket的时候,通过FCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取数据,接着,wrapper将返回的数据通过FCGi接口,沿着固定的socket传给Nginx,最终,NGinx将返回的数据发送给客户端,这就是Nginx+FCGi的运行流程。如图所示:
spawn-fcgi 和 php-fpm
FCGI接口方式在脚本解析服务器上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是FastCGI进程管理器,或者称为fastCgi引擎,spawn-fcgi 和 PHP-FPM就是支持php的两个Fcgi进程管理器。
span-fcgi是HTTP服务器lighttpd的一部分,目前是独立的一个项目,一般与lighttpd配合使用来支持PHP,但是lighttpd的spwan-fcgi在高并发访问的时候,会出现内存泄漏甚至自动重启FastCGI的问题
Nginx是个轻量级的HTTPserver,必须借助第三方的FCGI处理器才可以对PHP进行解析。
PHP-FPM是一个第三方的FCGI进程管理器,它是PHP的一个补丁来开发的,在安装的时候也需要和PHP源码一起编译,也就是说PHP-FPM被编译到PHP内核中,因此处理性能方面更加优秀,同事PHP-FPM在处理高并发方面也比spawn-fcgi引擎好很多,所以推荐NGINX+PHP-FPM组合。
FCGI的主要优点是把动态语言和HTTP server分离开来,所以Nginx 与 php、php-fpm经常被部署在不同的服务器上,以分担前端Nginx的服务器压力,让nginx 专一处理静态请求和转发动态请求。而PHP、PHP-fpm服务器专一解析PHP动态请求。
那么就部署它们吧
php下载地址: http://php.net
php-fpm下载地址:http://php-fpm.org/downloads/
我这里下载的php是php-5.5.38
安装之前,把依赖包都安装好,采用yum安装 :
yum -y install gcc gcc++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc-devel glib2 glib2-devel
安装好依赖包后,安装php
./configure --prefix=/usr /local/php --enable-fpm --enable-fastcgi(可能会提示没有这个选项)
make && make install
编译没有问题后,我们开始配置和优化php-fpm,php全局配置文件是php.ini,编译后是在/etc/php.ini这下面。
重点介绍php-fpm引擎的配置文件
php-fpm配置文件也在/etc/php-fpm.conf下面,默认情况下会把/etc/php-fpm.d/www.conf 的配置文件include进去。
我们在www.conf里面看看以下几项:
listen = 127.0.0.1:9000 #监听了本地9k端口
user = nginx #运行用户
group = nginx
pm.max_children = 50 # 设置fcgi的进程数,官方建议小于2G内存开启64个,4G可以开200个
request_terminate_timeout = 0 # 用于设置FCGI执行脚本的时间,默认是0秒,也就是五险的执行下去,可以更加情况改
rlimit_files = 1024 #设置PHP-FPM 打开文件描述符的限制,这个值要和linux内核打开文件数关联起来,例如,要将此值设置为65535,就必须在linux命令上执行ulimit -HSN 65536
pm.max_requests = 500 设置处理多少个请求后便会关闭,默认是500,
listen.allowed_clients = 127.0.0.1 # 设置允许访问FCGI进程解析器的IP地址,如果不在IP地址,将无法接受Nginx转发过来的php解析请求。
了解完上诉配置后,就可以启动FastCGI了,启动命令如下:
[root@salt ~]# php-fpm 启动php-fpm
如果有像这样的报错:
[root@salt php]# php-cgi
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/redis.so' - /usr/lib64/php/modules/redis.so: undefined symbol: igbinary_unserialize in Unknown on line 0
那么在/etc/php.ini把这行注释掉启动就可以了:
; extension=/usr/lib64/php/modules/redis.so
Notice
如果是php7.0版本以上的,可以使用以下命令安装redis
[root@salt ~]# pecl install redis
pecl/redis requires PHP (version >= 7.0.0, version <= 7.1.0, excluded versions: 6.0.0), installed version is 5.5.32
No valid packages found
install failed
配置nginx来支持php
我们切换到nginx配置文件目录下,发现有个default.conf的模版文件,我们copy一份来修改后即可用,命令如下:
[root@salt ~]# cd /etc/nginx/conf.d/
[root@salt conf.d]# ls
default.conf
[root@salt conf.d]# cp default.conf web1.conf
[root@salt conf.d]# mv default.conf default.cf # 避免默认配置影响nginx运行
[root@salt conf.d]# vim web1.conf
# 写入以下内容:
server {
listen 80;
server_name web1.test.com;
charset utf8;
location / {
root /var/www/html;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;;
include fastcgi_params;
}
}
参数解释
- location 正则匹配到以php结尾的到这里解析,
- root 指明了网站目录
- fastcgi_pass 指明了用哪里的php-fpm来解析
- fastcgi_index 指明首页
- fastcgi_param 指明的是php动态程序的主目录,/scripts也就是$fastcgi_script_name前面指定的路径,我们一般在这里写网站根目录的路径,比如我们的路径是 /var/www/html。
测试php+nginx是否正常工作
在网站根目录下面创建Index.php文件,写入一些内容,命令如下:
/var/www/html/index.html的内容:
<h1>
<span> hello, this is test page </span>
</h1>
/var/www/html/phpinfo.php内容:
<?php phpinfo(); ?>
我们访问http://ip/如果出现自定义页面,那么就成功了。
访问http://ip/phpinfo.php 出现php安装信息,那么也算成功了。
优化Nginx和FastCgi参数
我们在nginx配置文件里面的http段内添加一下内容,比如我们现在使用的web1.conf文件,那么我就在web1.conf里面添加以下内容:
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
参数解释
fastcgi_connect_timeout 300;` 值连接到后端FastCGI的超时时间
fastcgi_send_timeout 300; 指向Fastcgi 传送请求的超时时间,这个值是已经完成了2次握手后向FastCGI应答的超时时间
fastcgi_read_timeout 300; 指向接收FastCGI应答的超时时间,这个是已经完成2次握手后接收FastCGI应答的超时时间
fastcgi_buffer_size 64k; 用于指定读取FastCGI。 应答第一部分需要多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置Fastcgi_buffers选项指定的缓冲区大小。
fastcgi_buffers 4 64k; 指定本地需要多少和多大的缓冲区缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么就会为其分配4个64KB的缓冲区来缓存,如果页面大小大于256KB,那么大于256KB的部分会缓存到Fastcgi_temp指定的路径中。但是这个不是好办法。因为内存中的数据处理速度大于硬盘,一般这个值应该为站点中的php脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为16 16K,或者4 64KB。。
fastcgi_busy_buffers_size 128k; 默认值是fastcgi_buffers的两 倍
fastcgi_temp_file_write_size 128k; 表示写入缓存文件时使用多大的数据块,默认是fastcgi_buffers的两倍。
开启缓存后:
fastcgi_cache_valid 200 302 1h;将http状态码是200的和302的缓存一小时,301的缓存一天,其他的缓存一分钟fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
写完以上参数后,保存退出重启服务。
Nginx系列2之Nginx+php的更多相关文章
- Nginx系列0:Nginx学习历程
Nginx学习历程 一.初识Nginx 1.Nginx适用于哪些场景 (1)静态资源服务 通过本地文件系统提供服务 (2)反向代理服务 Nginx的强大性能 缓存 负载均衡 (3)API服务 Open ...
- Nginx系列3之Nginx+tomcat
preface 公司部分应用跑得的tomcat,众所周知,tcomat高并发性能很弱,所以在处理静态请求的时候,我们就把他抛给Nginx处理,而Tomcat专门处理动态请求.所以在这里说说Nginx+ ...
- nginx系列6:nginx的进程结构
nginx的进程结构 如下图: 通过ps –ef | grep nginx可以看到共有三个进程,一个master进程,两个worker进程. nginx是多进程结构,多进程结构设计是为了保证nginx ...
- nginx系列5:nginx的请求处理流程
nginx的请求处理流程 如下图: nginx可以处理来自web(http),Email,TCP/UDP的三类请求. nginx底层使用非阻塞的事件驱动引擎,结合状态机来完成异步通知,其中处理Http ...
- Nginx系列
包括nginx的入门和进阶学习. 目录 nginx系列1:认识nginx nginx系列2:搭建nginx环境 nginx系列3:搭建一个静态资源web服务器 nginx系列4:日志管理 nginx系 ...
- nginx高性能WEB服务器系列之九--nginx运维故障日常解决方案
nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...
- 死磕nginx系列
死磕nginx系列 死磕nginx系列--nginx入门 死磕nginx系列--nginx配置文件 死磕nginx系统--nginx日志配置 死磕nginx系列--nginx服务器做web服务器 死磕 ...
- 死磕nginx系列--nginx 目录
死磕nginx系列--nginx入门 死磕nginx系列--nginx配置文件 死磕nginx系统-nginx日志配置 死磕nginx系列--nginx服务器做web服务器 死磕nginx系列--使用 ...
- 死磕nginx系列--配置文档解读
nginx配置文件主要分为四个部分: main(全局设置) http ( ) upstream(负载均衡服务器设置) server(主机设置) location(URL匹配特点位置的设置) serve ...
随机推荐
- 2015/11/9用Python写游戏,pygame入门(8):按钮和游戏结束
昨天没有更新内容,今天相对多写一些. 因为我们已经基本完成游戏框架,但是游戏结束后,并不知道怎样比较好开始.我本来本着懒的原则,想结束后显示一个黑屏,然后你重新点一下鼠标就重新开始.但是那样实在太不像 ...
- Sql 2012 远程数据库连接
新装好的数据库,各种远程连接设置都设置好后.发现还是连接不上. 这时候,问题可能出在端口上,远程连接的时候需要指明端口.动态端口一般都会变.在本机连接时候,会自动选择端口.在远程访问时候,就必须要指明 ...
- express-partials与express4.x不兼容问题
在express中设置view engine为html,express-partials会导致语法不正确,其实只要做一行代码的改动就可以 function renderer(ext){ if(ext[ ...
- 如何批量删除虚拟机及其关联的存储(Windows Azure)
可以通过运行附件中PowerShell脚本文件RemoveVMandDisk.ps1批量删除VM和Disk,详细代码如下: param($serviceName) echo "Startin ...
- 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数
函数式编程高阶函数 就是把函数作为参数的函数,这种抽象的编程方式就是函数式编程.--- - -跳过,不是很理解,汗 - ---
- mysql性能优化-慢查询分析、优化索引和配置
一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三.配置优化 1) max_connec ...
- 理解 charging ic spec
如何選擇1個適合您的 charging ic 呢? 主要考量以下 parameters charging ic 的 IIN, VIN charging ic 給 battery 的 IIN, VIN ...
- android图片的异步加载和双缓存学习笔记——DisplayImageOptions (转)
转的地址:http://hunankeda110.iteye.com/blog/1897961 1 //设置图片在下载期间显示的图片 2 showStubImage(R.drawable.ic_lau ...
- 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数
本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...
- 【POJ 2653】Pick-up sticks 判断线段相交
一定要注意位运算的优先级!!!我被这个卡了好久 判断线段相交模板题. 叉积,点积,规范相交,非规范相交的简单模板 用了“链表”优化之后还是$O(n^2)$的暴力,可是为什么能过$10^5$的数据? # ...