質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Q&A

解決済

1回答

5840閲覧

nginx-websocketサーバーのSSL設定

nagasa

総合スコア35

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

0グッド

1クリップ

投稿2017/06/03 06:15

編集2017/06/03 09:57

現在、websocketサーバーにnginxを導入してSSL化したいと考えています。
プロキシサーバーとしてSSL化のみをおこなう予定です。
初心者で、初めてnginxに触れるのですが、下記の環境で設定をしてみました。

SSL無しの場合は動作していることは確認しています。クライアントでは(ws://websocketサーバーIPadress:9090)で接続
(SSL時にはws→wssに変更)
●websocketサーバー構成
CentOS7
websocket:voryx/Thruway
nginx:1.12.0
同一サーバー内に全てインストールしています。

vi /etc/nginx/nginx.conf

stream { upstream backend { server 127.0.0.1:9090; } server { listen 443 ssl; ssl_certificate /root/SSL/server.crt; ssl_certificate_key /root/SSL/XXXX.com.2017.key; proxy_connect_timeout 10s; proxy_timeout 10s; proxy_pass backend; } }

多少は予想していましたが、やはり動かず、基本的なところがわかっていないのですが、
どのようにすれば良いのか教えて頂きたくよろしくお願いします。
(追記)

編集後、設定は下記の通りとなっています。

user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; stream { upstream backend { server 127.0.0.1:9090; } server { listen 443 ssl; ssl_certificate /root/SSL/server.crt; ssl_certificate_key /root/SSL/XXXXX.com.2017.key; proxy_connect_timeout 10s; proxy_timeout 10s; location / { proxy_pass backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } } }

更に修正版

user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } stream { upstream backend { server 127.0.0.1:9090; } server { listen 443 ssl; ssl_certificate /root/SSL/server.crt; ssl_certificate_key /root/SSL/XXXX.com.2017.key; proxy_connect_timeout 10s; proxy_timeout 10s; proxy_pass backend; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

http://nginx.org/en/docs/http/websocket.html によると、Upgrade, Connection ヘッダが必要とのことです。

(2017/06/03 18:16) 訂正
ごめんなさい、stream {} ではなく、http {} の場合の設定でした。
クライアントからは https:// でアクセスしています。

http { (略) server { listen 443 ssl; ssl_certificate /root/SSL/server.crt; ssl_certificate_key /root/SSL/XXXX.com.2017.key; proxy_connect_timeout 10s; location / { proxy_pass http://127.0.0.1:9090; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } }

stream {} の場合、質問文の設定で、クライアントから https:// でアクセスすると、Upgrade して WebSocket で通信できませんでしょうか。

投稿2017/06/03 07:52

編集2017/06/03 09:16
TaichiYanagiya

総合スコア12141

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nagasa

2017/06/03 08:12

回答ありがとうございます。指摘して頂いたコードを入れてみたのですが、proxy_http_version 1.1;の部分で下記のエラーが出てしまいました。何かモジュール等、入れ忘れているのかチェックしてみます。 "proxy_http_version" directive is not allowed here in /etc/nginx/nginx.conf:
TaichiYanagiya

2017/06/03 08:18

すみません。location / {} が必要でした。
nagasa

2017/06/03 09:01 編集

追記ありがとうございます。こちらの間違えかわかりませんが、まだ同じエラーが出ていまして、現在は 本文の追記の通りとなっています、チェックしていみます。エラーは下記の通りです。 nginx: [emerg] "stream" directive is not allowed here in /etc/nginx/nginx.conf
TaichiYanagiya

2017/06/03 09:17

ごめんなさい、stream {} ではなく、http {} の場合の設定でした。 クライアントからは https:// でアクセスしています。 stream {} の場合、質問文の設定で、クライアントから https:// でアクセスすると、Upgrade して WebSocket で通信できませんでしょうか。
TaichiYanagiya

2017/06/03 09:40 編集

バックエンドに tomcat7 の WebSocket Echo example で試してみましたが、質問文の最初の(location なしの) stream {} 設定で wss:// で接続できているように思います。
nagasa

2017/06/03 10:03

上の質問のところの「更に修正版」の設定で、nginxは問題なく動いたのですが、クライアント側では下記のエラーが出て、繋がりませんでした。クライアント側も調べてみます。 WebSocket connection to 'wss://XXX.XXX.XXX.XX:9090/' failed: WebSocket opening handshake timed out
nagasa

2017/06/03 10:15

ちょっと、コードに間違いがないなら、もしかしたらSSLのファイルに問題があるかもしれないので、見てみます。一旦、これでベストアンサーとします。本当にありがとうございました。
TaichiYanagiya

2017/06/03 10:42

wss:// なのになぜか :9090 が付いていますね。 wss://IPアドレス/ または wss://IPアドレス:443/ となるはず。
nagasa

2017/06/03 11:06

ご指摘ありがとうございます。修正しました。ただ、まだ問題が根深いようで、なかなかつながらないです。
TaichiYanagiya

2017/06/06 02:37

アプリ側でリダイレクト(Location: wss://XXX.XXX.XXX.XX:9090/) を返していませんでしょうか? もし、そうならば、"proxy_redirect wss://XXX.XXX.XXX.XX:9090/ /" などで Location を変換するといいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問