Nginx выдает 404 для всего статического контента в настройке обратного прокси.

Вопрос или проблема

Странно, но эта конфигурация раньше работала нормально, а теперь все статические файлы возвращают 404 при прямой ссылке, то есть

  • domain.com/test.html
  • domain.com/test/test.html
  • domain.com/ и domain.com/test/ << работают, если присутствует index.html

это относится ко всем типам статических файлов.

Nginx.conf :

user www;
worker_processes 8;
worker_rlimit_nofile 65536;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
  worker_connections 1024;
  use epoll;
}

http {
  server_names_hash_bucket_size 64;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  access_log /var/log/nginx/access.log;
  sendfile off;
  tcp_nopush on;
  tcp_nodelay on;

  proxy_cache_path                /web-cache/cache levels=2:2 keys_zone=basic:8m max_size=512m inactive=60m;
  proxy_temp_path                 /web-cache/cache_temp;

  proxy_redirect     off;

  proxy_set_header        Host            $host;
  proxy_set_header        X-Real-IP       $remote_addr;
  proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

  ssl_session_cache    shared:SSL:10m;
  ssl_session_timeout  10m;

  #gzip compression options
  gzip on;
  gzip_static off;
  gzip_http_version 1.0;
  gzip_comp_level 9;
  gzip_min_length 128;
  gzip_buffers 16 8k;
  gzip_proxied any;
  gzip_types text/plain text/css text/xml text/javascript application/xml         application/xml+rss application/javascript application/json;
  gzip_disable "MSIE [1-6]\.";
  gzip_vary on;

  # include virtual hosts configuration
  include /etc/nginx/virtual.d/*.conf;
}

Пример виртуального хоста :

server {
  listen 80;
  server_name domain.com www.domain.com;
  access_log off;
  error_log on;

  location / {
    proxy_pass http://127.0.0.1:6666;
    include /etc/nginx/nocache.conf;
  }
  location ~* ^.+\.(htm|html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|bz2|pdf|odt|txt|tar|bmp|rtf|js|swf|avi|mp4|mp3|ogg|flv)$ {
    expires 30d;
    root /home/test/public_html;
  }
}

Я полагаю, что логи покажут, какие именно файлы nginx пытается обработать.

Возможные результаты расследования:

  1. Файл существует, но у пользователя www недостаточно прав для доступа к нему.
  2. Nginx использует location /

Очевидная проблема в том, что вы разместили root внутри блока location. Наилучшей практикой является размещение его в блоке server. Это одна из самых распространенных ошибок конфигурации nginx.

.

Ответ или решение

Ваш вопрос о том, почему Nginx возвращает ошибку 404 для всего статического контента при использовании в качестве обратного прокси, действительно заслуживает внимания. Давайте разберем возможные причины и решения данной проблемы, исходя из предоставленной конфигурации и сопутствующей информации.

Основная проблема

Как вы сами отметили, одна из наиболее распространенных ошибок в конфигурации Nginx связана с тем, что директива root помещена в блок location, а не в блок server. Это может привести к тому, что Nginx не сможет корректно интерпретировать маршрут к статическим файлам, что в свою очередь может вызвать ошибки 404. Рассмотрим основные аспекты:

Анализ конфигурации

  1. Блок server:

    server {
       listen 80;
       server_name domain.com www.domain.com;
       access_log off;
       error_log on;
    
       location / {
           proxy_pass http://127.0.0.1:6666;
           include /etc/nginx/nocache.conf;
       }
       location ~* ^.+\.(htm|html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|bz2|pdf|odt|txt|tar|bmp|rtf|js|swf|avi|mp4|mp3|ogg|flv)$ {
           expires 30d;
           root /home/test/public_html;
       }
    }
  2. Перенос директивы root:

    Вы можете переместить директиву root в блок server, что упростит управление всеми маршрутами для статических файлов. Это улучшит читаемость и устранит потенциальное ошибочное поведение:

    server {
       listen 80;
       server_name domain.com www.domain.com;
       root /home/test/public_html;
    
       location / {
           proxy_pass http://127.0.0.1:6666;
           include /etc/nginx/nocache.conf;
       }
       location ~* ^.+\.(htm|html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|bz2|pdf|odt|txt|tar|bmp|rtf|js|swf|avi|mp4|mp3|ogg|flv)$ {
           expires 30d;
       }
    }

Дополнительные проверки

  1. Права доступа:

    Убедитесь, что пользователь www имеет необходимые права на чтение файлов в директории /home/test/public_html. Попробуйте выполнить команду:

    sudo chown -R www:www /home/test/public_html
    sudo chmod -R 755 /home/test/public_html
  2. Логи Nginx:

    При включенных логах изучите /var/log/nginx/error.log и /var/log/nginx/access.log, чтобы уточнить, какие файлы пытается открыть Nginx и какая конкретно ошибка возникает.

Вывод

Правильная конфигурация Nginx играет критически важную роль в стабильной работе вашего веб-сервера. Перемещение директивы root в блок server, проверка прав доступа и анализ логов позволят устранить возникшую проблему. Следуя этим рекомендациям, вы сможете обеспечить корректную обработку и доставку всех статических файлов на вашем сервере, что повысит надежность и скорость работы вашего сайта.

Пожалуйста, не стесняйтесь обращаться за дополнительной помощью, если проблема не будет решена указанными методами. Точная диагностика позволит найти наилучшее решение.

Оцените материал
Добавить комментарий

Капча загружается...