使用nginx作多域名混跑的proxy_cache时遇到一问题:当一个非加速server_name的请求到达时,nginx不会像squid那样返回一个ERR_DNS_FAIL,反而假装很正常的返回一个页面:
server {
server_name www.aaa.com;
proxy_pass http://1.1.1.1;
}
server {
server_name www.bbb.com;
proxy_pass http://2.2.2.2;
}
}
访问www.ccc.com的时候,nginx毫不犹豫的把www.aaa.com的页面内容返回给了client。在日志里记录:
MISS/200 GET http://www.ccc.com/ 1.1.1.1:80
如果把aaa和bbb的server{}顺序倒换,那ccc的回源地址就变成了2.2.2.2。
也就是说,解析不出、定义不到的域名请求,自动返回排在第一位的server内容。
解决方法:在最上头,也定义一个自己的server,就可以了:
server {
root /cache;
rewrite ^(.*) /error.htm permanent;
}
server {
……
}
}
至于这个error.htm,有没有都一样,反正有就是301,没有就是404。
后面的web服务器为什么不检查Host直接给出内容,也是让人很郁闷的一点。
或许IIS也是如此吧。
问题:在一个服务器中增加了一些站点别名,差不多有20多个吧,重启nginx时,有如下的错误提示:
could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32
解决方法:
在配置文件的http{}段增加一行配置:
server_names_hash_bucket_size 64;
如果64还不够,那么就按32的倍数往上加。
中文wiki上摘抄的一段说明,大家可以看看:
保存服务器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size 所控制的。
参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。
如果 hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。
第一次是确定存储单元的地址,第二次是在存储单元中查找键值。
因此,如果Nginx给出需要增大 hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小。
一般来说主机上每个ip上会对应几个不同的站点。于是就会出现一个问题,直接访问这个ip,访问的会是哪个站点呢?
在nginx中,每个站点都是由一个server段定义的,里面设定了监听的ip和端口,站点的域名,根目录等。
解决方法:
在Listen ip:port; 这个指令行中,有一个参数default,指定了它后,这个server段就会是这个ip的默认站点;如果没有这个参数,那么默认ip直接访问的是nginx.conf中出现的第一个server段对应的站点。
listen: 127.0.0.1:80 default;
server_name shuai.be;
...
}
您可能感兴趣的文章:
nginx下禁止直接以IP访问的方法
两个nginx小技巧(禁止以ip方式访问、禁止列出目录)
设置nginx禁止通过IP访问服务器的方法
nginx禁止IP访问及未绑定的域名跳转的配置方法
nginx屏蔽ip直接访问的方法
nginx禁止直接以IP访问网站的方法