У меня довольно много проблем с настройкой nginx для обслуживания статических файлов моего приложения Rails; Я имею в виду все файлы в приложении public/
папка, а не только файлы в конвейере ресурсов Rails. Кажется, я могу заставить все работать в основном, но я не могу понять, как все собрать воедино. Мое приложение установлено в подкаталоге на сервере (/dashboard
), а не веб-корень.
Вот выдержки из моих различных файлов конфигурации:
config.ru:
map Dashboard::Application.config.relative_url_root || "/" do
run Rails.application
end
среды / production.rb:
config.relative_url_root = "/dashboard"
config.assets.prefix = "/dashboard/assets/"
nginx.conf:
location /dashboard/ {
root /srv/XXX/dashboard/public;
location /dashboard/assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
try_files $uri @unicorn;
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
location @unicorn {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://unicorn_server;
}
upstream unicorn_server {
server unix:/srv/XXX/dashboard/tmp/sockets/unicorn.sock fail_timeout=0;
}
С этой конфигурацией я могу обслуживать само приложение Rails, используя единорога и файлы внутри public/assets/
папку с помощью nginx, но остальные файлы в public/
папка направляется в Rails и в конечном итоге возвращает код состояния 404. Я знаю, это потому, что сервер ищет (например) /dashboard/robots.txt
который не существует внутри public/
папка. Я считаю, что мне нужно использовать alias
чтобы управлять путями, однако я не смог собрать все вместе, чтобы Rails правильно обслуживал приложение, а nginx - статические файлы.