从上游 Ruby 项目读取响应标头时,上游过早关闭连接

cjm*_*ash 5 ruby-on-rails nginx google-cloud-platform

我正在尝试使用 NGINX 反向代理 GCP 上的 ruby​​ 项目,我的/etc/nginx/sites-available/default文件如下所示

\n\n
 server {\n     large_client_header_buffers 4 16k;\n     listen 80 default_server;\n     #server_name my-devops-staging.com  \n     listen [::]:80 default_server;\n     #return 301 https://$host$request_uri;\n     # SSL configuration\n     #\n     listen 443 ssl default_server;\n     listen [::]:443 ssl default_server;\n     ssl_certificate           /etc/nginx/certificate.crt;\n     ssl_certificate_key       /etc/nginx/key.key;\n     ssl off;\n     ssl_session_cache  builtin:1000  shared:SSL:10m;\n     ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;\n     ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;\n     ssl_prefer_server_ciphers on;\n     # Note: You should disable gzip for SSL traffic.\n     # See: https://bugs.debian.org/773332\n     #\n     # Read up on ssl_ciphers to ensure a secure configuration.\n     # See: https://bugs.debian.org/765782\n     #\n     # Self signed certs generated by the ssl-cert package\n     # Don\'t use them in a production server!\n     #\n     # include snippets/snakeoil.conf;\n     root /var/www/html;\n     # Add index.php to the list if you are using PHP\n     index index.html index.htm index.nginx-debian.html;\n     location / {\n         proxy_set_header        Host $server_name;\n         proxy_set_header        X-Real-IP $remote_addr;\n         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;\n         proxy_set_header        X-Forwarded-Proto $scheme;\n         # Fix the \xe2\x80\x9cIt appears that your reverse proxy set up is broken" error.\n         proxy_pass http://localhost:8080;\n         # proxy_read_timeout 300;\n         proxy_read_timeout  9000;\n         proxy_request_buffering off;\n         proxy_buffering off;\n         proxy_redirect off;\n     }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

每当我跑步时,我可能做错了什么

\n\n
$ sudo service nginx restart\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在以下位置收到这些错误error.log

\n\n
2018/03/27 08:32:50 [error] 2959#2959: *64 upstream prematurely closed connection while reading response header from upstream, client: 130.211.2.175, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "my-devops-staging.com" \n2018/03/27 08:32:53 [error] 2959#2959: *66 upstream prematurely closed connection while reading response header from upstream, client 130.211.2.87, server: , request: "GET / HTTP/1.1", upstream: http://127.0.0.1:8080/", host: "my-devops-staging.com"\n
Run Code Online (Sandbox Code Playgroud)\n

Dev*_*per 8

通过将这些参数添加到代理 Nginx 配置文件中,使代理和后端之间的通信更加忠实:

location / {

    proxy_http_version 1.1;  # you need to set this in order to use params below.

    proxy_temp_file_write_size 64k;
    proxy_connect_timeout 10080s;
    proxy_send_timeout 10080;
    proxy_read_timeout 10080;
    proxy_buffer_size 64k;
    proxy_buffers 16 32k;
    proxy_busy_buffers_size 64k;
    proxy_redirect off;
    proxy_request_buffering off;
    proxy_buffering off;
    proxy_pass <whatever_here>;
}
Run Code Online (Sandbox Code Playgroud)

我从适合我们的生产环境中获取的神奇数字。您可能需要考虑更改这些数字以适应您的环境和连接数量等。

我希望这有帮助。


Erv*_*ouS 3

实际上,您在连接到 Rails 应用程序时超时了,您可以将其降低proxy_read_timeout到 300 并提高proxy_connect_timeout到匹配的值,如果这种情况持续发生,则可以提高到更高。只需在您的块中添加这些行location \ {...}

 location / {
     proxy_set_header        Host $server_name;
     proxy_set_header        X-Real-IP $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header        X-Forwarded-Proto $scheme;
     proxy_pass http://localhost:8080;
     proxy_read_timeout 300; # Reducing this
     proxy_connect_timeout 300;  # Adding this
     proxy_request_buffering off;
     proxy_buffering off;
     proxy_redirect off;
 }
Run Code Online (Sandbox Code Playgroud)