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