Назад | Перейти на главную страницу

Nginx обслуживает статические файлы через восходящий поток Unicorn (tcp)

Я пытаюсь создать приложение 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;
        }
}