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

來源:互聯網
上載者:User

標籤:行儲存   附件   返回   程式   ash   soc   安全性   enable   控制   

一、使用者對動態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;    }}

使用者訪問的是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#

 

[email protected]:/data/web# cat /etc/nginx/conf.d/blog.confserver {    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# 

 參考連結:

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.