2012-01-03 32 views
30

Tôi có một ứng dụng Sinatra được lưu trữ với Unicorn, và nginx ở phía trước của nó. Khi ứng dụng Sinatra bị lỗi (trả về 500), tôi muốn phục vụ một trang tĩnh, thay vì mặc định là "Lỗi Máy chủ Nội bộ" mặc định. Tôi có cấu hình nginx sau:nginx không phục vụ error_page của tôi

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

Chỉ thị error_page là ở đó, và tôi đã sudo'd như www-data (Ubuntu) và xác nhận tôi có thể cat tập tin, do đó nó không phải là một vấn đề cho phép. Với tệp cấu hình ở trên và service nginx reload, trang tôi nhận được do lỗi vẫn giống "Lỗi Máy chủ Nội bộ".

Lỗi của tôi là gì?

Trả lời

60

error_page xử lý lỗi do nginx tạo. Theo mặc định, nginx sẽ trả về bất kỳ máy chủ proxy nào trả về bất kể mã trạng thái http.

gì bạn đang tìm kiếm là proxy_intercept_errors

Chỉ thị này quyết định nếu nginx sẽ chặn phản ứng với HTTP mã trạng thái 400 và cao hơn.

Theo mặc định, tất cả các câu trả lời sẽ được gửi dưới dạng từ máy chủ proxy.

Nếu bạn bật tính năng này thì nginx sẽ chặn mã trạng thái xử lý rõ ràng bằng chỉ thị error_page. Câu trả lời có trạng thái mã không khớp với chỉ thị error_page sẽ được gửi dưới dạng từ máy chủ proxy.

+1

Tôi biết đó là câu hỏi của RTFM. Cảm ơn bạn đã dành thời gian để cung cấp câu trả lời tuyệt vời! –

+9

Chỉ cần lưu ý nhanh đến phản hồi 4 năm - hiện tại 'proxy_intercept_errors' hoạt động cho các lỗi bằng hoặc lớn hơn đến 300. – Tisho

12

Bạn có thể đặt proxy_intercept_errors đặc biệt cho vị trí đó

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

và bạn có thể thiết lập thay vì 200 trạng thái khác những gì bạn cần

+5

Sử dụng' proxy_intercept_errors; '(không đối số) không còn hợp lệ trong nginx hiện tại nữa. Sử dụng 'proxy_intercept_errors on;' thay vào đó. – Marian

+0

Hi Marian, cảm ơn vì đã có được – Alexey

+0

Câu hỏi nhanh về ngữ nghĩa ở đây ... đặt 'proxy_intercept_errors' thành' on' có nghĩa là trang tùy chỉnh được trả về và đặt thành 'tắt' nghĩa là trang nginx được trả về, đúng không? – speedplane

0

Như đã đề cập bởi Stephen in this response, sử dụng proxy_intercept_errors on; có thể làm việc. Mặc dù trong trường hợp của tôi, như đã thấy in this answer, sử dụng uwsgi_intercept_errors on; đã làm các trick ...

0

Những người đang sử dụng FastCGI như nhu cầu của họ ngược dòng tham số này bật

fastcgi_intercept_errors on; 

Đối với ứng dụng PHP của tôi, tôi đang sử dụng nó trong khối cấu hình ngược dòng của tôi

location ~ .php$ { ## Execute PHP scripts 
    fastcgi_pass php-upstream; 
    fastcgi_intercept_errors on; 
    error_page 500 /500.html; 
} 
Các vấn đề liên quan