Nginx配置中没有server_name会怎样?

Nginx配置中没有server_name会怎样?

答:此时Nginx会自动设置成 server_name ""; 它不会匹配任何域名,导致Nginx会优先将HTTP请求交给其它server处理。

Nginx选用server的规则

参考官方文档,Nginx处理HTTP请求的流程如下:

  1. 当Nginx在某个端口收到一个HTTP请求时,会交给监听该端口的server处理。
  2. 如果监听该端口的server有多个,则取决于请求头的Host与哪个server的域名(server_name)匹配。
  3. 如果没有匹配的域名,或者请求头的Host是IP地址,则交给监听该端口的默认server处理。
  4. 选用了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  ~^(?.+)\.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端口:
Nginx配置中没有server_name会怎样?_第1张图片
curl 127.0.0.1:80
由于没有发送域名,所以Nginx会选用监听80端口的默认server,即第三个server。

curl localhost:80
匹配第一个server。

curl www.test.com:80
匹配第二个server。

你可能感兴趣的:(Linux)