Question

I have rails app on unicorn and nginx in front of it.

# nginx.conf
upstream backend {
    server unix:/home/deployer/apps/example.ru/shared/tmp/sockets/unicorn.sock.0  fail_timeout=0;
    server unix:/home/deployer/apps/example.ru/shared/tmp/sockets/unicorn.sock.1  fail_timeout=0;
}

log_format default_log '$host $remote_addr [$time_local] "$request" $status $request_length "$http_referer" "$http_user_agent" $request_time';

server {
    listen 80;
    server_name example.ru www.example.ru dev.example.ru;
    access_log /var/log/nginx/example.ru-access.log default_log;

    # recursive_error_pages on;

    location ~ ^/assets/ {
        root /home/deployer/apps/example.ru/current/public;
        gzip_static on;
        expires 1y;
        add_header Cache-Control public;
        add_header ETag "";
        break;
    }

    location / {
        auth_basic "You shall not pass!";
        auth_basic_user_file /home/deployer/.htsandbox;

        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
        proxy_pass http://backend;
        proxy_redirect off;
    }

    # Error pages
    error_page 413 /413;

    if (-f /home/deployer/apps/example.ru/shared/public/system/maintenance.html) {
      return 503;
    }

    error_page 503 @maintenance;
    location @maintenance {
      if (-f $request_filename) {
        break;
      }
      root /home/deployer/apps/example.ru/shared/public/system;
      rewrite ^(.*)$ /maintenance.html break;
    }

    error_page 502 @bad_gateway;
    location @bad_gateway {
      if (-f $request_filename) {
        break;
      }
      root /home/deployer/apps/example.ru/shared/public/system;
      rewrite ^(.*)$ /bad_gateway.html break;
    }

}

When 413 error is raised by nginx, I want pass it to unicorn error page /413. But have 502 Bad Gateway nginx error page.

#log
2013/12/12 12:56:10 [error] 16853#0: *55 client intended to send too large body: 4099547 bytes, client: 128.72.7.207, server: example.ru, request: "POST /users/tester/avatar HTTP/1.1", host: "dev.example.ru", referrer: "http://dev.example.ru/users/tester/avatar"
2013/12/12 12:56:41 [error] 16853#0: *55 upstream prematurely closed connection while reading response header from upstream, client: 128.72.7.207, server: example.ru, request: "POST /users/tester/avatar HTTP/1.1", upstream: "http://unix:/home/deployer/apps/example.ru/shared/tmp/sockets/unicorn.sock.0:/413", host: "dev.example.ru", referrer: "http://dev.example.ru/users/tester/avatar"
2013/12/12 12:57:12 [error] 16853#0: *55 upstream prematurely closed connection while reading response header from upstream, client: 128.72.7.207, server: example.ru, request: "POST /users/tester/avatar HTTP/1.1", upstream: "http://unix:/home/deployer/apps/example.ru/shared/tmp/sockets/unicorn.sock.1:/413", host: "dev.example.ru", referrer: "http://dev.example.ru/users/tester/avatar"
Was it helpful?

Solution

Probably nginx already closed connect, when unicorn try loaded error page

See more

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top