配置方式
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 編譯參數