我正在尝试创建一个带有负载均衡器的 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;
}
}