php-fpm監聽socket類型-解決Connection refused

前言:
php-fpm的工作模式和nginx類似,都是一個master,多個worker模型。每個worker都在accept本pool內的監聽套接字(linux已不存在驚羣現象)。
一.背景:
在開發中碰到一個問題,項目以nginx+php-fpm形式訪問交互,結果訪問項目時報錯如下圖:

二.分析:
提示很明確嘛,去看error.log(在nginx.conf或者vhost裏頭配置的,找到你對應路徑即可)
錯誤信息如下:
2017/09/18 10:46:21 [error] 3880#0: *92 connect() failed (111: Connection refused) 
while connecting to upstream, client: 192.168.33.10, server: local.helios.com, 
request: "GET /v1/room/detail.json HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "local.helios.com"

2017/09/18 14:30:42 [crit] 5375#0: *43 connect() to unix:/tmp/php-cgi.sock failed (2: No such file or directory)
 while connecting to upstream, client: 192.168.33.10, server: www.lnmp.org, 
 request: "GET /index.php?uri=look/index HTTP/1.1", upstream: "fastcgi://unix:/tmp/php-cgi.sock:", host: "local.helios.com"

關於問題:connect() failed (111: Connection refused) while connecting to upstream網上也有很多描述了,
1.php-fpm是否運行
ps aux |grep php-fpm //查看是否啓動
/etc/init.d/php-fpm   或  /usr/local/php/sbin/php-fpm  //啓動php-fpm
2.php-fpm隊列是否足夠
cat /proc/meminfo -u //查看內存大,一個php-fpm平均進程佔用20MB,1G / 30MB = 33個
vi /usr/local/php/etc/php-fpm.conf  //查看配置文件中 pm.max_children
pm.max_children = 33 //改成上邊的個數,但是最好留些餘地別飽和運行
3.php-fpm.conf與fastcgi.conf的監聽是否相同
1).查看php-fpm監聽方式:
vim /usr/local/php/etc/php-fpm.conf
listen = 127.0.0.1:9000 //【ip+port形式】
;listen = /tmp/php-cgi.sock
2).查看nginx指定與php-fpm通信方式:
vi /usr/local/nginx/conf/vhost/vhost.conf
location ~\.php$ {
  fastcgi_pass unix:/tmp/php-cgi.sock;【unxi domain socket形式】
  fastcgi_index index.php;include fastcgi_params;        
  fastcgi_param  SCRIPT_FILENAME $document_root/$fastcgi_script_name;
}
三.解決:
根據上邊配置顯示,情況已經很明顯了,本次問題屬於第三種情況,
我的php-fpm用ip:port方式建立鏈接,
nginx卻用unix socket方式建立鏈接
這是兩種不同方式,好比暗號不同,怎麼可能接上頭嘛!

修改操作如下:
用哪種取決於你的PHP-FPM配置:,以下二選一即可。
方式1,統一成ip+port的形式:
php-fpm.conf: 
listen = 127.0.0.1:9000
vhost.conf: 
fastcgi_pass 127.0.0.1:9000;

方式2,統一成.sock的形式:
php-fpm.conf: 
listen = /tmp/php-fpm.sock
vhost.conf:
fastcgi_pass unix:/tmp/php-fpm.sock;
重啓nginx與php-fpm
/etc/init.d/nginx reload
/etc/init.d/php-fpm reload

搞定,訪問再試試。

其中php-fpm.sock是一個文件,由php-fpm生成,類型是srw-rw----.
UNIX Domain Socket可用於兩個沒有親緣關係的進程,是目前廣泛使

四.知識延伸:
上邊問題說到了是因爲nginx與php-fpm進程通信不匹配造成的,那他們有什麼不同呢?
Nginx和PHP-FPM的進程間通信有兩種方式:
1. TCP Socket:網絡地址進行尋址和訪問的套接字【ip:port】
2. UNIX Domain Socket:文件系統進行尋址和訪問的套接字【.sock文件】
其中TCP是IP+Port端口,可以跨服務器,而UNIX Domain Socket不經過網絡,只能用於Nginx跟PHP-FPM都在同一服務器的場景.


.sock文件就是以 .sock 爲後綴的文件而已。UNIX 系統不以後綴區分文件類型,但爲了方便,通常使用後綴來標識一下。.sock 文件極有可能是 UNIX 域套接字(UNIX domain socket),即通過文件系統(而非網絡地址)進行尋址和訪問的套接字。參見 man 手冊 unix(7)(命令:man 7 unix)。

區別:https://serverfault.com/questions/124517/whats-the-difference-between-unix-socket-and-tcp-ip-socket




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章