nginx 反向代理相關問題
- 需求:
關於一個多語言站點的部署,只有中文站點在國內,多於站點部署在國外,國外是主營業務,所以國外算是主站點,域名類似comunity.xx.com
,英語和小語
種都是透過sg|au|fr|de|ru|jp|it
訪問,國內透過cn
訪問,國內的在國內伺服器,透過nginx代理訪問國內。
- 環境
語言 | 伺服器 | 資料庫 | 前臺框架 | 後臺框架 | 伺服器化境 |
---|---|---|---|---|---|
php7.2 | nginx | mysql5.7 | laravel5.8 | laravel-admin | CentOS7 |
- 大致的訪問流程,
nginx1
是https
,nginx2
是http
comunity.xx.com/de|ru|jp|
訪問主伺服器 nginx1
處理返回結果
comunity.xx.com/cn
訪問主伺服器 nginx1
,伺服器nginx1
做一次代理轉發到國內伺服器nginx2
,處理返回結果
- nginx1 配置
server {
listen 80; server_name php.xxx.com; root html; index index.html index.htm;
}
server {
listen 443; server_name php.xxx.com; root html; index index.html index.htm; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; } location /cn {
proxy_pass http://192.168.1.100:6060; proxy_set_header Host $server_name; proxy_set_header X-Real-IP $remote_addr;#把源IP 【$remote_addr,建立HTTP連線header裡面的資訊】賦值給X-Real-IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 作為代理伺服器時,設定的IP列表,會把經過的機器ip,代理機器ip都記錄下來
}}
- nginx2 配置
server {
listen 6060; server_name localhost; root html; index index.html index.htm; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; } location /cn {
proxy_pass http://192.168.1.100:6060; proxy_set_header Host $server_name; proxy_set_header X-Real-IP $remote_addr;#把源IP 【$remote_addr,建立HTTP連線header裡面的資訊】賦值給X-Real-IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 作為代理伺服器時,設定的IP列表,會把經過的機器ip,代理機器ip都記錄下來
}}
- 遇到問題
1. 在本地部署一臺服務,然後在虛擬機器部署一臺服務,模擬線上環境,在切換到cn
站點的時候,可以正確使用laravel
route()
函式得到正確的url連結,
但是在正式環境,使用route()
函式得到的連結是php.xxx.com/abc
少了cn
。我想要得到的是php.xxx.com/cn/abc
,
使用reauest()->url()
得到的當前連結,在cn
站點也是會少了cn
。路由寫的都是正確的,輸入路由都可以得到正確的網頁,所以不會是路由寫錯了的問
題。後來透過設定app('url')->forceScheme('https');app('url')->forceRootUrl('https://php.xxx.com/cn');
可以生成我想要的鏈
接了,但是reauest()->url()
這個函式目前依然生成的連結缺少cn
,目前我已經儘量復原線上的環境了,本地測試沒有問題,但是到線上還是有點問題。
雖然使用別的方式解決了生成當前連結的問題,但是使用reauest()->url()
這個函式依然會有問題,除非我不使用laravel中的生成連結的函式,但是專案
中使用route()
函式的地方太多了。
2. 再說後臺的問題,laravel-admin
的後臺,開啟了配置檔案admin.php
中的https'secure' => env('ADMIN_HTTPS', false),
訪問連結也是
問題不斷,使用URL::current()
函式拿取當前連結,連結拿取不到,拿到的連結只有協議,沒有域名。載入的靜態資源還是載入的主伺服器的靜態資源,把
靜態資源加上cn
會顯示404
的狀態碼。
目前的思路就是從兩方面,一個是nginx的代理方面,一個是框架程式碼方面。暫未解決
本作品採用《CC 協議》,轉載必須註明作者和本文連結