1. 程式人生 > 其它 >Nginx反向代理php的兩種方式

Nginx反向代理php的兩種方式

第一種: 傳統的LNMP方式

這種我稱之為最古老的代理方式, 一般是流量入口放置一個Nginx, 然後proxy_pass到 Nginx + PHP的系統(Nginx解析http協議轉發給fastcgi_pass交由php處理), 通常的配置如下: 每臺PHP機器都會附加一個Nginx

# 這裡只是php機器的配置, 一般流量會通過前置的負載均衡/Nginx服務轉發到此
server {
    listen 80;
    server_name xxx.test.com;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php($|/) {
        # 設定專案根目錄 chroot
        set $PROJECT_NAME "程式碼路徑/public";
        include     fastcgi_params;
        fastcgi_pass  127.0.0.1:9000;   # 基於本地迴環地址
        fastcgi_index  index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param  SCRIPT_FILENAME  $PROJECT_NAME$fastcgi_script_name;
    }
}

第二種: 遠端代理方式

何為遠端代理,我給的定義是基於網路的代理方式簡單來說是把PHP主機的Nginx拆分出去, PHP主機上就只有PHP服務,通過遠端呼叫請求PHP。

upstream test {
    192.168.10.100:9000  weight=100 max_fails=3 fail_timeout=30s;
}

server {
    listen 80;
    server_name xxx.test.com;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php($|/) {
        # 設定專案根目錄
        set $PROJECT_NAME "程式碼路徑/public";
        # 設定upstream_name
        set $fastcgi_name test;

        index index.php index.html index.htm;
        include     fastcgi_params;
        fastcgi_pass  $fastcgi_name;
        fastcgi_index  index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param  SCRIPT_FILENAME  $PROJECT_NAME$fastcgi_script_name;  # 指定專案根目錄
}
tips:
    php-fpm的配置需要監聽其他地址:
        listen = 127.0.0.1:9000             --> listen = :9000
        listen.allowed_clients = 127.0.0.1  --> ;listen.allowed_clients = 127.0.0.1
  • 這種方式有什麼優勢呢?
    • 收斂了Nginx服務和配置, php機器無需再安裝Nginx服務, 便於配置統一管理
    • 配置可以託管於gitlab,變更可溯源/可評審,拒絕登入機器改動, 藉助ansible+jenkins批量更新配置

第三種: 更簡單的代理方式

upstream test {
    192.168.10.100:9000  weight=100 max_fails=3 fail_timeout=30s;
}

server {
    listen 80;
    server_name xxx.test.com;

    location /  {
	    set $PROJECT_NAME "程式碼路徑/public/index.php";
        fastcgi_pass  test;
        fastcgi_index  index.php;
        include     fastcgi_params;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param  SCRIPT_FILENAME  $PROJECT_NAME;
    }
}

這種方式相較於第二種方式,少了一次內部重定向(try_files), 相同的是第二和第三種模式一定是針對前後端完全分離的前提下進行的。