Nginx,为什么我需要指定一个服务器名称?

我很好奇,为什么需要在listen属性顶部的nginxconfiguration文件中指定server_name。

我一直在阅读一篇关于理解nginxconfiguration文件的digitalocean文章 ,这就是它解释两个设置之间的区别的方法:

listen:这个服务器块被devise为响应的IP地址/端口组合。 如果请求是由匹配这些值的客户端进行的,则可能会select该块来处理连接。

server_name:该指令是用于select要处理的服务器块的另一个组件。 如果有多个侦听指令具有相同特征的服务器模块可以处理请求,Nginx将parsing请求的“主机”头并将其与该指令相匹配。

但是,怎么能有两个不同的服务器监听相同的IP和相同的端口? 就我所知,Linux甚至不允许你启动两个监听同一端口的服务。

我错过了什么?

谢谢!

Nginx是Linux上的一个服务,它使用你告诉它使用的端口。 从那里开始,Linux并不关心nginx是干什么的,所以如果nginx想要在保留端口的请求中读取某些东西(例如,在端口80上get example.com )并且从其他请求中做一些不同的事情(例如get example.net在端口80),它可以这样做。

由于一台服务器通常托pipe多个域,因此nginx和所有现代Web服务器软件都提供了支持这一function的function,在nginx中是server_name指令。

但是,如果nginx想要在服务器上的某个其他服务(例如,22端口,通常由OpenSSH使用)在相同的端口上执行某些操作,那么将会有冲突解决。

那么,对于HTTP 1.1,你可以指向一个IP许多域名,这是不可能在HTTP 1.0 (更多,你可以在这个答案中看到)。 所以,你从nginx进程开始,并监听请求的端口,无限数量的域和子域。 例如,你可以检查stackoverflow.com和serverfault.com,他们都指向相同的IP地址。