nginx listen和server_name 的问题

本地nginx配置两个server,配置如下

server {                                                                                                                                                                                             
      listen       192.168.1.110:80;
      server_name rock.sandbox.com;
      xxxxxxxxx
}
server {                                                                                                                                                                                             
      listen       80 default_server;
      server_name 192.168.1.110 192.168.2.110 mysql.sandbox.com;
      xxxxxxxxx
}

这个时候我访问192.168.1.110 发现请求解析到了第一个server中去了。
server_name的匹配规则不是先完整,后通配再正则么?完整不是应该匹配到第二个server么?
server_name都不匹配最后走default_server
我要是把第一个server的listen改成 listen 80;在请求就会解析到第二个server。
这是什么问题?
第一个server我只想让1网段的访问,所以listen加上ip了。
难道server_name的匹配规则还和listen有关系?
求大神指点。
nginx版本 1.6.3
ubuntu 16.04

阅读 10k
1 个回答

我觉得不是说“server_name的匹配规则还和listen有关系”,而是listensocket层面的事情,而server_name只是url的解析,当然只有监听到的请求才能被解析,于是这就回到了一个tcp监听端口的问题:

如果serverA监听不指定ip,则相当于监听0.0.0.0:portServerB监听指定ip1:port,此时如果请求指定ip1必然会被ServerB接收到并处理,可以通过(netstat或者lsof等工具检查nginx进程的端口绑定情况)。

因此,题主情况还并没有涉及server_name处理优先级的问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题