nginx与php-fpm通信的两种方式

前言

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差别不大,但在压力比较满的时候,用套接字方式,效果比较好。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181210A1LGKO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券