ruby-on-rails - メインアプリケーションを備えたWebSocket(nginx +乗客+ faye)

原文 ruby-on-rails nginx websocket passenger faye

RailsアプリケーションでWebSocketをセットアップしようとしています。私のアプリケーションは、SocketRockerライブラリを使用するiOSクライアントで動作します。

websocketsバックエンドとして、faye-rails gemを使用します。
ラックミドルウェアとしてRailsアプリに統合されています

config.middleware.delete Rack::Lock
config.middleware.use FayeRails::Middleware, mount: '/ws', server: 'passenger', engine: {type: Faye::Redis, uri: redis_uri}, :timeout => 25 do
  map default: :block
end


Nginxを使用して本番サーバーにアップロードするまで、完璧に機能します。私はwebsocketリクエストをバックエンドに渡すために多くの解決策を試しましたが、うまくいきませんでした。主なことは、2つのサーバーが実行されていることですが、私は1つしか持っていません。私の考えは、/ fayeエンドポイントから/ wsへのリクエストをプロキシ化する(ヘッダーを更新する)必要があるだけでした。私の場合、正しいproxy_passパラメータは何ですか?

    location /faye {
    proxy_pass http://$server_name/ws;
    proxy_buffering off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    }
答え
私にも同様の問題があり、しばらく苦労した後、ようやくそれを機能させることができました。

nginx 1.8とgem 'faye-rails'のシンサーバーを使用していますが、マウントポイントは/ fayeです

私のnginx設定は次のようになりました:

upstream thin_server {
    server 127.0.0.1:3000;
}

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

server {
    ...   
    proxy_redirect off; 
    proxy_cache off;     

    location = /faye {
        proxy_pass http://thin_server;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        chunked_transfer_encoding off;
        proxy_buffering off;
        proxy_cache off;
    }

    location / {
        try_files $uri/index.html $uri.html $uri @proxy;
    }

    location @proxy {
        proxy_pass http://thin_server;
        proxy_set_header  X-Real-IP  $remote_addr;                      
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;   
        proxy_set_header  Host $http_host;                              
    }                                                            
    ...
}                                                  


それを機能させるための最後のターニングポイントは、「location = / faye」を設定したときです。 「location / faye」と「location〜/ faye」を試す前に失敗しました。
等号「=」は、nginxが他の場所の設定と混ざらないように見えます。
関連記事

ruby-on-rails - Rails ActiveRecord checkout_timeout設定は無視されました

ruby-on-rails - Ruby-on-Rails 4.1との関係でRSpec 3.1.0およびhas_manyに問題がある

ruby-on-rails - モデル内の属性の値を使用するにはどうすればよいですか? Ruby on Rails

ruby-on-rails - ファイルが添付されていないときにtransloadit-railsオーバーレイと進行状況バーが表示されないようにする

ruby-on-rails - Railsテストの構成を一時的にオーバーライドする

javascript - RubyコードでJqueryを介してクリックをトリガーする

ios - Swiftを使用してiOSからRuby / Railsサーバーに画像をアップロードする方法

ruby-on-rails - Ruby gemをインストールできません-未定義のメソッド `invoke_with_build_args`

ruby-on-rails - Railsアプリ内から別のデータベースのスキーマを管理する方法

javascript - ターボリンクでJavaScriptの依存関係を読み込む方法