天天看點

nginx與PHP的關系

nginx和php有什麼關系?很多新手可能有這個疑問,我之前學php也沒注意這些問題,隻管着按文檔配置操作,完成php項目就不管了,最近特意總結了一下。

  

  php是一門程式設計語言,講究說學逗唱...呃,不對,是可以編寫很多程式,但是隻有php的話,你的php隻能在你的伺服器裡孤立的運作,比如你用php寫了一個可以通過身高計算人的标準體重的程式,雖然這個程式可以在伺服器運作,但是他還不能和客戶互動,因為客戶現在還不能通路你的php程式,他也不會去下載下傳你的php程式到自己電腦裡運作,他隻想默默的通過浏覽器告訴你他的身高,然後得到這個程式傳回的體重,那麼誰來得到這個使用者發送過來的請求呢,又怎麼把請求資料轉發給對應的php程式呢 ?

  nginx就是為了解決上述問題而出現的,nginx是一個已經寫好的程式,需要安裝配置,作用是專門接收處理客戶通過浏覽器等發送來的請求,并和你寫的php程式互動,就這麼簡單,但是nginx不僅可以和你寫的php程式互動,也可以和你寫的其他程式互動,比如C,python,因為不是所有人都用php來寫web程式,簡單點說nginx是一個可以監聽處理http請求(浏覽器請求)的程式,會裝會配置,知道流程就可以用了,當然深入了解下就更好了。

  這樣的話,nginx就可以比喻處理成處理http請求業務的部門,是伺服器和外部千千萬萬浏覽器等用戶端進行溝通的關口。php是伺服器内部一個資料加工部門,可以加工生成各種頁面。用戶端發送的http請求曆經層層路由到達你的伺服器,然後被nginx逮個正着,統一聽候nginx大人的排程,如果客戶請求的是其他靜态資源,比如txt文本,圖檔等,nginx直接找到該資源,并傳回給用戶端,如果客戶請求的是php程式,就找到對應的php程式,然後把客戶資料給這個程式,讓這個php程式運作一遍,再把這個程式運作的結果傳回給用戶端。

PHP的sapi有fpm的運作模式,或者說接口,就是一種通路PHP這個軟體的方式,nginx配合fpm這個接口,通路PHP程式,實作和PHP的配合。

  1. 啟動php-fpm後,監聽一個端口,預設監聽9000(見配置檔案listen = 127.0.0.1:9000)
  2. 然後nginx配置,如果是PHP檔案,則轉發給php-fpm程式處理。
  3. 接下來,當nginx軟體收到一個用戶端的請求後,根據配置檔案判斷是否是PHP檔案,如果是,則轉發給fpm程式,fpm處理完之後傳回結果給nginx,nginx再傳回結果給用戶端。

PHP-FPM,Nginx,FastCGI 之間的關系

FastCGI 是一個協定,它是應用程式和 WEB 伺服器連接配接的橋梁。Nginx 并不能直接與 PHP-FPM 通信,而是将請求通過 FastCGI 交給 PHP-FPM 處理。

location ~ \.php$ {
    try_files $uri /index.php =404;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}           

這裡 fastcgi_pass 就是把所有 php 請求轉發給 php-fpm 進行處理。通過 netstat 指令可以看到,127.0.0.1:9000 這個端口上運作的程序就是 php-fpm.

nginx與PHP的關系

Nginx 反向代理

Nginx 反向代理最重要的指令是 proxy_pass,如:

location ^~ /seckill_query/ {
    proxy_pass http://ris.xxmail.gdrive:8090/;
    proxy_set_header Host ris.xxmail.gdrive;
}
 
location ^~ /push_message/ {
    proxy_pass http://channel.xxmail.gdrive:8090/;
    proxy_set_header Host channel.xxmail.gdrive;
}
 
location ^~ /data/ {
    proxy_pass http://ds.xxmail.gdrive:8087/;
    proxy_set_header Host ds.xxmail.gdrive;
}           

通過 location 比對 url 路徑,将其轉發到另外一個伺服器處理。

通過負載均衡 upstream 也可以實作反向代理。

Nginx 負載均衡

介紹一下 upstream 子產品:

負載均衡子產品用于從”upstream”指令定義的後端主機清單中選取一台主機。nginx先使用負載均衡子產品找到一台主機,再使用upstream子產品實作與這台主機的互動。

負載均衡配置:

upstream php-upstream {
    ip_hash;
 
    server 192.168.0.1;
    server 192.168.0.2;
}
 
location / {
    root   html;
    index  index.html index.htm;
    proxy_pass http://php-upstream;
}           

該例定義了一個 php-upstream 的負載均衡配置,通過 proxy_pass 反向代理指令應用這個配置。這裡用的 ip_hash 算法,負載均衡的算法有多種,就不一一列舉了。

負載均衡也可以用在 fastcgi_pass 上。

如:

fastcgi_pass http://php-upstream           

如果使用負載均衡,可能存在一個 session 失效的問題,你的每次請求可能配置設定到不同的伺服器,一個解決方法是把 Memcached 或 Redis 作為 session 存儲的方式,而且還可以提高性能。

一些問題

反向代理和負載均衡是什麼關系

反向代理和負載均衡這兩個詞經常出現在一起,但他們實際上是不同的概念,負載均衡它更多的是強調的是一種算法或政策,将請求分布到不同的機器上,是以實際上也起到了反向代理的作用。

proxy_pass 和 fastcgi_pass 的差別

一個是反向代理子產品,一個是轉發給 factcgi 後端處理。

nginx與PHP的關系