1. 程式人生 > >PHP-FPM,Nginx,FastCGI 之間的關係

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

轉載自:https://blog.tanteng.me/2017/11/nginx-fastcgi-php-fpm/

 

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

本文介紹 PHP-FPM,Nginx,FastCGI 三者之間的關係,以及 Nginx 反向代理和負載均衡的配置。

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

FastCGI 是一個協議,它是應用程式和 WEB 伺服器連線的橋樑。Nginx 並不能直接與 PHP-FPM 通訊,而是將請求通過 FastCGI 交給 PHP-FPM 處理。

 

1

2

3

4

5

6

7

8

9

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,如:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

location ^~ /seckill_query/ {

    proxy_pass http://ris.filemail.gdrive:8090/;

    proxy_set_header Host ris.filemail.gdrive;

}

 

location ^~ /push_message/ {

    proxy_pass http://channel.filemail.gdrive:8090/;

    proxy_set_header Host channel.filemail.gdrive;

}

 

location ^~ /data/ {

    proxy_pass http://ds.filemail.gdrive:8087/;

    proxy_set_header Host ds.filemail.gdrive;

}

通過 location 匹配 url 路徑,將其轉發到另外一個伺服器處理。

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

Nginx 負載均衡

介紹一下 upstream 模組:

負載均衡模組用於從”upstream”指令定義的後端主機列表中選取一臺主機。nginx先使用負載均衡模組找到一臺主機,再使用upstream模組實現與這臺主機的互動。

負載均衡配置:

 

1

2

3

4

5

6

7

8

9

10

11

12

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 上。

如:

 

1

fastcgi_pass http://php-upstream

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

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

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

proxy_pass 和 fastcgi_pass 的區別

一個是反向代理模組,一個是轉發給 factcgi 後端處理。