Server块和“虚拟主机”的概念有密切联系
虚拟主机,又称虚拟服务器、主机空间或是网页空间,它是一种技术。该技术是为了节省互联网服务器硬件成本而出现的,这里的“主机”或“空间”是由实体的服务器延伸而来,硬件系统可以基于服务器群,或者单个服务器等,虚拟主机技术主要应用于HTTP、FTP及EMAIL等多项服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源,从用户角度来看,一台虚拟主机和一台独立的硬件主机是完全一样的
在使用Nginx服务器提供Web服务时,利用虚拟主机的技术就可以避免为每一个要运行的网站提供单独的Nginx服务器,也无需为每个网站对应运行一组Nginx进程,虚拟主机技术使得Nginx服务器可以在同一台服务器上只运行一组Nginx进程,就可以运行多个网站
在前面提到过,每一个http块都可以包含多个Server块,而每个Server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(或网站)
和http块相同,Server块也可以包含自己的全局块,同时可以包含多个location块,在Server全局块中,最常见的两个配置项是本虚拟主机的监听配置和本虚拟主机的名称或IP配置
Listen指令:
Server块中最重要的指令就是Listen指令,这个指令有三种配置语法。这个指令默认的配置值是:Listen :80 | :8000;只能在Server块种配置这个指令
Listen指令的配置非常灵活,可以单独制定ip,单独指定端口或者同时指定ip和端口
Listen 127.0.0.1:8000; #只监听来自127.0.0.1这个IP,请求8000端口的请求
Listen 127.0.0.1; #只监听来自127.0.0.1这个IP,请求80端口的请求(不指定端口,默认80)
Listen 8000; #监听来自所有IP,请求8000端口的请求
Listen *:8000; #和上面效果一样
Listen localhost:8000; #和第一种效果一致
关于上面的一些重要参数做如下说明:
address:监听的IP地址(请求来源的IP地址),如果是IPv6的地址,需要使用中括号“[]”括起来,比如[fe80::1]等
port:端口号,如果只定义了IP地址没有定义端口号,就使用80端口。这边需要做个说明:要是你压根没配置listen指令,那么如果nginx以超级用户权限运行,则使用:80,否则使用:8000,多个虚拟主机可以同时监听同一个端口,但是server_name需要设置成不一样;
default_server:假如通过Host没匹配到对应的虚拟主机,则通过这台虚拟主机处理。具体的可以参考这篇文章(https://segmentfault.com/a/1190000015681272),写的不错
backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在FreeBSD中默认为-1,其他平台默认为511
accept_filter=filter:设置监听端口对请求的过滤,被过滤的内容不能被接收和处理。本指令只在FreeBSD和NetBSD 5.0+平台下有效,filter可以设置为dataready或httpready,感兴趣的读者可以参阅Nginx的官方文档
bind:标识符,使用独立的bind()处理此address:port;一般情况下,对于端口相同而IP地址不同的多个连接,Nginx服务器将只使用一个监听命令,并使用bind()处理端口相同的所有连接
ssl:标识符,设置会话连接使用SSL模式进行,此标识符和Nginx服务器提供的HTTPS服务有关
总结:listen指令的使用看起来比较复杂,但其实在一般的使用过程中,相对来说比较简单,并不会进行太复杂的配置
server_name指令:
用于配置虚拟主机的名称
Syntax: server_name name …;
Default:
server_name “”;
Context: server
对于name 来说,可以只有一个名称,也可以由多个名称并列,之间用空格隔开。每个名字就是一个域名,由两段或者三段组成,之间由点号“.”隔开,比如
在该例中,此虚拟主机的名称设置为myserver.com或www. myserver.com,Nginx服务器规定,第一个名称作为此虚拟主机的主要名称
在name 中可以使用通配符“*”,但通配符只能用在由三段字符串组成的名称的首段或尾段,或者由两段字符串组成的名称的尾段,如:
另外name还支持正则表达式的形式。这边就不详细展开了