在为unicorn rails服务器提供服务时,如何让nginx从两个位置提供静态文件?

时间:2011-01-31 18:17:23

标签: ruby-on-rails nginx unicorn

好的,所以我有几乎标准的nginx配置用于服务unicorn rails服务器(侦听套接字文件并且还提供来自rails_app / public目录的静态文件)。

但是,我想做以下事情:

  1. 提供来自的静态文件 rails_app / public(目前是 完成)
  2. 使用来自不同根目录的url / reports /提供静态文件(例如/ mnt / files /)
  3. 我尝试将以下内容添加到我的nginx配置中:

    location /reports/ {
        root /mnt/matthew/web;
    }
    

    但它不起作用。

    我有什么想法可以让这件事发生?

    (下面是我的整个nginx.conf文件:

    worker_processes 1;
    
    pid /tmp/nginx.pid;
    error_log /tmp/nginx.error.log;
    
    events {
      worker_connections 1024; # increase if you have lots of clients
      accept_mutex off; # "on" if nginx worker_processes > 1
      # use epoll; # enable for Linux 2.6+
      # use kqueue; # enable for FreeBSD, OSX
    }
    
    http {
      # nginx will find this file in the config directory set at nginx build time
      include mime.types;
    
      # fallback in case we can't determine a type
      default_type application/octet-stream;
    
      # click tracking!
      access_log /tmp/nginx.access.log combined;
      sendfile on;
    
      tcp_nopush on; # off may be better for *some* Comet/long-poll stuff
      tcp_nodelay off; # on may be better for some Comet/long-poll stuff
      gzip on;
      gzip_http_version 1.0;
      gzip_proxied any;
      gzip_min_length 500;
      gzip_disable "MSIE [1-6]\.";
      gzip_types text/plain text/html text/xml text/css
                 text/comma-separated-values
                 text/javascript application/x-javascript
                 application/atom+xml;
    
      # this can be any application server, not just Unicorn/Rainbows!
      upstream app_server {
        server unix:/home/matthew/server/tmp/unicorn.sock fail_timeout=0;
    
    
      }
    
      server {
        # enable one of the following if you're on Linux or FreeBSD
        listen 80 default deferred; # for Linux
        # listen 80 default accept_filter=httpready; # for FreeBSD
    
    
        client_max_body_size 4G;
        server_name _;
    
        keepalive_timeout 5;
    
        location /reports/ {
            root /mnt/matthew/web;
        }
        # path for static files
        root /home/matthew/server/public;
    
    
    
        try_files $uri/index.html $uri.txt $uri.html $uri @app;
    
        location @app {
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_redirect off;
    
          proxy_pass http://app_server;
        }
    
        # Rails error pages
        error_page 500 502 503 504 /500.html;
        location = /500.html {
          root public;
        }
      }
    }
    

1 个答案:

答案 0 :(得分:4)

location @app正在查找/home/matthew/server/public中的文件,因为这是指定的父根。如果您的try files语句与location /reports/中具有不同根目录的文件匹配,则将找不到这些文件。你需要这样设置:

location /reports/ {
    root /mnt/matthew/web;
    try_files $uri/index.html $uri.txt $uri.html $uri @foo;
}
root /home/matthew/server/public;
try_files $uri/index.html $uri.txt $uri.html $uri @app;

location @foo {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_redirect off;

  proxy_pass http://app_server;

  root /mnt/matthew/web
}

location @app {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_redirect off;

  proxy_pass http://app_server;
}