【问题标题】:Nginx Rails website and Passenger with multiple portsNginx Rails 网站和具有多个端口的乘客
【发布时间】:2015-02-15 10:35:53
【问题描述】:

我想运行我的 Rails 站点的两个版本,一个用于生产,一个用于开发。生产版将监听 80 端口,开发版将监听 9033 端口。这是我的配置服务器块,它们位于同一文件中

server {
  listen 80 default_server;
  server_name mywebsite.com;
  passenger_enabled on;
  passenger_app_env production;
  root /path/to/public/dir;
}

server {
  listen 9033 default_server;
  server_name mywebsite.com;
  passenger_enabled on;
  passenger_app_env development;
  root path/to/public/dir;
  passenger_friendly_error_pages on;
}

问题在于当我尝试通过浏览器连接网站时,无论我使用哪个端口,我总是得到与first服务器中指定的环境对应的网站版本堵塞。因此,在我上面给出的示例中,它始终为我的网站的生产版本提供服务。

为什么第一个服务器块会覆盖第二个,我怎样才能做到这一点,以便我可以访问我的网站的任一版本,而无需手动更改配置文件并重新加载 nginx?

更新:

即使在发送每个 HTTP 请求之前清除了浏览器缓存之后,这些建议都不起作用。我将我的服务器块更改为以下内容,希望我的服务器返回不同版本的网站

server {
  listen *:80;
  server_name mywebsite.com;
  passenger_enabled on;
  passenger_app_env production;
 root /home/alex/code/m2m/public/;
}


server {
  listen *:80;
  server_name dev.mywebsite.com;
  passenger_enabled on;
  passenger_app_env development;
  root /home/alex/code/m2m/public/;
  passenger_friendly_error_pages on;
}

然后在我的 /etc/hosts 文件中添加以下行

my.ip.addr.ess    dev.mywebsite.com

但是对这两个域的请求只会返回我网站的生产版本。注意我使用的是默认的 nginx.conf 文件。有没有办法可以调试我的浏览器(Chrome v40.0.2214.111(64 位))来查看我的请求是否/在哪里被更改?我认为问题出在客户端,因为评论者给我的建议似乎应该有效。

【问题讨论】:

  • 您的配置似乎正常,请发布日志。如果您评论第一个服务器块在 9033 端口上作为开发版本可以正常工作?还有其他服务器块吗?
  • 当我注释掉第一个服务器块时,只有端口 9033 的开发版本返回正确的网页,生产版本得到 404。这是我的日志的粘贴箱:pastebin.com/Bk7vFESX 没有其他服务器块。
  • 请测试,首先,删除两个default_server 指令,其次,从第二个server 位置删除server_name
  • 删除 default_server 指令会导致生产版本的端口 80 被提供,而不管哪个服务器块是第一个。在第二次删除服务器指令什么都不做。好的,这是最奇怪的事情。我一直在运行“sudo nginx -s reload”来更新 nginx,并将其更改为我的网站 conf 文件。我发现如果我运行命令并发现端口 80 和 9033 都指向 prod 版本,如果我等待 10 秒,再次运行命令并等待 10 秒左右,我将被定向到 dev 版本我的网站!除了 conf 文件之外似乎有什么影响它
  • 您确定您的浏览器缓存和所有这些东西都正常吗?是不是明显像你说的那样,客户端没有问题?

标签: ruby-on-rails-3 nginx passenger


【解决方案1】:

如果你试试这个:

listen *:80;

listen *:9033;

这是我关于针对 nginx 配置的问题的建议。 根据 nginx 文档,通过放置这些监听指令,nginx 将首先匹配 ip:port 服务器块,然后查看 匹配 IP:port 的服务器块中的 server_name 指令。因此,如果包含正确“端口”的请求在错误的环境中结束,这与应用程序或乘客指令有关。

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2012-05-10
    • 2010-12-14
    相关资源
    最近更新 更多