nginx.conf中的fastcgi_pass

基本原理

nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。

nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx。

 

2种连接方式

fastcgi_pass 127.0.0.1:9000;

fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;

 

为什么会有2种fastcgi_pass

Nginx和PHP-FPM的进程间通信有两种方式,一种是TCP,一种是UNIX Domain Socket.

其中TCP是IP加端口,可以跨服务器.而UNIX Domain Socket不经过网络,只能用于Nginx跟PHP-FPM都在同一服务器的场景.用哪种取决于你的PHP-FPM配置:

方式1:

php-fpm.conf: listen = 127.0.0.1:9000

nginx.conf: fastcgi_pass 127.0.0.1:9000;

方式2:

php-fpm.conf: listen = /tmp/php-fpm.sock

nginx.conf: fastcgi_pass unix:/tmp/php-fpm.sock;

其中php-fpm.sock是一个文件,由php-fpm生成,类型是srw-rw----.

UNIX Domain Socket可用于两个没有亲缘关系的进程,是目前广泛使用的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的.这种通信方式是发生在系统内核里而不会在网络里传播.UNIX Domain Socket和长连接都能避免频繁创建TCP短连接而导致TIME_WAIT连接过多的问题.对于进程间通讯的两个程序,UNIX Domain Socket的流程不会走到TCP那层,直接以文件形式,以stream socket通讯.如果是TCP Socket,则需要走到IP层,对于非同一台服务器上,TCP Socket走的就更多了.

 

socket是神马?摘抄一段描述:

Socket 可以被定义描述为两个应用通信通道的端点。一个 Socket 端点可以用 Socket 地址来描述, Socket 地址结构由 IP 地址,端口和使用协议组成( TCP or UDP )。http协议可以通过socket实现,socket在传输层上实现。从这个角度来说,socket介于应用层和传输层之间。但是socket作为一种进程通信机制,操作系统分配唯一一个socket号,是依赖于通信协议的,但是这个通信协议不仅仅是 tcp或udp,也可以是其它协议。

 

 

在同一台服务器上,用tcp socket与unix domain socket有什么区别?

如图所示,对于进程间通讯的两个程序,unix domain socket的流程不会走到TCP 那层,直接以文件形式,以stream socket通讯。如果是TCP socket,则需要走到IP层。对于非同一台服务器上,TCP socket走的就更多了。

 

 

 

例子:

UNIX Domain Socket:

Nginx <=> socket <=> PHP-FPM

TCP Socket(本地回环):

Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM

TCP Socket(Nginx和PHP-FPM位于不同服务器,不过也只能这样):

Nginx <=> socket <=> TCP/IP <=> 物理层 <=> 路由器 <=> 物理层 <=> TCP/IP <=> socket <=> PHP-FPM

像mysql命令行客户端连接mysqld服务也类似有这两种方式:

使用Unix Socket连接(默认):

mysql -uroot -p --protocol=socket --socket=/tmp/mysql.sock

使用TCP连接:

mysql -uroot -p --protocol=tcp --host=127.0.0.1 --port=3306

 

 

如何配置

php5.3之后的版本,php-fpm.conf里的listen的默认配置是127.0.0.1:9000,就不会生成php-fpm.sock,因此如果需要Nginx里的配置有链接tmp/php-fpm.sock的话,需要将listen的地址配置成和nginx的配置文件一致,同时保证这个路径已经存在,这样在启动./php-fpm的时候,会在对应路径上自动生成php-fpm.sock,例如:

让PHP-FPM使用Unix套接字

打开 /etc/php-fpm.d/www.conf

vim /etc/php-fpm.d/www.conf

修改后如下:

;listen = 127.0.0.1:9000 listen = /var/run/php-fpm/php-fpm.sock

修改www.conf配置文件里的listen.mode=0666就可以设置默认权限,不用手动修改了

然后重新加载 PHP-FPM:

systemctl restart php-fpm.

接下修改nginx的配置和所有的虚拟主机

fastcgi_pass 127.0.0.1:9000; ==>fastcgi_pass unix:/tmp/php-fpm.sock;

 

打开nginx.conf

vim /etc/nginx/conf.d/default.conf

fastcgi_pass unix:/tmp/php-fpm.sock;

最后重新加载 nginx:

systemctl restart nginx.

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个 Nginx 配置文件FastCGI 相关的指令。下面是每个指令的详细解释: 1. `fastcgi_pass 127.0.0.1:9000;` 这个指令指定了 FastCGI 应用程序的地址和端口号。它告诉 Nginx 将请求发送到这个地址和端口,以便 FastCGI 应用程序能够处理它们。 2. `fastcgi_index index.php;` 这个指令指定了 FastCGI 应用程序应该处理的默认文件名。如果请求的 URL 没有指定文件名,Nginx 将尝试使用这个指令指定的文件名。 3. `include fastcgi.conf;` 这个指令告诉 Nginx 包含一个名为 fastcgi.conf 的文件。这个文件包含一些常用的 FastCGI 配置指令和变量定义,这些指令和变量通常在 FastCGI 应用程序的配置使用。 4. `fastcgi_cache ngx_fcgi_cache;` 这个指令启用了 FastCGI 缓存。它指定了缓存存储区域的名称,即 ngx_fcgi_cache。缓存存储区域可以是磁盘或内存。 5. `fastcgi_cache_valid 200 302 1h;` 这个指令指定了当 FastCGI 应用程序返回成功响应(HTTP 状态码 200 或 302)时,缓存的响应应该保留多长时间。在这个例子,响应将被缓存 1 小时。 6. `fastcgi_cache_valid 301 1d;` 这个指令指定了当 FastCGI 应用程序返回永久重定向响应(HTTP 状态码 301)时,缓存的响应应该保留多长时间。在这个例子,响应将被缓存 1 天。 7. `fastcgi_cache_valid any 1m;` 这个指令指定了当 FastCGI 应用程序返回任何其他响应时,缓存的响应应该保留多长时间。在这个例子,响应将被缓存 1 分钟。 8. `fastcgi_cache_min_uses 1;` 这个指令指定了每个缓存键应该至少被访问多少次才能被缓存。在这个例子,每个缓存键至少被访问一次才能被缓存。 9. `fastcgi_cache_use_stale error timeout invalid_header http_500;` 这个指令指定了当 FastCGI 应用程序返回错误响应或超时时,是否应该使用旧的缓存响应。它还指定了一些可以被缓存的 HTTP 响应头(例如,HTTP 状态码 500)。 10. `fastcgi_cache_key http://$host$request_uri;` 这个指令指定了用于缓存键的变量。在这个例子,缓存键将由主机名和请求 URI 组成。这意味着相同的 URI 在不同的主机上将产生不同的缓存键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值