web-dev-qa-db-ja.com

NGINXはWebSocketをリバースプロキシし、SSL(wss://)を有効にしますか?

私は自分自身でNGINXを構築することにあまりにも失望しているのですが、追加のレイヤーを持たずにセキュアなWebソケットを有効にしたいです。

Websocketサーバー自体でSSLを有効にしたくないのですが、代わりにNGINXを使用してSSLレイヤーを全体に追加したいです。

そこにあるすべてのWebページには、私にはできないと書かれていますが、私にはできるとわかっています!誰にでも(私自身)、私にその方法を見せてくれてありがとう!

114
crockpotveggies

ただ、nginxはリリース1.3.13でWebsocketをサポートしていることに注意してください。使用例:

location /websocket/ {

    proxy_pass ​http://backend_Host;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 86400;

}

nginx changelog および WebSocket proxying のドキュメントも確認できます。

160
Tarantula

Opsプログラマーの勇敢なグループが、新しいnginx_tcp_proxy_module

2012年8月に書かれたので、あなたが将来から来ているなら、宿題をするべきです。

前提条件

CentOSを使用していると仮定します。

  • NGINXの現在のインスタンスを削除します(これには開発サーバーを使用することをお勧めします)
  • 可能であれば、古いNGINX構成ファイルを保存して、再利用できるようにします(init.d/nginxスクリプトを含む)
  • yum install pcre pcre-devel openssl openssl-develおよびNGINXの構築に必要なその他のライブラリ
  • ここでGitHubから nginx_tcp_proxy_module を取得します https://github.com/yaoweibin/nginx_tcp_proxy_module そしてそれを配置したフォルダーを覚えておいてください(zip圧縮されていないことを確認してください)

新しいNGINXを構築する

繰り返しますが、CentOSを想定しています。

  • cd /usr/local/
  • wget 'http://nginx.org/download/nginx-1.2.1.tar.gz'
  • tar -xzvf nginx-1.2.1.tar.gz
  • cd nginx-1.2.1/
  • patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch
  • ./configure --add-module=/path/to/nginx_tcp_proxy_module --with-http_ssl_module(必要に応じてモジュールを追加できます)
  • make
  • make install

オプション:

  • Sudo /sbin/chkconfig nginx on

Nginxをセットアップする

古い設定ファイルを再利用する場合は、最初に古い設定ファイルをコピーすることを忘れないでください。

重要: confの最上位にtcp {}ディレクティブを作成する必要があります。 _http {}ディレクティブ内にないことを確認してください。

以下の設定例は、単一のアップストリームWebsocketサーバーと、SSLと非SSLの両方の2つのプロキシを示しています。

tcp {
    upstream websockets {
        ## webbit websocket server in background
        server 127.0.0.1:5501;

        ## server 127.0.0.1:5502; ## add another server if you like!

        check interval=3000 rise=2 fall=5 timeout=1000;
    }   

    server {
        server_name _;
        listen 7070;

        timeout 43200000;
        websocket_connect_timeout 43200000;
        proxy_connect_timeout 43200000;

        so_keepalive on;
        tcp_nodelay on;

        websocket_pass websockets;
        websocket_buffer 1k;
    }

    server {
        server_name _;
        listen 7080;

        ssl on;
        ssl_certificate      /path/to/cert.pem;
        ssl_certificate_key  /path/to/key.key;

        timeout 43200000;
        websocket_connect_timeout 43200000;
        proxy_connect_timeout 43200000;

        so_keepalive on;
        tcp_nodelay on;

        websocket_pass websockets;
        websocket_buffer 1k;
    }
}
53
crockpotveggies

これは私のために働いた:

location / {
    # redirect all HTTP traffic to localhost:8080
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $Host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # WebSocket support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

-借入元: https://github.com/nicokaiser/nginx-websocket-proxy/blob/df67cd92f71bfcb513b343beaa89cb33ab09fb05/simple-wss.conf

32
Harlan T Wood

sSLを使用した.netコア2.0 Nginxの場合

location / {
    # redirect all HTTP traffic to localhost:8080
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $Host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    # WebSocket support
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
}

これは私のために働いた

16
Altair CA

私にとっては、proxy_passロケーションの設定になりました。 http://nodeserverhttps://nodeserverに変更し、ノードサーバー側で有効なSSL証明書をセットアップする必要があります。そのようにして、外部ノードサーバーを導入するとき、IPを変更するだけでよく、他のすべては同じ構成のままです。

これが途中で誰かを助けることを願っています...私はずっと問題を見つめていました...ため息...

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
upstream nodeserver {
        server 127.0.0.1:8080;
}
server {
        listen 443 default_server ssl http2;
        listen [::]:443 default_server ssl http2 ipv6only=on;
        server_name mysite.com;
        ssl_certificate ssl/site.crt;
        ssl_certificate_key ssl/site.key;
        location /horizon {
                proxy_pass https://nodeserver;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_Host;
                proxy_intercept_errors on;
                proxy_redirect off;
                proxy_cache_bypass $http_upgrade;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-NginX-Proxy true;
                proxy_ssl_session_reuse off;
            }
}
7
CDO

Pankaj Malhotraによる優れた簡潔な記事は、NGINXでこれを行う方法を説明しており、利用可能です here

基本的なNGINX構成を以下に再現します。

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

upstream appserver {
    server 192.168.100.10:9222; # appserver_ip:ws_port
}

server {
    listen 8888; // client_wss_port

    ssl on;
    ssl_certificate /path/to/crt;
    ssl_certificate_key /path/to/key;


    location / {
        proxy_pass http://appserver;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}
5
btiernay

Nginx/1.14.0を使用する

ポート8097で実行されているwebsocket-serverがあり、ユーザーがポート8098でwssに接続すると、nginxはコンテンツを復号化してwebsocketサーバーに転送するだけです

だから私はこの設定ファイルを持っています(私の場合は/etc/nginx/conf.d/default.conf

server {
    listen   8098;
        ssl on;
        ssl_certificate      /etc/ssl/certs/combined.pem;
        ssl_certificate_key  /root/domain.key;
    location / {

        proxy_pass http://hostname:8097;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;

    }
}
1
john Smith