Nginx-->進階-->原理-->Nginx+php+fastcgi的原理與關係

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

用戶瀏覽器發起對網頁的訪問:http://192.168.1.103/index.phphtml

用戶和nginx服務器進行三次握手進行TCP鏈接(忽略包括nginx訪問控制策略、nginx防火牆等訪問控制策略)node

第一步:用戶將http請求發送給nginx服務器linux

第二步:nginx會根據用戶訪問的URI和後綴對請求進行判斷nginx

1.例如用戶訪問的index.php,nginx則會根據配置文件中的location進行匹配,例如: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 /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中動做的含義是:json

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中作一次中轉。

2、相關疑問

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# 
複製代碼

 參考連接:

http://runningyongboy.blog.51cto.com/8234857/1722299

相關文章
相關標籤/搜索