it-swarm.dev

nginx가 error_page를 제공하지 않습니다

Unicorn으로 호스팅 된 Sinatra 응용 프로그램과 그 앞에 nginx가 있습니다. Sinatra 응용 프로그램 오류가 발생하면 (500을 반환) 기본 "내부 서버 오류"가 아닌 정적 페이지를 제공하고 싶습니다. 다음과 같은 nginx 구성이 있습니다.

server {
  listen 80 default;
  server_name *.example.com;
  root /home/deploy/www-frontend/current/public;

  location / {
    proxy_pass_header Server;
    proxy_set_header Host $http_Host;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 5;
    proxy_read_timeout 240;
    proxy_pass http://127.0.0.1:4701/;
  }

  error_page 500 502 503 504 /50x.html;
}

Error_page 지시문이 있으며 www.data (Ubuntu)로 Sudo'd를 작성했으며 파일을 cat 할 수 있는지 확인 했으므로 권한 문제가 아닙니다. 위의 설정 파일과 service nginx reload, 오류로 수신 된 페이지는 여전히 "내부 서버 오류"와 동일합니다.

내 오류가 뭐야?

40

error_page는 nginx에 의해 생성 된 오류를 처리합니다. 기본적으로 nginx는 http 상태 코드에 관계없이 프록시 서버가 반환하는 모든 것을 반환합니다.

당신이 찾고있는 것은 proxy_intercept_errors

이 지시어는 nginx가 400 이상의 HTTP 상태 코드로 응답을 가로 챌지 여부를 결정합니다.

기본적으로 모든 응답은 프록시 서버에서 그대로 전송됩니다.

이것을 on으로 설정하면 nginx는 error_page 지시어에 의해 명시 적으로 처리되는 상태 코드를 가로 챌 것입니다. error_page 지시문과 일치하지 않는 상태 코드가있는 응답은 프록시 서버에서 그대로 전송됩니다.

76
Stephen Emslie

특히 해당 위치에 대해 proxy_intercept_errors를 설정할 수 있습니다

location /some/location {
    proxy_pass_header Server;
    proxy_set_header Host $http_Host;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 5;
    proxy_read_timeout 240;
    proxy_pass http://127.0.0.1:4701/;
    proxy_intercept_errors on; # see http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors

    error_page 400 500 404 ... other statuses ... =200 /your/path/for/custom/errors;
}

필요한 다른 200 가지 상태를 설정할 수 있습니다

17
Alexey

업스트림으로 FastCGI를 사용하는 사용자는이 매개 변수를 켜야합니다.

fastcgi_intercept_errors on;

내 PHP 응용 프로그램의 경우 업스트림 구성 블록에서 사용하고 있습니다

 location ~ .php$ { ## Execute PHP scripts
    fastcgi_pass   php-upstream; 
    fastcgi_intercept_errors on;
    error_page 500 /500.html;
 }
4
Aftab Naveed

Stephen이 언급했듯이 이 응답에서 , proxy_intercept_errors on; 일할 수있다. 제 경우에는 이 답변에서 , uwsgi_intercept_errors on; 트릭을 했어 ...

0
ppython