web-dev-qa-db-ja.com

HTTPSのフォワードプロキシとしてのNginx

このガイド を使用して)HTTPトラフィックをプロキシするようにnginxを正常に構成できましたが、HTTPSリクエストをプロキシするすべての試みはコード400(Bad Request)。

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開発ワークフロー/ツールキットの一部であることを追加する必要があります。これは、production環境でクライアント側のJavaScriptをテスト/デバッグするための優れた方法です(プロキシの前にリライトを使用)。

また、nginxの設定言語は間違いなくそれ自体がプログラミング言語です。変数があります!

25
katspaugh

NginxはSSLでフォワードプロキシモードをサポートしていないようです。代わりに Squid のようなものを使用する必要があります。 nginxの作者による詳細な説明のリンクは次のとおりです。 HTTPSおよびnginxをフォワードプロキシとして使用。

17
Zorayr

明確にするために:私のブログのコメントフィードで書いたように、nginxは、HTTPプロキシを介してリモートホストへのraw TCP接続を確立するために使用されるCONNECTメソッド呼び出しを処理しません-これにより、つまり、nginxはフォワードプロキシとして機能することを想定していないため、通常のHTTPに関係なく正常に機能します。

Nginxは、文字通り、これらのメソッド呼び出しをどうするかをまったく理解していません。そのため、ログのエラーメッセージはあまり役に立ちません。私はいつもHTTPSにprivoxyを使用していることに気づきました: http://www.privoxy.org/ -設定もめちゃくちゃ簡単です。しかし、HTTPSリレーのコンテンツをフィルタリングしたり壊したりすることはまだ不可能です。HTTPS接続はCONNECTメソッドを介してraw接続で処理され、サーバーは何をリレーしているかがわからないためです。

7
Magnus

ソースから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/nginxを実行します。ポート80で本番ウェブサーバーも実行していて、それをいじるリスクを冒したくない場合は、Debianの標準のnginxパッケージと共存できます(ただし、/usr/localバージョンを起動してください)ブート時に個別に);または、より多くの構成を使用して、コンパイルしたnginxから両方のサービスを実行できます。ただし、ファイアウォールがトラフィックを許可するポートで実行するようにコンパイル済みのnginxを設定する場合は、Debianパッケージシステムでは実行されないため、手動でnginxセキュリティアップデートを確認する必要があることに注意してください。

3
Silas S. Brown

私はSilas S. Brownの指示に従いましたが、転送とSSLを処理できるNginxバイナリをコンパイルすることができました。すべてをDockerイメージにまとめました。 Dockerfileと設定はGitHubにあります: https://github.com/reiz/nginx_proxy

このDocker Hubリポジトリ内のNginx Dockerイメージは、SSL接続と転送を処理できます: https://hub.docker.com/r/reiz/nginx_proxy/

0
Robert Reiz