本文目錄一覽:
php和nginx之間是如何工作的
Nginx+php-fpm實現原理 Nginx本身不會對PHP進行解析,終端對PHP頁面的請求將會被Nginx交給FastCGI進程監聽的IP地址及端口,由php-fpm作為動態解析服務器處理,最後將處理結果再返回給nginx。其實,Nginx就是一個反向代理服務器。Nginx通過反向代理功能將動態請求轉向後端php-fpm,從而實現對PHP的解析支持,這就是Nginx實現PHP動態解析的原理。 Nginx不支持對外部程序的直接調用或者解析,所有的外部程序(包括PHP)必須通過FastCGI接口來調用。FastCGI接口在Linux下是socket(這個socket可以是文件socket,也可以是ip socket)。為了調用CGI程序,還需要一個FastCGI的wrapper(wrapper可以理解為用於啟動另一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。當Nginx將CGI請求發送給這個socket的時候,通過FastCGI接口,wrapper接收到請求,然後派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本並讀取返回數據;接着,wrapper再將返回的數據通過FastCGI接口,沿着固定的socket傳遞給Nginx;最後,Nginx將返回的數據發送給客戶端。
當nginx接收到一個http請求時,通過配置文件找到對應的server。然後匹配server中的所有location,找到最匹配的。而在location中的命令會啟動不同的模塊去完成工作,比如rewrite模塊、index模塊。因此在nginx中模塊可以看作真正的勞動工作者。nginx的模塊是被編譯到nginx中的,屬於靜態方式。啟動nginx時,模塊被自動加載。
nginx 不能解析php怎麼辦
nginx 不能解析php解決方法如下:
在nginx配置文件中添加:
location ~ .*\.php?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
nginx和php的兩種通信方式
Nginx與PHP的兩種通信方式-unix socket和tcp socket
1、兩者Nginx配置
unix socket
需要在nginx配置文件中填寫php-fpm運行的pid文件地址。
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
}
tcp socket
需要在nginx配置文件中填寫php-fpm運行的ip地址和端口號。
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
}
2、兩者比較
從上面的圖片可以看,unix socket減少了不必要的tcp開銷,而tcp需要經過loopback,還要申請臨時端口和tcp相關資源。但是,unix socket高並發時候不穩定,連接數爆發時,會產生大量的長時緩存,在沒有面向連接協議的支撐下,大數據包可能會直接出錯不返回異常。tcp這樣的面向連接的協議,多少可以保證通信的正確性和完整性。
3、選擇建議:如果是在同一台服務器上運行的nginx和php-fpm,並發量不超過1000,選擇unix socket,因為是本地,可以避免一些檢查操作(路由等),因此更快,更輕。 如果面臨高並發業務,我會選擇使用更可靠的tcp socket,以負載均衡、內核優化等運維手段維持效率。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/200764.html