ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Nginx 如何实现正向代理、反向代理与透明代理?一文讲透负载均衡、主备冗余与 Docker 化部署

Nginx 如何实现正向代理、反向代理与透明代理?一文讲透负载均衡、主备冗余与 Docker 化部署 Nginx 如何实现正向代理、反向代理与透明代理一文讲透负载均衡、主备冗余与 Docker 化部署摘要Nginx 到底是正向代理还是反向代理透明代理怎么做到客户端和服务器完全无感多台后端主机如何做负载均衡与主备冗余老旧的裸机部署又该如何平滑迁移到 Docker本文从三种代理的本质区别讲起逐一给出可直接复制运行的配置覆盖正向代理含 HTTPS CONNECT、反向代理、透明代理应用层 / 网络层两种方案、多主机负载均衡、主备冗余backup keepalived最后完整演示迁移到 Docker 部署的全流程与踩坑清单。目录一、先搞清楚三种代理到底代理了谁二、环境与前置准备三、Nginx 正向代理怎么实现四、Nginx 反向代理怎么实现五、透明代理怎么实现客户端与服务器完全无感六、多主机负载均衡怎么配七、主备冗余怎么做八、如何迁移到 Docker 部署九、常见问题 FAQ十、总结与最佳实践一、先搞清楚三种代理到底代理了谁很多同学刚上手时最大的困惑不是怎么写配置而是这三种代理到底有什么区别我到底该用哪个。先用一句话把本质钉死代理类型代理的是谁客户端是否感知代理存在服务器是否感知代理存在典型场景正向代理代理客户端去访问外网✅ 知道要手动配代理地址❌ 不知道以为在直连客户端内网科学上网、统一出口、访问控制反向代理代理服务器对外提供服务❌ 不知道以为在访问真实站点✅ 知道自己部署的网关、负载均衡、SSL 卸载透明代理在网络层劫持流量转发❌ 完全不知道零配置❌ / 部分取决是否保留源 IP企业出口审计、旁路引流、服务网格1.1 正向代理Forward Proxy客户端主动配置代理服务器地址所有请求先发给代理再由代理替你访问目标站点。[客户端] --配置代理-- [正向代理] -- [目标网站]特点客户端知道代理存在服务端只看到代理的 IP。1.2 反向代理Reverse Proxy客户端访问的是代理服务器的地址代理服务器再把请求转发给后端的真实业务服务器。[客户端] -- [反向代理] -- [后端服务器集群]特点客户端以为代理就是真实服务器代理对客户端隐藏了后端拓扑。1.3 透明代理Transparent Proxy介于两者之间客户端不需要任何配置网关或策略路由把流量导过来代理在背后悄悄转发。[客户端] --(网关指向代理)-- [透明代理] -- [目标网站]特点客户端完全无感而服务器是否无感取决于你用的是应用层透明还是网络层透明保留真实源 IP——这一点是本文的重点后面会单独展开。一句话记忆正向代理替客户端办事反向代理替服务器挡枪透明代理谁都没告诉就把事办了。二、环境与前置准备本文示例基于如下环境其他版本大同小异组件版本操作系统Ubuntu 22.04 / CentOS 7Nginx1.24建议 1.24.0 或 1.26.xDocker24.0Docker Composev2.x目录约定后文 Docker 迁移会复用这个结构/etc/nginx/ ├── nginx.conf# 主配置├── conf.d/# 各站点配置│ ├── forward.conf# 正向代理│ ├── reverse.conf# 反向代理│ └── transparent.conf# 透明代理└── upstreams/# 负载均衡 / 主备后端└── backend.conf基础工具安装# Ubuntu / Debiansudoaptupdatesudoaptinstall-ynginxcurlnet-tools# CentOS / RHELsudoyuminstall-yepel-releasesudoyuminstall-ynginxcurlnet-tools三、Nginx 正向代理怎么实现问题Nginx 主要被设计成反向代理那它能做正向代理吗答案能但需要分类讨论——HTTP 可以伪正向代理HTTPS 需要第三方模块。3.1 HTTP 正向代理利用$http_host动态转发原理正向代理请求里带有完整的Host头Nginx 用变量$http_host动态解析目标并转发。# /etc/nginx/conf.d/forward.conf server { listen 8088; resolver 8.8.8.8 ipv6off; # DNS 解析器必须配置否则无法解析变量中的域名 resolver_timeout 5s; access_log /var/log/nginx/forward_proxy.log; location / { # 关键用变量拼接目标地址强制触发运行时 DNS 解析 proxy_pass http://$http_host$request_uri; proxy_set_header Host $http_host; # 让代理服务器本身不缓存、不改内容 proxy_buffering off; proxy_request_buffering off; proxy_set_header Proxy-Connection ; } }⚠️注意这种写法只支持 HTTP80 端口。因为 HTTPS 的请求内容是加密的Nginx 看不到Host无法知道要转发到哪里。3.2 HTTPS 正向代理HTTP CONNECT 隧道要支持 HTTPS必须让 Nginx 处理 HTTP 的CONNECT方法建立隧道。原生 Nginx不支持CONNECT需要引入第三方模块ngx_http_proxy_connect_module。步骤一编译带模块的 Nginx# 依赖sudoaptinstall-ybuild-essential libpcre3-dev zlib1g-dev libssl-devgit# 下载 nginx 源码与模块cd/usr/local/srcwgethttps://nginx.org/download/nginx-1.24.0.tar.gztar-zxvfnginx-1.24.0.tar.gzgitclone https://github.com/chobits/ngx_http_proxy_connect_module.git# 打补丁patch 文件名要按你的 nginx 版本选择目录里有对应关系cdnginx-1.24.0 patch-p1../ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_102101.patch# 编译安装./configure\--prefix/etc/nginx\--sbin-path/usr/sbin/nginx\--conf-path/etc/nginx/nginx.conf\--with-http_ssl_module\--with-http_v2_module\--with-http_realip_module\--with-stream\--with-stream_ssl_preread_module\--add-module../ngx_http_proxy_connect_modulemakesudomakeinstall步骤二配置支持 CONNECT 的 server# /etc/nginx/conf.d/forward.conf server { listen 8088; resolver 8.8.8.8 ipv6off; resolver_timeout 5s; access_log /var/log/nginx/forward_proxy.log; # 启用 CONNECT 方法主要用于 HTTPS 隧道 proxy_connect; proxy_connect_allow 443 563; # 允许 CONNECT 的目标端口all 表示全部 proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 10s; proxy_connect_send_timeout 10s; # 非 CONNECT 请求即普通 HTTP走这里 location / { proxy_pass http://$http_host$request_uri; proxy_set_header Host $http_host; } }3.3 验证正向代理# 测试 HTTPcurl-xhttp://127.0.0.1:8088 http://httpbin.org/ip# 测试 HTTPS走 CONNECT 隧道curl-v-xhttp://127.0.0.1:8088 https://httpbin.org/ip浏览器侧的设置网络设置 → 手动代理 → HTTP 代理填代理机IP:8088即可。3.4 正向代理的常见坑不配resolverproxy_pass里带变量时不写resolverNginx 无法解析域名直接 502。$http_hostvs$host$host不带端口$http_host带端口转发时用$http_host更准。HTTPS 只走 CONNECT别指望用location里的proxy_pass处理 HTTPS握手都过不去。四、Nginx 反向代理怎么实现问题客户端只想访问一个域名后端却有好几台机器怎么优雅地转发并让后端拿到真实客户端 IP4.1 最小可用配置# /etc/nginx/conf.d/reverse.conf server { listen 80; server_name www.example.com; location / { proxy_pass http://127.0.0.1:8080; # 后端真实服务地址 proxy_http_version 1.1; proxy_set_header Connection ; 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-Forwarded-Proto $scheme; proxy_read_timeout 60s; proxy_connect_timeout 5s; } }4.2 关键指令逐条拆解指令作用是否必须proxy_pass指定后端地址决定转发目标✅ 必须proxy_set_header Host让后端拿到原始域名多站点后端必须✅ 强烈建议X-Real-IP传递真实客户端 IP✅ 建议X-Forwarded-For追加代理链上的 IP便于溯源✅ 建议X-Forwarded-Proto告诉后端原始协议是 http 还是 https✅ 建议proxy_http_version 1.1支持长连接、WebSocket建议proxy_buffering是否缓冲后端响应按需4.3 让后端识别真实客户端 IP后端无论 Nginx、Tomcat 还是 PHP如果要做限流、审计就需要解出真实 IP# 后端 Nginx 上配置 set_real_ip_from 10.0.0.0/8; # 信任的代理机网段 real_ip_header X-Forwarded-For; real_ip_recursive on;五、透明代理怎么实现客户端与服务器完全无感这是全文最容易翻车的部分。先记住一个核心结论Nginx 的透明代理分两个等级——应用层透明客户端无感配起来简单和网络层透明客户端服务器都无感保留真实源 IP但链路极其脆弱。等级实现手段客户端无感服务器无感保留源IP复杂度应用层透明iptables REDIRECT Nginx 反代按 Host/SNI 分流✅❌源 IP 变为代理机⭐⭐网络层透明iptables TPROXY Nginxproxy_bind ... transparent✅✅⭐⭐⭐⭐⭐5.1 前置让流量自动流向代理客户端完全无感的前提是——流量在客户端毫不知情的情况下被送到代理机。两种常见做法(1) 客户端把默认网关指向代理机适合可控的客户端网段# 在客户端执行示意iprouteadddefault via192.168.1.10(2) 在代理机所在网段的上一跳路由器上做策略路由把目标流量引到代理机。流量到了代理机后再由iptables拦截并交给 Nginx。5.2 方案一应用层透明简单、推荐 95% 场景原理用iptables的REDIRECT把本机接收到的 80/443 流量重定向到 Nginx 监听端口Nginx 通过 HTTP 的Host头80或 TLS 的SNI443判断真实目标再反向代理过去。# 开启转发sudosysctl-wnet.ipv4.ip_forward1# HTTP把入境 80 重定向到 Nginx 的 8080sudoiptables-tnat-APREROUTING-ptcp--dport80-jREDIRECT --to-ports8080# HTTPS把入境 443 重定向到 Nginx 的 8443sudoiptables-tnat-APREROUTING-ptcp--dport443-jREDIRECT --to-ports8443Nginx 侧——HTTP 按 Host 分流# 透明代理 - HTTP server { listen 8080; resolver 8.8.8.8 ipv6off; location / { proxy_pass http://$http_host$request_uri; proxy_set_header Host $http_host; } }HTTPS 按 SNI 分流利用streamssl_preread握手前就能读到域名这是无感的关键# 透明代理 - HTTPS四层按 SNI 分流 stream { # 根据 SNI 把流量分给不同后端 map $ssl_preread_server_name $transparent_backend { ~example\.com example_upstream; ~api\.example\.com api_upstream; default default_upstream; } upstream example_upstream { server 10.0.0.11:443; } upstream api_upstream { server 10.0.0.12:443; } upstream default_upstream { server 10.0.0.99:443; } server { listen 8443; ssl_preread on; # 开启 SNI 预读 proxy_pass $transparent_backend; proxy_timeout 30s; } }⚠️方案一的代价客户端确实无感了但服务器看到的是代理机的 IP因为 REDIRECT 后 Nginx 以自己身份建连。要让服务器也无感必须上方案二。5.3 方案二网络层透明TPROXY 保留真实源 IP原理TPROXY在内核层拦截流量并保留原始源 IP 原始目的 IPNginx 用特制 socket 选项IP_TRANSPARENT接收并用proxy_bind $remote_addr transparent以客户端身份去连接后端——这样服务器看到的源 IP 就是真实客户端 IP端到端完全透明。第一步内核与转发参数sudosysctl-wnet.ipv4.ip_forward1sudosysctl-wnet.ipv4.conf.all.rp_filter0# 关闭反向路径过滤否则丢包sudosysctl-wnet.ipv4.conf.eth0.rp_filter0# 对监听网卡也关掉# 持久化可选catEOF|sudotee/etc/sysctl.d/99-transparent.confnet.ipv4.ip_forward 1 net.ipv4.conf.all.rp_filter 0 net.ipv4.conf.eth0.rp_filter 0 EOF第二步iptables 策略路由# 1) 建立 DIVERT 链处理已建立连接的后续包避免被重复拦截sudoiptables-tmangle-NDIVERTsudoiptables-tmangle-APREROUTING-ptcp-msocket-jDIVERTsudoiptables-tmangle-ADIVERT-jMARK --set-xmark 0x1/0xffffffffsudoiptables-tmangle-ADIVERT-jACCEPT# 2) 把入境 80/443 的流量 TPROXY 到 Nginx 的 12345/12346 端口sudoiptables-tmangle-APREROUTING-ptcp--dport80-jTPROXY --on-port12345--tproxy-mark 0x1/0x1sudoiptables-tmangle-APREROUTING-ptcp--dport443-jTPROXY --on-port12346--tproxy-mark 0x1/0x1# 3) 策略路由给带标记的包即代理转发出去的包指定专用路由表sudoipruleaddfwmark 0x1 lookup100sudoiprouteaddlocal0.0.0.0/0 dev lo table100第三步Nginx 配置proxy_bind ... transparent# 网络层透明代理 —— HTTP stream { upstream http_backend { server 10.0.0.20:80; } server { listen 12345; proxy_pass http_backend; # 关键以客户端真实 IP 作为源地址去连接后端 proxy_bind $remote_addr transparent; proxy_timeout 60s; } }# 网络层透明代理 —— HTTPS按 SNI 分流 保留源 IP stream { map $ssl_preread_server_name $sni_backend { ~example\.com example_https; default default_https; } upstream example_https { server 10.0.0.11:443; } upstream default_https { server 10.0.0.99:443; } server { listen 12346; ssl_preread on; proxy_pass $sni_backend; proxy_bind $remote_addr transparent; # 保留真实源 IP proxy_timeout 60s; } }第四步给 Nginx 提权proxy_bind ... transparent需要设置IP_TRANSPARENT必须以 root或具备CAP_NET_ADMIN运行 worker# /etc/nginx/nginx.conf 顶层 user root; # 生产环境更推荐用 cap 方式见下文 Docker 部分5.4 透明代理排错清单现象排查方向连接被拒 / 无响应xt_TPROXY模块是否加载lsmod | grep TPROXY日志里只有connection refused检查proxy_bind权限、nginx 是否以 root 运行抓包有包但 Nginx 没收到ip rule/ip route策略路由是否配好回程丢包rp_filter0是否生效all和具体网卡都要设HTTPS 分流不生效ssl_preread on是否开启SNI 是否被客户端禁用服务器仍看到代理 IP是否遗漏proxy_bind $remote_addr transparent务实建议如果你只是要客户端无感方案一REDIRECT Host/SNI就够了稳定且好维护只有确实需要把真实客户端 IP 透传到后端如风控、审计时才上 TPROXY 方案二并且一定要做好压测和回滚预案。六、多主机负载均衡怎么配问题后端有多台机器怎么把请求分摊出去还支持权重、会话保持和健康检查Nginx 的负载均衡靠upstream块实现常用策略如下。6.1 轮询 / 加权轮询默认upstream backend { server 10.0.0.21:8080; # 默认权重 1 server 10.0.0.22:8080 weight3; # 权重 3摊到约 3 倍流量 server 10.0.0.23:8080 weight2; }6.2 最少连接适合请求耗时差异大的场景upstream backend { least_conn; server 10.0.0.21:8080; server 10.0.0.22:8080; }6.3 IP 哈希 / 一致性哈希会话保持upstream backend { ip_hash; # 同一客户端 IP 固定打到同一台简单会话保持 server 10.0.0.21:8080; server 10.0.0.22:8080; } # 或使用一致性哈希增删节点时影响面更小 upstream backend { hash $request_uri consistent; server 10.0.0.21:8080; server 10.0.0.22:8080; }6.4 被动健康检查参数开源版 Nginx 提供的是被动健康检查依赖max_fails/fail_timeoutupstream backend { server 10.0.0.21:8080 max_fails3 fail_timeout30s; server 10.0.0.22:8080 max_fails3 fail_timeout30s; }含义30 秒内失败 3 次就把该节点摘除 30 秒。如果需要主动健康检查定时探测/health开源版需借助nginx_upstream_check_module模块或直接使用 Nginx Plus / 其他 LB。6.5 完整 upstream 反代示例upstream backend { least_conn; server 10.0.0.21:8080 weight3 max_fails3 fail_timeout30s; server 10.0.0.22:8080 weight2 max_fails3 fail_timeout30s; server 10.0.0.23:8080 weight1 max_fails3 fail_timeout30s; keepalive 32; # 与后端保持长连接降低握手开销 } server { listen 80; server_name www.example.com; location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }七、主备冗余怎么做问题负载均衡解决了分摊但如果主节点挂了怎么办Nginx 自己挂了又怎么办要分两个层次来看。7.1 层次一后端主备backup用backup标记备用节点——只有所有主节点都不可用时备用节点才会被启用upstream backend { server 10.0.0.21:8080; # 主 server 10.0.0.22:8080; # 主 server 10.0.0.30:8080 backup; # 备平时不接流量 }配合持久化连接时也可以做多级upstream backend { server 10.0.0.21:8080 max_fails2 fail_timeout10s; server 10.0.0.22:8080 max_fails2 fail_timeout10s; server 10.0.0.30:8080 backup; # 兜底 }7.2 层次二Nginx 自身高可用keepalived VIP两台 Nginx 组成主备对外暴露一个虚拟 IPVIP谁活着谁持有 VIP[ VIP 192.168.1.100 ] / \ [Nginx-1 MASTER] [Nginx-2 BACKUP]在两台 Nginx 上安装 keepalivedsudoaptinstall-ykeepalived/etc/keepalived/keepalived.confMASTER 节点global_defs { router_id nginx_ha } # Nginx 存活探针 vrrp_script chk_nginx { script /etc/keepalived/check_nginx.sh interval 2 weight -20 # 探测失败则优先级减 20触发切换 fall 2 rise 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 # BACKUP 节点设为 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.1.100/24 } }/etc/keepalived/check_nginx.sh#!/bin/bash# 返回非 0 表示 nginx 异常keepalived 会降低本机优先级触发切换if!killall-0nginx2/dev/null;thenexit1ficurl-sf-o/dev/null http://127.0.0.1/health||exit1exit0sudochmodx /etc/keepalived/check_nginx.shsudosystemctlenable--nowkeepalived这样即使一台 Nginx 整体宕机VIP 也会在秒级漂移到备份机对外服务几乎无中断。八、如何迁移到 Docker 部署问题裸机上的 Nginx尤其是自己编译带第三方模块的那套怎么平滑迁移到 Docker8.1 迁移思路配置与镜像解耦配置文件通过 volume 挂载不进镜像需要自定义模块的自制镜像如正向代理的proxy_connect标准功能的直接用官方镜像透明代理容器要特殊授权NET_ADMIN/ host 网络用docker-compose编排healthcheckrestart保活。8.2 目录规划/opt/nginx-docker/ ├── docker-compose.yml ├── Dockerfile# 需要自定义模块时才用├── conf/ │ ├── nginx.conf │ └── conf.d/ │ ├── reverse.conf │ └── transparent.conf └── logs/8.3 方案 A标准 Nginx官方镜像最简单docker-compose.ymlservices:nginx:image:nginx:1.24-alpinecontainer_name:nginxports:-80:80-443:443volumes:-./conf/nginx.conf:/etc/nginx/nginx.conf:ro-./conf/conf.d:/etc/nginx/conf.d:ro-./logs:/var/log/nginxrestart:unless-stoppedhealthcheck:test:[CMD,nginx,-t]interval:30stimeout:5sretries:3启动dockercompose up-ddockercompose logs-fnginx8.4 方案 B带第三方模块自制镜像以正向代理需要的ngx_http_proxy_connect_module为例# Dockerfile FROM debian:bookworm-slim AS build ARG NGINX_VERSION1.24.0 RUN apt-get update apt-get install -y --no-install-recommends \ build-essential libpcre3-dev zlib1g-dev libssl-dev \ wget ca-certificates git \ rm -rf /var/lib/apt/lists/* WORKDIR /build RUN wget -q https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz \ tar -zxf nginx-${NGINX_VERSION}.tar.gz \ git clone --depth1 https://github.com/chobits/ngx_http_proxy_connect_module.git WORKDIR /build/nginx-${NGINX_VERSION} # 注意patch 文件名需按 nginx 版本选择 RUN patch -p1 ../ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_102101.patch \ ./configure \ --prefix/etc/nginx \ --sbin-path/usr/sbin/nginx \ --conf-path/etc/nginx/nginx.conf \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-stream \ --with-stream_ssl_preread_module \ --with-stream_realip_module \ --add-module../ngx_http_proxy_connect_module \ make -j$(nproc) make install FROM debian:bookworm-slim COPY --frombuild /etc/nginx /etc/nginx COPY --frombuild /usr/sbin/nginx /usr/sbin/nginx COPY --frombuild /usr/lib/nginx /usr/lib/nginx RUN mkdir -p /var/log/nginx ln -sf /dev/stdout /var/log/nginx/access.log \ ln -sf /dev/stderr /var/log/nginx/error.log EXPOSE 80 443 8088 STOPSIGNAL SIGQUIT CMD [nginx, -g, daemon off;]docker-compose.ymlservices:nginx-proxy:build:.container_name:nginx-proxyports:-80:80-443:443-8088:8088# 正向代理端口volumes:-./conf/nginx.conf:/etc/nginx/nginx.conf:ro-./conf/conf.d:/etc/nginx/conf.d:rorestart:unless-stopped8.5 方案 C透明代理容器重点透明代理需要host 网络 内核能力普通桥接网络会失效services:nginx-transparent:image:nginx:1.24-alpinecontainer_name:nginx-transparentnetwork_mode:host# 必须透明代理要看真实网卡/源 IPcap_add:-NET_ADMIN# 配置 iptables / IP_TRANSPARENT-NET_RAWvolumes:-./conf/nginx.conf:/etc/nginx/nginx.conf:ro-./conf/conf.d:/etc/nginx/conf.d:rorestart:unless-stopped关于 iptables 规则network_mode: host的容器与宿主机共享网络命名空间容器里执行iptables会影响宿主机。更稳妥的做法是把 TPROXY/REDIRECT 规则放在宿主机或使用nsenter进入宿主网络命名空间统一管理。关于 sysctlnet.ipv4.ip_forward、rp_filter等参数属于宿主机内核建议在宿主机/etc/sysctl.d/配置而不是依赖 compose 的sysctls可能被忽略。8.6 配置热更新与运维# 校验配置不重启容器dockercomposeexecnginx nginx-t# 热加载不断连接dockercomposeexecnginx nginx-sreload# 更新镜像并滚动重启dockercompose pulldockercompose up-d日志Docker 里建议把access.log/error.log软链到/dev/stdout、/dev/stderr见上面 Dockerfile再用docker logs统一查看。九、常见问题 FAQQ1Nginx 到底能不能做正向代理能。HTTP 用$http_host变量转发即可HTTPS 必须引入ngx_http_proxy_connect_module支持CONNECT方法。Q2透明代理为什么服务器无感这么难因为默认转发时 Nginx 用自己的 IP 去连后端服务器就看到了代理 IP。要做到服务器也无感必须用TPROXY proxy_bind $remote_addr transparent保留真实源 IP链路长、依赖内核能力容易静默失败。Q3负载均衡怎么让会话不丢用ip_hash按客户端 IP 固定或hash ... consistent一致性哈希也可以把会话外置到 Redis。Q4backup和 keepalived 有什么区别backup是后端服务器层面的主备Nginx 内部选择keepalived 是Nginx 自身的高可用多台 Nginx VIP两者互补通常一起用。Q5迁移到 Docker 后配置改了要重建镜像吗不需要。配置用 volume 挂载改完nginx -t校验 nginx -s reload即可。只有新增/修改编译模块时才需要重新 build 镜像。Q6透明代理容器一定要network_mode: host吗是。透明代理需要看到真实网卡与真实源 IP桥接网络下TPROXY拿不到正确信息。十、总结与最佳实践把全文要点收拢成一张表需求方案关键配置内网统一出口上网正向代理resolverproxy_pass http://$http_host...HTTPS 用proxy_connect对外统一入口、SSL 卸载反向代理proxy_passX-Forwarded-*客户端零配置、服务器也不感知网络层透明代理TPROXYproxy_bind $remote_addr transparent客户端零配置、实现简单应用层透明代理REDIRECT$http_host/ssl_preread多台后端分摊流量负载均衡upstreamleast_conn/ip_hash后端兜底主备冗余server ... backupNginx 自身高可用keepalivedvrrp_instance VIP平滑上云/容器化Dockervolume 挂载配置 network_mode: host透明代理几条血泪经验能用反向代理解决的别硬上透明代理——后者维护成本极高。透明代理的成败在于细节内核模块、rp_filter、策略路由、root 权限缺一不可。配置一定要进版本管理Docker 化后配置与镜像解耦回滚和协作都会轻松很多。上线前先压测 准备回滚尤其是TPROXY这类改内核行为的方案。参考资料Nginx 官方文档https://nginx.org/en/docs/ngx_http_proxy_connect_module正向代理 CONNECThttps://github.com/chobits/ngx_http_proxy_connect_moduleNginxproxy_bind指令transparent参数https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html#proxy_bindNginxupstream负载均衡https://nginx.org/en/docs/http/ngx_http_upstream_module.htmlkeepalived 官方文档https://www.keepalived.org/manpage.html如果本文对你有帮助欢迎点赞 收藏 ⭐ 关注你的支持是我持续输出的最大动力遇到配置问题也欢迎在评论区留言我会尽量一一解答。
返回列表