【问题标题】:How to deploy Ruby Rack app with NGINX如何使用 NGINX 部署 Ruby Rack 应用程序
【发布时间】:2012-10-13 08:49:28
【问题描述】:

我想用 NGINX 部署一个简单的 Ruby Rack 服务。我在互联网上阅读了各种各样的东西,但没有一个足够有用。假设我有这个(实际上它有点复杂但仍然

require 'rack'

class HelloWorld
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
  end
end

Rack::Handler::Mongrel.run HelloWorld, Port: 9292

我想知道用 NGINX 部署它的最佳方式是什么。也许是 FCGI 或其他?

【问题讨论】:

    标签: ruby nginx rack


    【解决方案1】:

    最简单的可能是passenger,它允许 nginx 服务(除其他外)任何基于机架的应用程序。它很容易设置,但是由于 nginx 没有可加载的模块,你必须从源代码安装 nginx(安装程序会为你处理所有这些)。

    另一种流行的方法是让 nginx 代理独角兽。 Unicorn 是一个 ruby​​ 网络服务器,可以托管任何机架应用程序。通常,您让 nginx 处理静态资产并将其余的发送给 unicorn。与 Thin、mongrel 等相比,Unicorn 有一些不错的功能,例如,它几乎可以开箱即用地处理无缝重启。

    【讨论】:

      【解决方案2】:

      这是一个基本的 nginx 配置,适用于您使用 unicorn/thin 解决方案的情况:

      upstream rack_upstream {
        server 127.0.0.1:9292;
      }
      
      server {
        listen       80;
        server_name  domain.tld;
        charset UTF-8;
      
        location / {
      
          proxy_pass http://rack_upstream;
          proxy_redirect     off;
          proxy_set_header   Host             $host;
          proxy_set_header   X-Real-IP        $remote_addr;
          proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
      
        location ~* ^.+\.(jpg|jpeg|gif|png|css|js)$ {
          root /path/to/static/files;
        }
      }
      

      如果您以 root 身份运行 nginx,您将可以在端口 80 上为您的站点提供服务。

      否则将listen 80 更改为listen SOME-AVAILABLE-PORT

      domain.tld 替换为您的网站名称

      您还可以在 (jpg|jpeg|gif|png|css|js) 正则表达式中添加要由 nginx 提供的文件扩展名,并用 | 分隔它们

      查看更多:

      http://wiki.nginx.org/DirectiveIndex

      http://wiki.nginx.org/ServerBlockExample

      http://wiki.nginx.org/FullExample

      【讨论】:

        【解决方案3】:

        使用预编译的乘客二进制文件 (for Debian/Ubuntu) 时,部署 nginx+passenger 非常容易。项目的目录结构如下:

        /var/www/my_app:
            \-- public/   <- public root of webserver
            \-- config.ru <- that's where you place hello world
            \-- tmp
                \-- restart.txt
        

        nginx 配置(可能例如在/etc/nginx/sites-available/my_site):

        server {
          listen 80;
          server_name example.com;
          root /var/www/my_app/public;
        
          passenger_enabled on;
          passenger_ruby /usr/bin/ruby;    
        }
        

        当你想重启你的应用程序时,只需运行

        touch /var/www/my_app/tmp/restart.txt
        

        要在 Debian 上启用您的站点,请创建一个符号

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

        并重新加载 nginx /etc/init.d/nginx reload

        【讨论】:

        • 如何禁用默认服务器以使用“my_site”?
        • 只需删除配置文件:rm /etc/nginx/sites-enables/my_site 并重新加载 nginx:/etc/init.d/nginx/reload
        • 那是删除我要使用的,我要删除默认配置
        • 对,对不起,我忽略了这一点。 rm /etc/nginx/sites-enables/default 应该这样做。
        • 是的,当然。我试图让它通用。这只是 Debian 约定,但不是每个人都遵守它。最初的问题是关于运行 Rack 应用程序,而不是关于配置 nginx。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多