LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

Nginx 反向代理(一):实现 http 协议反向代理

admin
2025年6月29日 18:36 本文热度 61

4 Nginx 反向代理

4.1 代理基础知识

代理分为两种,分别是正向代理和反向代理

正向代理(Forward Proxy) 和 反向代理(Reverse Proxy) 是两种常见的代理服务器,它们用于处理网络通信中的不同方向和用途

正向代理(Forward Proxy)

特点

  • 代理服务器位于客户端和目标服务器之间

  • 客户端向代理服务器发送请求,代理服务器将请求发送到目标服务器,并将目标服务器的响应返回给客户端

  • 目标服务器不知道客户端的存在,它只知道有一个代理服务器向其发送请求

  • 客户端通过正向代理访问互联网资源时,通常需要配置客户端来使用代理


用途

  • 突破访问限制:用于绕过网络访问限制,访问受限制的资源

  • 隐藏客户端身份:客户端可以通过正向代理隐藏其真实 IP 地址


反向代理(Reverse Proxy)

特点

  • 代理服务器位于目标服务器和客户端之间

  • 客户端向代理服务器发送请求,代理服务器将请求转发给一个或多个目标服务器,并将其中一个目标服务器的响应返回给客户端

  • 目标服务器不知道最终客户端的身份,只知道有一个代理服务器向其发送请求

  • 用于将客户端的请求分发给多个服务器,实现负载均衡


用途

  • 负载均衡:通过将流量分发到多个服务器,确保服务器的负载均匀分布

  • 缓存和加速:反向代理可以缓存静态内容,减轻目标服务器的负载,并提高访问速度

  • 安全性:隐藏真实服务器的信息,提高安全性,同时可以进行 SSL 终止(SSL Termination)


相同和不同

相同点

  • 中间层:正向代理和反向代理都是位于客户端和目标服务器之间的中间层。

  • 代理功能:它们都充当了代理的角色,处理请求和响应,使得通信更加灵活和安全


不同点

  • 方向:正向代理代理客户端,反向代理代理服务器

  • 目的:正向代理主要用于访问控制和隐藏客户端身份,反向代理主要用于负载均衡、缓存和提高安全性

  • 配置:客户端需要配置使用正向代理,而反向代理是对服务器透明的,客户端无需感知


4.2 Nginx 和 LVS

Nginx 和 LVS(Linux Virtual Server) 都是流行的代理和负载均衡解决方案,但它们有一些不同的特点和应用场景

选择使用 Nginx 还是 LVS 取决于具体的应用需求和复杂度。Nginx 更适合作为 Web 服务器和应用层负载均衡器,而 LVS 更适用于传输层负载均衡

相同点

  • 负载均衡:Nginx 和 LVS 都可以作为负载均衡器,将流量分发到多个后端服务器,提高系统的可用性和性能

  • 性能:Nginx 和 LVS 都具有高性能的特点,能够处理大量并发连接和请求


不同点

  • 层次:Nginx 在应用层进行负载均衡和反向代理,而 LVS 在传输层进行负载均衡

  • 功能:Nginx 除了负载均衡外,还可以作为反向代理和静态文件服务器;而 LVS 主要专注于负载均衡,实现简单而高效的四层分发

  • 配置和管理:Nginx 配置相对简单,易于管理,适用于各种规模的应用;LVS 需要深入了解 Linux 内核和相关配置,适用于大规模和对性能有更高要求的场景


LVS 不监听端口,不处理请求数据,不参与握手流程,只会在内核层转发数据报文

Nginx 需要在应用层接收请求,根据客户端的请求参数和Nginx中配置的规则,再重新作为客户端向后端服务器发起请求

LVS 通常做四层代理,Nginx 做七层代理

4.3 实现 http 协议反向代理

4.3.1 相关指令和参数

Nginx 可以基于ngx_http_proxy_module 模块提供 http 协议的反向代理服务,该模块是 Nginx 的默认模块

