前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx Proxy 知识点解析

Nginx Proxy 知识点解析

作者头像
用户1560186
发布2019-11-19 20:57:11
2.1K0
发布2019-11-19 20:57:11
举报
文章被收录于专栏:运维录运维录运维录

nginx proxy 介绍

一般,nginx中有两个模块都有proxy_pass指令.

  • ngx_http_proxy_module 的 proxy_pass
语法: proxy_pass URL;
场景: location, if in location, limit_except
说明: 设置后端代理服务器协议(protocol)和地址(address),以及location中可以匹配的一个可选的URI.协议可以是"http"或"https".地址可以是一个域名或ip地址和端口,或者一个 unix-domain socket路径.
详见官方文档: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
  • ngx_stream_proxy_module 的 proxy_pass
语法: proxy_pass address;
场景: server
说明: 设置后端代理服务器的地址。这个地址(address)可以是一个域名或ip地址和端口,或者一个 unix-domain socket路径.
详见官方文档: http://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_pass

proxy_pass用法

  • ngx_stream_proxy_module
server {
    listen 127.0.0.1:80;
    proxy_pass 127.0.0.1:8080;
}

server {
    listen 80;
    proxy_connect_timeout 1s;
    proxy_timeout 1m;
    proxy_pass abc.com;
}

server {
    listen 53 udp;
    proxy_responses 1;
    proxy_timeout 20s;
    proxy_pass dns.abc.com:53;
}

server {
    listen [::1]:80;
    proxy_pass unix:/tmp/stream.socket;
}
  • ngx_http_proxy_module
server {
    listen      80;
    server_name www.abc.com;

   upstream websocket {
        server 192.168.100.10:8010;
    }

    # 正常代理,不修改后端url的
    location /testa/ {
        proxy_pass http://127.0.0.1;
    }

    # 修改后端url地址的代理(本例后端地址中,最后带了一个斜线)
    location /testb {
        proxy_pass http://www.test.com:8801/;
    }

    # 使用 if in location
    location /google {
        if ( $geoip_country_code ~ (RU|CN) ) {
            proxy_pass http://www.google.hk;
        }
    }

    location /testc/ {
        # 没有匹配 limit_except 的,代理到 unix:/tmp/backend.socket:/uri/
        proxy_pass http://unix:/tmp/backend.socket:/uri/;;

        # 匹配到请求方法为: PUT or DELETE, 代理到9080
        limit_except PUT DELETE {
            deny all;
        }
    }

    location /wsapp/ {
    proxy_pass http://websocket;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    }

}

proxy_pass 指令/ 解析

首先,我们看上边的两个例子

    location /testa/ {
        proxy_pass http://127.0.0.1;
    }

    location /testb {
        proxy_pass http://www.test.com/;
    }

    #错误写法
    location ~ /testd {
        proxy_pass http://127.0.0.1:8801/; # 记住,location为正则表达式时,不能这样写!!!
    }

区别只在于proxy_pass转发的路径后是否带 “/”, - 针对不带/, 假如我们访问的url=http://www.abc.com/testa/test.php, 则通过nginx代理后,请求的路径访问地址为http://www.abc.com/testa/test.php - 针对带/, 假如我们访问的url=http://www.abc.com/testb/test.php, 则通过nginx代理后,请求的路径访问地址为http://www.abc.com/test.php - 实现上述效果也可以通过rewrite来实现,代码如下

location ^~ /test/
    {
    proxy_set_header Host www.abc.com;
    rewrite /testb/(.+)$ /$1 break;
    proxy_pass http://www.abc.com;
    }

proxy_set_header 解析

proxy_set_header
Syntax: proxy_set_header field value
Default: Host $proxy_host / Connection close
Context: http / server / location
Reference: proxy_set_header
  • 当nginx作为反向代理使用,而如果后端服务器有防盗链或根据http请求头中的host字段来进行路由或判断功能的话,如nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】
  • 同理,X_Forward_For字段表示该条http请求是有谁发出的,如果反向代理服务器不重写该请求头的话,那么后端服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就无法访问了。
  • 因此,一般我们用以下nginx中增加以下配置:
proxy_set_header Host $http_host;
proxy_set_header X-Forward-For $remote_addr;

需要注意的是:如果Host请求头部没有出现在请求头中,则$http_host值为空,但是$host值为主域名。因此,一般而言,会用$host代替$http_host变量,从而避免http请求中丢失Host头部的情况下Host不被重写的失误。

proxy_pass 与 tomcat session丢失

闲言少叙,直接看nginx修改前后的配置文件:

    location  / {
        proxy_pass http://10.40.15.43:8080/testf/;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP       $remote_addr;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

修改后的配置文件:

    location  / {
        proxy_pass http://10.40.15.43:8080/testf/;
        proxy_redirect off;
        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_set_header   Cookie $http_cookie;
        add_header From admin.abc.com.cn;
        proxy_cookie_path /testf/ /;
        chunked_transfer_encoding       off;
        }

问题分析:原来配置会导致cookie存储的位置不是基于“/”那么在第二次访问的时候会从新创建session,因此session中的信息丢失,因此修改cookeie的存储路径解决问题。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • nginx proxy 介绍
  • proxy_pass用法
  • proxy_pass 指令/ 解析
  • proxy_set_header 解析
  • proxy_pass 与 tomcat session丢失
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档