簡體   English   中英

Thin + Nginx + Websockets配置| 軌道

[英]Thin + Nginx + Websockets configurations | Rails

我有一個帶有websocket-rails gem的Ruby on Rails 3.2應用程序,在nginx反向代理后面的瘦web服務器中運行。

除了nginx反向代理,一切正常。 通過刪除nginx反向代理,websocket通信工作正常。 (開發和生產)。 使用nginx作為websockets的反向代理是問題的起點。

Nginx 1.3.13及更高版本應該能夠支持websocket代理。 根據這里這里的文檔,我創建了以下nginx配置:

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;
  }
}

然而,遺憾的是,這不起作用。 我不知道為什么,但在我看來,nginx並沒有處理我的websocket連接嘗試作為websocket連接而是常規HTTP連接,如日志所示:

==> 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 "-" "-"

請注意,連接在100毫秒內關閉,即使它應該保持活動狀態。

進一步的配置: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:

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

HTTP/1.1 200 OK
Server: nginx/1.3.15
Date: Sat, 13 Apr 2013 19:50:35 GMT
Content-Type: text/json
Transfer-Encoding: chunked
Connection: keep-alive

152
[["client_connected",{"id":null,"channel":null,"data":{"connection_id":37160040},"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}]]

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}]]

顯然,這是出了問題。 但為什么?

基於telnet結果,我注意到我使用了“升級”,大寫字母為“U”。 使用“升級”代替“升級”修復了我遇到的所有問題......

是啊。 http到ws的連接升級語法有時區分大小寫

所以完整的服務器配置如下所示:

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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM