Nginx 配置片段主要用于实现正向代理,可以用来转发 HTTP 和 HTTPS 请求
你的 Nginx 配置片段主要用于实现正向代理,可以用来转发 HTTP 和 HTTPS 请求。配置思路基本正确,但有些细节需要特别注意,否则可能无法正常工作。
下面我为你分析一下,并提供修改建议:
🔧 配置分析与建议
你的配置分为 HTTP 代理 (8888端口) 和 HTTPS 代理 (8889端口) 两部分。
1. HTTP 代理 (端口 8888)
server {listen 8888;server_name localhost;# 建议添加 DNS 解析器resolver 8.8.8.8; # 使用公共DNS或其他可靠DNSresolver_timeout 5s;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_set_header X-Forwarded-Proto $scheme;}
}
- 优点:使用
$http_host
可以正确获取代理地址的端口号,这是推荐的做法。 - 问题与建议:
- 强烈建议添加
resolver
指令来指定 DNS 服务器,否则 Nginx 可能无法解析$http_host
中的域名。 resolver_timeout
设置了 DNS 解析的超时时间。
- 强烈建议添加
2. HTTPS 代理 (端口 8889)
server {listen 8889 ssl;server_name localhost;ssl_certificate D:/phpstudy_pro/Extensions/Nginx1.15.11/conf/ssl/99.com.pem;ssl_certificate_key D:/phpstudy_pro/Extensions/Nginx1.15.11/conf/ssl/99.com.key;ssl_session_timeout 5m;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_prefer_server_ciphers on;# 正向代理HTTPS需要特殊模块proxy_connect;proxy_connect_allow 443;proxy_connect_connect_timeout 10s;proxy_connect_data_timeout 10s;# 建议添加 DNS 解析器resolver 8.8.8.8;resolver_timeout 5s;location / {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;proxy_set_header X-Forwarded-Proto $scheme;}
}
- 核心问题:Nginx 默认不支持正向代理 HTTPS 流量(即
CONNECT
方法)。你需要使用 ngx_http_proxy_connect_module
第三方模块。 - 解决方案:
- 你需要重新编译 Nginx 以加入此模块,或者寻找已包含此模块的预编译版本(文中提到了 Windows 和 Ubuntu 的相关做法)。
- 在配置中添加
proxy_connect
,proxy_connect_allow
等指令(已在上面示例中添加)。
- SSL 配置注意:你使用了自签名证书(
99.com.pem
和99.com.key
)。客户端(浏览器或应用程序)需要信任你的 CA 证书才能建立连接,否则会遇到安全警告或错误。有时也需要配置proxy_ssl_verify
等相关指令。
⚠️ 重要提醒
- 模块依赖:HTTPS 正向代理功能强烈依赖
ngx_http_proxy_connect_module
模块。没有它,此配置无法代理 HTTPS 流量。 - 证书信任:对于 HTTPS 代理,客户端必须信任你配置的服务器证书(
99.com.pem
),否则连接会因安全原因失败。 - 配置测试:修改配置后,务必运行
nginx -t
命令检查配置文件语法是否正确。 - 生效配置:检查无误后,使用
nginx -s reload
命令重新加载配置使其生效。
🔍 如何测试你的代理
配置完成后,你可以使用 curl
命令来测试代理是否工作:
# 测试HTTP代理
curl -x http://localhost:8888 http://example.com/# 测试HTTPS代理(确保你的curl信任代理服务器的证书)
curl -x https://localhost:8889 https://example.com/
💎 总结
你的配置方向是对的,但需要两个关键调整:
- 为两个
server
块都加上resolver
指令。 - 为 HTTPS 代理服务器编译并添加
ngx_http_proxy_connect_module
模块,这是它能工作的前提。
希望这些说明对你有帮助。如果你在编译模块或配置过程中遇到问题,可以查阅 ngx_http_proxy_connect_module
项目的官方文档以获取更详细的指导。
看起来你在配置 Nginx 正向代理时遇到了 proxy_connect
指令无法识别的问题。这通常是因为你的 Nginx 没有编译并加载 ngx_http_proxy_connect_module
模块。下面我会帮你梳理解决方案。
🔧 解决方案概述
出现 unknown directive "proxy_connect"
错误,核心原因是 Nginx 在编译时没有包含 ngx_http_proxy_connect_module
模块。这个模块是支持 HTTP CONNECT 方法(用于 HTTPS 正向代理)所必需的。
由于你使用的是 Windows 环境下的 phpstudy,预编译的 Nginx 二进制包通常不会包含此第三方模块。因此,你需要重新编译 Nginx 来加入这个模块。
📝 解决步骤
由于 phpstudy 中的 Nginx 是 Windows 版本,重新编译过程相比 Linux 更为复杂。以下是主要步骤和注意事项:
准备编译环境:
- 在 Windows 下编译 Nginx 需要搭建特定的编译环境,通常建议使用 MSYS2 或 Cygwin,并安装必要的开发工具链(如 GCC、make、PCRE、zlib、OpenSSL 等)。
- 确保你的系统已安装 Visual Studio(例如 Visual Studio 2015 或更高版本),因为 Nginx 在 Windows 上的编译需要 Microsoft 的编译器和链接器。
获取 Nginx 源码和模块:
- 从 Nginx 官网下载与你当前版本(
1.15.11
)匹配的 Nginx 源代码包。 - 从 GitHub 克隆或下载
ngx_http_proxy_connect_module
模块的源码。
- 从 Nginx 官网下载与你当前版本(
选择并应用补丁:
- 非常重要:
ngx_http_proxy_connect_module
需要为 Nginx 源码打上特定的补丁才能正常编译。不同版本的 Nginx 需要不同的补丁文件。 - 根据你的 Nginx 版本(1.15.11),在模块的
patch
目录下找到对应的补丁文件。根据 的补丁对照表,nginx 1.15.4 ~ 1.16.x
版本可能适用proxy_connect_rewrite_101504.patch
。 - 在 MSYS2 或 Cygwin 环境中,进入 Nginx 源码目录,使用
patch
命令应用补丁:patch -p1 < /path/to/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_101504.patch
- 非常重要:
配置和编译:
- 在 Nginx 源码目录下,运行
configure
脚本,添加--add-module
参数指向模块源码路径,并包含其他你需要的模块(如--with-http_ssl_module
):./configure --add-module=../ngx_http_proxy_connect_module --with-http_ssl_module
- Windows 下的
configure
脚本可能会需要指定一些特定的路径和选项,请确保参考 Nginx 官方关于在 Windows 上构建的文档。 - 配置成功后,运行
make
进行编译。如果一切顺利,编译完成后会在objs
目录下生成nginx.exe
以及其他相关文件。
- 在 Nginx 源码目录下,运行
替换二进制文件并测试:
- 备份:在操作之前,务必备份 phpstudy 中原来的 Nginx 目录(特别是
nginx.exe
以及conf
目录下的所有配置文件)。 - 将新编译生成的
nginx.exe
以及可能生成的.pdb
文件或其他依赖文件,替换到 phpstudy 的 Nginx 安装目录下(例如D:\phpstudy_pro\Extensions\Nginx1.15.11
)。 - 重启 Nginx 服务或进程,然后再次检查配置语法:
nginx -t -c D:\phpstudy_pro\Extensions\Nginx1.15.11/conf/nginx.conf
- 如果不再报
unknown directive "proxy_connect"
错误,说明模块已成功加载。
- 备份:在操作之前,务必备份 phpstudy 中原来的 Nginx 目录(特别是
⚠️ 注意事项
- 复杂性警告:在 Windows 上手动编译 Nginx 并打第三方补丁过程较为复杂,容易遇到各种环境依赖和编译错误。请耐心操作,并做好遇到问题自行搜索排查的准备。
- 版本匹配:务必确保补丁文件与 Nginx 版本严格匹配,否则编译可能失败。
- 备份!备份!备份!:替换主要二进制文件前一定要备份,以便出现问题时可以回滚。
- 考虑替代方案:如果编译过程遇到难以解决的问题,或者追求稳定性,可以考虑在 Linux 虚拟机或容器中部署一个已经编译好该模块的 Nginx 作为正向代理服务器,Windows 本地的应用通过网络连接到这个代理服务器。
💎 如何验证代理是否工作
配置正确且 Nginx 重启后,你可以使用 curl
命令测试代理:
# 测试 HTTP 网站
curl http://example.com -x http://127.0.0.1:8888 -v
# 测试 HTTPS 网站
curl https://example.com -x http://127.0.0.1:8888 -v --proxy-insecure
希望这些说明能帮助你解决问题。如果过程中遇到其他困难,可以查阅 ngx_http_proxy_connect_module
项目的官方文档或在其社区中寻求帮助。