生产中使用Rails 5 App的Elastic Beanstalk Nginx上的502错误网关(头太大)

fja*_*ahr 6 ruby-on-rails nginx devise doorkeeper amazon-elastic-beanstalk

我正在使用网守,并在Rails 5应用程序中设计了自己的OAuth提供程序以用于Amazon Alexa帐户链接。如果用户触发了OAuth流程并且已经登录到我的网站,则该流程可以正常工作。但是,如果用户未登录,则需要先登录,然后再开始流程。设计登录后,不会将用户重定向到OAuth流。现在,我已经添加了登录后重定向回OAuth流程的功能,并且在开发模式下(使用ngrok)可以正常工作,但是在生产环境中,登录后出现502错误,我无法弄清楚问题出在哪里。

这是access.log中的条目:

2017/05/03 22:54:04 [error] 2866#0: *185513 upstream sent too big header while reading response header from upstream, client: 172.31.23.232, server: _, request: "GET /oauth/authorize?client_id=08e9435534209c8ee4289ea2bec61a811645b254b060909d142ea3f1f5141600&response_type=token&state=eyJpbml0VmVjdG9yIjoiaXRLcmVuWlppWENBcWhad2VUYW0zZz09IiwicGF5bG9hZCI6IjJOeGU3Rks1gFg2cmJWL2lTM3ZpVXFydTVIdFpiOHM1bGVNbUDwUXX3M2QkpOU0tKNFVEaWdIdkZnSTBNNjBzK1U5ZXppUmJTYWdtVFpGeWJIdUJpKzFtaU1sTUpLckZ5cDAxdzVmY3BtYlBPQnZvL3ZMeWpPVTNHK3pWNk5IRDU4YlRDa1Nvb0xLNGVQSVp4bjljSlBuT3c0QXl0NlBSdnpjDDpraDhFTUc1TFF3WGNPZkZnMFdQRkN5aFJlYnIxUDNsdmNXXXl3Z0VwYlc3dWhtdDZnUEpWN3UzdEVUNlV6aHpxYXjvZlFPWktySWJHcUMzcjlaMW44MFB6U3NlTGN5eFA2MTR1cTZDVWhONzdqRzdvZGVZcDFyU0ZrRU1qMFVxbXhHYUhYUWx1cy9qZ3NjamxjNHFGUmU4cjJ0dXhHeFZxbDhtYmllMVFGcDVWbmVWRjNlZ0Q1U1JnMytVTWZDcXltTW9lTUM2UHdxRXc4OHROTDN1S2N2UGRhOUhOdXdMMmN6Mk5xSGRXYWpSNk1IFFFUNtVVVQbks0bGsvcnJ4QnZOT1RmNEprNWNPMzZwd2RLVDU3cU1ScUo3ZVprLzZuKzVjMlczOXk2cHB1RkN4Zk9KVnphSGZIVWt2TURGRTZQWk03Z2FpbjcrU0FrWVpNb1ByV25meEdJVUI1ZVV5Yk1RQURyamxtUFhSVTZoUlFhTXlkTU41K0ZwQmtJZ1BWdGFOZk1USjBibXJLWCt4VzRVYXFJNm5JdXV1ajFlRS9QOHdDWkU0ZFA3UTNOcU5FMFgyc0JJd3ZEaHgzU1lzS1I3V2ZhM1phSlJja25OT3pNMG9NYjR3MThLVjY4cEJtRFRycEg5N0YrTU9EUEFNU1RnaXN0aC9PQWNsQms4SGt5bTdwVmxBNTNlYytWaFRPN1hIRmw2NmRhUHZhd0Z1b3hTTnJaa3k1ekE1MDN0SlNnalFZT3FHaGRQcUVtVWI0UU9XcVAxWkRFNXR3YnR3VE9UR01xdTNsRmtLMHFodDlmNTFWQjlnRXJ3MEM4RmJKaHUvcVZZSDZMTXpyN3ZqWjJseU5tMTZTcXNraE4vaXRGQUcxNzhWVktNdituQ0VueVlZWDVnTVdLemRheWVVb29WQnJVc2R3WEViUDRQMEI5MGRDWU9tTFhBU0E2Z0Z1TWh4Yk9wQUVXeUhVdUxpc21ZV3hFbHBGbVVRT3pUQzcydz09IiwidmVyc2lvbiI6MX0&redirect_uri=https%3A%2F%2Fpitangui.amazon.com%2Fspa%2Fskill%2Faccount-linking-status.html%3FvendorId%3DM3AP36Y8XL4DFZ HTTP/1.1", upstream: "http://unix:///var/run/puma/my_app.sock:/oauth/authorize?client_id=08e9435534209c8ee4289ea2bec61a811645b254b060909d142ea3f1f5141600&response_type=token&state=eyJpbml0VmVjdG9yIjoiaXRLcmVuWfpbSENBvWfad2VUYW0zZz09IiwicGF5bG9hZCI6IjJOeGU3Rks1TFg2cmJWL2lTM3ZpVXFydTVIdFpiOHM1bGDNbB1wI3M2QkpOU0tKNFVEaXdIdkZnSTBN
Run Code Online (Sandbox Code Playgroud)

