nginx没有转发到我的rails应用程序

时间:2014-07-11 16:15:35

标签: ruby-on-rails nginx

我很擅长使用nginx。我想用它来提供静态内容,以减少rails服务器上的负载。这似乎是一项相当简单的任务,但我找不到适合我的解决方案。

我希望nginx提供存在于rails应用程序目录中 public 目录中的静态文件。更确切地说:我在输入 http:/ [domainname] 时希望获得服务的目录中有一个 index.html 。相反,我只是得到默认的nginx index.html。我已经检查 thin 正在运行,当我查询 127.0.0.1:3000 时,我得到了我想要的页面。

所以这是 sites-available 目录中名为[domainname]的文件。

upstream rails {
  server 127.0.0.1:3000; #This is where thin is waiting for connections
}

# HTTP server
server {
    listen      80;
    server_name [domainname];

    set  $app /home/projektor/website/app.[domainname];
    root $app/public;

    # Set a limit to POST data
    client_max_body_size 8M;

    # Errors generated by Rails
    error_page 400     /400.html;
    error_page 422     /422.html;
    error_page 500 504 /500.html;

    # Errors generated *outside* Rails
    error_page 502     @502;
    error_page 503     @503;

    # If the public/system/maintenance.html file exists,
    # return a 503 error, that ...
    if (-f $document_root/system/maintenance.html) {
      return 503;
    }

    # ... will serve the very same file. This construct
    # is needed in order to stop the request before
    # handing it to Rails.
    location @503 {
      rewrite ^ /system/maintenance.html break;
    }

    # When a 502 error occurs - that is, Rails is not
    # running, serve the 502.html file
    location @502 {
      rewrite ^ /502.html break;
    }


    # Add client-side caching headers to static files
    #
    location ~ ^/(stylesheets|javascripts|images|system/avatars) {
        expires 720h;
    }

    # Hand over the request to Rails, setting headers
    # that will be interpreted by request.remote_ip,
    # request.ssl? and request.host
    #
    location / {
        proxy_set_header    X-Real-IP         $remote_addr;
        proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto http;
        proxy_set_header    Host              $http_host;
        proxy_redirect      off;

        # If the file exists as a static file serve it directly            
        if (-f $request_filename) {
            break;
        }

        # Oh yeah, hand over the request to Rails! Yay! :-D
        proxy_pass http://rails;
    }
}

该文件基于this一个。

感谢您的帮助。

修改 我已经在上游部分为 0.0.0.0:3000 交换了 127.0.0.1:3000 。我还检查了site-available和sites-enabled中文件的所有权,它们都应该没问题。

我将return 503;硬编码到位置指令中,似乎它永远不会匹配。它似乎总是匹配预先创建的默认配置。

2 个答案:

答案 0 :(得分:1)

查看try_files文档中的Mongrel示例。这样的事情应该有效:

location / {
    try_files /system/maintenance.html $uri $uri/index.html $uri.html @thin;
}
location @thin {
    proxy_set_header    X-Real-IP         $remote_addr;
    proxy_set_header    X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto http;
    proxy_set_header    Host              $http_host;
    proxy_redirect      off;

    # Oh yeah, hand over the request to Rails! Yay! :-D
    proxy_pass http://rails;
}

答案 1 :(得分:1)

当我设置最新版本的NGINX时,让它正确指向我的rails应用程序的解决方案与完全配置完全相关。我在文档中找不到一些额外的步骤。它的表现与你的一样。我没有干净安装,但请耐心等待。

我在默认安装位置设置了一个名为sites-enabled的目录。这是来自apt存储库的debian安装,因此安装位置是/ etc / nginx和/ var / nginx。

mkdir /etc/nginx/sites-enabled /etc/nginx/sites-available
  1. 将网站的conf文件放在sites-available /

  2. 将此行添加到/etc/nginx/nginx.conf的底部

    包括/ etc / nginx / sites-enabled / *;

  3. 查找并删除任何可能包含DEFAULT配置的引用,该引用告诉nginx实际加载此文件。这是什么给你nginx默认index.html(/etc/nginx/conf.d/default.conf)

    grep -r" default.conf"的/ etc / nginx的

  4. 符号链接(man ln)您站点中的文件 - 可用于启用站点。

    ln -s / etc / nginx / sites-available / myfilename / etc / nginx / sites-enabled / myfilename

  5. 测试您的配置。

    /etc/init.d/nginx configtest

  6. 正确设置配置后,重新启动nginx

    /etc/init.d/nginx restart

  7. 我无法记住,如果删除此引用或在步骤2中包含该行就足够了。如果您更新或评论此答案并给我结果,我可以尝试挖掘我采取的其他步骤。

    我不认为这里的问题是你的实际配置。