AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 770259
Accepted
Madox
Madox
Asked: 2016-04-15 01:18:09 +0800 CST2016-04-15 01:18:09 +0800 CST 2016-04-15 01:18:09 +0800 CST

Nginx 1.2.1 personalizado 404

  • 772

Estou tentando criar um erro 404 personalizado com o 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;
    }

Em seguida, na pasta /usr/share/nginx/html, criei um arquivo nes chamado custom_404.html.

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

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

E a última coisa é que no desenvolvimento eu uso nginx para aplicativos 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;

Fiquei sem resultados do Google para tentar, então, se alguém puder me dar uma pista para continuar, seria ótimo.

linux django nginx http-status-code-404 google-compute-engine
  • 3 3 respostas
  • 554 Views

3 respostas

  • Voted
  1. Best Answer
    JosefScript
    2016-04-15T10:36:07+08:002016-04-15T10:36:07+08:00

    Bem, se a pasta /usr/share/nginx/html não existia, onde você colocou o arquivo de erro então? O Nginx serve arquivos de qualquer pasta que você quiser, você só precisa dizer qual. É por isso que você usa a diretiva root.

    Portanto, crie a pasta /usr/share/nginx/html e coloque o arquivo lá ou coloque-o em, por exemplo, /what/ever/folder e altere 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. Não acho que mudar sua configuração para um local nomeado ("@foo") mude alguma coisa. O que você quis dizer com "comnetar e reiniciar". Reiniciando o nginx ou o django?

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

    Você verificou se realmente recebe um 404 quando seu projeto 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 pegá-lo com error_page 502 /error_page.html; e

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

    meu arquivo de erro personalizado é servido.

    • 2
  2. Madox
    2016-04-15T23:07:16+08:002016-04-15T23:07:16+08:00

    Depois de conversar com uma colega minha, ela me fez mudar a forma como eu lidava com o assunto.

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

    Então, a maneira como estou fazendo isso atualmente é 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 comnetar e reiniciar, descobri que a linha que me dá esse erro é a seguinte linha:

    error_page 404 = @custom_error;
    

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

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

    Outra coisa que estou pensando é que esta versão do nginx (1.2.1) tem alguns problemas, mas não posso atualizá-la 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.

    • 1
  3. Madox
    2016-04-19T03:39:32+08:002016-04-19T03:39:32+08:00

    Graças à ajuda do JosefScript, consegui fazer isso 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 de errado, eu acho, é que eu não disse ao erro 502 para servir um arquivo específico (minha página de erro) e estava esperando o 404 para servir aquele arquivo.

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

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

    • 0

relate perguntas

  • Protegendo um novo servidor Ubuntu [fechado]

  • (Soft) RAID 6 no Ubuntu 7.10, devo migrar para 8.10?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve