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), 相同的是第二和第三種模式一定是針對前后端完全分離的前提下進行的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM