虽然我能够成功配置 nginx 来代理 HTTP 流量(使用本指南),但所有代理 HTTPS 请求的尝试都会导致代码 400(错误请求)。
Nginx 调试日志根本没有帮助:
2013/06/05 14:38:33 [info] 74946#0: *589
client sent invalid request while reading client request line, client: 127.0.0.1,
server: google.com, request: "CONNECT google.com:443 HTTP/1.1"
Run Code Online (Sandbox Code Playgroud)
这些CONNECT要求是什么?甚至可以proxy_pass在 nginx 中进行HTTPS 请求吗?
需要补充一点,代理服务器是我的 Web 开发工作流程/工具包的一部分。这是在生产环境中测试/调试客户端 JavaScript 的好方法(在代理之前使用重写)。
此外,nginx 的配置语言本身可以说是一种编程语言。它有变数!
小智 19
好像 nginx 不支持 SSL 的正向代理模式。您将需要使用类似Squid 的东西。这是 nginx 作者提供的更多解释的链接:HTTPS and nginx as Forward Proxy。
小智 9
澄清一下:正如我在博客的评论提要中所写的那样,nginx 不处理用于通过 HTTP 代理建立到远程主机的原始 TCP 连接的 CONNECT 方法调用 - 这是有道理的,考虑到 nginx 不应该作为转发代理工作,它恰好适用于常规 HTTP 无论如何。
Nginx 根本不知道如何处理这些方法调用,这就是为什么日志中的错误消息相当无用的原因。我一直发现自己在 HTTPS 中使用 privoxy:http : //www.privoxy.org/ - 它也非常容易设置。但是仍然无法过滤或破坏 HTTPS 中继的内容,因为 HTTPS 连接是通过 CONNECT 方法使用原始连接处理的,服务器不知道它在中继什么。
如果你不介意从源代码编译 nginx,你可以安装ngx_http_proxy_connect_module。以下内容在 Raspberry Pi 上的 Debian 9“Stretch”中为我工作(在我将 deb-src URL 添加到 /etc/apt/sources.list 并执行 apt-get update 之后):
cd /tmp &&
apt-get source nginx &&
git clone https://github.com/chobits/ngx_http_proxy_connect_module &&
cd nginx-* &&
patch -p1 < ../ngx_http_proxy_connect_module/proxy_connect.patch &&
sudo apt-get install libpcre3-dev &&
./configure --add-module=/tmp/ngx_http_proxy_connect_module &&
make && sudo make install
Run Code Online (Sandbox Code Playgroud)
然后编辑/usr/local/nginx/conf/nginx.conf并使其看起来像这样(我已经提供了您想要阻止的域的示例,它适用于 SSL 和非 SSL 代理):
user www-data;
worker_processes auto;
events { }
http {
server_names_hash_bucket_size 128;
server {
listen 8888;
server_name spam.example.com *.spam.example.com;
server_name spam2.example.com *.spam2.example.com;
access_log off;
return 404;
}
server {
listen 8888;
server_name ~.+;
proxy_connect;
proxy_max_temp_file_size 0;
resolver 8.8.8.8;
location / {
proxy_pass http://$http_host;
proxy_set_header Host $http_host;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后跑/usr/local/nginx/sbin/nginx。nginx如果您还在端口 80 上运行生产网络服务器并且不想冒险搞乱它,那么它会很高兴与 Debian 的库存包共存(但请确保/usr/local在启动时单独启动该版本);或者,通过更多配置,您可以从您编译的 nginx 运行这两个服务。但是,如果您确实将编译后的 nginx 设置为在防火墙允许流量访问的端口上运行,请注意,您必须手动检查 nginx 安全更新,因为 Debian 软件包系统将不再为您执行此操作。
| 归档时间: |
|
| 查看次数: |
60659 次 |
| 最近记录: |