Nginx location 和 proxy()

  本篇文章为你整理了Nginx location 和 proxy()的详细内容,包含有 Nginx location 和 proxy,希望能帮助你了解 Nginx location 和 proxy。

  目录一、Nginx location 基本配置1.1、Nginx 配置文件1.2 、Python 脚本二、测试2.1、测试 location 末尾存在 / 和 proxy_pass末尾存在 /nginx配置如下请求url后端内容2.2、测试 location 末尾存在 / 和 proxy_pass末尾不存在 /nginx配置如下请求url后端内容2.3、测试三 location 不加末尾 / 且 proxy_pass 不加 末尾 /nginx配置如下请求url后端内容2.4、location 不加末尾 / 且 proxy_pass 加 末尾 /nginx配置如下请求url后端内容2.5、location 末尾有 / proxy_pass 末尾其他有路径,且末尾加 /nginx配置如下请求url后端内容2.6、 location 末尾有 / proxy_pass 末尾其他有路径,且末尾不加 /nginx配置如下请求url后端内容三、总结

  本文是基于 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

  
 

 

  小结论: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

  
 

 

  小结论: 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

  
请求 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

  
请求 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

  
请求 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

  
在日常的web网站部署中,经常会用到 nginx的 proxy_pass 反向代理,有一个配置需要弄清楚:配置 proxy_pass 时,

  当在后面的 upstram_name 后面出现了 /,相当于是绝对根路径,则 nginx 不会把 location 中匹配的路径部分代理走;

  如果没有 /,则会把匹配的路径部分也给代理走。

  
作者:理想三旬

  出处:

   本人承接各种项目维护和python项目开发, 如果觉得文章写得不错,或者帮助到您了,请点个赞,加个关注哦。运维学习交流群:544692191 本文版权归作者所有,欢迎转载,如果文章有写的不足的地方,或者是写得错误的地方,请你一定要指出,因为这样不光是对我写文章的一种促进,也是一份对后面看此文章的人的责任。谢谢。

  以上就是Nginx location 和 proxy()的详细内容,想要了解更多 Nginx location 和 proxy的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: