nginx和php-fpm通信, unix socket还是tcp?

Nginx和Fastcgi( php-fpm是PHP端的Fastcgi实现 )的通信方式有两种,一种是TCP的方式,一种是unix socket方式。

两种方式各有优缺点,这里先给出两种的配置方法,然后再对性能、安全性等做出总结。

  • TCP是使用TCP端口连接,本地配置: 127.0.0.1:9000
  • Socket是使用Unix Domain Socket连接套接字,一般以文件形式:/dev/shm/PHP-cgi.sock

很多教程在socket方式时使用路径/tmp,而路径/dev/shm是个tmpfs,速度比磁盘快得多。

在服务器压力不大的情况下,tcp和socket差别不大,但在压力比较满的时候,用套接字方式,效果确实比较好。

1 配置指南

1.1 TCP配置方式

TCP通信配置起来很简单,三步即可搞定。

第一步,配置nginx。

编辑 /etc/nginx/conf.d/你的站点配置文件(如果使用的默认配置文件,修改/etc/nginx/sites-available/default)

fastcgi_pass参数修改为127.0.0.1:9000,像这样:

location ~ \.php$ {

index index.php index.html index.htm;

include /etc/nginx/fastcgi_params;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fastcgi_params;

}

第二步,编辑php-fpm配置文件。

打开 /etc/php/fpm/pool.d/www.conf,将listen参数修改为127.0.0.1:9000,像这样:

listen=127.0.0.1:9000

第三步,重启php-fpm,重启nginx

1.2 unix socket配置方式

unix socket其实严格意义上应该叫Unix Domain Socket,

它是*nix系统进程间通信(IPC)的一种被广泛采用方式,以文件(一般是.sock)作为socket的唯一标识(描述符),

需要通信的两个进程引用同一个socket描述符文件就可以建立通道进行通信了。

Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。

与管道相比,Unix domain sockets 既可以使用字节流和数据队列,而管道通信则只能通过字节流。

Unix domain socket 的接口和Internet socket很像,但它不使用网络底层协议来通信。

Unix domain socket 的功能是POSIX操作系统里的一种组件。

Unix domain socket 使用系统文件的地址来作为自己的身份。它可以被系统进程引用。

所以两个进程可以同时打开一个Unix domain sockets来进行通信。

不过这种通信方式是发生在系统内核里而不会在网络里传播。

unix socket 配置需要五步。

第一步,决定socket描述符文件的存储位置。

可以放在系统的任意位置,如果想要更快的通信速度,可以放在/dev/shm下面,这个目录是所谓的tmpfs,是RAM可以直接使用的区域,所以读写速度都会很快。

决定了文件位置,就要修改文件的权限了,要让nginx和php-fpm对它都有读写的权限,可以这样:

sudo touch /dev/shm/fpm-cgi.sock

sudo chown www-data:www-data /dev/shm/fpm-cgi.sock

sudo chmod 666 /dev/shm/fpm-cgi.sock

第二步,修改php-fpm配置文件

打开/etc/php5/fpm/pool.d/www.conf,将listen参数修改为/dev/shm/fpm-cgi.sock,像这样:

listen=/dev/shm/fpm-cgi.sock

listen.backlog参数改为-1,内存积压无限大;默认是128,并发高了之后就会报错

 ; Set listen(2) backlog. A value of '-1' means unlimited.

; Default Value: 128 (-1 on FreeBSD and OpenBSD)

listen.backlog = -1

第三步,修改nginx站点配置文件

fastcgi_pass参数修改为unix:/dev/shm/fpm-cgi.sock,像这样:

location~\.php${

indexindex.phpindex.htmlindex.htm;

include/etc/nginx/fastcgi_params;

fastcgi_passunix:/dev/shm/fpm-cgi.sock;

fastcgi_indexindex.php;

includefastcgi_params;

}

第四步,修改/etc/sysctl.conf 文件

提高内核级别的并发连接数

sudo echo'net.core.somaxconn = 2048'>>/etc/sysctl.conf

sudo sysctl-p

第五步, 重启nginx和php-fpm服务

最好先重启php-fpm再重启nginx

如果nginx做要做负载均衡的话,根本也不要考虑unix socket的方式了,只能采用TCP的方式。

 

原文链接:

« »

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *