前言

nginx和fastcgi的通信方式有两种,一种是TCP的方式,一种是unix socke方式。两种方式各有优缺点,这里先给出两种的配置方法,然后再对性能、安全性等做出总结。

TCP是使用TCP端口连接127.0.0.1:9000
Socket是使用unix domain socket连接套接字/dev/shm/php-cgi.sock(很多教程使用路径/tmp,而路径/dev/shm是个tmpfs,速度比磁盘快得多),在服务器压力不大的情况下,tcp和socket差别不大,但在压力比较满的时候,用套接字方式,效果确实比较好。

配置指南

TCP配置方式

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

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

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

1
2
3
4
5
6
7

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/php5/fpm/pool.d/www.conf

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

1
listen=127.0.0.1:9000

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

unix socket配置方式

unix socket其实严格意义上应该叫unix domain socket,它是*nix系统进程间通信(IPC)的一种被广泛采用方式,以文件(一般是.sock)作为socket的唯一标识(描述符),需要通信的两个进程引用同一个socket描述符文件就可以建立通道进行通信了。

Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。与管道相比,Unix domain sockets 既可以使用字节流和数据队列,而管道通信则只能通过字节流。Unix domain sockets的接口和Internet socket很像,但它不使用网络底层协议来通信。Unix domain socket 的功能是POSIX操作系统里的一种组件。Unix domain sockets 使用系统文件的地址来作为自己的身份。它可以被系统进程引用。所以两个进程可以同时打开一个Unix domain sockets来进行通信。不过这种通信方式是发生在系统内核里而不会在网络里传播。

配置需要五步

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

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

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

1
2
3

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,像这样:

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

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

1
2
3

; 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,像这样:

1
2
3
4
5
6
7

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 文件,提高内核级别的并发连接数(这个系统级的配置文件我也不是特别熟悉,参考的是这篇博客:《Php-fpm TcpSocket vs UnixSocket》)

1
2

sudoecho'net.core.somaxconn = 2048'>>/etc/sysctl.conf
sudosysctl-p

第五步, 重启nginx和php-fpm服务(最好先重启php-fpm再重启nginx)

两种通信方式的分析和总结

从原理上来说,unix socket方式肯定要比tcp的方式快而且消耗资源少,因为socket之间在nginx和php-fpm的进程之间通信,而tcp需要经过本地回环驱动,还要申请临时端口和tcp相关资源。

当然还是从原理上来说,unix socket会显得不是那么稳定,当并发连接数爆发时,会产生大量的长时缓存,在没有面向连接协议支撑的情况下,大数据包很有可能就直接出错并不会返回异常。而TCP这样的面向连接的协议,多少可以保证通信的正确性和完整性。

当然以上主要是半懂不懂的理论分析加主观臆测,具体的差别还是要通过测试数据来说话,以后有空,会进行这方面的测试。从网上别人博客的测试数据,我的理论分析差不多是对的。至于你选择哪种方式,我只能说“鱼和熊掌不可兼得也”,通过高超的运维和配置技巧,在性能和稳定性上做一个平衡吧。

说说我的选择

其实,如果nginx做要做负载均衡的话,根本也不要考虑unix socket的方式了,只能采用TCP的方式。现在我的小站没有那么高的并发量,所以就用unix socket了,以后如果有了高并发业务,再进行一些参数调整即可应付,如果真要是无法支撑,那只能做负载均衡了,到时候自然会选择TCP方式。

http://xieminis.me/?p=216

https://blog.linuxeye.com/364.html

