Я пытаюсь создать приложение rails с балансировщиком нагрузки. Приложение запущено, но я не знаю, как обслуживать статические файлы. Во всех примерах предполагается, что nginx и unicorn работают на одной машине.
Вот минимальные конфиги:
Машина A: Nginx Machine B: процесс Unicorn с приложением
Машина А:
user www-data;
worker_processes 4;
pid /run/nginx.pid;
events {
worker_connections 768;
}
http {
upstream unicorn_servers {
server 192.168.14.224:8080 fail_timeout=0;
}
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
gzip_proxied any;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
include /etc/nginx/sites-enabled/*;
}
server {
listen 80;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://unicorn_servers;
}
}
Машина B:
dir = '/home/user/apps/test_app'
working_directory dir
pid "#{dir}/pids/unicorn.pid"
# logs
stderr_path "#{dir}/log/unicorn.log"
stdout_path "#{dir}/log/unicorn.log"
worker_processes 2
timeout 30
Я всегда вижу 404 на статических активах.
<link rel="stylesheet" media="all" href="/assets/application-0723cb9a2dd5a514d954f70e0fe0b89f6f9f1ae3a375c182f43b5f2b57e9c869.css" data-turbolinks-track="true" />
<script src="/assets/application-08a19ba96489d7fc7864bb409a6841003509fe519cbd091b7a11a1acc7e53fbb.js" data-turbolinks-track="true"></script>
Как настроить nginx для обслуживания статических файлов с другого компьютера?
В твоем server
блок, вам нужно установить root
директиве в каталог верхнего уровня, содержащий ваши активы (для приложения Rails это public
каталог), а затем используйте try_files
либо загрузить статический актив, либо передать его вашему приложению Rails.
Конечно, статические файлы должны быть доступны веб-серверу (например, через NFS). Если по какой-то причине вы не можете этого сделать, прокси с машины A на другой экземпляр nginx на машине B (который может получить доступ к статическим файлам), который, в свою очередь, прокси-сервер для единорога.
Быстрый пример:
server {
listen 80;
root /home/user/apps/test_app/public;
location / {
try_files $uri $uri/ @rails;
}
location @rails {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://unicorn_servers;
}
}