php-fpm的两种配置方式
配置方式
php-fpm.conf
listen = 127.0.0.1:9000 // ip + port 方式 ;listen = /dev/shm/php-cgi.sock // unix socket 方式
以上配置二选一即可, 接下来在 Apache 或者 Nginx 中需要使用与之对应的方式监听,参考配置如下:
Apache
<VirtualHost *:80> ServerAdmin admin@example.com DocumentRoot "/data/wwwroot/default" ServerName 127.0.0.1 ErrorLog "/data/wwwlogs/error_apache.log" CustomLog "/data/wwwlogs/access_apache.log" common <Files ~ (\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)$> Order allow,deny Deny from all </Files> <FilesMatch \.php$> SetHandler "proxy:unix:/dev/shm/php-cgi.sock|fcgi://localhost" // unix socket 形式 # SetHandler "proxy:fcgi://127.0.0.1:9000" // ip + port 形式 </FilesMatch> </VirtualHost>
Nginx
server { listen 80; #监听80端口,接收http请求 server_name www.example.com; #就是网站地址 root /data/wwwroot/default; # 准备存放代码工程的路径 #路由到网站根目录www.example.com时候的处理 location / { index index.php; #跳转到www.example.com/index.php autoindex on; } #当请求网站下php文件的时候,反向代理到php-fpm location ~ \.php$ { include /usr/local/nginx/conf/fastcgi.conf; #加载nginx的fastcgi模块 fastcgi_intercept_errors on; fastcgi_pass unix:/dev/shm/php-cgi.sock; // unix socket 形式 # fastcgi_pass 127.0.0.1:9000; // ip + port 形式 include proxy.conf; } }
工作原理
两种方式的区别
unix socket 方式
优点:
unix socket 方式要比 tcp 的方式快,而且消耗资源少,因为 socket 之间在 nginx 和 php-fpm 的进程之间通信,而 tcp 需要经过本地回环驱动,还要申请临时端口和 tcp 相关资源。
会有很多 linux 傻瓜面板,他们可能会有很多中 php-fpm 的版本,那么如果是不同版本去开不同的端口,然后 nginx 去配置的话,你要记住很多端口,sock 文件便是解决这个问题最简单的方法。
Socket 是使用 unix domain socket 连接套接字 /dev/shm/php-cgi.sock
缺点:
unix socket 会显得不是那么稳定,当并发连接数爆发时,会产生大量的长时缓存,在没有面向连接协议支撑的情况下,大数据包很有可能就直接出错并不会返回异常。
虽然 sock 有更少的数据拷贝和上下文切换,更少的资源占用,但是如果数据都是错的,那还有什么用呢。另外使用 sock 的话,必须 nginx 和 fpm 在同一台机器上
tcp 方式
优点:
从稳妥的考虑肯定是使用 tcp,tcp 协议能保证数据的正确性,sock 不能保证。
可以跨服务器,当 nginx 和 php-fpm 不在同一台机器上时,只能使用这种方式
缺点:
性能不如 unix socket
相关命令
/usr/local/php/sbin/php-fpm // 启动 php-fpm /usr/local/php/sbin/php-fpm restart // 重启 php-fpm ps aux | grep php-fpm // 查看 php-fpm 是否启动 ps aux | grep -c php-fpm // 查看 php-fpm 进程数 php -i | grep mem // 查看运行内存 php -i | grep Configure // 查看 php 编译参数