Nginx 通过 Unicorn 上游(tcp)提供静态文件

Nginx 通过 Unicorn 上游(tcp)提供静态文件

我正在尝试创建一个带有负载均衡器的 Rails 应用程序。应用程序正在运行,但我不知道如何提供静态文件。所有示例都假设 nginx 和 unicorn 在同一台机器上运行。

以下是最低配置:

机器 A:Nginx 机器 B:带有应用程序的 Unicorn 进程

机器 A:

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 来为其他计算机提供静态文件服务?

答案1

在您的server块中,您需要将root指令设置为包含您的资产的顶级目录(对于 Rails 应用程序,这是public目录),然后使用try_files它来加载静态资产或传递到您的 Rails 应用程序。

当然,静态文件必须能够被 Web 服务器访问(例如通过 NFS)。如果出于某种原因您无法做到这一点,那么请从机器 A 代理到机器 B 上的另一个 nginx 实例(可以访问静态文件),然后由该实例再代理到 unicorn。

一个简单的例子:

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;
        }
}

相关内容