Nginx 1.2.1 personalizado 404

2

Estou tentando criar um erro 404 personalizado com nginx.

Primeiro, na minha máquina local, adicionei as seguintes linhas ao site padrão:

 error_page 404 /custom_404.html;
    location = /custom_404.html {
            root /usr/share/nginx/html;
            internal;
    }

Então, na pasta / usr / share / nginx / html, criei um arquivo nes chamado custom_404.html.

Depois fui para a minha máquina de desenvolvimento e tentei fazer o mesmo, mas sem sorte.

Uma das coisas que eu notei é que no local eu estou usando a versão 1.9.3 e no ambiente de desenvolvimento a versão 1.2.1, e também que o html forlder (/ usr / share / nginx / html) não existe.

E a última coisa é que no desenvolvimento eu uso nginx para aplicações django, então meu arquivo de configuração é algo assim:

server {
listen 80;
server_name test.example.net;

# output compression saves bandwidth
gzip  on;
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 6;
gzip_proxied any;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

client_max_body_size 10M;

if ($http_user_agent ~* '(blackberry|
    iemobile|iphone|ipod|mobile|Mobile|
    nokia|opera\s+mini|smartphone|symbian|webOS)') {
    set $mobile on;
}

if ($http_user_agent ~* 'ipad'){
    set $mobile off;
}

if ($host = example.net) {
    rewrite ^(.*)$ http://www.example.net$1 permanent;
}

if ($uri = '/') {
    set $home_es on;
}

if ($http_referer ~* ^http://test.example.net){
    set $home_es off;
}

if ($home_es = on) {
    rewrite ^(.*)$ /es$1 permanent;
}

gzip_buffers 16 8k;
gzip_disable "MSIE [1-6].(?!.*SV1)";

# media - folder in uri for admin static files
location /newmedia/ {
    expires 30d;
    root /media/jumbo_project;
}
location /media/ {
    expires 30d;
    alias /home/jumbo/media/jumbo_project/newmedia/;
}
location /static/ {
    expires 30d;
    root /media/jumbo_project;
}

error_page   502 503 504 500 /50x.html;

location /50x.html {
    internal;
}

location / {
    proxy_pass  http://localhost:8000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_read_timeout 60;
}

log_format log_time '$request_time $remote_addr - $remote_user [$time_local]  '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent"';

access_log  /var/log/nginx/jumbo-wsgi.access.log log_time;
error_log   /var/log/nginx/jumbo-wsgi.error.log;

Eu fiquei sem resultados do Google para tentar, se alguém puder me dar uma pista para continuar, seria ótimo.

    
por Madox 14.04.2016 / 11:18

3 respostas

2

Bem, se a pasta / usr / share / nginx / html não existisse, onde você colocou o arquivo de erro? Nginx serve arquivos de qualquer pasta que você gosta, você só tem que dizer qual deles. É por isso que você usa a diretiva raiz.

Então, crie a pasta / usr / share / nginx / html e coloque o arquivo lá ou coloque-o, por exemplo, / what / ever / folder e mude sua configuração para

error_page 404 /custom_404.html;

location = /custom_404.html { 
    root /what/ever/folder; 
    internal;
}

Simples, né?

OK, não é tão simples. Eu não acho que mudar sua configuração para um local nomeado ("@foo") mude qualquer coisa. O que você quis dizer com "comneting e restarting"? Reiniciando o nginx ou o django?

Você recebe algum erro ao recarregar sua configuração do nginx?

Você verificou se você realmente obteve um 404 quando seu projeto de django está inoperante? Eu tenho um proxy_pass na minha configuração para proxy de uma webcam. Quando esta webcam não está disponível, recebo um "502 Bad Gateway".

Se eu pegar com error_page 502 /error_page.html; e

        location = /error_page.html  {
             root /what/ever/folder;
    }

meu arquivo de erro personalizado é exibido.

    
por 14.04.2016 / 20:36
1

Depois de conversar com uma colega minha, ela me fez mudar a maneira como eu estava lidando com o problema.

O que eu queria era mostrar uma página de manutenção, sempre que eu precisasse parar / reiniciar o projeto django para que ele não mostrasse um 404 Not Found, porque deveria um 503 Service temporariamente indisponível.

Portanto, a maneira como estou fazendo isso é adicionando o seguinte código:

location / {
    proxy_pass  http://localhost:8000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_read_timeout 60;

    proxy_intercept_errors on;

    error_page 404 = @custom_error;
}

location @custom_error {
    index error_page.html;
    root /usr/share/nginx/www; 
    internal;
}

Mas isso me dá um 502 Bad Gateway, e ao comneting e restarting descobri que a linha que me dá este erro é a seguinte:

error_page 404 = @custom_error;

Talvez eu esteja fazendo isso da maneira errada, mas faz sentido (para mim) ter que fazer algo com o proxy e isso tem que detectar se o serviço está indisponível na outra extremidade (porta 8000).

Eu tentei a solução que @JosefScript comentou acima, mas sem sorte.

Outra coisa que eu estou pensando é que esta versão do nginx (1.2.1) tem alguns problemas, mas não consigo atualizá-lo porque o google-cloud-machine funciona em uma imagem debian modificada. E essa imagem tem seus próprios repositórios que o google gerencia diretamente.

    
por 15.04.2016 / 09:07
0

Graças à ajuda do JosefScript, consegui fazê-lo, e aqui está o código final.

error_page   503 504 500 /50x.html;
error_page   502  /error_page.html;  # NEW 

location /50x.html {
    internal;
    }

location /error_page.html{  #  NEW
    root /home/jumbo;       #  NEW
    }                       #  NEW

location / {
    proxy_pass  http://localhost:8000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_read_timeout 60;

    proxy_intercept_errors on;   #  NEW
    }

O que eu estava fazendo errado, eu acho, é que eu não contei o erro 502 para servir um arquivo específico (minha página de erro) e estava esperando o 404 servir esse arquivo.

Outra coisa a salientar é que eu estava pensando em tudo como rota de arquivo estático não um redirecionamento de proxy.

Obrigado novamente ao @JosefScript por toda a ajuda e fazendo as perguntas certas ^ _ ^

    
por 18.04.2016 / 13:39