一、使用者對動態PHP網頁造訪流程
# 使用者瀏覽器發起網頁的存取:http://192.168.1.103/index.php
使用者和nginx伺服器進行三次握手進行TCP連線(忽略包括nginx存取控制策略、nginx防火牆等存取控制策略)
# 第一步:使用者將http請求傳送給nginx伺服器
第二步:nginx會根據使用者存取的URI和後綴對請求進行判斷
1.例如使用者存取的index.php,nginx則會根據設定檔中的location進行匹配,例如:
[email protected]:/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; } }<br>
使用者存取的是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相关配置
[email protected]:/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/*; } [email protected]:/data/web#<br>
[email protected]:/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; } } [email protected]:/data/web#<br>
以上是Nginx+PHP+FastCGI加速模式怎麼實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!