1. 为什么需要Nginx正向代理HTTPS站点
在企业内部网络环境中,经常需要统一管控员工对外部HTTPS站点的访问。传统的透明代理方案存在证书信任问题,而Nginx作为高性能的反向代理服务器,其实也可以配置为正向代理,专门用于处理HTTPS流量转发。
我最近在客户现场部署了一套基于Nginx的正向代理系统,主要解决以下痛点:
- 内网终端需要统一出口访问外网资源
- 需要记录访问日志但又不希望解密HTTPS流量
- 避免在每个终端安装根证书的复杂操作
2. 核心配置方案解析
2.1 基础环境准备
建议使用Nginx 1.18.0以上版本,编译时需要包含以下模块:
- --with-http_ssl_module (SSL支持)
- --with-http_realip_module (获取真实客户端IP)
- --with-stream (TCP层代理)
典型编译参数示例:
bash复制./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-stream \
--with-threads
2.2 关键配置详解
在nginx.conf中添加stream模块配置:
nginx复制stream {
server {
listen 443;
proxy_pass $host:$443;
proxy_protocol on;
}
}
http模块中的代理配置:
nginx复制server {
listen 3128;
location / {
resolver 8.8.8.8;
proxy_pass https://$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;
}
}
2.3 访问控制配置
建议配合geo模块实现IP白名单控制:
nginx复制geo $deny_proxy {
default 1;
10.0.0.0/8 0;
192.168.0.0/16 0;
}
server {
if ($deny_proxy) {
return 403;
}
# ...其他配置...
}
3. 完整部署流程
3.1 证书准备(可选)
如果需要代理自身提供HTTPS接口:
bash复制openssl req -x509 -nodes -days 3650 \
-newkey rsa:2048 \
-keyout /etc/nginx/ssl/proxy.key \
-out /etc/nginx/ssl/proxy.crt
3.2 系统参数调优
调整内核参数(/etc/sysctl.conf):
conf复制net.ipv4.tcp_max_tw_buckets = 20000
net.ipv4.tcp_tw_reuse = 1
net.core.somaxconn = 32768
3.3 服务启停管理
创建systemd服务文件:
ini复制[Unit]
Description=Nginx Forward Proxy
After=network.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
[Install]
WantedBy=multi-user.target
4. 实战问题排查指南
4.1 常见错误代码
| 错误代码 | 可能原因 | 解决方案 |
|---|---|---|
| 502 Bad Gateway | DNS解析失败 | 检查resolver配置 |
| 503 Service Unavailable | 上游连接数限制 | 调整worker_connections |
| ERR_SSL_PROTOCOL_ERROR | 客户端未正确配置代理 | 检查代理协议头 |
4.2 性能优化建议
- 连接池优化:
nginx复制proxy_http_version 1.1;
proxy_set_header Connection "";
- 缓存静态资源:
nginx复制proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static:10m inactive=1d;
location ~* \.(jpg|png|css|js)$ {
proxy_cache static;
proxy_cache_valid 200 1h;
}
- 日志分割配置(logrotate):
conf复制/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
sharedscripts
postrotate
/bin/kill -USR1 `cat /var/run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
5. 安全加固措施
5.1 基础安全配置
nginx复制server_tokens off;
proxy_hide_header X-Powered-By;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
5.2 限流防护
nginx复制limit_req_zone $binary_remote_addr zone=proxy:10m rate=10r/s;
server {
limit_req zone=proxy burst=20;
# ...其他配置...
}
5.3 审计日志增强
nginx复制log_format proxy_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$ssl_protocol/$ssl_cipher '
'$upstream_addr $request_time';
access_log /var/log/nginx/proxy.log proxy_log;
重要提示:正向代理不应解密HTTPS流量,否则会破坏端到端加密。如确有内容审计需求,建议采用专门的中间人代理方案。