本文主要是介绍Nginx - server、listen、server_name和多服务请求处理(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
server 上下文
server {
}
server
指令用于配置一个虚拟服务。listen
指令描述了本服务可接受链接的所有地址和端口,server_name
指令列举了所有服务的名字,例如
server {listen 80;server_name example.org www.example.org;
}
listen 指令
Syntax:
listen address[:port] [default_server] [ssl] [http2 | quic] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];listen port [default_server] [ssl] [http2 | quic] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];listen unix:path [default_server] [ssl] [http2 | quic] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];Default: listen *:80 | *:8000;
Context: server
例如一些常见的用法,listen
指令指定了该服务监听的地址和端口
listen 127.0.0.1:8000;
listen 127.0.0.1; # 不加端口,默认80
listen 8000;
listen *:8000;
listen localhost:8000;#IPv6 addresses
listen [::]:8000;
listen [::1];
server_name 指令
Syntax: server_name name ...;
Default:
server_name "";
Context: server
设置虚拟服务的名字,可以使用通配符和正则表达式
server_name example.com www.example.com;server_name example.com *.example.com www.example.*;server_name www.example.com ~^www\d+\.example\.com$;
多服务请求处理
当有多个服务时,nginx如何决定使用哪个server进行处理呢?例如在*:80
端口监听了多个服务:
server {listen 80 default_server;server_name test.com;default_type text/html;location / {return 200 'Default Main Server\n';}
}server {listen 80;server_name zh.test.com;default_type text/html;location / {return 200 'Chinese Server\n';}
}server {listen 80;server_name en.test.com;default_type text/html;location / {return 200 'English Server\n';}
}
nginx 将通过测试请求头中的Host
字段来决定使用哪个服务。如果没有server name 被匹配到,或者请求中不包含请求头,则使用该端口的默认服务。listen
指令中的default_server
可以用来显式配置默认服务,如果没有该字段,那么默认使用该端口的第一个服务。
使用curl请求测试,分别得到
$ curl -H ‘Host: test.com' -v localhost
Default Main Server
$ curl -H ‘Host: zh.test.com' -v localhost
Chinese Server
$ curl -H ‘Host: en.test.com' -v localhost
English Server
name-based 和 IP-based混合虚拟服务
服务器可以有多个公网IP以及解析多个域名,如下配置:
server {listen 127.0.0.2:80;server_name test.com;default_type text/html;location / {return 200 'Default Main Server\n';}
}server {listen 127.0.0.1:80;server_name zh.test.com;default_type text/html;location / {return 200 'Chinese Server\n';}
}server {listen 127.0.0.1:80;server_name en.test.com;default_type text/html;location / {return 200 'English Server\n';}
}
访问测试:
$ curl -H 'Host: test.com' -v 127.0.0.1
Chinese Server
$ curl -H 'Host: test.com' -v 127.0.0.2
Default Main Server
$ curl -H 'Host: zh.test.com' -v 127.0.0.1
Chinese Server
$ curl -H 'Host: zh.test.com' -v 127.0.0.2
Default Main Server
这篇关于Nginx - server、listen、server_name和多服务请求处理(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!