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
# Apache 正向代理配置
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
# nginx 正向代理配置
http {
# 设置DNS解析器
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;

# 处理HTTPS请求
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;

# 可选:添加健康检查
# check interval=3000 rise=2 fall=5 timeout=1000 type=http;
# check_http_send "HEAD /health HTTP/1.0\r\nHost: localhost\r\n\r\n";
# check_http_expect_alive http_2xx http_3xx;
}

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
# 启用必要的模块
# LoadModule proxy_module modules/mod_proxy.so
# LoadModule proxy_http_module modules/mod_proxy_http.so
# LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
# LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so

# 关闭正向代理
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 证书配置
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;

# SSL 优化配置
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;
# 其他代理设置...
}
}

# 重定向HTTP到HTTPS
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_timeoutproxy_read_timeoutproxy_send_timeout参数
  • 检查后端服务器响应时间
  • 考虑增加代理缓冲区大小

3. 负载均衡配置问题

解决方案:

  • 确保所有后端服务器都正常运行
  • 配置适当的健康检查
  • 调整负载均衡算法以适应业务需求

4. SSL证书问题

解决方案:

  • 确保使用有效的SSL证书
  • 配置正确的证书链
  • 定期更新证书以避免过期

性能优化建议

  1. 启用连接复用:使用keepalive连接减少连接建立开销
  2. 调整工作进程数:根据服务器CPU核心数设置合适的工作进程
  3. 优化缓冲区大小:根据实际流量调整代理缓冲区
  4. 启用Gzip压缩:减少传输数据量
  5. 配置适当的超时设置:避免连接占用时间过长
  6. 使用缓存:对静态内容和频繁访问的动态内容使用缓存

参考资料