在nginx配置中与位置块一起苦苦挣扎

时间:2011-03-03 17:39:02

标签: nginx

我从slicehost中获得了一个新的切片,用于游戏和学习nginx以及更多关于部署的一般信息。我在那里安装了一个使用乘客的红宝石应用程序(我称之为app1)。我把它作为我的nginx配置中使用以下服务器块的服务器的默认应用程序:

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

这很好用。但是,我想在这片上尝试一些不同的应用程序,所以我想我会这样设置:

HTTP:/// APP1

HTTP:/// APP2

等。我想我可以通过添加一个位置块,然后像这样将app1特定的东西移动到其中来做到这一点:

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

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

但是,在执行此操作(并且当然重新启动nginx)时,转到普通IP地址会显示“welcome to nginx”消息(我期望这样)。但是,转到/ app1会显示错误消息:

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

这与我在该IP上转到另一条路径时得到的错误消息不同,例如/ foo:

404 Not Found
nginx/0.8.53

所以,就像nginx知道那个位置但是我没有正确设置它。谁能让我直截了当?我应该设置不同的服务器块而不是使用位置吗?我确信这很简单,但无法解决。

干杯,最大

5 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

我在这里看不到真正的问题,
为了让你明白这一点 您需要在大多数系统上查看nginx日志文件:
在/ var /日志/ nginx的/
并在此处打开相关的访问文件(可能是error.log) 在那里你可以看到url nginx究竟试图访问的内容以及为什么它会失败 我真正想到的是,你的根路径错了, 也许它应该是别名,因为 如果您要连接到另一个应用程序的连接,它可能会得到 &#34; APP1&#34;网址中的单词而非直接单词。

所以请尝试:

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

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

并查看它的工作天气,并首先尝试查看日志,以确定问题是什么。

答案 2 :(得分:2)

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

 location ~ ^/app1 { ... 

应该有效,或者效率更高:

 location = /app1 { ...

答案 3 :(得分:2)

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

passenger_base_uri /app1;

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

答案 4 :(得分:2)

您似乎希望在基础uri的同一台服务器上托管更多应用。试试这个:

root /srv/http/;
passenger_base_uri /app_1;
passenger_base_uri /app_2

同样在/ srv / http下,创建2个符号链接:

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

可以在http://domain.com/app_1下访问app1。

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