用戶對動態PHP網頁訪問過程,以及nginx解析php步驟


www.example.com
|
Nginx
|
路由到www.example.com/index.php
|
加載nginx的fast-cgi模塊
|
fast-cgi監聽127.0.0.1:9000地址 .
|
www.example.com/index.php請求到達127.0.0.1:9000
|
php-fpm 監聽127.0.0.1:9000
|
php-fpm 接收到請求,啟用worker進程處理請求
|
php-fpm 處理完請求,返回給nginx
|
nginx將結果通過http返回給瀏覽器

 

一、用戶對動態PHP網頁訪問過程

用戶瀏覽器發起對網頁的訪問: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直接將用戶請求的靜態資源返回給用戶。

php-fpm進程管理器

php-fpm即php-Fastcgi Process Manager. 
php-fpm是 FastCGI 的實現,並提供了進程管理的功能。 
進程包含 master 進程和 worker 進程兩種進程。 
master 進程只有一個,負責監聽端口,接收來自 Web Server 的請求,而 worker 進程則一般有多個(具體數量根據實際需要配置),每個進程內部都嵌入了一個 PHP 解釋器,是 PHP 代碼真正執行的地方。

第四步: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;
}

}

原文:https://blog.csdn.net/riuhazen/article/details/78684584


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM