Rails 6 Nginx обратный прокси: проблема с обслуживанием статических файлов

#ruby-on-rails #nginx #nginx-reverse-proxy

#ruby-on-rails #nginx #nginx-reverse-proxy

Вопрос:

Я просмотрел несколько сообщений, чтобы найти решение моей проблемы: похоже, что все скрипты, кроме js, обслуживаются Nginx в качестве обратного прокси.

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

На стороне Rails (в режиме разработки) я устанавливаю config.public_file_server.enabled = false и запускаю rails assets:precompile так, чтобы он создавал /public/assets и /public/pack/ папки с файлами с метками времени.

Файл конфигурации Nginx показан ниже: тест nginx -t в порядке. Я запускаю службу nginx и начинаю rails s прослушивать порт 3000. Затем я открываю localhost: 8080 (или localhost: 3000) и получаю 404 в браузере:

ПОЛУЧИТЬ //localhost:8080/packs/js/application-c294f00fc4a07bb438b5.js net::ОШИБКА_АБОРТИРОВАНА 404 (Не найдена)

Другие статические файлы типа css or jpg извлекаются правильно, а js script — нет. Доступ к Nginx.журнал показывает:

ПОЛУЧИТЬ /assets/application.debug- (временная метка).css HTTP/ 1.1″ 200

GET /assets/db-schema-(временная метка).jpg HTTP/1.1″ 200

ПОЛУЧИТЬ /packs/js/application-c294f00fc4a07bb438b5.js HTTP/1.1″ 404

но ничего в error.log.

Что я делаю не так?

Конфигурация Nginx:

 #/nginx.conf
worker_processes  auto; 
worker_rlimit_nofile 1024;
error_log  /usr/local/etc/nginx/logs/error.log warn;

events {
    worker_connections  1024;
    # accept_mutex on;        # "on" if nginx worker_processes > 1
}


http {
    include           mime.types;
    default_type      application/octet-stream;
    sendfile          on;
    keepalive_timeout 65;
    
    add_header    X-XSS-Protection "1; mode=block";
    add_header    X-Content-Type-Options nosniff;
    add_header    X-Frame-Options SAMEORIGIN;
    
    include /servers*.;
    include /usr/local/etc/nginx/rails.conf;
}
  

и

 #rails.conf

#upstream app {
#   server http://localhost:3000;
#}

server {
    listen          8080;
    server_name     localhost;

    gzip                  on;
    gzip_proxied          no-cache no-store private expired auth;
    gzip_types
        "application/json;charset=utf-8" application/json ..."
        
    
    location ~ ^/(assets|packs)/{
        try_files $uri @rails;
        access_log off;
        gzip_static on;
        expires max;
        add_header Cache-Control public;
        add_header Last-Modified "";
        add_header ETag "";
        break;
    }

    location / { 
        try_files $uri @rails;  
    }

    location @rails {    
        proxy_set_header  X-Real-IP  $remote_addr;    
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;         
        proxy_set_header  Host $host;    
        
        proxy_pass        http://localhost:3000; # http://app

        proxy_http_version  1.1;
        proxy_set_header    Connection ‘’;
        proxy_buffering     off;
        proxy_cache         off;
        chunked_transfer_encoding off;
    }
} 
  

Ответ №1:

хорошо, я нашел проблему. Мне пришлось добавить на сервер корневой:

 root  /path-to-my-public-folder/public;
  

и производительность в порядке. Теперь я не понимаю, почему Nginx нашел css и jpg, но не скрипты.