2011-03-03 110 views
4

与所在地块挣扎我得到了一个新的片断slicehost,为玩耍和学习有关部署nginx的和更普遍的目的。我在那里安装了一个使用乘客的红宝石应用程序(我将调用app1)。我把它的默认应用该服务器具有下列服务器块在我的nginx的配置使用:在nginx的配置

server { 
    listen 80; 
    server_name <my server ip>; 
    root <path to app1 public folder>; 
    passenger_enabled on; 
} 

这工作得很好。但是,我想尝试一些不同的应用程序上出这片,所以以为我会设置它就像这样:

的http:/// APP1

的http:/// APP 2

等我想我能做到,它通过添加位置块,并且APP1具体的东西移到了,像这样:

server { 
    listen 80; 
    server_name <my server ip>; 

    location ^~ /app1 { 
     root <path to app1 public folder>; 
     passenger_enabled on; 
    } 
} 

但是,这样做(和重新启动,当然nginx的),去纯IP地址给出了“欢迎nginx的”消息(我期望)。但是,去/ APP1给出错误信息:

404 Not Found 
The requested URL /app1 was not found on this server. 

这是错误消息我得到不同的,当我去到另一条路径上的IP,如/富:

404 Not Found 
nginx/0.8.53 

所以,这就像nginx知道那个位置,但我没有正确设置它。任何人都可以设置我吗?我应该设置不同的服务器块而不是使用位置吗?我相信这很简单,但无法解决。

干杯,最大

+0

作为旁注,不鼓励将[root在一个位置块](https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#root-inside-location-block ) – Daan 2016-02-27 11:02:04

回答

2

我认为它只是一个轻微的语法问题:

location ~ ^/app1 { ... 

应该工作,或稍微更高效:

location = /app1 { ... 
+0

感谢martin。我尝试了这两个,但仍然得到相同的'在此服务器上找不到请求的URL/app1。 '错误。 – 2011-03-04 09:35:03

2

一个问题是,您的Rails应用程序可能不是为了从子目录运行而设计的。乘客有一个指令,将解决这个问题:

passenger_base_uri /app1; 

然而,在子目录运行Rails应用是有点不标准。如果可以的话,一个更好的选择可能是设置使用nginx的的虚拟主机子域。

3

什么你后名称的虚拟主机。其思想是每个结构域上的相同的IP承载和nginx的选择的虚拟主机基于HTTP请求,这是由浏览器发送的Host:头服务。

要使用名称的虚拟主机,使用你想,而不是为你的服务器的IP为server_name指令域。

server { 
    listen 80; 
    server_name app1.com; 

    location/{ 
    root /srv/http/app1/public; 
    passenger_enabled on; 
    } 
} 

然后,主机在同一机器中更多的应用程序,只是声明为每一个单独的server { }块。

server { 
    listen 80; 
    server_name app2.com; 

    location/{ 
    root /srv/http/app2/public; 
    passenger_enabled on; 
    } 
} 

我使用的是麒麟,而不是乘客,而是结构的虚拟主机部分为任何后端相同。

全球nginx的配置(其自身的主机没有):https://github.com/benhoskings/babushka-deps/blob/master/nginx/nginx.conf.erb

每个虚拟主机模板包装:https://github.com/benhoskings/babushka-deps/blob/master/nginx/vhost.conf.erb

麒麟虚拟主机的细节:https://github.com/benhoskings/babushka-deps/blob/master/nginx/unicorn_vhost.common.erb

2

看来你想要在基本uri的同一台服务器上托管更多的应用程序。试试这个:

root /srv/http/; 
passenger_base_uri /app_1; 
passenger_base_uri /app_2 
下的/ srv/HTTP

此外,创建符号链接2:http://domain.com/app_1

ln -s /srv/http/app_1 /srv/http/app1/public 
ln -s /srv/http/app_2 /srv/http/app2/public 

的APP1下就可以进行访问。

下面是更多阅读:http://www.modrails.com/documentation/Users%20guide%20Nginx.html#deploying_rack_to_sub_uri

3

我在这里未能寿看到真正的问题,
为了让你明白这一点 你需要查看大多数系统上的nginx的日志文件:
/var/log/nginx/
并在此处打开相关访问文件(可能是error.log) 您可以在其中看到nginx准确访问的网址以及为什么会失败。
我真的以为发生了,你得到的根路径错了, 也许它应该是别名,而不是因为 如果你正在代理到另一个应用程序的连接,它可能会在url中取得 “app1”字,而不是直接的。

所以请尝试:

server { 
    listen 80; 
    server_name <my server ip>; 

    location /app1 { 
     alias <path to app1 public folder>; 
     passenger_enabled on; 
    } 
} 

,看看天气它的工作原理,并尽量先查看日志真正确定什么问题。