php-fpm.confphp
listen = 127.0.0.1:9000 // ip + port 方式 ;listen = /dev/shm/php-cgi.sock // unix socket 方式
以上配置二選一便可, 接下來在 Apache 或者 Nginx 中須要使用與之對應的方式監聽,參考配置以下:html
Apachelinux
<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>
Nginxnginx
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; } }
工做原理git
優勢:apache
unix socket 方式要比 tcp 的方式快,並且消耗資源少,由於 socket 之間在 nginx 和 php-fpm 的進程之間通訊,而 tcp 須要通過本地迴環驅動,還要申請臨時端口和 tcp 相關資源。緩存
會有不少 linux 傻瓜面板,他們可能會有不少中 php-fpm 的版本,那麼若是是不一樣版本去開不一樣的端口,而後 nginx 去配置的話,你要記住不少端口,sock 文件即是解決這個問題最簡單的方法。服務器
Socket 是使用 unix domain socket 鏈接套接字 /dev/shm/php-cgi.sock併發
缺點:dom
unix socket 會顯得不是那麼穩定,當併發鏈接數爆發時,會產生大量的長時緩存,在沒有面向鏈接協議支撐的狀況下,大數據包頗有可能就直接出錯並不會返回異常。
雖然 sock 有更少的數據拷貝和上下文切換,更少的資源佔用,可是若是數據都是錯的,那還有什麼用呢。另外使用 sock 的話,必須 nginx 和 fpm 在同一臺機器上
優勢:
從穩妥的考慮確定是使用 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 編譯參數