(值混淆但长度相同)

并从error.log中:

2017/05/04 21:15:07 [error] 579#0: *204674 upstream sent too big header while reading response header from upstream, client: 172.31.23.232, server: _, request: "POST /users/sign_in HTTP/1.1", upstream: "http://unix:///var/run/puma/my_app.sock:/users/sign_in", host: "example.com", referrer: "https://example.com/users/sign_in"
Run Code Online (Sandbox Code Playgroud)

如您所见,请求很长,所以我尝试配置large_client_header_buffers没有任何效果。然后阅读有关类似问题的一点后,我试过配置fastcgi_buffersfastcgi_buffer_size以及代理缓存,也没有效果。我正在使用.ebextension文件按此处所述添加这些配置,但实际上我还没有找到一种方法来验证这些配置在部署后在生产中是否真正生效。

这是我在第一次发生错误之前对门卫/设备所做的修改:

将返回的路径保存在resource_owner_authenticator块中的模型中:

  resource_owner_authenticator do
    account_link = AccountLink.create(return_to: request.fullpath)
    session[:return_to] = account_link.id

    current_user || warden.authenticate!(:scope => :user)
  end
Run Code Online (Sandbox Code Playgroud)

重定向到after_sign_in_path_for方法中保存的路径(如果存在):

  def after_sign_in_path_for(resource)
    account_link_id = session[:return_to]

    if account_link_id
      account_link = AccountLink.find(account_link_id)

      if account_link
        session.delete(:return_to)

        account_link.return_to
      else
        dashboard_path
      end
    end
  end
Run Code Online (Sandbox Code Playgroud)

我还看到一些建议,认为Elastic Beanstalk中的502可能与未激活的SSL证书有关,但我已经检查过。

编辑:在我的rails生产日志中,我看到登录路径以及302重定向之后的发布均成功。但是我的浏览器指示登录路径的帖子已经获取了502。我不确定该怎么做。

fja*_*ahr 5

我在一些帮助下解决了它。事实证明,调整Nginx设置是正确的主意,但我需要先调整所有设置,然后再尝试分别尝试调整正确的设置时会收到不同的错误消息。该错误似乎是一种包罗万象的东西。这是我现在使用的组合,请确保检查您的请求的实际标头大小是多少,并相应地调整大小。

这是我的.ebextensions文件夹中的配置文件:

files:
  "/etc/nginx/conf.d/01_proxy.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      large_client_header_buffers 4 32k;
      fastcgi_buffers 16 32k;
      fastcgi_buffer_size 32k;
      proxy_buffer_size   128k;
      proxy_buffers   4 256k;
      proxy_busy_buffers_size   256k;

container_commands:
  01_reload_nginx:
    command: "sudo service nginx reload"
Run Code Online (Sandbox Code Playgroud)