Пользовательский 404 Nginx 1.2.1

Я пытаюсь сделать пользовательскую ошибку 404 с помощью nginx.

Сначала на моем локальном компьютере я добавил следующие строки на сайт по умолчанию:

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

Затем в Папка / usr / share / nginx / html Я создал файл nes с именем custom_404.html.

Затем я пошел к своей машине разработки и попытался сделать то же самое, но без особого успеха.

Я заметил, что локально я использую версию 1.9.3, а в среде разработки - версию 1.2.1, а также что формат HTML (/ usr / share / nginx / html) не существует.

И последнее, что в процессе разработки я использую nginx для приложений django, так что мой файл конфигурации выглядит примерно так:

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;

У меня закончились результаты Google, чтобы попробовать, так что если кто-то может дать мне руководство было бы здорово продолжить.

2
задан 14 April 2016 в 12:18
3 ответа

Ну, если папки /usr/share/nginx/html не существовало, то куда вы тогда поместили файл ошибки? Nginx обслуживает файлы из любой понравившейся вам папки, просто нужно сказать, из какой. Поэтому вы используете директиву root.

Итак, либо создайте папку /usr/share/nginx/html и поместите файл туда, либо поместите его, например, в /what/ever/folder и измените вашу конфигурацию на

error_page 404 /custom_404.html;

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

Простую, да?

OK, не так уж и просто. Я не думаю, что изменение конфигурации на именованное место ("@foo") что-то изменит. Что вы имели в виду под "comneting and restarting". Перезапуск nginx или django?

Получаете ли вы какие-либо ошибки при перезагрузке вашего конфигурационного файла nginx?

Проверили, действительно ли вы получаете 404, когда ваш проект django не работает? В моём конфигурационном файле есть proxy_pass для проксирования веб-камеры. Когда эта вебкамера недоступна, я получаю "502 Bad Gateway".

Если я поймаю ее с помощью error_page 502 /error_page.html;. и

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

мой пользовательский файл ошибок обслуживается.

2
ответ дан 3 December 2019 в 10:38

Благодаря помощи JosefScript я смог это сделать, и вот окончательный код.

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
    }

Что я делал неправильно, я думаю, это то, что я не сообщил об ошибке 502 для обслуживания определенного файла (моя страница с ошибкой) и ждал, пока 404 обработает этот файл.

Еще одна вещь, на которую следует обратить внимание, это то, что я думал все это как статический маршрут файла, а не перенаправление прокси.

Еще раз спасибо @JosefScript за помощь и правильные вопросы ^ _ ^

0
ответ дан 3 December 2019 в 10:38

После разговора с моей коллегой она заставила меня изменить способ решения проблемы.

Я хотел, чтобы всякий раз, когда мне нужно будет остановить/перезапустить проект django, чтобы он не показывал 404 Not Found, потому что он должен быть временно недоступен для 503 Service.

Итак, в настоящее время я делаю это, добавляя следующий код:

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

Но это дает мне 502 Плохой шлюз, и при комнете и перезапуске я обнаружил, что строка, которая дает мне эту ошибку, это следующая строка:

error_page 404 = @custom_error;

Может быть, я делаю это неправильно, но для меня имеет смысл, что это должно что-то делать с прокси, и это должно обнаружить, если служба недоступна на другом конце (порт 8000).

Я пробовал решение, которое @JosefScript прокомментировал выше, но безуспешно.

Другая вещь, о которой я думаю, это то, что у этой версии nginx (1.2.1) есть некоторые проблемы, но я не могу её обновить, потому что google-cloud-машина работает на изменённом образе debian. И у этого образа есть свои собственные репозитории, которыми Google управляет напрямую.

1
ответ дан 3 December 2019 в 10:38

Теги

Похожие вопросы