核心原理
Nginx通过reverse proxy
(反向代理)功能实现以下目标:
✅ 隐藏真实内网IP:仅暴露Nginx所在服务器的公网/局域网IP
✅ 多站点隔离:同一台Nginx可托管多个独立内网服务的虚拟主机
✅ 协议转换:支持HTTP→HTTP/HTTPS→HTTP等跨协议转发
✅ 负载分发:可选集成负载均衡算法分配流量至多台内网机器
典型场景示例
用户需求 | 技术方案 | 关键配置项 |
---|---|---|
外网用户通过 api.mydomain.com 访问内网 168.1.10:8080 的应用 |
基于域名+路径的反向代理 | server_name , location , proxy_pass |
内网Web应用需强制HTTPS加密传输 | TLS终止+双向代理 | ssl_certificate , proxy_ssl |
不同路径指向同一内网服务器的不同接口 | 带前缀的路径路由 | location /path/ { ... } |
禁止直接访问内网真实IP | IP白名单控制 | allow/deny 指令 |
完整配置步骤
定义上游服务器池 (upstream
)
# 此示例定义两组后端服务集群 upstream innernet_cluster { server 192.168.1.10:8080; # 第一台内网Web服务器 server 192.168.1.11:8080 backup; # 备用服务器(可选) keepalive 32; # 长连接复用提升性能 } upstream db_backend { server 192.168.1.20:3306; # MySQL数据库专用通道 }
创建虚拟主机块 (server
)
server { listen 80; # 对外服务端口 server_name frontend.example.com; # 用户访问的域名 # 关键日志配置 access_log /var/log/nginx/frontend_access.log main; error_log /var/log/nginx/frontend_error.log warn; # 核心代理逻辑 location / { proxy_pass http://innernet_cluster; # 转发至上游集群 proxy_set_header Host $host; # 传递原始主机头 proxy_set_header X-Real-IP $remote_addr; # 记录客户端真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理链追踪 } # 特殊接口单独处理(如API网关) location /api/v1/ { proxy_pass http://innernet_cluster/new_endpoint/; # 路径重写示例 rewrite ^/api/v1/(.)$ /$1 break; # URL规范化 } }
HTTPS强化配置(推荐)
server { listen 443 ssl http2; # 同时启用HTTP/2 server_name secure.example.com; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; # 禁用旧版协议 ssl_ciphers ECDHE-ECDSA-AES256-GCM_SHA384:!RC4; # 现代加密套件 # 其余配置同普通HTTP服务器... }
高级功能扩展
功能需求 | 实现方式 | 注意事项 |
---|---|---|
健康检查 | max_fails=3 fail_timeout=30s |
配合proxy_next_upstream 自动剔除故障节点 |
WebSocket支持 | proxy_http_version 1.1 proxy_set_header Upgrade $http_upgrade |
必须保留Connection头部 |
大文件下载加速 | proxy_buffering off; proxy_request_buffering off; |
避免内存溢出 |
认证墙保护 | auth_basic "Restricted Area" auth_basic_user_file /etc/htpasswd |
不适合高并发场景 |
常见问题与解答
Q1: 浏览器提示”504 Gateway Time-out”如何解决?
A: 按顺序排查以下环节:
1️⃣ 连通性验证:telnet 192.168.1.10 8080
测试端口可达性
2️⃣ 超时时间调整:增加 proxy_read_timeout 300;
(默认60秒)
3️⃣ 防火墙规则:检查内网服务器是否放行来自Nginx所在IP的请求
4️⃣ 应用响应速度:确认后端服务能在合理时间内完成处理
Q2: 如何让后端获取真实的访客IP而非Nginx地址?
A: 必须同时满足两个条件:
① 在代理配置中添加:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
② 后端应用需信任Nginx的出口IP(建议限定特定网段)
⚠️ 注意:此操作存在伪造风险,生产环境应结合WAF进行防护
调试命令速查表
操作目的 | 命令示例 | 输出说明 |
---|---|---|
实时查看配置错误 | nginx -t -c /etc/nginx/conf.d/ |
语法树结构验证 |
跟踪单个请求流程 | grep 'GET /xxx' /var/log/nginx/access.log | tail -n 5 |
查看完整请求链 |
分析带宽占用 | ngxtop -g bytes |
可视化流量监控 |
导出当前连接数 | curl http://localhost:8080/nginx_status |
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/94999.html