目錄
- 前言
- Nginx 根據域名反向代理
- Nginx proxy_pass 關於 '/' 的作用
1. 前言
接到一個需求,通過nginx 代理互聯網上某一個頁面,剛開始的時候覺得很簡單的,直接 proxy_pass 過去就完事了,測試了下還是想太多。具體記錄如下。
2. Nginx 根據域名反向代理
web服務器通常有三種訪問方式:
- 基於ip
- 基於域名
- 基於端口
而互聯網上暴露的網站多數都是通過 基於域名 的方式,如果直接通過解析后的IP訪問,可能就無法訪問到網站信息。我這里模擬了下這種方式,如下:
對應關系:
瀏覽器訪問域名:
瀏覽器訪問ip地址:
現在問題來了,當你的 nginx 配置 proxy_pass 的時候,得到的是 域名返回的結果 還是 ip地址返回的結果呢?這兩種返回的結果完全不同。
在另一台主機 [ 192.168.118.14 ] 上安裝 nginx 並配置好
配置nginx 方向代理
通過瀏覽器訪問 192.168.118.14
查看日志信息:
192.168.118.41 - - [23/Jul/2019:20:09:12 +0800] "GET / HTTP/1.1" 200 15 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-" "upstream_addr":"112.2.3.66:80"
結合上面的反饋, 可以得到,當 nginx 反向代理域名,會根據啟動時候解析出來的ip,加載到內存中,后面不會改變可以綁定hosts或者指定resolve服務器來固定ip
如果在使用 nginx 做反向代理的時候遇到以上相同的情況,解決辦法是 設置一個 proxy_set_header
proxy_set_header Host "[domain]";
配置完成,nginx -s reload 瀏覽器訪問:
現在就得到想要的頁面了。
3. Nginx proxy_pass 關於 '/' 的作用
有這樣一個服務器訪問如下:
訪問 http://192.168.118.15 得到
訪問 http://192.168.118.15/a/
在這台主機前端需要添加一個反向代理。配置如下:
第一種配置:
當這樣配置的時候,訪問 http://192.168.118.14/a/ 結果如下:
總結:
proxy_pass http://192.168.118.14/a/ --> http://192.168.118.15/
第二種配置:
當這樣配置的時候,訪問 http://192.168.118.14/a/ 結果如下:
總結:
proxy_pass http://192.168.118.14/a --> http://192.168.118.15/
綜上所述:
當 proxy_pass 不加 '/' 時, location uri 會追加到 proxy_pass http://domain/ 后面;
當 proxy_pass 加 '/' 時,不會在 proxy_pass http://domain 后面追加任何uri
切記以上兩條規則。