评论

收藏

[Nginx] Nginx location 和 proxy_pass路径配置问题小结

web服务器 web服务器 发布于:2021-09-29 20:59 | 阅读数:339 | 评论:0

本文是基于 location 的匹配末尾是否配置 / 和 proxy_pass 末尾是否配置 / ,进行测试,完全还原了整个测试过程,本文给大家介绍Nginx location 基本配置及相关配置文件,感兴趣的朋友跟随小编一起看看吧
本文是基于 location 的匹配末尾是否配置 / 和 proxy_pass 末尾是否配置 / ,进行测试,完全还原了整个测试过程。帮助了解具体的情况。

一、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 可以运行
该脚本用于获取请求内容。 这个作为后端,也就是 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
后端内容
打印的内容:
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 -
小结论:proxy_pass 地址加了 / 的话, 请求 test.com/user/test.html 实际请求是 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
后端内容
打印的内容:
Host: test1
Content-Length: 0
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: e33d0a2c-1965-4152-b87c-94fca50f2899
Accept-Encoding: gzip, deflate, br
127.0.0.1 - - [10/Apr/2021 16:57:18] "POST /user/test.html HTTP/1.1" 200 -
小结论: proxy_pass 地址不加了 / 的话, 请求 test.com/user/test.html 实际请求是 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
后端内容
打印的内容:
Host: test1
Content-Length: 0
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: 31cd33c6-4c95-41b5-a095-28cdc7113dcd
Accept-Encoding: gzip, deflate, br
127.0.0.1 - - [10/Apr/2021 16:59:34] "POST /user/test.html HTTP/1.1" 200 -
请求 test.com/user/test.html 实际请求是 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
后端内容
打印的内容:
Host: test1
Content-Length: 0
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: d0f4b83f-6482-41ba-8a01-c059eececc2d
Accept-Encoding: gzip, deflate, br
127.0.0.1 - - [10/Apr/2021 17:00:21] "POST //test.html HTTP/1.1" 200 -
请求 test.com/user/test.html 实际请求是 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
后端内容
打印的内容:
Host: test1
Content-Length: 0
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: 6447cf0b-5988-4f96-81a4-2b621fe32604
Accept-Encoding: gzip, deflate, br
127.0.0.1 - - [10/Apr/2021 17:03:27] "POST /haha/test.html HTTP/1.1" 200 -
请求 test.com/user/test.html 实际请求是 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
后端内容
打印的内容:
Host: test1
Content-Length: 0
User-Agent: PostmanRuntime/7.26.8
Accept: */*
Postman-Token: 32fb2a50-1e7c-4131-9804-1828e21ca841
Accept-Encoding: gzip, deflate, br
127.0.0.1 - - [10/Apr/2021 17:05:03] "POST /hahatest.html HTTP/1.1" 200 -
请求 test.com/user/test.html 实际请求是 http://test1/hahatest.html

三、总结
序号访问URLlocation配置proxy_pass配置后端接收的请求备注1test.com/user/test.html/user/http://test1//test.html 2test.com/user/test.html/user/http://test1/user/test.html 3test.com/user/test.html/userhttp://test1/user/test.html 4test.com/user/test.html/userhttp://test1///test.html 5test.com/user/test.html/user/http://test1/haha//haha/test.html 6test.com/user/test.html/user/http://test1/haha/hahatest.html
注意上表格中的后端是指 python 脚本对应的web服务。在日常的web网站部署中,经常会用到 nginx的 proxy_pass 反向代理,有一个配置需要弄清楚:配置 proxy_pass 时,

  • 当在后面的 upstram_name 后面出现了 /,相当于是绝对根路径,则 nginx 不会把 location 中匹配的路径部分代理走;
  • 如果没有 /,则会把匹配的路径部分也给代理走。
到此这篇关于Nginx location 和 proxy_pass路径配置详解的文章就介绍到这了,更多相关Nginx location 和 proxy_pass路径配置内容请搜索CodeAE代码之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持CodeAE代码之家!
原文链接:https://www.cnblogs.com/operationhome/p/15212801.html

关注下面的标签,发现更多相似文章