如何使用NGINX部署Ruby Rack应用程序

时间:2012-10-23 12:11:38

标签: ruby nginx rack

我想用NGINX部署一个简单的Ruby Rack服务。我在互联网上阅读了各种各样的东西,其中没有一个是有用的。让我说我有这个(实际上它有点复杂但仍然是<200行代码服务):

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或其他什么?

3 个答案:

答案 0 :(得分:15)

这是一个基本的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

答案 1 :(得分:9)

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

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

答案 2 :(得分:1)

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

/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上启用您的网站,请创建一个symlik

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

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