1. 程式人生 > >使用者對動態PHP網頁訪問過程,以及nginx解析php步驟

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

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

相關推薦

使用者動態PHP網頁訪問過程以及nginx解析php步驟

一、使用者對動態PHP網頁訪問過程 使用者瀏覽器發起對網頁的訪問:http://192.168.1.103/index.php 使用者和nginx伺服器進行三次握手進行TCP連線(忽略包括nginx訪問控制策略、nginx防火牆等訪問控制策略) 第一步:使用者將http請求

12.13 Nginx防盜鏈 12.14 Nginx訪問控制 12.15 Nginx解析php相關配置 12.16 Nginx代理

12.13 nginx防盜鏈 12.14 nginx訪問控制 12.15 nginx解析php相關配置 12.16 nginx代理- 12.13 Nginx防盜鏈 - 12.14 Nginx訪問控制 - 12.15 Nginx解析php相關配置 - 12.16 Nginx代理 - 擴展 - 502問題匯總

12.13 Nginx防盜鏈 12.14 Nginx訪問控制 12.15 Nginx解析php相關配

12.13 Nginx防盜鏈 12.1412.13 Nginx防盜鏈 vim /usr/local/nginx/conf/vhost/test.com.conf加入location ~ ^.+.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)

關於springmvc框架的web工程從.xml到.java再到.jsp顯示到網頁上的過程以及jsp靜態檔案的訪問

作為一個初學者來說解決一個大難題是不容易的,要抓緊記錄下來分享給大家才行。 首先,你應該擁有一個配置好的環境和安裝好外掛的eclipse(需要用到web外掛,spring外掛和jsp外掛),以及tomcat的相關配置。 開啟瀏覽器輸入本地伺服器地址(一般是http

Nginx防盜鏈以及訪問控制Nginx解析php配置和代理

NginxNginx防盜鏈 1.編輯配置文件: [root@weixing01 ~]# vim /usr/local/nginx/conf/vhost/test.com.conf location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jp

Spring框架學習1.0動態代理的理解z自定義BeanFactory

自定義一個介面 和一個接實現類 public interface Hello { void setInfo(String a,String b); String getInfo(); void hah(String s); }/** * Creat

詳解SpringCloud-gateway動態路由兩種方式以及路由載入過程

gateway配置路由主要有兩種方式,一種是用yml配置檔案,一種是寫程式碼裡,這兩種方式都是不支援動態配置的。如: 下面就來看看gateway是如何載入這些配置資訊的。 1 路由初始化 無論是yml還是程式碼,這些配置最終都是被封裝到RouteDefinition

Easyui Datagrid 的Combobox 如何動態修改下拉選項以及值的轉換

options 解釋 logs sel onclick med rsize rip 原因 我是先將下拉選項的值通過datagrid的url查出來了,在每一行的row中 //項目結果選項卡的列表 $(‘#project_table‘).datagrid({

Nginx的防盜鏈、Nginx訪問控制、Nginx解析php的配置、Nginx代理

Linux學習筆記Nginx的防盜鏈 Nginx的訪問控制 禁止上傳圖片目錄裏php解析 Nginx解析php的配置 Nginx代理 Nginx的防盜鏈、Nginx的訪問控制、Nginx解析php的配置、Nginx代理

Nginx防盜鏈 Nginx訪問控制 Nginx解析php相關配置 Nginx代理

十二周四次課(3月15日)12.13 Nginx防盜鏈cd /usr/local/nginx/conf/vhostvi test.com.conf將以上內容復制到下圖位置測試,成功前提data/wwwroot/test.com目錄下要有1.gif12.14 Nginx訪問控制cd /usr/local/ngi

14.Nginx防盜鏈&Nginx訪問控制&Nginx解析php相關配置&Nginx代理

Nginx防盜鏈 Nginx訪問控制 Nginx解析php相關配置 Nginx代理 [toc] 一、Nginx防盜鏈: 1. 打開配置文件: 增加如下配置文件: [root@xavi ~]# cd /usr/local/nginx/conf/vhost/ [root@xavi vhost]#

四十九、Nginx防盜鏈、Nginx訪問控制、Nginx解析PHP相關配置、Nginx代理

Nginx防盜鏈 Nginx訪問控制 Nginx解析PHP相關配置 Nginx代理 四十九、Nginx防盜鏈、Nginx訪問控制、Nginx解析PHP相關配置、Nginx代理一、Nginx防盜鏈 必須和“不記錄日誌和過期時間”結合在一起,因為它們同時用到了location。# v

Nginx防盜鏈、Nginx訪問控制、Nginx解析php相關配置、Nginx代理

nginxNginx防盜鏈首先進入到/usr/local/nginx/conf/vhost/目錄下,編輯配置文件 vim test.com.confvim test.com.conf然後如數如下內容location ~ ^.+.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|b

49.Nginx防盜鏈、Nginx訪問控制、Nginx解析php相關配置、Nginx代理

Nginx防盜鏈 Nginx訪問控制 Nginx解析php相關配置 Nginx代理 一、Nginx防盜鏈 配置如下,可以和上面的配置結合起來 vim /usr/local/nginx/conf/vhost/test.com.conf location ~* ^.+\.(gif|jpg|p

display主要屬性的探究以及vertical-aligin

lln nbsp AD pad 沒有 com block ccf 圖片 display 首先要簡單說明一下display的主要3個主要屬性,分別為block,inline-block,inline,這裏只提及主要,關於其他的inherit,none等可以自行了解   inl

Django部署生產環境靜態文件不能訪問404以及圖片不能訪問403

以及 數據 col debug client localhost char clear IE 部署環境的搭建請看此博客https://blog.csdn.net/anifans9350/article/details/80145535 查看nginx.conf 文件,

Linux centos VMware Nginx防盜鏈、Nginx訪問控制、Nginx解析php相關配置、Nginx代理

jpeg htm dao bubuko youdao dir cal fastcgi real-ip 一、Nginx防盜鏈 配置如下,可以和上面的配置結合起來 location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|

Nginx防盜鏈 Nginx訪問控制 Nginx解析php相關配置 Nginx代理

nginx配置一、Nginx防盜鏈#vi /usr/local/nginx/conf/vhost/test.com.conf#/usr/local/nginx/sbin/nginx -t#/usr/local/nginx/sbin/nginx -s reload#curl -e "http://ww

HTTP/2 服務器推送(Server Push)教程(HTTP/2 協議的主要目的是提高網頁性能配置Nginx和Apache)

tcp tac 面板 參考 寫入 修改 現實 多個 後端 HTTP/2 協議的主要目的是提高網頁性能。 頭信息(header)原來是直接傳輸文本,現在是壓縮後傳輸。原來是同一個 TCP 連接裏面,上一個回應(response)發送完了,服務器才能發送下一個,現在可以多個回

48次課(Nginx防盜鏈、Nginx訪問控制、Nginx解析php相關配置、Nginx代理)

curl urn real-ip connect referer ini adf accept txt Nginx防盜鏈 編輯虛擬配置文件 [root@100xuni1 ~]# vim /usr/local/nginx/conf/vhost/test.com.conf