« »

Nginx proxy_pass到$host的问题与解决方法

在配置一个location的时候,希望使用一个变量如$host来指示nginx代理:

location /prog/ {
    proxy_pass http://$host;
}

如你想不到,这个配置是不能使用的,查看error.log,打出来的信息也无法帮助解决问题。

但相同情况下,root标签就工作得很好:

locatin /prog/ {
    root /dev/shm/$host;
}

令人匪夷所思,估计这是nginx的一个bug,或者是一个搅不清的逻辑?

把上面的错误配置改成

location /prog/ {
proxy_pass http://$host/;
}

或者

set $vhost "prog.linuxany.com";
location /prog/ {
    proxy_pass http://$vhost;
}

等等,都不能解决问题,最后是用了个奇怪的配置方式,居然能工作……

location /prog/ {
    proxy_pass http://127.0.0.1:80;
    proxy_set_header Host $host;
}

这个配置就能工作正常,但上面这个配置只支持单ip的后端,能不能支持upstream呢?

再改一下测测

upstream backend.linuxany.com {
    server 127.0.0.1:80;
}

location /prog/ {
    proxy_pass http://backend.linuxany.com;#固定写的后端upstream
    proxy_set_header Host $host;#$host=prog.linuxany.com;
}

能用!

有了这个办法,便不用在数十个主机配置内把/prog/这个location贴上数十次,另外,它也可以支持这样的写法:

location /prog/ {
    proxy_pass http://127.0.0.1:80;
    proxy_set_header Host fetch.$host;
}

还可以用正则表达式对host进行匹配:

set $vhost $host;
if $host ~* "([^\.]+)\.linuxany\.com" {
    set $vhost $1.baidu.com;
}

location /prog/ {
    proxy_pass http://127.0.0.1:80;
    proxy_set_header Host fetch.$host;
}

可用的方面就广了。

您还可能感兴趣的内容

日志信息 »

该日志于2011-04-25 12:54由 admin 发表在Nginx分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。

没有评论

发表评论 »


返回顶部