nginx、cgi通信原理
2014-02-28 11:56
603 查看
nginx+fastcgi+php-fpm是很多大型网站的服务端架构,也都知道fastcgi在性能上比CGI优异很多,但很少有人解释nginx是怎么跟fastcgi通信的,下面我们来解释下
网上对CGI的工作原理一般是这么定义的:
客户端web浏览器浏览某个主页后,利用一定的方式提交数据,并通过HTTP协议向Web服务器发出请求,服务器端的HTTP Daemon(守护进程)将描述的主页信息通过标准输入stdin和环境变量(enviroment variable)传递给主页指定的CGI程序,并启动此应用程序进行处理(包括数据库处理),处理结果通过标准输出stdout返回给HTTP
Daemon守护进程,再由HTTP Daemon进程通过HTTP协议返回给客户端浏览器,由浏览器解析执行,将最终结果显示给用户
上面的解释有两个关键地方“标准输入和标准输出”,貌似nginx就是通过“标准输入和标准输出”来和CGI通信的,那么这个“标准输入和标准输出”是怎么样构建的呢,因为CGI也是监听在服务器的某个端口上,不可能有像操作本地文件系统那样的“标准输入和标准输出”的,后来发现nginx跟fastcgi通信有两种方式:
1、tcp的方式,nginx默认是通过tcp的方式跟fastcgi通信的
2、socket方式,这个方式需要单独配置
Tcp是使用TCP端口连接127.0.0.1:9000
Socket是使用unix domain socket连接套接字/dev/shm/php-cgi.sock
测试机是个1核的centos5.4,2用户并发时系统资源消耗50%左右,10用户资源就跑得很满了。
结论是在服务器压力不大的情况下,tcp和socket差别不大,但在压力比较满的时候,用套接字方式,效果确实比较好。
下面是配置方法
平时大家配置的nginx连接fastcgi的方式都是tcp的,现在使用一种速度更快的方法unix
domain socket来完成:
一:首先建立/dev/shm/php-cgi.sock文件,然后将之改所有者改为nginx(与 nginx的用户一致):
#touch /dev/shm/php-cgi.sock
#chown nginx:nginx /dev/shm/php-cgi.sock
二:编辑 nginx.conf和业务conf
修改:
# fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
三:在php-fpm.conf中修改配置为:
PHP5.2.5:
#127.0.0.1:9000
/dev/shm/php-cgi.sock
PHP5.3.10:
;listen = 127.0.0.1:9000
listen = /dev/shm/php-cgi.sock
重启php-fpm与nginx就可以了,ls -all查看/dev/shm/php-cgi.sock由普通文件变成s开头的unix套接字
网上对CGI的工作原理一般是这么定义的:
客户端web浏览器浏览某个主页后,利用一定的方式提交数据,并通过HTTP协议向Web服务器发出请求,服务器端的HTTP Daemon(守护进程)将描述的主页信息通过标准输入stdin和环境变量(enviroment variable)传递给主页指定的CGI程序,并启动此应用程序进行处理(包括数据库处理),处理结果通过标准输出stdout返回给HTTP
Daemon守护进程,再由HTTP Daemon进程通过HTTP协议返回给客户端浏览器,由浏览器解析执行,将最终结果显示给用户
上面的解释有两个关键地方“标准输入和标准输出”,貌似nginx就是通过“标准输入和标准输出”来和CGI通信的,那么这个“标准输入和标准输出”是怎么样构建的呢,因为CGI也是监听在服务器的某个端口上,不可能有像操作本地文件系统那样的“标准输入和标准输出”的,后来发现nginx跟fastcgi通信有两种方式:
1、tcp的方式,nginx默认是通过tcp的方式跟fastcgi通信的
2、socket方式,这个方式需要单独配置
下面以nginx+php-fpm fascgi配置实例来对这两种配置方式对比:
对于nginx连接fastcgi的两种不同方式做了测试,结果如下。Tcp是使用TCP端口连接127.0.0.1:9000
Socket是使用unix domain socket连接套接字/dev/shm/php-cgi.sock
测试机是个1核的centos5.4,2用户并发时系统资源消耗50%左右,10用户资源就跑得很满了。
结论是在服务器压力不大的情况下,tcp和socket差别不大,但在压力比较满的时候,用套接字方式,效果确实比较好。
2users | 10users | ||
nginx/1.2.9 + PHP 5.2.5 | tcp | 1060 | 1294 |
nginx/1.2.9 + PHP 5.2.5 | socket | 997 | 1487 |
nginx/1.2.9 + PHP 5.3.10 | tcp | 906 | 1082 |
nginx/1.2.9 + PHP 5.3.10 | socket | 880 | 1247 |
平时大家配置的nginx连接fastcgi的方式都是tcp的,现在使用一种速度更快的方法unix
domain socket来完成:
一:首先建立/dev/shm/php-cgi.sock文件,然后将之改所有者改为nginx(与 nginx的用户一致):
#touch /dev/shm/php-cgi.sock
#chown nginx:nginx /dev/shm/php-cgi.sock
二:编辑 nginx.conf和业务conf
修改:
# fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
三:在php-fpm.conf中修改配置为:
PHP5.2.5:
#127.0.0.1:9000
/dev/shm/php-cgi.sock
PHP5.3.10:
;listen = 127.0.0.1:9000
listen = /dev/shm/php-cgi.sock
重启php-fpm与nginx就可以了,ls -all查看/dev/shm/php-cgi.sock由普通文件变成s开头的unix套接字
相关文章推荐
- Nginx环境下常见的开源项目重写汇总
- 使用logrotate管理nginx日志文件
- 一步步安装nginx搭建流媒体服务器
- nginx 配置技巧
- (总结)Nginx配置文件nginx.conf中文详解
- nginx 安装手记
- LNMP(linux+nginx+mysql+php)服务器环境配置
- nginx_技术研究报告
- Nginx的$uri和$request_uri
- Nginx+uwsgi+web.py
- Nginx搭建flv视频点播服务器
- Linux下nginx的启动 关闭 重启
- 手动 3- nginx - php 配置magento环境
- nginx last break等
- 手动 2- 安装nginx和php(配置) linux
- 运行和控制Nginx
- nginx location规则
- compile nginx on linux
- Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)
- nginx 多站点配置方法集合