2013-04-13 6 views
7

は、私はnginxのリバースプロキシの背後にある薄いウェブサーバで実行して、WebSocketのレールの宝石とのRuby on Railsの3.2アプリを持っているレール。 nginxのリバースプロキシを除きThin + Nginx + Websocketsの設定|

、すべてがうまく動作します。 nginxのリバースプロキシを削除することで、websocketの通信はうまく動作します。 (開発と生産の両方)。 Webソケットのリバースプロキシとしてnginxを使用すると、問題がどこから始まるのでしょうか。

Nginx バージョン1.3.13以降では、WebSocketプロキシをサポートできる必要があります。

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

upstream ravecy { 
    server localhost:3000; 
    server localhost:3001; 
} 

server { 
    listen 80; 
    server_name test.ravecy.com; 

    root /var/www/ravecy.com/public; 

    location/{ 
    try_files $uri @ravecy; 
    } 

    location @ravecy { 
    proxy_pass http://ravecy; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection $connection_upgrade; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_redirect off; 
    } 
} 

は、悲しいことに、しかし、これは動作しません:ドキュメント herehereに基づいて、私は次のnginxの設定を作成しました。私は理由を正確に知りませんが、ログから分かるようにnginxのは、WebSocketの接続が、通常のHTTP接続として私のWebSocket接続の試行を処理していないように私には思える:接続が閉じていることを

==> production.log <== 
Started GET "/chat" for 82.170.121.62 at 2013-04-10 12:20:12 +0200 
Processing by ApplicationController#chat as HTML 
    Rendered application/chat.html.erb within layouts/frontend (0.2ms) 
    Rendered layouts/frontend/_navbar.html.erb (6.3ms) 
    Rendered layouts/shared/_alert.html.erb (0.0ms) 
    Rendered layouts/frontend/_facebook_sdk.html.erb (0.0ms) 
Completed 200 OK in 9ms (Views: 8.4ms | ActiveRecord: 0.4ms) 
Started GET "/websocket" for 82.170.121.62 at 2013-04-10 12:20:12 +0200 

==> websocket_rails.log <== 
I [2013-04-10 12:20:12.744] [ConnectionManager] Connection opened: #<Connnection::47398780> 

I [2013-04-10 12:20:12.745] [Dispatcher] Started Event: client_connected 
I [2013-04-10 12:20:12.745] [Dispatcher] Name: client_connected 
I [2013-04-10 12:20:12.745] [Dispatcher] Data: {"connection_id"=>47398780} 
I [2013-04-10 12:20:12.745] [Dispatcher] Connection: #<Connnection::47398780> 

I [2013-04-10 12:20:12.747] [Dispatcher] Event client_connected Finished in 0.001960819 seconds 


==> /var/log/nginx/access.log <== 
82.170.121.62 - - [10/Apr/2013:12:20:12 +0200] "GET /chat HTTP/1.1" 200 854 "http://test.ravecy.com/posts" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17" 
82.170.121.62 - - [10/Apr/2013:12:20:12 +0200] "GET /assets/frontend-6ad91089203a6026624ce015c2800492.css HTTP/1.1" 304 0 "http://test.ravecy.com/chat" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17" 
82.170.121.62 - - [10/Apr/2013:12:20:12 +0200] "GET /assets/frontend-98fa493fc9f482c0d44b31bda5a89135.js HTTP/1.1" 304 0 "http://test.ravecy.com/chat" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17" 

==> websocket_rails.log <== 
I [2013-04-10 12:20:12.832] [ConnectionManager] Connection closed: #<Connnection::47398780> 

I [2013-04-10 12:20:12.832] [Dispatcher] Started Event: client_disconnected 
I [2013-04-10 12:20:12.832] [Dispatcher] Name: client_disconnected 
I [2013-04-10 12:20:12.832] [Dispatcher] Data: nil 
I [2013-04-10 12:20:12.832] [Dispatcher] Connection: #<Connnection::47398780> 

