場景1:因服務器限制,所以只對外開放了一個端口,但是需要請求不同的外網環境,所以在中轉服務器上用nginx做了一次轉發
實現:
1
2
3
4
5
6
7
8
9
10
|
server { listen 8051; server_name localhost; location /license/ { proxy_pass http: //xxx .xxx.xxx.xxx:8058/; } location / { proxy_pass http: //xxx .xxx.xxx.xxx:8051/; } } |
特別注意:
敲黑板:此處如果涉及到文件上傳的轉發,相應在server_name下添加client_max_body_size 100m;
域名轉發的地址,proxy_pass后面必須跟"/",否則會造成轉發不正常
在nginx中配置proxy_pass代理轉發時,如果在proxy_pass后面的url加/,表示絕對根路徑;
如果沒有/,表示相對路徑,把匹配的路徑部分也給代理走。
假設下面四種情況分別用 http://192.168.1.1/proxy/aerchi.html 進行訪問。
第一種:
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
代理到URL:http://127.0.0.1/aerchi.html
第二種(相對于第一種,最后少一個 / )
location /proxy/ {
proxy_pass http://127.0.0.1;
}
代理到URL:http://127.0.0.1/proxy/aerchi.html
第三種:
location /proxy/ {
proxy_pass http://127.0.0.1/aaa/;
}
代理到URL:http://127.0.0.1/aaa/aerchi.html
第四種(相對于第三種,最后少一個 / )
location /proxy/ {
proxy_pass http://127.0.0.1/aaa;
}
代理到URL:http://127.0.0.1/aaaaerchi.html
場景2:因業務需要,一套前段代碼需要映射到兩個后臺地址上,所以需要在接口上進行區分轉發,同時轉發時需要把區分標志去掉
實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
server { listen 0.0.0.0:8204; server_name localhost; # 靜態頁面目錄 root E:\xxxxxxx; # 默認首頁 index /index .html; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_cookie_path /* /*; client_max_body_size 100m; location ~* /wx/ (.*) { #根絕接口是否包含/wx/來區分 # 動態頁面,交給tomcat處理 if ( !-e $request_filename) { proxy_pass http: //127 .0.0.1:8091/$1; #轉到后臺時需要把/wx去掉 } } location / { # 用戶瀏覽器端的緩存設置 location ~* \.(css|js|jpg|jpeg|gif|png|swf|htm|html|json|xml|svg|woff|ttf|eot|map|ico)$ { expires -1; if (-f $request_filename) { break ; } } # 動態頁面,交給tomcat處理 if ( !-e $request_filename) { proxy_pass http: //127 .0.0.1:8092; #proxy_cookie_path /* /*; } } error_page 500 502 503 504 /50x .html; location = /50x .html { root html; } } |
特別注意:
1、 proxy_set_header Host $http_host;
不改變請求頭 。
2、proxy_set_header Host host;如果客戶端請求頭中沒有攜帶這個頭部,那么傳遞到后端服務器的請求也不含這個頭部。這種情況下,使用 host;如果客戶端請求頭中沒有攜帶這個頭部,那么傳遞到后端服務器的請求也不含這個頭部。 這種情況下,使用host;如果客戶端請求頭中沒有攜帶這個頭部,那么傳遞到后端服務器的請求也不含這個頭部。這種情況下,使用host變量它 的值在請求包含“Host”請求頭時為“Host”字段的值,在請求未攜帶“Host”請求頭時為虛擬主機的主域名;
3、proxy_set_header Host host: host:host:proxy_port;
服務器名可以和后端服務器的端口一起傳送:
4、如果某個請求頭的值為空,那么這個請求頭將不會傳送給后端服務器:
proxy_set_header Accept-Encoding “”;
5、用戶真實的ip地址轉發給后端服務器
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
場景3:前段代碼用vue實現,vue沒有具體的頁面,也是通過/xx/xx來訪問資源,這時候需要與后臺接口進行區分
實現:
可以通過特殊字符類似“#”來區分,攜帶#的請求默認是靜態資源
1
2
3
4
5
6
|
location ~* \.( #|css|js|jpg|jpeg|gif|png|swf|htm|html|json|xml|svg|woff|ttf|eot|map|ico)$ { expires -1; if (-f $request_filename) { break ; } } |
場景4:因服務器限制,數據庫訪問需要nginx進行轉發
實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
stream { upstream cloudsocket { hash $remote_addr consistent; server 數據庫實際ip:3306 weight=5 max_fails=3 fail_timeout=30s; } server { listen 127.0.0.1:8058; #本機代理端口 proxy_connect_timeout 10s; proxy_timeout 300s; #設置客戶端和代理服務之間的超時時間,如果5分鐘內沒操作將自動斷開。 proxy_pass cloudsocket; } } |
特別注意:
stream與http同級,所以不要放到http里
場景5:訪問某域名時需要重定向到另一個地址
實現:
1
2
3
4
5
6
7
8
9
|
server { listen 7000; server_name localhost; client_max_body_size 100m; location = / { rewrite ^(.*) https: //www .baidu.com permanent; } } |
特別注意:
last 本條規則匹配完成后繼續向下匹配新的location URI規則
break 本條規則匹配完成后終止,不在匹配任何規則
redirect 返回302臨時重定向
permanent 返回301永久重定向
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/xiufengd/p/13162044.html