0

セットアップ: Rails 5.1.3、Dreamhost VPS with Passenger and Nginx。 VPSなので、私はroot権限を必要とする機能を実行するためにroot権限を持っていません。Rails + Passenger + NginxエラーリクエストOrigin(ドメイン名.com)が一致しません。Base_url(IPアドレス)

状況:現在、私はActionCable機能を備えた以前のレールアプリをやり直しました。これまでの設定は、httpサーバ用のNginxではなくApacheで行っていました。すべてがWebSocketを除いて正常に動作し、かなりの数の記事を読んで、すべてのアクションケーブル+ Apacheが動作しないことを確認します。

その時点で、NginXに切り替えました。 NginXを使って、私の最初の観察は、アプリケーションが常に 'ケーブル/プロセス'を試み、websocketにアップグレードしないことでした。様々な議論を通じて読んだ後、私はでこれを解決するために管理:Dreamhostのと、私はいつものDTは/ etc/nginxの/.../***にアクセスするには、root権限がありませんconfファイルとして

location /cable { 
    proxy_pass http://127.0.0.1:8000/cable; 
    proxy_http_version 1.1; 
proxy_set_header Host $http_host; 
proxy_set_header Upgrade $http_upgrade; 
proxy_set_header Connection "upgrade"; 

} 

をVPSパッケージでは、/home/username/nginx/(appname.com)/(any-file-name.conf)にファイルを追加できます。これは、dreamhostのドキュメントに従って、nginxの "server block"に追加されます。

^^そのディレクトリ内の "redis.conf"というファイル内の上記のコードブロックだけが、アクションケーブルの問題をソートしました。それは正常にすべてのチャネルでストリーミングを開始します。

主な問題は、作成、更新、破棄のいずれの操作も実行できないことです。POSTやDELETEメソッドが必要なものはすべて、認証トークンのエラーとなります。 : - ://127.0.0.1)

詳細エラー://siik.io このアプリ&ドメイン名は)(request.base_urlと一致しませんでしたHTTPという

I, [2017-09-11T03:27:28.623080 #7273] INFO -- : [50a21156-0333-413e-94b 

8-07b791c209fc] Completed 200 OK in 83ms (Views: 56.0ms | ActiveRecord: 16.6ms) 
I, [2017-09-11T03:27:31.950732 #7273] INFO -- : [dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] Started POST "/conversations/1/messages" for 106.208.156.243 at 2017-09-11 03:27:31 -0700 
I, [2017-09-11T03:27:31.953339 #7273] INFO -- : [dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] Processing by MessagesController#create as JS 
I, [2017-09-11T03:27:31.953511 #7273] INFO -- : [dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] Parameters: {"utf8"=>"✓", "message"=>{"user_id"=>"1", "body"=>"sdfgh"}, "commit"=>"Send", "conversation_id"=>"1"} 
W, [2017-09-11T03:27:31.954325 #7273] WARN -- : [dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] HTTP Origin header (http://www.siik.io) didn't match request.base_url (http://127.0.0.1:8000) 
I, [2017-09-11T03:27:31.954890 #7273] INFO -- : [dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms) 
F, [2017-09-11T03:27:31.956888 #7273] FATAL -- : [dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] 
F, [2017-09-11T03:27:31.956969 #7273] FATAL -- : [dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken): 
F, [2017-09-11T03:27:31.957017 #7273] FATAL -- : [dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] 
F, [2017-09-11T03:27:31.957126 #7273] FATAL -- : [dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_controller/metal/request_forgery_protection.rb:195:in `handle_unverified_request' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_controller/metal/request_forgery_protection.rb:227:in `handle_unverified_request' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] devise (4.3.0) lib/devise/controllers/helpers.rb:253:in `handle_unverified_request' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_controller/metal/request_forgery_protection.rb:222:in `verify_authenticity_token' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/callbacks.rb:413:in `block in make_lambda' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/callbacks.rb:197:in `block (2 levels) in halting' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/abstract_controller/callbacks.rb:12:in `block (2 levels) in <module:Callbacks>' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/callbacks.rb:198:in `block in halting' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/callbacks.rb:507:in `block in invoke_before' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/callbacks.rb:507:in `each' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/callbacks.rb:507:in `invoke_before' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/callbacks.rb:130:in `run_callbacks' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/abstract_controller/callbacks.rb:19:in `process_action' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_controller/metal/rescue.rb:20:in `process_action' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_controller/metal/instrumentation.rb:32:in `block in process_action' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/notifications.rb:166:in `block in instrument' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/notifications.rb:166:in `instrument' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_controller/metal/instrumentation.rb:30:in `process_action' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_controller/metal/params_wrapper.rb:252:in `process_action' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activerecord (5.1.3) lib/active_record/railties/controller_runtime.rb:22:in `process_action' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/abstract_controller/base.rb:124:in `process' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionview (5.1.3) lib/action_view/rendering.rb:30:in `process' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_controller/metal.rb:189:in `dispatch' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_controller/metal.rb:253:in `dispatch' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/routing/route_set.rb:49:in `dispatch' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/routing/route_set.rb:31:in `serve' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/journey/router.rb:46:in `block in serve' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/journey/router.rb:33:in `each' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/journey/router.rb:33:in `serve' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/routing/route_set.rb:834:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] remotipart (1.3.1) lib/remotipart/middleware.rb:32:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] warden (1.2.7) lib/warden/manager.rb:36:in `block in call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] warden (1.2.7) lib/warden/manager.rb:35:in `catch' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] warden (1.2.7) lib/warden/manager.rb:35:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] rack (2.0.3) lib/rack/etag.rb:25:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] rack (2.0.3) lib/rack/conditional_get.rb:38:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] rack (2.0.3) lib/rack/head.rb:12:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] rack (2.0.3) lib/rack/session/abstract/id.rb:232:in `context' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] rack (2.0.3) lib/rack/session/abstract/id.rb:226:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/middleware/cookies.rb:613:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/middleware/callbacks.rb:26:in `block in call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/callbacks.rb:97:in `run_callbacks' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/middleware/callbacks.rb:24:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/middleware/debug_exceptions.rb:59:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] railties (5.1.3) lib/rails/rack/logger.rb:36:in `call_app' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] railties (5.1.3) lib/rails/rack/logger.rb:24:in `block in call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/tagged_logging.rb:69:in `block in tagged' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/tagged_logging.rb:26:in `tagged' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/tagged_logging.rb:69:in `tagged' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] railties (5.1.3) lib/rails/rack/logger.rb:24:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/middleware/remote_ip.rb:79:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/middleware/request_id.rb:25:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] rack (2.0.3) lib/rack/method_override.rb:22:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] rack (2.0.3) lib/rack/runtime.rb:22:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] activesupport (5.1.3) lib/active_support/cache/strategy/local_cache_middleware.rb:27:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] actionpack (5.1.3) lib/action_dispatch/middleware/executor.rb:12:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] rack (2.0.3) lib/rack/sendfile.rb:111:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] railties (5.1.3) lib/rails/engine.rb:522:in `call' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] passenger (5.1.8) src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb:97:in `process_request' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] passenger (5.1.8) src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb:160:in `accept_and_process_next_request' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] passenger (5.1.8) src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb:113:in `main_loop' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] passenger (5.1.8) src/ruby_supportlib/phusion_passenger/request_handler.rb:416:in `block (3 levels) in start_threads' 
[dd8e08f7-f28b-497b-9ae9-e57a6a45c35d] passenger (5.1.8) src/ruby_supportlib/phusion_passenger/utils.rb:113:in `block in create_thread_and_abort_on_exception' 

をしかし、 http://siik.io:8000を介してサイトにアクセスすると完全に動作します。ウェブソケットのビットredis.confファイルは必要ありません。

私は1週間分のさまざまな修正と文書化を行っており、これに対する解決策を見つけることができませんでした。私は基本的な要件は... nginx.confファイルへ追加する場所/ {}ブロックに複数のヘッダを追加することであると思う(私は以下試したいくつかの例をリストアップしました。)

listen 80; 
listen *:80; 
server_name siik.io www.siik.io http://siik.io; 
location/{ 

     proxy_redirect off; 
     proxy_set_header Host $host:8000; 

     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 


     proxy_http_version 1.1; 

     proxy_set_header X-Real-IP $remote_addr:8000; 
     proxy_set_header X-Forwarded-Port $server_port; 

     proxy_pass http://127.0.0.1:8000/; 
} 

私は基本的にさまざまな組み合わせを試しています。&上記の値の順列は、どのように動作するかを明確に分かりました。私はこれがどのように動作するかを知りません。 - 逆プロキシとhttpサーバに関するいくつかの概念知識があります。

はい、私はrequest.originを知っています== request.base_urlは、レールのprotect_from_forgeryビットからですが、私はそれをオフに切り替えるとは思わないが、正しいヘッダーを含むどこかを読んだこの問題を解決してください。私はこのヘッダーセットのいくつかのバリエーションを試しましたが、うまくいきませんでした。そして、正しいヘッダーを含めることで、httpオリジンヘッダーがdomainname.ioからIPアドレスに変更されるか、request.base_urlがドメイン名へのIPアドレス?

はい、location/{}ブロックをredis.confの隣にある新しいファイルproxy.confに追加すると、完全に壊れます。 domainname.io経由のWebサイトは接続を拒否しますが、domainname.io:8000は完全に動作します。場所の下の空のブロックさえ/それを壊す - 私は特定のproxy_setコマンドがそれを壊していたかどうかを調べるためにテストしていたが、ちょうどビット "場所/ {}"はそれを破る - これはおそらく期待されていますか?

なぜ私は明示的にポート番号と、siik.io:8000経由でアクセス完璧にこの作品?

ご迷惑をおかけして申し訳ございません。

答えて

0

あなたはこれらの指示に従ってみてください、別のポート上のアクション・ケーブル・サーバを実行する必要はありません。https://www.phusionpassenger.com/library/config/nginx/action_cable_integration/

は、規則に従ってここにコピー™:

同一ホスト上で動作ケーブル・サーバを実行し、ポートは、サブURI

の下でこれはRailsので推奨されているように、デフォルトの設定であり、また最も簡単です。 config/routes.rbの特定のパスにActionCable.serverをマウントして動作します。そうすれば、Action Cableサーバーはアプリケーションと同じホストとポートで実行されますが、サブURIの下で実行されます。

たとえば、あなたroutes.rbが含まれていてもよい:

# Serve websocket cable requests in-process 
mount ActionCable.server => '/cable' 

routes.rbコメントは取り付けがActionCable.serverはインプロセス、それを提供するためのものであることを述べているが、乗客は実際には別のプロセスとして実行を主張する。)

Passenger + Nginxでこれを動作させるには、Nginx仮想ホストにスニペットを追加する必要があります。あなたがアクションケーブルエンドポイントを設定する場所のブロックを挿入する必要が

server { 
    listen 80; 
    server_name www.foo.com; 
    root /path-to-your-app/public; 
    passenger_enabled on; 
} 

、次のように:このようになります。これは、すでにアプリケーションの仮想ホストを持っていたと仮定し

server { 
    listen 80; 
    server_name www.foo.com; 
    root /path-to-your-app/public; 
    passenger_enabled on; 

    ### INSERT THIS!!! ### 
    location /cable { 
     passenger_app_group_name YOUR_APP_NAME_HERE_action_cable; 
     passenger_force_max_concurrent_requests_per_process 0; 
    } 
} 

置き換え/cableと実際のアクションケーブルパスは、routes.rbで指定されています。

YOUR_APP_NAME_HEREを、Nginx設定ファイルのどこにも表示されない一意の識別子に置き換えます。

最適のWebSocketのパフォーマンスのためpassenger_force_max_concurrent_requests_per_processオプションの曲旅客。

+0

感謝@カムデン、私はアクションケーブルのビットのためにこれを試してみるつもりですが(おそらく私は現在の私の問題を誤解しました) - アクションケーブル "場所/ケーブル"ブロックを式から外すと、 --domainname.io--だけでアプリケーションにアクセスすると、ログイン、ログアウト、作成を実行するたびに、HTTP要求元(DOMAINNAME.IO)のエラーがREQUEST.BASE_URL(IPアドレス)と一致しません。 、破壊する - 何でも。 –

+0

[私はすぐに入力キーを押してください...] http://www.siik.ioとhttp://127.0.0.1:8000の間の不一致によるその真偽トークン部分の問題は、何の修正があってもまだ残っていますアクションケーブル用に追加されました。私はアクションケーブルが孤立した問題だと思っています。なぜ私がApacheからnginxに切り替えたのかを説明するために言及しました。あなたの提案がアクションケーブルを実行するためのスタンドアロン+ Apacheで乗客を走らせることだったなら、それを試してみることが大好きです。のみ、nginxより良いハンドリングやラムとプロセスを誇っています。私は最初にnginxのリダイレクトを修正する方法を探究したいと思います。 –

0

固定。私はこれが解決されたか完全にわからない

は、私はまだすべてが動作している理由を把握しようとしています。 基本的に、問題はPassenger + Nginxの設定が維持されているように見えました。 - これは私が信じている夢のホスト特有の問題です。

私の最初のVPSの設定は、ユーチューブ上のデイブ・ジョーンズチュートリアル以下のhttpサーバとしてApacheで行われました。 Dreamhostパネルのドメインホスティングセクションには、私が従っていた元のチュートリアルのとおり、チェックされていないルビーアプリケーションを使用するためのチェックボックスがあります。 @Camdenのリンクを読む - 非常に便利 - コントロールパネルのこのPassenger BoxとHTTPSの安全なビットをチェックし、「Let's Encrypt SSL」の証明書を追加してサーバを再起動しました。 必要に応じてすべてが完全に機能し始めました。また、CONFファイルの '/ cable'のロケーションブロックの下にある443ポートのヘッダーを追加し、config.force_sslをtrueに設定して、http://www.domainnam.ioをproduction.rbファイルに追加しました。

結論として、乗客nginxの統合の不適切な設定が問題であると私は理解しています。 @Camdenさんにリンクをありがとうございます。

関連する問題