Nginx反向代理php的兩種方式
阿新 • • 發佈:2022-04-12
第一種: 傳統的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), 相同的是第二和第三種模式一定是針對前後端完全分離的前提下進行的。