您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關如何理解Nginx+PHP+FastCGI加速模式,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
用戶瀏覽器發起對網頁的訪問:http://192.168.1.103/index.php
用戶和nginx服務器進行三次握手進行TCP連接(忽略包括nginx訪問控制策略、nginx防火墻等訪問控制策略)
第一步:用戶將http請求發送給nginx服務器
第二步:nginx會根據用戶訪問的URI和后綴對請求進行判斷
1.例如用戶訪問的index.php,nginx則會根據配置文件中的location進行匹配,例如:
root@json:/data/web# cat /etc/nginx/conf.d/blog.conf server { root /data/web/blog/; index index.html index.htm; server_name www.fwait.com; location / { try_files $uri $uri/ /index.html; } location /blog/ { #alias /usr/share/doc/; auth_basic "authorized users only"; auth_basic_user_file /etc/nginx/passwd.conf; #autoindex on; allow 192.168.1.103; deny all; } location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_intercept_errors on; fastcgi_pass 127.0.0.1:9000; } }
用戶訪問的是index.php,則會匹配到location ~ \.php$,這個的含義是對用戶通過URI訪問的資源進行區分大小的匹配,并且訪問的資源是以.php結尾的。
nginx根據用戶請求的資源匹配到具體的location后,會執行location對應的動作,location中動作的含義是:
include /etc/nginx/fastcgi_params; #表示nginx會調用fastcgi這個接口
fastcgi_intercept_errors on; #表示開啟fastcgi的中斷和錯誤信息記錄
fastcgi_pass 127.0.0.1:9000; # 表示nginx通過fastcgi_pass將用戶請求的資源發給127.0.0.1:9000進行解析,這里的nginx和php腳本解析服務器是在同一臺機器上,所以127.0.0.1:9000表示的就是本地的php腳本解析服務器。
根據nginx服務器的配置,可以看出,用戶訪問的是動態的php資源,nginx會調用php相關腳本解析程序對用戶訪問的資源進行解析。
第三步:通過第二步可以看出,用戶請求的是動態內容,nginx會將請求交給fastcgi客戶端,通過fastcgi_pass將用戶的請求發送給php-fpm
如果用戶訪問的是靜態資源呢,那就簡單了,nginx直接將用戶請求的靜態資源返回給用戶。
第四步:fastcgi_pass將動態資源交給php-fpm后,php-fpm會將資源轉給php腳本解析服務器的wrapper
第五步:wrapper收到php-fpm轉過來的請求后,wrapper會生成一個新的線程調用php動態程序解析服務器
如果用戶請求的是需要讀取例如MySQL數據庫等,將會觸發讀庫操作;
如果用戶請求的是如圖片/附件等,PHP會觸發一次查詢后端存儲服務器如通過NFS進行存儲的存儲集群;
第六步:php會將查詢到的結果返回給nginx
第七步:nginx構造一個響應報文將結果返回給用戶
這只是nginx的其中一種,用戶請求的和返回用戶請求結果是異步進行,即為用戶請求的資源在nginx中做了一次中轉,nginx可以同步,即為解析出來的資源,服務器直接將資源返回給用戶,不用在nginx中做一次中轉。
1.是不是每次用戶對動態資源的請求都需要觸發一次完整的動態資源解析過程?
不是,可以有兩種方法解決這個問題:
第一,啟用nginx本身具備的緩存功能,將動態資源解析結果緩存起來,下次用戶進行對應資源訪問時,nginx進行本次緩存查詢,如果查詢成功,則直接動態資源被解析后的靜態資源返回給用戶;
第二,在nginx后端部署緩存機器,如部署varnish緩存集群,對資源進行緩存,用戶請求的資源,可以先在緩存集群上進行查找;
2.用nginx做緩存是否可行?看實際情況,如果在整個web架構中,nginx不是瓶頸的前提下,nginx可以用來做緩存,但是不建議這么做,因為nginx是用戶請求和應答用戶請求的必經之路,如果nginx出現了瓶頸,后端的其他如存儲集群等性能再好也沒用,所以在實際的部署中,不建議啟用nginx的緩存功能(在將nginx作為http server的情況下)。因為啟用nginx緩存功能,一是會降低nginx性能,二是會消耗部署nginx的對應服務器的硬件資源。
3.如果用一張圖表示nginx fastcgi wrapper php之間的關系
4.fastcgi具體是個什么東西
CGI全稱通用網關接口 Commmon Gateway Interface
用于HTTP服務上的程序服務通信交流的一種工具,CGI程序須運行在網絡服務器上。
傳統CGI接口方式性能較差,由于每次HTTP服務器遇到動態程序需要重啟解析器來執行解析,然后結果被返回給HTTP服務器。這在處理高并發時,幾乎是不可能的,因此誕生了FastCGI。另外傳統的CGI接口方式安全性也很差
一個可伸縮地。高速地在HTTP服務器和動態腳本語言間通信的接口
接口在linux下是socket(這個socket可以是文件socket也可以是ip socket)
主要優點把動態語言和HTTP服務器分離開來。多數流行的HTTP服務器都支持FsatCGI包括Apache/Nginx/lighttpd等
支持語言比較流行的是PHP,接口方式采用C/S架構,可以將HTTP服務器和腳本解析器分開,同時在腳本解析服務器上啟動一個或者多個腳本解析守護進程。
當HTTP服務器每次遇到動態程序時,可以將其直接交付給FastCGI進程來執行,然后將得到的結果返回給瀏覽器。這種方式可以讓HTTP服務器專一地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提高了整個應用系統的性能。
5.具體的nginx + php的nginx相關配置
root@json:/data/web# cat /etc/nginx/nginx.conf|egrep -v "#|^$" user www-data; worker_processes 4; pid /var/run/nginx.pid; events { worker_connections 768; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; gzip on; gzip_disable "msie6"; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } root@json:/data/web# root@json:/data/web# cat /etc/nginx/conf.d/blog.conf server { root /data/web/blog/; index index.html index.htm; server_name www.fwait.com; location / { try_files $uri $uri/ /index.html; } location /blog/ { #alias /usr/share/doc/; auth_basic "authorized users only"; auth_basic_user_file /etc/nginx/passwd.conf; #autoindex on; allow 192.168.1.103; deny all; } location ~ \.php$ { #include /usr/local/etc/nginx/fastcgi.conf; include /etc/nginx/fastcgi_params; fastcgi_intercept_errors on; fastcgi_pass 127.0.0.1:9000; } } root@json:/data/web#
看完上述內容,你們對如何理解Nginx+PHP+FastCGI加速模式有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。