回答:
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の変更ログとWebSocketプロキシのドキュメントも確認できます。
proxy_read_timeout
、私は答えを編集しました。
location
ディレクティブは、server
または別のlocation
ディレクティブ内に配置されます(場所のドキュメントを参照)。backend_host
はupstream
(上流のドキュメントを参照)-プロキシするサーバーの1つまたはグループです。
勇敢なOpsプログラマーグループが、ブランドをスパンキングする新しいnginx_tcp_proxy_moduleで状況を解決しているため、恐れはありません。
2012年8月に書かれているので、もしあなたが未来から来ているなら、あなたは宿題をするべきです。
CentOSを使用していると仮定します。
init.d/nginx
スクリプトを含めて再利用できるようにします。yum install pcre pcre-devel openssl openssl-devel
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
古い構成ファイルを再利用する場合は、最初にコピーしてください。
重要:tcp {}
confの最上位にディレクティブを作成する必要があります。ディレクティブの中にないことを確認してくださいhttp {}
。
以下の設定例は、単一のアップストリームWebソケットサーバーと、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;
}
}
これは私のために働きました:
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
# WebSocket support
手先が私のためにそれをしました。以前はポート400を転送しようとしていましたが、wssは443を超えて機能します。FYIの将来の読者:)
.net core 2.0 Nginx for SSL
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;
}
これは私のために働いた
私にとっては、proxy_pass
場所の設定に行き着きました。HTTPSプロトコルを使用するように切り替え、ノードサーバー側で有効な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 /websocket { #replace /websocket with the path required by your application
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;
}
}
localtion /horizon
、うまくいきません。localtion /
またはのみlocation /websockify
動作します。理由がわからない...
Pankaj Malhotraによる優れた簡潔な記事は、NGINXを使用してこれを行う方法について説明しており、こちらから入手できます。
基本的な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;
}
}
nginx / 1.14.0の使用
ポート8097でwebsocketサーバーを実行していて、ユーザーがポート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;
}
}