Nginx配置中没有server_name会怎样?
答:此时Nginx会自动设置成 server_name "";
它不会匹配任何域名,导致Nginx会优先将HTTP请求交给其它server处理。如果其它server不处理,则还是交给该server处理。
Nginx选用server的规则
参考官方文档,Nginx处理HTTP请求的流程如下:
- 当Nginx在某个端口收到一个HTTP请求时,会交给监听该端口的server处理。
- 如果监听该端口的server有多个,则取决于请求头的Host与哪个server的域名(server_name)匹配。
- 如果没有匹配的域名,或者请求头的Host是IP地址,则交给监听该端口的默认server处理。
- 选用了server之后,Nginx会寻找与HTTP请求的URL匹配的location,决定如何做出响应。
如果监听一个端口的server有多个,则最前面定义的那个是默认server。也可以手动指定:
server {
listen 80 default_server;
...
- 例如,/etc/nginx/conf.d/default.conf中定义了一个监听80端口的server,它会返回Nginx的欢迎页面。如果用户不定义其它监听80端口的server,则它就会成为默认server,处理所有发到80端口的HTTP请求。
server_name有以下几种格式,排在前面的优先匹配:
server_name www.test.com localhost; # 匹配明确的域名(可以填多个,Nginx不会去验证DNS)
server_name *.test.com; # 以 *. 开头,模糊匹配
server_name www.test.*; # 以 .* 结尾
server_name ~^(?<www>.+)\.test\.com$; # 正则表达式
server_name ""; # 空字符串,不会匹配任何域名
如果有两个server监听的端口和域名都相同,运行Nginx时就会报错:conflicting server name
。
同理,如果有两个server监听的端口相同,并且都没有设置server_name,运行Nginx也会报错:conflicting server name
。
测试验证
将 /etc/nginx/conf.d/default.conf 改为如下内容,然后启动Nginx。
server {
listen 80;
server_name localhost;
return 200 "This is 1\n";
}
server {
listen 80;
server_name *.test.com;
return 200 "This is 2\n";
}
server {
listen 80 default_server;
# server_name "";
return 200 "This is 3\n";
}
测试发送不同域名的HTTP请求到80端口:
curl 127.0.0.1:80
由于没有发送域名,所以Nginx会选用监听80端口的默认server,即第三个server。
curl localhost:80
匹配第一个server。
curl www.test.com:80
匹配第二个server。