魏长东

weichangdong

nginx和cgi通信

网上对CGI的工作原理一般是这么定义的:

客户端web浏览器浏览某个主页后,利用一定的方式提交数据,并通过HTTP协议向Web服务器发出请求,服务器端的HTTP Daemon(守护进程)将描述的主页信息通过标准输入stdin和环境变量(enviroment variable)传递给主页指定的CGI程序,并启动此应用程序进行处理(包括数据库处理),处理结果通过标准输出stdout返回给HTTP Daemon守护进程,再由HTTP Daemon进程通过HTTP协议返回给客户端浏览器,由浏览器解析执行,将最终结果显示给用户。(作者注:我自己认为啊,这个所谓的HTTP Daemon,就是nginx

上面的解释有两个关键地方“标准输入和标准输出”,貌似nginx就是通过“标准输入和标准输出”来和CGI通信的,那么这个“标准输入和标准输出”是怎么样构建的呢,因为CGI也是监听在服务器的某个端口上,不可能有像操作本地文件系统那样的“标准输入和标准输出”的,后来发现nginx跟fastcgi通信有两种方式:

1、tcp的方式,nginx默认是通过tcp的方式跟fastcgi通信的。(公司一直用的这个)

2、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; 这是tcp形式
fastcgi_pass unix:/dev/shm/php-cgi.sock;这是socket形式

三:在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套接字