2013-09-03 13:00:52
来 源
kejihao
Nginx错误分析
该篇讲述Nginx服务器的proxy_pass中$host问题汇总,希望对于初学Nginx服务器相关的朋友有帮助,更多Nginx安装、配置、报错处理等资源请本站内搜索。。
今天在配置一个location的时候,希望使用一个变量如$host来指示nginx代理:

location /test/ {

proxy_pass http://$host;

}

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

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

locatin /test/ {

root /dev/shm/$host;

}

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

把上面的错误配置改成

location /test/ {

proxy_pass http://$host/;

}

或者

set $vhost "test.sudone.com";

location /test/ {

proxy_pass http://$vhost;

}

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

location /test/ {

proxy_pass http://127.0.0.1:80;

proxy_set_header Host $host;

}

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

再改一下测测

upstream backend.sudone.com {

server 127.0.0.1:80;

}

location /test/ {

proxy_pass http://backend.sudone.com;#固定写的后端upstream

proxy_set_header Host $host;#$host=test.sudone.com;

}

嗯?能用!

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

location /test/ {

proxy_pass http://127.0.0.1:80;

proxy_set_header Host fetch.$host;

}

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

set $vhost $host;

if $host ~* "([^.]+).sudone.com" {

set $vhost $1.xxx.com;

}

location /test/ {

proxy_pass http://127.0.0.1:80;

proxy_set_header Host fetch.$host;

}

可用的方面就广了。

---------------------------------------------------

补充:

在这个配置里,我的nginx代理的后端(backend)也是nginx,目前尚不清楚其它的web服务器如apache等是否能在这样的配置下工作正常。

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。