## nginx+php-fpm配置后頁面顯示空白的解決方法
由于nginx與php-fpm之間的一個小bug,會導致這樣的現象: 網站中的靜態頁面 *.html 都能正常訪問,而 *.php 文件雖然會返回200狀態碼, 但實際輸出給瀏覽器的頁面內容卻是空白。 簡而言之,原因是nginx無法正確的將 *.php 文件的地址傳遞給php-fpm去解析, 相當于php-fpm接受到了請求,但這請求卻指向一個不存在的文件,于是返回空結果。 為了解決這個問題,需要改動nginx默認的fastcgiparams配置文件: vi /etc/nginx/fastcgi_params 在文件的最后增加兩行:
```
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_script_name;
```
然后重啟服務。
## nginx + php-fpm 502
Nginx和PHP-FPM的進程間通信有兩種方式,一種是TCP,一種是UNIX Domain Socket.
其中TCP是IP加端口,可以跨服務器.而UNIX Domain Socket不經過網絡,只能用于Nginx跟PHP-FPM都在同一服務器的場景.用哪種取決于你的PHP-FPM配置:
方式1:
```
php-fpm.conf: listen = 127.0.0.1:9000
nginx.conf: fastcgi_pass 127.0.0.1:9000;
```
方式2:
```
php-fpm.conf: listen = /tmp/php-fpm.sock
nginx.conf: fastcgi_pass unix:/tmp/php-fpm.sock;
```
其中php-fpm.sock是一個文件,由php-fpm生成,類型是srw-rw----.
把php-fpm.sock權限改為777,可以正常顯示。
UNIX Domain Socket可用于兩個沒有親緣關系的進程,是目前廣泛使用的IPC機制,比如X Window服務器和GUI程序之間就是通過UNIX Domain Socket通訊的.這種通信方式是發生在系統內核里而不會在網絡里傳播.UNIX Domain Socket和長連接都能避免頻繁創建TCP短連接而導致TIME_WAIT連接過多的問題.對于進程間通訊的兩個程序,UNIX Domain Socket的流程不會走到TCP那層,直接以文件形式,以stream socket通訊.如果是TCP Socket,則需要走到IP層,對于非同一臺服務器上,TCP Socket走的就更多了.
```
UNIX Domain Socket:
Nginx <=> socket <=> PHP-FPM
TCP Socket(本地回環):
Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM
TCP Socket(Nginx和PHP-FPM位于不同服務器):
Nginx <=> socket <=> TCP/IP <=> 物理層 <=> 路由器 <=> 物理層 <=> TCP/IP <=> socket <=> PHP-FPM
```
像mysql命令行客戶端連接mysqld服務也類似有這兩種方式:
使用Unix Socket連接(默認):
```
mysql -uroot -p --protocol=socket --socket=/tmp/mysql.sock
```
使用TCP連接:
```
mysql -uroot -p --protocol=tcp --host=127.0.0.1 --port=3306
```