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的配合。
- 啟動php-fpm后,監聽一個端口,默認監聽9000(見配置文件listen = 127.0.0.1:9000)
- 然后nginx配置,如果是PHP文件,則轉發給php-fpm程序處理。
- 接下來,當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 反向代理
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 后端處理。