【问题标题】:Rails + Passenger + Nginx error Request Origin (domainname.com) does not match Request Base_url (IP Address)Rails + Passenger + Nginx 错误 Request Origin (domainname.com) 与 Request Base_url (IP Address) 不匹配
【发布时间】:2017-09-11 10:43:13
【问题描述】:

设置: Rails 5.1.3,带有Passenger 和Nginx 的Dreamhost VPS。 由于它是 VPS,我没有 root 权限来执行任何需要 root 权限的功能。

情况:目前,我重做了一个具有 ActionCable 功能的以前的 rails 应用程序。早期的配置是使用 Apache 而不是 Nginx 用于 http 服务器。除了websockets,一切都很好,我读了很多文章,所有确认action cable + apache都不起作用。

此时,我切换到 NginX。使用 NginX,我的第一个观察是应用程序不断尝试“get cable/”过程并且无法升级到 websocket。在阅读了各种讨论后,我设法解决了这个问题:

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

}

由于我没有访问通常的 dt/etc/nginx/.../***.conf 文件的 root 权限,使用 dreamhost VPS 包,我可以在 /home/username/nginx/ 添加一个文件(appname.com)/(any-file-name.conf),这将添加到 nginx“服务器块”,根据 dreamhost 文档。

^^因此,仅在该目录中名为“redis.conf”的文件中的上述代码块就对动作电缆问题进行了排序。它成功地开始在频道上流式传输,一切都很好。

我后来意识到,主要问题是我无法执行任何创建、更新、销毁操作 - 任何需要 POST 或 DELETE 方法的操作,因为它会导致真实性令牌错误,说“请求来源 (http : //siik.io - 这是应用程序和域名)与 request.base_url (http://127.0.0.1) 不匹配。

详细错误:

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 访问该站点时,一切正常,即使是 websockets 位也不需要 redis.conf 文件。

我已经经历了一周的各种修复和文档,但未能找到解决方案。我认为基本要求是在 location / {} 块中添加更多标头以添加到 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 来自于 rails 的protect_from_forgery 位,我不认为将其关闭是一种解决方案,尽管我确实在某处读到了包含正确标题的内容将解决这个问题。我已经尝试了这个标头集的一些变体,但都没有奏效,我想知道是否包含正确的标头应该达到 http 源标头将从 domainname.io 更改为 IP 地址或 request.base_url 将从域名的IP地址??

哦,是的,当我在 redis.conf 旁边的新文件 proxy.conf 中添加 location / {} 块时,它完全中断了。通过 domainname.io 的网站拒绝连接,而 domainname.io:8000 完美运行。即使是 location / 下的空块也会破坏它 - 我正在测试是否有任何特定的 proxy_set 命令导致它破坏 - 但没有。只是“位置/{}”位打破了它 - 也许这是意料之中的?

为什么当我通过 siik.io:8000 访问它时,它可以完美地工作,并明确显示端口号?

非常感谢任何帮助!!!!

【问题讨论】:

    标签: ruby-on-rails passenger request-headers nginx-reverse-proxy


    【解决方案1】:

    已修复。

    我不完全确定这是如何解决的,我仍在试图弄清楚为什么一切正常。 基本上,问题似乎与维护Passenger+Nginx 配置的方式有关。 - 我相信这是一个 Dreamhost 特定的问题。

    我最初的 VPS 配置是按照 Dave Jones 在 youtube 上的教程使用 Apache 作为 http 服务器完成的。在 Dreamhost 面板的域托管部分中,有一个复选框可以将 Passenger 与 ruby​​ 应用程序一起使用,根据我遵循的原始教程,该应用程序未选中。 阅读@Camden 的链接 - 非常有帮助 - 我决定从头开始重新配置所有内容,并检查控制面板上的这个乘客箱以及 HTTPS 安全位,添加来自“让我们加密 SSL”的证书并重新启动我的服务器。 一切都开始按要求完美运行。我还在 CONF 文件中的“/cable”位置块下添加了 443 端口的标头 - 并在 production.rb 文件中添加了http://www.domainnam.io,并将 config.force_ssl 设置为 true。

    因此,总而言之,我理解问题在于乘客 nginx 集成的配置不当。 感谢@Camden 提供的链接。

    【讨论】:

      【解决方案2】:

      您不需要在另一个端口上运行您的动作电缆服务器,请尝试按照以下说明操作:https://www.phusionpassenger.com/library/config/nginx/action_cable_integration/

      根据 THE RULES™ 复制到此处:

      在同一主机和端口上运行 Action Cable 服务器,在子 URI 下

      这是 Rails 推荐的默认设置,也是最简单的。它通过将ActionCable.server 挂载到config/routes.rb 中的某个路径来工作。这样,您的 Action Cable 服务器将与您的应用程序在同一主机和端口上运行,但在子 URI 下。

      例如,您的routes.rb 可能包含:

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

      (虽然routes.rb 评论说挂载ActionCable.server 是为了在进程中提供它,但Passenger 实际上坚持将它作为一个单独的进程运行。)

      要在Passenger + Nginx 中进行这项工作,您需要向您的Nginx 虚拟主机添加一个sn-p。假设您的应用程序已经有一个虚拟主机,如下所示:

      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 中指定的实际 Action Cable 路径。

      YOUR_APP_NAME_HERE 替换为不会出现在 Nginx 配置文件中其他任何位置的唯一标识符。

      passenger_force_max_concurrent_requests_per_process 选项调整Passenger 以获得最佳WebSocket 性能。

      【讨论】:

      • 感谢@camden,我将尝试使用动作电缆位,但是(也许我歪曲了我当前的问题)-当我将动作电缆“位置/电缆”块从等式,主要问题仍然存在:每当我执行登录、注销、创建、销毁 - 任何事情。
      • [我过早地按了 Enter 键抱歉...] 因此,由于siik.io127.0.0.1:8000 之间的不匹配导致的真实性令牌部分的问题仍然存在,无论为操作电缆添加了什么修复程序。我认为动作电缆是一个孤立的问题,我提到它是为了解释为什么我从 apache 切换到 nginx。如果您的建议是在独立 + apache 中运行乘客以运行动作电缆,我很想尝试一下。只是,nginx 拥有更好的处理或内存和进程。不过,我想先探索一下如何仅修复 nginx 重定向。
      猜你喜欢
      • 2016-06-21
      • 2022-11-23
      • 1970-01-01
      • 2021-03-17
      • 2019-03-23
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多