nginx 反向代理

Nginx是一个高性能的开源Web服务器,同时也可以用作反向代理服务器。反向代理是一种服务器的行为模式,它接收客户端的请求,然后将这些请求转发给后端的服务器,最终将后端服务器的响应返回给客户端。这样做的一个常见用途是将客户端的请求分发给多个后端服务器,以实现负载均衡。

代理设置

nginx使用proxy_pass指令来进行跳转到上游服务。proxy_pass指令一般出现在location块内进行匹配的路径跳转。

语法

复制代码
proxy_pass URL;

如下:

复制代码
location / {
  proxy_pass http://backend_server; 
}

proxy_pass后跟location匹配的路径跳转的代理服务地址。

向后转发的地址路径根据proxy_pass指定的URL不同有一些区别,大致分两种情况:

  • proxy_pass指定的URL不带路径,即只有协议,ip和端口信息,则location匹配的请求地址uri会完全传递到后端被代理服务器。如

    location / {
    proxy_pass http://192.168.1.100:8080;
    }

访问/test则整个资源路径(/test)会被传递给后端被代理服务,也即最后访问http://192.168.1.100:8080/test

不带路径还有一种特殊情况,就是 location使用正则匹配,则proxy_pass指定的URL不能带路径。一般情况下在做反向代理的时候都是进行前缀匹配就可以了,不会使用正则。

  • proxy_pass指定的URL带路径,则location匹配的部分会被替换成proxy_pass的URL

复制代码
location /api/ {
  proxy_pass http://192.168.1.100:8080/api/; 
}

访问/api/test 则会访跳转到http://192.168.1.100:8080/api/test。因为/api/test中的/api/部分是location匹配段被替换成了proxy_pass指定的URL。

这里注意URL带路径即使只有一个/也是路径,如

复制代码
location /api/ {
  proxy_pass http://192.168.1.100:8080/; 
}

这个时候访问/api/test则转为http://192.168.1.100:8080/test。

指定的URL需不需要以/结尾这个要结合location匹配信息来处理

以下表格列举表达下不同场景的效果

location proxy_pass 访问路径 跳转代理服务路径
/app/ http://localhost:5000/api/ /app/foo /api/foo
/app/ http://localhost:5000/api /app/foo /apifoo
/app http://localhost:5000/api/ /app/foo /api//foo
/app http://localhost:5000/api /app/foo /api//foo
/app http://localhost:5000/api /appfoo /apifoo

反正URL带路径时候记住一点,location匹配的部分会被URL替换

代理header设置

在进行反向代理的时候,客户端访问nginx,然后nginx在访问上游服务,这个时候上游服务实际上只间接和nginx进行打交道,客户端和上游服务直接没有直接网络访问,这个时候上游服务是获取不到客户端真实的IP的。不过nginx做反向代理的时候可以设置参数将客户端IP传递给上游服务,这就可以使用proxy_set_header指令将客户端IP设置到nginx跳转到上游服务的请求头中

proxy_set_header指令允许从新定义或新增header头参数传递给被代理服务。语法:

复制代码
proxy_set_header field value;

如传递客户端IP可以使用如下设置:

复制代码
    location / {
        proxy_pass http://upstream;
        # 设置请求头中的Host字段为客户端请求的Host
        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 X-Real-IP $remote_addr; 将客户端的真实 IP 地址赋值给 X-Real-IP 头,这是一个备用的客户端 IP 地址头。

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 将客户端的真实 IP 地址追加到 X-Forwarded-For 头中,这个头通常用于代理和负载均衡场景,用来传递客户端的真实 IP 地址列表。

通过这样的配置,上游服务就可以通过解析 X-Forwarded-For 头来获取客户端的真实 IP 地址了。需要注意的是,X-Forwarded-For 头中可能包含多个 IP 地址,因为请求可能会经过多个代理服务器。因此,上游服务需要根据具体情况来选择合适的 IP 地址。

例如java就可以通过HttpServletRequest对象来获取上面两个参数:

复制代码
request.getHeader("X-Forwarded-For");
request.getHeader("X-Real-IP");

除了使用proxy_set_header来设置请求代理服务器的头参数,也可以设置响应客户端的头参数。

proxy_hide_header来设置响应信息的哪些头信息不传给客户端。例如隐藏代理服务的服务版本:

复制代码
proxy_hide_header X-Powered-By;

X-Powered-By将不会传递给客户端。

proxy_pass_header将一些不允许转发的头信息传递给客户端,如默认情况下服务端的Server和Date不会传递给客户端,使用proxy_pass_header可以将其允许传递给客户端,一般不用设置默认即可

复制代码
proxy_pass_header Server;
proxy_pass_header Date;

另外还可以使用proxy_http_version来指定代理的协议版本、proxy_method来指定代理的请求方法类型。

相关推荐
乐维_lwops5 小时前
2026年如何实现多分支机构全网设备统一运维监控一
运维·cmdb·运维监控·网管·agent ops
视觉AI6 小时前
VS Code Remote-SSH 连接Jetson踩坑完整解决记录(网段不通+主机密钥变更双重故障)
运维·网络·人工智能·windows·ssh·边缘计算
银河麒麟操作系统6 小时前
闸机高效稳跑,通勤提速升级!银河麒麟赋能北京轨交新基建
运维·服务器·安全·交通物流
六点_dn6 小时前
Linux学习笔记-printf命令
linux·运维·算法
蜡台6 小时前
Linux Python 安装使用
linux·运维·服务器
147API6 小时前
OpenAI新增工作区Admin keys,管理自动化怎么拆权限
运维·人工智能·自动化·openai·api
喵喵喵~~~~7 小时前
2026 指挥控制台源头工厂深度测评:按行业项目落地能力择优采购指南
大数据·运维·人工智能·智能家居
小顿的企业观察8 小时前
从人形机器人到AI销售智能体,AI正在重塑中企出海的底层逻辑
大数据·运维·人工智能·机器人·产品运营·制造
工业HMI实战笔记8 小时前
【拯救HMI】:低碳制造:自动化技术如何助力企业节能降耗
运维·前端·自动化·交互·制造
小宏运维有点菜9 小时前
JumpServer
linux·运维