Nginx可作HTTP正向代理,但官方不支持HTTPS正向代理;HTTP代理需配置resolver和proxy_pass动态转发,HTTPS需编译第三方connect模块并监听CONNECT请求,且必须限制访问权限、记录日志、避免公网暴露。

当服务器因安全策略或网络隔离无法直连外网时,Nginx 可以作为正向代理,让内网服务通过它“间接”访问外部 HTTP/HTTPS 资源。但要注意:Nginx 官方不原生支持 HTTPS 正向代理(即 CONNECT 方法),仅支持 HTTP 正向代理;若需代理 HTTPS 流量,需借助第三方模块(如 ngx_http_proxy_connect_module)或改用 Squid 等专用代理工具。
HTTP 正向代理配置(适用于内网调用外部 HTTP 接口)
Nginx 本身可通过 proxy_pass 在 location 块中实现简易 HTTP 正向代理,适用于客户端明确指定目标 URL 的场景(如 curl http://api.example.com,且该请求被发往 Nginx 代理地址)。
- 确保 Nginx 编译时未禁用
http_proxy模块(默认启用) - 在
http或server块中添加如下配置:
server {
listen 8080;
resolver 114.114.114.114; # 必须配置 DNS 解析器
location / {
proxy_pass http://$http_host$request_uri; # 动态转发到原始 Host
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
}此时客户端需将请求发往 http://nginx-ip:8080/http://target.com/path(即把完整目标 URL 当作 path),Nginx 会解析并代理。这种方式较“非标准”,适合内部脚本调用,不推荐用于浏览器。
HTTPS 正向代理(需额外编译模块)
浏览器或 curl 访问 HTTPS 站点时,会先发送 CONNECT 请求建立隧道,Nginx 默认不处理该方法。要支持,必须引入 ngx_http_proxy_connect_module:
- 下载对应 Nginx 版本的模块源码,重新编译 Nginx(添加
--add-module=...) - 配置示例:
server {
listen 3128;
# 允许 CONNECT 方法
proxy_connect;
proxy_connect_allow 443 563;
proxy_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
<pre class="brush:php;toolbar:false;"># 后续 HTTPS 流量走隧道,无需再配置 proxy_pass
resolver 114.114.114.114;}
配置完成后,客户端(如 curl、wget 或系统级代理设置)可设 http://nginx-ip:3128 为代理,即可访问 HTTPS 网站。注意:该端口仅响应 CONNECT 请求,不处理普通 HTTP 请求。
实际使用建议与注意事项
-
权限控制必加:正向代理极易被滥用为开放代理。务必限制访问来源,例如:
allow 192.168.10.0/24;+deny all; - 不要暴露在公网:即使加了 allow,也应配合防火墙(如 iptables)仅放行可信 IP 的连接
-
日志记录关键字段:在 server 块中添加
log_format connect '$remote_addr - [$time_local] "$request" $status $body_bytes_sent';,便于审计代理行为 -
替代方案更稳妥:若仅需服务器出网,优先考虑系统级代理(
export http_proxy=...)、SNAT(iptables + 网关机器),或部署轻量 Squid(原生支持完整正向代理语义)
不复杂但容易忽略:正向代理本质是“替你发请求”,它不改变业务逻辑,但会成为单点和审计焦点。上线前务必测试超时、DNS 失败、证书验证等边界情况。










