Apache Nginx 正向和反向代理
最近需要调试手机端与服务器端的网络通讯协议,需要对网络封包的截取和分析,所以考虑在机器上做一层代理.通过此方案来抓取分析网络包.
代理的基本概念
正向代理
正向代理是一个位于客户端和*原始服务器(origin server)*之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
正向代理的典型用途:
- 为在防火墙内的局域网客户端提供访问Internet的途径
- 隐藏客户端真实IP地址
- 缓存内容以提高访问速度
- 访问被地理位置限制的资源
反向代理
反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
反向代理的典型用途:
- 将防火墙后面的服务器提供给Internet用户访问
- 为后端的多台服务器提供负载平衡
- 为后端较慢的服务器提供缓冲服务
- 启用高级URL策略和管理技术
- 提供SSL终止,减轻后端服务器负担
Apache 正向代理配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| ProxyRequests On ProxyVia On
<Proxy *> Require all granted # 现代Apache 2.4+语法 </Proxy>
ProxyTimeout 60
ProxyBufferSize 4096
|
Nginx 正向代理配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| http { resolver 8.8.8.8 114.114.114.114 valid=300s; resolver_timeout 5s; server { listen 8088; location / { proxy_pass http://$http_host$request_uri; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 10s; proxy_read_timeout 120s; proxy_send_timeout 120s; } } }
|
Nginx 反向代理配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| upstream backend_servers { server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s; server 192.168.1.11:8080 weight=5 max_fails=3 fail_timeout=30s; }
server { listen 80; server_name www.example.com; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; location / { proxy_pass http://backend_servers; proxy_http_version 1.1; 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_connect_timeout 10s; proxy_read_timeout 60s; proxy_send_timeout 60s; proxy_buffers 16 16k; proxy_buffer_size 32k; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; } location /health { return 200 "OK"; } }
|
Apache 反向代理配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
ProxyRequests Off
<Proxy "balancer://mycluster"> BalancerMember http://192.168.1.10:8080 loadfactor=5 BalancerMember http://192.168.1.11:8080 loadfactor=5 ProxySet lbmethod=byrequests ProxySet stickysession=JSESSIONID </Proxy>
<Proxy *> Require all granted </Proxy>
ProxyPass / balancer://mycluster/ ProxyPassReverse / balancer://mycluster/
ProxyTimeout 60
RequestHeader set X-Forwarded-Proto "https" env=HTTPS
|
高级配置与最佳实践
SSL 终止配置
Nginx SSL 终止
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| server { listen 443 ssl http2; server_name www.example.com; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; location / { proxy_pass http://backend_servers; } }
server { listen 80; server_name www.example.com; return 301 https://$host$request_uri; }
|
缓存配置
Nginx 代理缓存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| http { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; server { location / { proxy_cache my_cache; proxy_cache_valid 200 304 10m; proxy_cache_valid any 1m; proxy_cache_key "$scheme$request_method$host$request_uri"; proxy_pass http://backend_servers; } } }
|
常见问题与解决方案
1. 代理服务器无法解析域名
解决方案:
- 确保配置了正确的DNS解析器
- 检查网络连接和防火墙设置
- 验证DNS服务器是否可达
2. 代理超时问题
解决方案:
- 调整
proxy_connect_timeout、proxy_read_timeout和proxy_send_timeout参数
- 检查后端服务器响应时间
- 考虑增加代理缓冲区大小
3. 负载均衡配置问题
解决方案:
- 确保所有后端服务器都正常运行
- 配置适当的健康检查
- 调整负载均衡算法以适应业务需求
4. SSL证书问题
解决方案:
- 确保使用有效的SSL证书
- 配置正确的证书链
- 定期更新证书以避免过期
性能优化建议
- 启用连接复用:使用
keepalive连接减少连接建立开销
- 调整工作进程数:根据服务器CPU核心数设置合适的工作进程
- 优化缓冲区大小:根据实际流量调整代理缓冲区
- 启用Gzip压缩:减少传输数据量
- 配置适当的超时设置:避免连接占用时间过长
- 使用缓存:对静态内容和频繁访问的动态内容使用缓存
参考资料