I [2013-04-10 12:20:12.833] [Dispatcher] Event client_disconnected Finished in 0.000293462 seconds 


==> /var/log/nginx/access.log <== 
82.170.121.62 - - [10/Apr/2013:12:20:12 +0200] "GET /websocket HTTP/1.1" 200 398 "-" "-" 

注意をたとえそれが生き続けるべきであっても、100ms以内に。

さらにコンフィグ: nginx.conf:

user www-data; 
worker_processes 4; 
pid /run/nginx.pid; 

events { 
    worker_connections 768; 
} 

http { 
    sendfile on; 
    tcp_nopush on; 
    tcp_nodelay on; 
    keepalive_timeout 65; 
    types_hash_max_size 2048; 

    include /etc/nginx/mime.types; 
    default_type application/octet-stream; 

    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log; 

    gzip on; 
    gzip_disable "msie6"; 

    include /etc/nginx/conf.d/*.conf; 
    include /etc/nginx/sites-enabled/*; 
} 

薄い設定:

--- 
chdir: /var/www/ravecy.com 
environment: production 
address: 127.0.0.1 
port: 3000 
timeout: 30 
log: log/thin.log 
pid: tmp/pids/thin.pid 
max_conns: 1024 
max_persistent_conns: 100 
require: [] 
wait: 30 
servers: 2 
daemonize: true 

nginxのバージョン:例を生きるため nginxの/ 1.3.15 URL: http://test.ravecy.com/chat

また注意:JSコンソールでnew WebSocket("ws://test.ravecy.com/websocket")を実行すると、 ブラウザで「予期しない応答コード:200」と表示されます。

私はこの作業を行うと、もはや私が何をすべきかを知ってかなり絶望的です。

は、Telnetはnginxの結果:

Telnetは薄いへの直接の結果:

GET /websocket HTTP/1.1 
Host: test.ravecy.com 
Connection: Upgrade 
Upgrade: WebSocket 

HTTP/1.1 101 Web Socket Protocol Handshake 
Upgrade: WebSocket 
Connection: Upgrade 
WebSocket-Origin: 
WebSocket-Location: ws://test.ravecy.com/websocket 

[["client_connected",{"id":null,"channel":null,"data":{"connection_id":37489460},"success":null,"result":null,"server_token":null}]][["users",{"id":null,"channel":null,"data":[],"success":null,"result":null,"server_token":null}]][["client_connected",{"id":null,"channel":null,"data":{},"success":false,"result":null,"server_token":null}]] 

を明らかに、これはものがうまくいかなかったです。しかし、なぜ?私は首都「U」と「アップグレード」を使用ことに注意telnetの結果に基づいて

+0

は、それがHTTPで固定だようだ://test.ravecy .com/chat。原因は何ですか? –

答えて

7

。 「アップグレード」の代わりに、うん...

+0

thx!あなたはnginxの設定で意味ですか?あなたはどこで「U」を正確に変更しましたか? – unludo

+1

'map $ http_upgrade $ connection_upgrade { デフォルトアップグレード; ''閉じる; } ' –

+0

ありがとうございます!あなたは今日私の脳を救う。私の場合正しい場所の設定は次のようになります。 'proxy_http_version 1.1;' 'proxy_set_headerアップグレード$ http_upgrade;' 'proxy_set_header接続「アップグレード」; –

0

を私が持っていたすべての問題を修正し、「アップグレード」を使用。接続が時々WSへのHTTPの構文をアップグレード、大文字と小文字を区別し

あるので、完全なサーバ設定は、次のようになります。

server { 
listen 80; 
server_name server.com; 

root /var/www/my-app/current/public; 

try_files $uri/index.html $uri @app; 

location @app { 
    proxy_pass http://app; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
} 

# enables WS support 
location /websocket { 
    proxy_pass http://app; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "Upgrade"; 
} 

error_page 500 502 503 504 /500.html; 
client_max_body_size 4G; 
keepalive_timeout 10; 

}