Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nginx和php-fpm 是使用 tcp socket 还是 unix socket ? #9

Open
gaoxt opened this issue Mar 9, 2017 · 2 comments
Open

nginx和php-fpm 是使用 tcp socket 还是 unix socket ? #9

gaoxt opened this issue Mar 9, 2017 · 2 comments

Comments

@gaoxt
Copy link
Owner

gaoxt commented Mar 9, 2017

tcp socket

允许通过网络进程之间的通信,也可以通过loopback进行本地进程之间通信。

unix socket

允许在本地运行的进程之间进行通信。

分析

图解
从上面的图片可以看,unix socket减少了不必要的tcp开销,而tcp需要经过loopback,还要申请临时端口和tcp相关资源。但是,unix socket高并发时候不稳定,连接数爆发时,会产生大量的长时缓存,在没有面向连接协议的支撑下,大数据包可能会直接出错不返回异常。tcp这样的面向连接的协议,多少可以保证通信的正确性和完整性。

我的选择

如果是在同一台服务器上运行的nginx和php-fpm,并发量不超过1000,选择unix socket,因为是本地,可以避免一些检查操作(路由等),因此更快,更轻。
如果我面临高并发业务,我会选择使用更可靠的tcp socket,以负载均衡、内核优化等运维手段维持效率。

nginx和php-fpm 使用unix socket

将sock文件放在/dev/shm目录下,使用的内存读写更快。

# cd /dev/shm
touch php7.0-fpm.sock 
chown www-data:www-data php7.0-fpm.sock
chmod 777 php7.0-fpm.sock

php-fpm 配置

# vi /etc/php/7.0/fpm/pool.d/www.conf
listen= /dev/shm/php7.0-fpm.sock
listen.owner = www-data
listen.group = www-data

nginx server块配置

  location ~* \.php$ {
    fastcgi_pass unix:/dev/shm/php7.0-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
  }

提高nginx和php-fpm使用的 unix socket稳定性(单机能力有限)

1.修改内核参数

net.unix.max_dgram_qlen = 4096
net.core.netdev_max_backlog = 4096
net.core.somaxconn = 4096

2.提高backlog
backlog默认位128,1024这个值最好换算成自己正常的QPS。

nginx.conf
server{
  listen 80 default backlog=1024;
}

php-fpm.conf
listen.backlog = 1024

3.增加sock文件和php-fpm实例
在/dev/shm新建一个sock文件,在nginx中通过upstream魔抗将请求负载均衡到两个sock文件,
并且将两个sock文件分别对应到两套php-fpm实例上。

参考

nginx通过TCP以及unix-domain-socket连接fastcgi方式对比
nginx、php-fpm默认配置与性能–TCP socket还是unix domain socket

@Sorata
Copy link

Sorata commented May 14, 2018

感谢分享~

1 similar comment
@entimm
Copy link

entimm commented Oct 23, 2018

感谢分享~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants