nginx中的 fastcgi_pass为什么有时候是unix:/tmp/php-fpm.sock,有时候是127.0.0.1:9000
一种是 sock 文件 一种是通过 9000 的fpm端口
ps -ef | grep php-fpm 查看php-fpm所有的进程
ps -ef | grep php-fpn.conf 查看配置所在路径
netstat -lntp 查看监听端口 listen/network/tcp/port
这牵扯到了nginx和php的通信模式,上面所列的就是这两种,一种是利用系统本身socket的,一种是利用tcp协议的
两种协议有区别,
UNIX Domain Socket不经过网络,只是在系统内部进行通信,适用于php和nginx都装在同一台linux服务器上
tcp通信协议的也就是fastcgi_pass模式的既适用于php和nginx都装在同一台linux服务器上,同时又适用于不在同一台服务器上的,一般在同一个局域网中,也就是127.0.0.1的意义了
当然我们在真正的php搭建服务器环境的时候,具体用那种,就要看php-fpm.conf中使用的是哪种了
tcp方式:
php-fpm.conf: listen = 127.0.0.1:9000
nginx.conf: fastcgi_pass 127.0.0.1:9000;
UNIX Domain Socket方式:
php-fpm.conf: listen = /tmp/php-fpm.sock
nginx.conf: fastcgi_pass unix:/tmp/php-fpm.sock;
在我们真正实例中多数都是装在同一台服务器上,所以选择UNIX Domain Socket是比较合适的选择,因为这样可以避免数据传输经过tcp层造成导致TIME_WAIT连接过多的问题。
具体两个传输方式的流程如下
1.1 TCP Socket(本地回环127.0.0.1)方式的数据传输:
Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM
1.2 TCP Socket(Nginx和PHP-FPM位于不同服务器)的数据传输:
Nginx <=> socket <=> TCP/IP <=> 物理层 <=> 路由器 <=> 物理层 <=> TCP/IP <=> socket <=> PHP-FPM
2 UNIX Domain Socket方式的数据传输:
Nginx <=> socket <=> PHP-FPM
nginx配置:
server {
listen 80;
server_name localhost;
root /home/work/project/public;
index index.html index.htm index.php;
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
set $root /home/work/cfgset/;
location ~ \.php(.*)$ {
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
access_log /var/logs/project/access.log;
error_log /var/logs/project/error.log;
}
php-fpm配置:
[global]
pid = /var/run/php-fpm.pid
error_log = /var/log/php-fpm.log
log_level = notice
[www]
listen = /tmp/php-cgi.sock
;listen = 127.0.0.1:9000
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
user = user
group =user
pm = dynamic
pm.max_children = 20
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 20
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log
env[PATH]=$PATH
env[LD_LIBRARY_PATH]=$LD_LIBRARY_PATH
php_flag[display_errors] = Of
其中 nginx中的fastcgi_pass 与php-fpm.conf中listen = /tmp/php-cgi.sock保持一致。
若php-fpm.conf中配置为 listen = 127.0.0.1:9000 那么nginx中fastcgi_pass 为
fastcgi_pass 127.0.0.0.1:9000