我想通过Nginx
和RoR Web服务器(如Unicorn
, Thin
或WEBrick
)在本地计算机上部署我的Ruby on Rails应用程序。
如下图所示,我想通过post
子域访问我的web-app:
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
instaed subdomain.me
)。 但是,当我使用post.subdomain.me:3000
时, post.subdomain.me:3000
都很完美(我失去了一半的头发来实现这一点)。 为什么和如何解决?
当你用端口访问应用程序时 – 你直接访问rails服务器,而不是用nginx代理,这对于调试来说很好,但是通常不适合生产。
主机头可能不会被客户端传递, $host
默认为nginx主机
尝试
location @ruby { proxy_set_header Host $host; proxy_pass http://sub; }
和一个'硬编码'方式: proxy_set_header Host post.subdomain.me;
proxy_set_header
和proxy_redirect
指令配置proxy_pass
指令,并且需要位于相同的位置块中或从封闭的server
块继承。 你需要像这样格式化你的配置文件:
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
没有正确地将信息传递给RoR,如@Vasfed建议,请为proxy_set_header Host
尝试其他值。 还有三个候选人,所有的意思都略有不同。
proxy_set_header Host post.subdomain.me; proxy_set_header Host $server_name; proxy_set_header Host $host;