nginx 与fastcgi通信方式相关推荐

  1. Nginx连接fastcgi的方式

    2019独角兽企业重金招聘Python工程师标准>>> Nginx连接fastcgi的方式有2种: TCP和unix domain socket 什么是Unix domain soc ...

  2. nginx、fastCGI、php-fpm关系梳理(转载参考)

    nginx.fastCGI.php-fpm关系梳理 还可以参考:http://www.cnblogs.com/skynet/p/4173450.html 前言: Linux下搭建nginx+php+m ...

  3. linux下nginx+python+fastcgi部署总结(web.py版)

    2019独角兽企业重金招聘Python工程师标准>>> 在上一篇文章linux下nginx+python+fastcgi部署总结(django版)中,我们部署了nginx+djang ...

  4. Nginx + CGI/FastCGI + C/Cpp

    http://www.cnblogs.com/skynet/p/4173450.html Nginx + CGI/FastCGI + C/Cpp 2014-12-19 11:05 by 吴秦, 197 ...

  5. Nginx + CGI/FastCGI + C/Cpp(编不过去,不搞了。。。)(Common Gateway Interface)

    Nginx + CGI/FastCGI + C/Cpp 文章目录 1.CGI 1.1.环境变量 1.2.标准输入 总结:CGI使外部程序与Web服务器之间交互成为可能.CGI程式运行在独立的进程中,并 ...

  6. windows下nginx+mono+fastCGI部署asp.net网站

    1,什么是nginx 简介 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx ...

  7. 架构 Varnish+Nginx+PHP(FastCGI)+MYSQL5+MemCache

    说明:        我在设计系统架构时,进行了大胆的尝试,只用6台Web服务器,达到了可承受4000万PV(页面访问量)的性能: 抛弃了 Apache,因为它能承受的并发连接相对较低: 抛弃了 Sq ...

  8. 架构 Varnish+nginx+php(FastCGI)+MYSQL5+MenCache+MenC

    说明:        我在设计系统架构时,进行了大胆的尝试,只用6台Web服务器,达到了可承受4000万PV(页面访问量)的性能: 抛弃了 Apache,因为它能承受的并发连接相对较低: 抛弃了 Sq ...

  9. Nginx运行FastCGI程序(ngx_http_fastcgi_module模块、fcgi库、spwan-fcgi进程管理器)

    一.什么是CGI 通用网关接口(Common Gateway Interface.CGI)描述了客户端和服务器程序之间传输数据的一种标准,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数 ...

  10. nginx参数fastcgi

    参数说明 CGI:全称"通用网关接口",Http服务器与其他机器上的程序进行"交谈"的一种工具,其程序一般运行在网络服务器上. FastCGI全称:" ...

最新文章

  1. Java序列化的机制和原理
  2. ubuntu怎么测tcp协议的服务器,Ubuntu利用TCP协议来获取server时间(示例代码)
  3. JavaScript代码检查工具——JSLintMate
  4. oracle shell 登录,linux 本地账号密码无法登陆(shell可以登录),一直返回 登陆的login界面...
  5. 最小硬盘实现单原子信息存储 超现有硬盘500倍
  6. 基于CMake构建MSVC_CUDA及MinGW编译环境下的的OpenCV项目
  7. [html] 如何根据设备尺寸做页面自适应?
  8. HTTP----HTTP2.0新特性
  9. 瀑布流式页面布局_微信小程序——实现简单的瀑布流式布局
  10. 什么是TLV存储格式以及为什么Protocol Buffer要比Json和XML传输时要快
  11. excel字符处理函数
  12. 你所不知道的我国交通工程早期经历了怎样的发展?
  13. LabVIEW编程LabVIEW开发 常用运动控制器比较
  14. DDOS误判怎么预防
  15. 163邮箱手机收件服务器设置,网易邮箱全面默认开通IMAP 手机收信提速10倍
  16. python不定积分教学_python使用sympy不定积分入门及求解
  17. 雨林木风 ghost win7 纯净版系统下载
  18. linux pgm格式图片,pgm文件扩展名,pgm文件怎么打开?
  19. html+css淘宝静态网页
  20. 视觉欺骗 A和B的颜色相同吗?

热门文章

  1. iOS autoreleasePool 深入理解
  2. JWT学习(二):Json Web Token JWT的Java使用 (JJWT)
  3. Linux下安装whl文件
  4. Extjs自定义日期控件的显示格式
  5. 设置三个按钮等宽分布
  6. 关于个人博客的相关内容
  7. DVWA系列之11 Brute Force中的密码绕过
  8. WSUS的链式部署:WSUS2.0 三
  9. 软件测试工程师的工作总结
  10. iptables 从入门到应用