12

我想用 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或别的什么?

4

3 回答 3

15

这是您要使用unicorn/thin解决方案的情况的基本 nginx 配置:

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 80listen 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

于 2012-10-23T13:29:15.200 回答
9

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

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

于 2012-10-23T12:17:48.753 回答
1

使用预编译的乘客二进制文件(对于 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 配置(可能例如 in /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

于 2015-01-09T23:35:39.113 回答