我想用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或其他什么?
答案 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
答案 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