http://nginx.org/en/docs/http/ngx_http_proxy_module.html
proxy_pass URL; # 转发的后端服务器地址,可以写主机名,域名,IP地址,也可以额外指定端口                # 作用域 location, if in location, limit_exceptproxy_hide_header field; # Nginx 默认不会将后端服务器的 Date,Server,XPad,X-Accel-... 这些响应头信息传给客户端,除了这些之外的响应头字段会回传                # 可以使用 proxy_hide_header 显式指定不回传的响应头字段                # 作用域 http, server, locationproxy_pass_header field; # 显式指定要回传给客户端的后端服务器响应头中的字段                # 作用域 http, server, locationproxy_pass_request_body on|off# 是否向后端服务器发送客户端 http 请求的 body 部分,默认 on                # 作用域 http, server, locationproxy_pass_request_headers on|off# 是否向后端服务器发送客户端 http 请求的头部信息,默认 on                # 作用域 http, server, locationproxy_connect_timeout time; # Nginx与后端服务器建立连接超时时长,默认60S,超时会向客户端返回504                # 作用域 http, server, locationproxy_read_timeout time; # Nginx 等待后端服务器返回数据的超时时长,默认60S,超时会向客户端返回504                # 作用域 http, server, locationproxy_send_timeout time; # Nginx 向后端服务器发送请求的超时时长,默认60S,超时会向客户端返回408                # 作用域 http, server, locationproxy_set_body value; # 重新定义传给后端服务器的请求的正文,可以包含文本,变量等                # 作用域 http, server, locationproxy_set_header field value; # 更改或添加请求头字段并发送到后端服务器                # 作用域 http, server, locationproxy_http_version 1.0|1.1# 设置向后端服务器发送请求时的 http 协议版本,默认值1.0                # 作用域 http, server, locationproxy_ignore_client_abort on|off# 客户端中断连接,Nginx 是否继续执行与后端的连接,默认值 off,客户端中断,Nginx 也会中断后端连接,on 表示 客户端中断,nginx 还会继续处理与后端在连接                # 作用域 http, server, locationproxy_headers_hash_bucket_size size; # 当配置了 proxy_hide_header 和 proxy_set_header 的时候                # 用于设置nginx保存HTTP报文头的hash表的大小,默认值 64                # 作用域 http, server, locationproxy_headers_hash_max_size size; # 上一个参数的上限,默认值 512,作用域 http, server, locationproxy_next_upstream error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_403|http_404|http_429|non_idempotent| off ...; # 当前配置的后端服务器无法提供服务时,因为何种错误而去请求下一个后端服务器                # 默认值 error timeout,表示当前后端服务器因为 error 和 timeout 错误时,去请求另一个后端服务器,作用域 http, server, locationproxy_cache zone|off# 是否启用代理缓存,默认 off,不启用,zone 指缓存名称                # 作用域 http, server, locationproxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size[inactive=time] [max_size=size] [min_free=size] [manager_files=number][manager_sleep=time] [manager_threshold=time] [loader_files=number][loader_sleep=time] [loader_threshold=time] [purger=on|off][purger_files=number] [purger_sleep=time] [purger_threshold=time];                # 开启代理缓存后指定缓存数据的存放路径,作用域 http,默认没有设置                # path 表示缓存数据存放路径,要保证nginx 有写权限                # levels 表示缓存数据目录层级,16进制表示,levels=1:2 表示第一级有16个目录,0-f,第一级中每个目录下有16*16个子目录,00-ff                # keys_zone=name:size zone 表示缓存名称,先定义后使用,size 表示该zone 空间大小                # inactive 表示缓存数据生命周期,默认值10分钟                # max_size 表示缓存占用的磁盘空间最大能有多大proxy_cache_key string; # 指定缓存数据的key,不同的key 对应不同的缓存文件,作用域 http, server, location                # 默认值 $scheme$proxy_host$request_uriproxy_cache_valid [code ...] time; # 为不同响应状态码的数据设置不同的缓存时长,可设置多条,默认不设置                # 作用域 http, server, locationproxy_cache_use_stale error|timeout|invalid_header|updating|http_500|http_502|http_503|http_504|http_403|http_404|http_429|off ...; # 在后端服务器报哪些错误的情况下,直接使用过期缓存数据响应客户端请求                # 默认off,作用域 http, server, locationproxy_cache_methods GET|HEAD|POST ...; # 缓存哪些请求类型的数据,默认值 GET HEAD,作用域 http, server, location
4.3.2 基本配置
#转发到指定IPserver {  listen 80;  server_name www.m99-josedu.com;  #root /var/www/html/www.m99-josedu.com;  location / {    proxy_pass http://10.0.0.210#210要开启WEB服务,请求的是默认 default_Serve 配置  }}[root@ubuntu ~]# curl http://10.0.0.210hello world
#被转发到后端210[root@ubuntu ~]# curl http://www.m99-josedu.comhello world
#转发到指定IP指定端口server {  listen 80;  server_name www.m99-josedu.com;  location / {    proxy_pass http://10.0.0.210:8080;  }
#后端主机配置server {  listen 8080;  root /var/www/html/8080;}[root@ubuntu ~]# curl www.m99-josedu.comhello 8080
#转发到指定域名server {  listen 80;  server_name www.m99-josedu.com;  location / {    proxy_pass http://www.node-1.com;  }}[root@ubuntu ~]# cat /etc/hosts10.0.0.210 www.node-1.com
#后端主机配置server {  listen 80;  root /var/www/html/www.node-1.com;  server_name www.node-1.com;}[root@ubuntu ~]# echo "node-1" > /var/www/html/www.node-1.com/index.html
#测试[root@ubuntu ~]# curl www.m99-josedu.comnode-1
#透传指定参数#在上述请求中,客户端访问 http://www.m99-josedu.com,该主机收到请求后作为客户端去请求 http://www.node-1.com
#客户端主机配置[root@ubuntu ~]# cat /etc/hosts10.0.0.206 www.m99-josedu.com
#中间主机配置[root@ubuntu ~]# cat /etc/hosts10.0.0.210 www.m99-josedu.comserver {  listen 80;  server_name www.m99-josedu.com;  location / {    proxy_pass http://10.0.0.210;    proxy_set_header Host $http_host; #将客户端从请求头中传来的 Host 值传给后端服务器  }
#后端主机配置server {  listen 80;  root /var/www/html/www.m99-josedu.com;  server_name www.m99-josedu.com;}[root@ubuntu ~]# echo "m99" > /var/www/html/www.m99-josedu.com/index.html
#客户端测试[root@ubuntu ~]# curl http://www.m99-josedu.comm99
#如果后端服务不可用,从客户端访问会返回502
#停止后端nginx[root@ubuntu ~]# systemctl stop nginx.service#客户端访问中间Nginx[root@ubuntu ~]# curl http://www.m99-josedu.com<html><head><title>502 Bad Gateway</title></head><body><center><h1>502 Bad Gateway</h1></center><hr><center>nginx</center></body></html>
[root@ubuntu ~]# curl http://www.m99-josedu.com -IHTTP/1.1 502 Bad GatewayServer: nginxDate: Sun, 11 Feb 2025 12:41:53 GMTContent-Type: text/html; charset=utf8Content-Length: 150Connection: keep-alive
#如果连接后端服务器超时,会报504
#启动Nginx 服务,并设置防火墙规则,如果是中间服务器的请求就DROP[root@ubuntu ~]# systemctl start nginx.service[root@ubuntu ~]# iptables -A INPUT -s 10.0.0.206 -j DROP
#客户端测试,60S 后超时,显示504[root@ubuntu ~]# time curl http://www.m99-josedu.com<html><head><title>504 Gateway Time-out</title></head><body><center><h1>504 Gateway Time-out</h1></center><hr><center>nginx</center></body></html>
real 1m0.057suser 0m0.009ssys 0m0.010s
#修改超时时长为10Sserver {  listen 80;  server_name www.m99-josedu.com;  location / {    proxy_pass http://10.0.0.210;    proxy_set_header Host $http_host;    proxy_connect_timeout 10s;  }
#客户端再次测试[root@ubuntu ~]# time curl http://www.m99-josedu.com<html><head><title>504 Gateway Time-out</title></head><body><center><h1>504 Gateway Time-out</h1></center><hr><center>nginx</center></body></html>
real 0m10.032suser 0m0.005ssys 0m0.014s
#修改后端服务器策略[root@ubuntu ~]# iptables -F[root@ubuntu ~]# iptables -A INPUT -s 10.0.0.206 -j REJECT
#客户端测试直接返回 502[root@ubuntu ~]# time curl http://www.m99-josedu.com<html><head><title>502 Bad Gateway</title></head><body><center><h1>502 Bad Gateway</h1></center><hr><center>nginx</center></body></html>
real 0m0.013suser 0m0.005ssys 0m0.006s

