Ruby on rails 为什么我能';是否通过nginx代理通行证访问子域?

Ruby on rails 为什么我能';是否通过nginx代理通行证访问子域?,ruby-on-rails,ubuntu,nginx,unicorn,Ruby On Rails,Ubuntu,Nginx,Unicorn,我想通过Nginx和rorweb服务器(如Unicorn、Thin或WEBrick)在本地计算机上部署我的Ruby-on-Rails应用程序 如下所示,我想通过post子域访问我的web应用程序: upstream sub { server unix:/tmp/unicorn.subdomain.sock fail_timeout=0; # server 127.0.0.1:3000; } server { listen 80; server_name post.subdom

我想通过
Nginx
和rorweb服务器(如
Unicorn
Thin
WEBrick
)在本地计算机上部署我的Ruby-on-Rails应用程序

如下所示,我想通过
post
子域访问我的web应用程序:

upstream sub {
  server unix:/tmp/unicorn.subdomain.sock fail_timeout=0;
#  server 127.0.0.1:3000;
}

server {
  listen   80;
  server_name post.subdomain.me;

  access_log /var/www/subdomain/log/access.log;
  error_log  /var/www/subdomain/log/error.log;
  root     /var/www/subdomain;
  index    index.html;

  location / {
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host $http_host;
    proxy_redirect  off;
    try_files /system/maintenance.html $uri $uri/index.html $uri.html @ruby;
  }

  location @ruby {
    proxy_pass http://sub;
  }
}
一切正常,当我键入
post.subdomain.me
时,我可以看到我的RoR应用程序


问题:当我使用
post.subdomain.me
url时,我无法访问我的子域(
request.subdomain
返回空且
request.host
返回
subdomain.me
的安装)。但是当我使用
post.subdomain.me:3000
时,一切都很完美(意识到这一点,我掉了一半头发)。为什么以及如何解决此问题?

当您使用端口访问应用程序时-您直接访问rails服务器,而不是由nginx代理,这对于调试来说很好,但对于生产来说通常不太好

客户端可能没有传递主机头,
$host
默认为nginx主机

试一试


和一个“硬编码”方式:
proxy\u set\u header Host post.subdomain.me

代理设置\u标题
代理重定向
指令配置
代理传递
指令,并且需要位于同一位置块内或从封闭的
服务器
块继承。您需要按如下方式格式化配置文件:

location / {
    try_files /system/maintenance.html $uri $uri/index.html $uri.html @ruby;
}

location @ruby {
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host $http_host;
    proxy_redirect  off;
    proxy_pass http://sub;
}
编辑:假设
nginx
没有按照@Vasfed的建议将信息正确地传递给RoR,请为
proxy\u set\u header Host
尝试其他值。还有另外三位候选人,他们的意思都略有不同

    proxy_set_header  Host post.subdomain.me;
    proxy_set_header  Host $server_name;
    proxy_set_header  Host $host;

您在HTTP服务器上使用什么?你提到了Unicorn、Thin和Webrick,但没有说你试过哪一个。@TomL:所有这些我都有同样的问题。你所有的
proxy\u xxx
指令都在错误的
位置
块中。您需要使用
location@ruby
块中的
proxy\u pass
指令保存它们,否则它们将被忽略。@RichardSmith:您能详细描述一下您的答案吗?编辑后将
$http\u host
替换为
$host
或硬编码域您是否在
位置/
部分删除了主机的
代理集头
?很抱歉,您是对的。我更改了错误的文件。@alisepri.Kh EDIT:明确说明了Vasfed的建议。
    proxy_set_header  Host post.subdomain.me;
    proxy_set_header  Host $server_name;
    proxy_set_header  Host $host;