Nginx作为HTTPS的正向代理


23

虽然我能够成功配置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"

这些CONNECT要求是什么?proxy_pass在nginx中甚至可以进行HTTPS请求吗?

更新资料

需要补充的是,代理服务器是我的Web开发工作流程/工具包的一部分。这是在生产环境中测试/调试客户端JavaScript的好方法(使用代理之前的重写)。

同样,nginx的配置语言本身就是一种编程语言。它有变量!

https  nginx  proxy 

Answers:



7

只是为了澄清一下:正如我在博客评论提要中所写的那样,nginx不处理用于通过HTTP代理建立到远程主机的原始TCP连接的CONNECT方法调用-考虑到nginx不应作为正向代理服务器,无论使用哪种常规HTTP都可以正常工作。

Nginx实际上不知道如何处理这些方法,这就是为什么日志中的错误消息相当无用的原因。我一直发现自己使用privoxy进行HTTPS:http : //www.privoxy.org/-设置起来也非常容易。但是仍然无法过滤或处理HTTPS中继的内容,因为HTTPS连接是通过CONNECT方法使用原始连接来处理的,并且服务器不知道中继的内容。


2

如果您不介意从源代码编译nginx,则可以安装ngx_http_proxy_connect_module。以下内容在Raspberry Pi上的Debian 9“ Stretch”中为我工作(在我将deb-src URL添加到/etc/apt/sources.list并进行apt-get更新之后):

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

然后进行编辑/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;
        }
    }
}

然后运行/usr/local/nginx/sbin/nginxnginx如果您还在端口80上运行生产Web服务器,并且不想冒险惹恼它,它将与Debian的库存包共存(但请确保在启动时/usr/local单独启动该版本);或者,通过更多配置,您可以从编译的Nginx中运行这两个服务。但是,如果您确实将已编译的nginx设置为在防火墙允许流量访问的端口上运行,请注意,由于Debian软件包系统将不再为您执行此操作,因此您必须手动检查nginx安全更新。


我不得不调整一些命令,但总体而言,您的回答对我有用。非常感谢!
罗伯特·雷兹

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.