Nginx location 和 proxy_pass路徑配置問題小結(jié)
本文是基于 location 的匹配末尾是否配置 / 和 proxy_pass 末尾是否配置 / ,進(jìn)行測試,完全還原了整個測試過程。幫助了解具體的情況。
一、Nginx location 基本配置
1.1、Nginx 配置文件
upstream test1{
server 127.0.0.1:8000;
}
upstream test2{
server 127.0.0.1:8000;
}
server{
server_name test.com;
listen 80;
access_log /usr/local/openresty/nginx/logs/test.com_access.log latest;
error_log /usr/local/openresty/nginx/logs/test.com.log error;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3s;
proxy_read_timeout 120s;
proxy_send_timeout 120s;
proxy_next_upstream error timeout invalid_header http_404 http_502 http_504 http_500;
location /user/ {
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://test1/;
}
location / {
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://test2/;
}
}
1.2 、Python 腳本
python2 可以運(yùn)行
該腳本用于獲取請求內(nèi)容。 這個作為后端,也就是 proxy_pass 代理的后端。
#!/usr/bin/env python
import SimpleHTTPServer
import SocketServer
PORT = 8000
class GetHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_GET(self):
print(self.headers)
self.send_response(200, "")
def do_POST(self):
print(self.headers)
content_length = self.headers.getheaders('content-length')
length = int(content_length[0]) if content_length else 0
print(self.rfile.read(length))
self.send_response(200, "")
Handler = GetHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
httpd.serve_forever()
二、測試
2.1、測試 location
末尾存在 / 和 proxy_pass末尾存在 /
nginx配置如下
location /user/ {
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://test1/;
}
請求url
test.com/user/test.html
后端內(nèi)容
打印的內(nèi)容:
Host: test1 Content-Length: 0 User-Agent: PostmanRuntime/7.26.8 Accept: */* Postman-Token: f2bfe770-4f44-4ee9-91c4-060f59dfb26c Accept-Encoding: gzip, deflate, br 127.0.0.1 - - [10/Apr/2021 16:54:26] "POST /test.html HTTP/1.1" 200 -
小結(jié)論:proxy_pass 地址加了 / 的話, 請求 test.com/user/test.html 實(shí)際請求是 http://test1/test.html。
2.2、測試 location
末尾存在 / 和 proxy_pass末尾不存在 /
nginx配置如下
location /user/ {
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://test1;
}
請求url
test.com/user/test.html
后端內(nèi)容
打印的內(nèi)容:
Host: test1
Content-Length: 0
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: e33d0a2c-1965-4152-b87c-94fca50f2899
Accept-Encoding: gzip, deflate, br127.0.0.1 - - [10/Apr/2021 16:57:18] "POST /user/test.html HTTP/1.1" 200 -
小結(jié)論: proxy_pass 地址不加了 / 的話, 請求 test.com/user/test.html 實(shí)際請求是 http://test1/user/test.html
2.3、測試三 location
不加末尾 / 且 proxy_pass 不加 末尾 /
nginx配置如下
location /user {
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://test1;
}
請求url
test.com/user/test.html
后端內(nèi)容
打印的內(nèi)容:
Host: test1
Content-Length: 0
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: 31cd33c6-4c95-41b5-a095-28cdc7113dcd
Accept-Encoding: gzip, deflate, br127.0.0.1 - - [10/Apr/2021 16:59:34] "POST /user/test.html HTTP/1.1" 200 -
請求 test.com/user/test.html 實(shí)際請求是 http://test1/user/test.html
2.4、location 不加
末尾 / 且 proxy_pass 加 末尾 /
nginx配置如下
location /user {
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://test1/;
}
請求url
test.com/user/test.html
后端內(nèi)容
打印的內(nèi)容:
Host: test1
Content-Length: 0
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: d0f4b83f-6482-41ba-8a01-c059eececc2d
Accept-Encoding: gzip, deflate, br127.0.0.1 - - [10/Apr/2021 17:00:21] "POST //test.html HTTP/1.1" 200 -
請求 test.com/user/test.html 實(shí)際請求是 http://test1//test.html
2.5、location 末尾
有 / proxy_pass 末尾其他有路徑,且末尾加 /
nginx配置如下
location /user/ {
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://test1/haha/;
}
請求url
test.com/user/test.html
后端內(nèi)容
打印的內(nèi)容:
Host: test1
Content-Length: 0
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: 6447cf0b-5988-4f96-81a4-2b621fe32604
Accept-Encoding: gzip, deflate, br127.0.0.1 - - [10/Apr/2021 17:03:27] "POST /haha/test.html HTTP/1.1" 200 -
請求 test.com/user/test.html 實(shí)際請求是 http://test1/haha/test.html
2.6、 location 末尾
有 / proxy_pass 末尾其他有路徑,且末尾不加 /
nginx配置如下
location /user/ {
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://test1/haha;
}
請求url
test.com/user/test.html
后端內(nèi)容
打印的內(nèi)容:
Host: test1
Content-Length: 0
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: 32fb2a50-1e7c-4131-9804-1828e21ca841
Accept-Encoding: gzip, deflate, br127.0.0.1 - - [10/Apr/2021 17:05:03] "POST /hahatest.html HTTP/1.1" 200 -
請求 test.com/user/test.html 實(shí)際請求是 http://test1/hahatest.html
三、總結(jié)
| 序號 | 訪問URL | location配置 | proxy_pass配置 | 后端接收的請求 | 備注 |
|---|---|---|---|---|---|
| 1 | test.com/user/test.html | /user/ | http://test1/ | /test.html | |
| 2 | test.com/user/test.html | /user/ | http://test1 | /user/test.html | |
| 3 | test.com/user/test.html | /user | http://test1 | /user/test.html | |
| 4 | test.com/user/test.html | /user | http://test1/ | //test.html | |
| 5 | test.com/user/test.html | /user/ | http://test1/haha/ | /haha/test.html | |
| 6 | test.com/user/test.html | /user/ | http://test1/haha | /hahatest.html |
注意上表格中的后端是指 python 腳本對應(yīng)的web服務(wù)。
在日常的web網(wǎng)站部署中,經(jīng)常會用到 nginx的 proxy_pass 反向代理,有一個配置需要弄清楚:配置 proxy_pass 時,
- 當(dāng)在后面的
upstram_name后面出現(xiàn)了/,相當(dāng)于是絕對根路徑,則nginx不會把location中匹配的路徑部分代理走; - 如果沒有
/,則會把匹配的路徑部分也給代理走。
到此這篇關(guān)于Nginx location 和 proxy_pass路徑配置詳解的文章就介紹到這了,更多相關(guān)Nginx location 和 proxy_pass路徑配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx如何使用openssl自簽名實(shí)現(xiàn)https登錄
這篇文章主要介紹了nginx使用openssl自簽名實(shí)現(xiàn)https登錄,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
關(guān)閉nginx空主機(jī)頭 防止nginx空主機(jī)頭及惡意域名指向
nginx的默認(rèn)配置中的虛擬主機(jī)允許用戶通過IP訪問,或者通過未設(shè)置的域名訪問,比如有人惡意把他自己的域名指向了你的ip,需要的朋友可以參考下2016-09-09
Nginx下配置pathinfo及ThinkPHP的URL Rewrite模式支持
這篇文章主要介紹了Nginx下配置pathinfo及ThinkPHP的URL Rewrite模式支持,使用Nginx運(yùn)行ThinkPHP的必備配置,需要的朋友可以參考下2015-07-07
解讀nginx反向代理location和proxy_pass的映射關(guān)系
這篇文章主要介紹了解讀nginx反向代理location和proxy_pass的映射關(guān)系,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Nginx配置srcache_nginx模塊搭配Redis建立緩存系統(tǒng)
這篇文章主要介紹了Nginx配置srcache_nginx模塊搭配Redis建立緩存系統(tǒng)的方法,文中關(guān)于Nginx模塊和Redis數(shù)據(jù)庫的安裝就不再說明了,這里只關(guān)注配置搭建階段,需要的朋友可以參考下2016-01-01

