前言
nginx转发php类型的请求可以通过fastcgi的方式,fastcgi支持TCP和 unix domain socket两种方式。
Unix domain socket监听
Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。
与管道相比,Unix domain sockets 既可以使用字节流和数据队列,而管道通信则只能通过字节流。
Unix domain sockets的接口和Internet socket很像,但它不使用网络底层协议来通信。Unix domain socket 的功能是POSIX操作系统里的一种组件。
TCP监听
通过网络TCP链接建立网络通信,即使是监听127.0.0.1,也是通过网络底层协议来通信。相对于socket方式,会消耗一些网络资源。
选择TCP还是Unix domain socket?
如果nginx和php-fpm都在同一台机器,当然是选择Unix domain socket方式;但是如果nginx和php-fpm不在同一台机器,socket方式就不能用了。
如果网站的静态资源和php处理的页面是分开的,需要较高的处理能力,可以选择将nginx和php-fpm分开,通过TCP监听的方式组成集群进行处理。(因为fastcgi么有转发静态资源,所以需要nginx将静态资源转发对应的静态资源的目录)
php配置
php-fpm 修改 php-fpm.conf
TCP模式:
listen = 0.0.0.0:9000
Unix domain socket模式:
listen = /opt/php/var/run/php-fpm.sock ; 这里的目录也可以选择/dev/shm/php-fpm.sock,/dev/shm/是一个内存的目录,相对读写的速度会快一点。
nginx修改
TCP模式:
upstream fpm_server{
server 192.168.122.100:9000;
server 192.168.122.101:9000;
}
server {
listen 80;
server_name localhost;
root /var/www/php;
location ~ [^/]\.php(/|$) {
fastcgi_pass fpm_server;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}
}
Unix domain socket模式:
server {
listen 80;
server_name localhost;
root /var/www/php;
location ~ [^/]\.php(/|$) {
fastcgi_pass unix:/opt/php/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}
}
总结
在服务器压力不大的情况下,tcp和Unix domain socket差别不大,但在压力比较满的时候,用套接字方式,效果比较好。
领取专属 10元无门槛券
私享最新 技术干货