#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, но не скрипты.