4.3.3 实现动静分离

根据条件进行调度,实现动静分离

角色 
IP
Client 
10.0.0.208
Proxy Server 
10.0.0.206
API Server 
10.0.0.159
Static Server 
10.0.0.210


#client 配置
[root@ubuntu ~]# cat /etc/hosts10.0.0.206 www.m99-josedu.com
#Proxy Server 配置server {  listen 80;  server_name www.m99-josedu.com;  #root /var/www/html/www.m99-josedu.com;  location /api {    proxy_pass http://10.0.0.159;    proxy_set_header Host "api.m99-josedu.com";}
  location /static {    proxy_pass http://10.0.0.210;    proxy_set_header Host "static.m99-josedu.com";  }}
#API Server 配置server {  listen 80;  root /var/www/html/api.m99-josedu.com/;  server_name api.m99-josedu.com;}[root@ubuntu ~]# cat /var/www/html/api.m99-josedu.com/api/index.htmlapi
#Static Server 配置server {  listen 80;  root /var/www/html/static.m99-josedu.com;  server_name static.m99-josedu.com;}
[root@ubuntu ~]# cat /var/www/html/static.m99-josedu.com/static/index.htmlstatic[root@ubuntu ~]# curl http://www.m99-josedu.com/api/index.htmlapi[root@ubuntu ~]# curl http://www.m99-josedu.com/static/index.htmlstatic
proxy_pass 后面加斜线和不加斜线的区别
#没有斜线是追加# http://www.m99-josedu.com/api/index.html ----> http://api.m99-josedu.com/api/index.htmllocation /api {  proxy_pass http://10.0.0.159;  proxy_set_header Host "api.m99-josedu.com";
#有斜线是替换# http://www.m99-josedu.com/api/index.html -----> http://api.m99-josedu.com/index.htmllocation /api {  proxy_pass http://10.0.0.159/;  proxy_set_header Host "api.m99-josedu.com";}
实现对特定资源的代理
location ~ \.(jpe?g|png|bmp|gif)$ {  proxy_pass http://10.0.0.159;  proxy_set_header Host "api.m99-josedu.com";}

4.3.4 代理服务器实现数据缓存

前置条件:各服务器时间和时区先统一,方便测试

#Proxy Server 配置#定义缓存proxy_cache_path /tmp/proxycache levels=1:2 keys_zone=proxycache:20m inactive=60s max_size=1g;
server {  listen 80;  server_name www.m99-josedu.com;  location /static {    proxy_pass http://10.0.0.210;    proxy_set_header Host "static.m99-josedu.com";    proxy_cache proxycache; #使用缓存    proxy_cache_key $request_uri;    proxy_cache_valid 200 302 301 90s;    proxy_cache_valid any 2m; #此处一定要写,否则缓存不生效  }
#重载,生成缓存目录[root@ubuntu ~]# nginx -s reload[root@ubuntu ~]# ll /tmp/proxycache/total 8drwx------ 2 www-data root 4096 Feb 12 23:09 ./drwxrwxrwt 14 root root 4096 Feb 12 23:09 ../
#Static Server 配置server {  listen 80;  root /var/www/html/static.m99-josedu.com;  server_name static.m99-josedu.com;}[root@ubuntu ~]# ls -lh /var/www/html/static.m99-josedu.com/static/total 8.0K-rw-r--r-- 1 root root 657 Feb 12 15:14 fstab-rw-r--r-- 1 root root 7 Feb 12 04:42 index.html
#客户端测试[root@ubuntu ~]# curl http://www.m99-josedu.com/static/fstab
#查看 Proxy Server 上的缓存数据,文件名就是key 的 hash 值[root@ubuntu ~]# tree /tmp/proxycache//tmp/proxycache/└── 3└── ab└── 2d291e4d45687e428f0215bec190aab3
#并不是一个文本文件[root@ubuntu ~]# file /tmp/proxycache/3/ab/2d291e4d45687e428f0215bec190aab3/tmp/proxycache/3/ab/2d291e4d45687e428f0215bec190aab3: data
#查看当前时间和缓存文件时间[root@ubuntu ~]# dateMon Feb 12 11:35:55 PM CST 2025[root@ubuntu ~]# stat /tmp/proxycache/3/ab/2d291e4d45687e428f0215bec190aab3File/tmp/proxycache/3/ab/2d291e4d45687e428f0215bec190aab3Size1270 Blocks8 IO Block4096 regular fileDevice: fd00h/64768d Inode786517 Links1Access: (0600/-rw-------) Uid: ( 33/www-data) Gid: ( 33/www-data)Access2025-02-12 23:35:50.506517303 +0800Modify2025-02-12 23:35:50.506517303 +0800Change2025-02-12 23:35:50.506517303 +0800Birth2025-02-12 23:35:50.506517303 +0800
#除了文件内容外,还有头部信息[root@ubuntu ~]# cat /tmp/proxycache/3/ab/2d291e4d45687e428f0215bec190aab3
#生命周期结束后文件被删除[root@ubuntu ~]# dateMon Feb 12 11:36:54 PM CST 2025[root@ubuntu ~]# stat /tmp/proxycache/3/ab/2d291e4d45687e428f0215bec190aab3stat: cannot statx '/tmp/proxycache/3/ab/2d291e4d45687e428f0215bec190aab3': No such file or directory
#但是在缓存有效期内,后端服务器内容发生了更新,客户端获取的还是缓存数据#后端真实数据删除,客户端还能拿到缓存数据[root@ubuntu ~]# rm -f /var/www/html/static.m99-josedu.com/static/fstab
#客户端测试[root@ubuntu ~]# curl http://www.m99-josedu.com/static/fstab
#在Proxy Server 中添加响应头字段proxy_cache_path /tmp/proxycache levels=1:2 keys_zone=proxycache:20m inactive=60s max_size=1g;
server {  listen 80;  server_name www.m99-josedu.com;  location /static {    proxy_pass http://10.0.0.210;    proxy_set_header Host "static.m99-josedu.com";    proxy_cache proxycache;    proxy_cache_key $request_uri;    proxy_cache_valid 200 302 301 90s;    proxy_cache_valid any 2m;    add_header X-Cache $upstream_cache_status; #添加响应头,可以用来查看是否命中缓存  }
#当前没有级存文件[root@ubuntu ~]# tree /tmp/proxycache//tmp/proxycache/└── 3    └── ab
#客户端测试[root@ubuntu ~]# curl -I http://www.m99-josedu.com/static/fstabHTTP/1.1 200 OKServer: nginxDate: Mon, 12 Feb 2025 15:51:48 GMTContent-Type: application/octet-streamContent-Length: 657Connection: keep-aliveLast-Modified: Mon, 12 Feb 2025 15:14:44 GMTETag: "65ca35e4-291"X-Cache: MISS #首次访问,没有命中缓存,MISSAccept-Ranges: bytes
[root@ubuntu ~]# curl -I http://www.m99-josedu.com/static/fstabHTTP/1.1 200 OKServer: nginxDate: Mon, 12 Feb 2025 15:51:54 GMTContent-Type: application/octet-streamContent-Length: 657Connection: keep-aliveLast-Modified: Mon, 12 Feb 2025 15:14:44 GMTETag: "65ca35e4-291"X-Cache: HIT #缓存数据在生命周期内,被命中Accept-Ranges: bytes
#有无缓存对比,压力测试#后端服务器准备一个大文件[root@ubuntu ~]# ls -lh /var/www/html/static.m99-josedu.com/static/syslog-rw-r----- 1 root root 242K Feb 13 00:08 /var/www/html/static.m99-josedu.com/static/syslog
#100个客户端同时并发,总共发起1000个请求[root@ubuntu ~]# ab -c 100 -n 10000 http://www.m99-josedu.com/static/syslogThis is ApacheBench, Version 2.3 <$Revision: 1879490 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking www.m99-josedu.com (be patient)Completed 1000 requestsCompleted 2000 requestsCompleted 3000 requestsCompleted 4000 requestsCompleted 5000 requests......Total transferred: 3190000 bytesHTML transferred: 1620000 bytesRequests per second: 3300.30 [#/sec] (mean) #有缓存,每秒处理3300个请求Time per request: 30.300 [ms] (mean)Time per request: 0.303 [ms] (mean, across all concurrent requests)Transfer rate: 1028.12 [Kbytes/sec] received
#修改Proxy Server 配置,禁用缓存后再次测试proxy_cache_path /tmp/proxycache levels=1:2 keys_zone=proxycache:20m inactive=60s max_size=1g;
server {  listen 80;  server_name www.m99-josedu.com;  #root /var/www/html/www.m99-josedu.com;  location /api {    proxy_pass http://10.0.0.159/;    proxy_set_header Host "api.m99-josedu.com";}
  location /static {    proxy_pass http://10.0.0.210;    proxy_set_header Host "static.m99-josedu.com";    proxy_cache off;    proxy_cache_key $request_uri;    proxy_cache_valid 200 302 301 90s;    proxy_cache_valid any 2m;    add_header X-Cache $upstream_cache_status;  }}
[root@ubuntu ~]# ab -c 100 -n 10000 http://www.m99-josedu.com/static/syslogThis is ApacheBench, Version 2.3 <$Revision: 1879490 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking www.m99-josedu.com (be patient)Completed 1000 requestsCompleted 2000 requestsCompleted 3000 requestsCompleted 4000 requestsCompleted 5000 requests......Total transferred: 3190000 bytesHTML transferred: 1620000 bytesRequests per second: 1845.59 [#/sec] (mean) #不使用缓存,每秒处理 1845个请求Time per request: 54.183 [ms] (mean)Time per request: 0.542 [ms] (mean, across all concurrent requests)Transfer rate: 574.94 [Kbytes/sec] received

4.3.5 实现客户端IP地址透传

在使用 Nginx 做代理的情况下,默认后端服务器无法获取客户端真实IP地址

角色 
IP
Client 
10.0.0.208
Proxy Server 
10.0.0.206
Real Server 
10.0.0.210

默认情况下,后端服务器无法获取真实客户端IP
#Proxy Server 配置server {  listen 80;  server_name www.m99-josedu.com;  location / {    proxy_pass http://10.0.0.210;  }}
#Real Server 配置server {  listen 80 default_server;  listen [::]:80 default_server;  root /var/www/html;  index index.html index.htm index.nginx-debian.html;  server_name _;  location / {    return 200 ${remote_addr}---${http_x_real_ip}---${http_x_forwarded_for};  }}
#客户端测试,后端服务器只能获取代理服务器IP[root@ubuntu ~]# curl www.m99-josedu.com10.0.0.206------
修改代理服务器配置,透传真实客户端IP
server {  listen 80;  server_name www.m99-josedu.com;  #root /var/www/html/www.m99-josedu.com;  location / {    proxy_pass http://10.0.0.210;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  }
#表示将客户端IP追加请求报文中X-Forwarded-For首部字段,多个IP之间用逗号分隔,如果请求中没有X-Forwarded-For,就使用$remote_addr proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#客户端测试 $remote_addr 获取代理IP,$http_x_real_ip 获取真实客户端IP,$http_x_forwarded_for 获取真实客户端IP[root@ubuntu ~]# curl www.m99-josedu.com10.0.0.206---10.0.0.208---10.0.0.208
实现多级代理客户端IP透传

角色 
IP
Client 
10.0.0.208
Proxy Server - First 
10.0.0.206
Proxy Server - Second 
10.0.0.159
Real Server 
10.0.0.210


208
-->206-->159-->210
#Proxy Server - First 配置server {  listen 80;  server_name www.m99-josedu.com;  location / {    proxy_pass http://10.0.0.159;  }}
#Proxy Server - Second 配置server {  listen 80 default_server;  listen [::]:80 default_server;  root /var/www/html;  index index.html index.htm index.nginx-debian.html;  server_name _;  location / {    proxy_pass http://10.0.0.210;  }}
#Real Server 配置server {  listen 80 default_server;  listen [::]:80 default_server;  root /var/www/html;  index index.html index.htm index.nginx-debian.html;  server_name _;  location / {    return 200 ${remote_addr}---${http_x_real_ip}---${http_x_forwarded_for};  }
#客户端测试,Real Server 只能通过 $remote_addr 获取上一级代理的IP[root@ubuntu ~]# curl www.m99-josedu.com10.0.0.159------
修改第一级代理服务器配置
server {  listen 80;  server_name www.m99-josedu.com;  location / {    proxy_pass http://10.0.0.159;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  }
#客户端测试 $remote_addr 获取上一级代理IP,$http_x_real_ip 获取真实客户端IP,$http_x_forwarded_for 获取真实客户端IP[root@ubuntu ~]# curl www.m99-josedu.com10.0.0.159---10.0.0.208---10.0.0.208
继续修改第二级代理服务器配置
server {  listen 80 default_server;  listen [::]:80 default_server;  root /var/www/html;  index index.html index.htm index.nginx-debian.html;  server_name _;  location / {    proxy_pass http://10.0.0.210;    proxy_set_header X-Real-IP $remote_addr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  }
#客户端测试# $remote_addr 获取上一级代理IP# $http_x_real_ip 获取上上一级代理IP# $http_x_forwarded_for 累加了第一级代理的 X-Forwarded-For 和第二级代理的 X-ForwardedFor[root@ubuntu ~]# curl www.m99-josedu.com10.0.0.159---10.0.0.206---10.0.0.20810.0.0.206
第一级代理不透传,不添加请求头字段
server {  listen 80;  server_name www.m99-josedu.com;  location / {    proxy_pass http://10.0.0.159;    #proxy_set_header X-Real-IP $remote_addr;    #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  }
#客户端测试# $remote_addr 获取上一级代理IP# $http_x_real_ip 获取上上一级代理IP# $http_x_forwarded_for 获取上上一级代理IP[root@ubuntu ~]# curl www.m99-josedu.com10.0.0.159---10.0.0.206---10.0.0.206

— END —

阅读原文:原文链接


该文章在 2025/7/1 23:13:07 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved