NGINX学习笔记(四):一篇搞懂NGINX的常用配置之SERVER指令

写在前面

在NGINX中,每一个SERVER就是一个虚拟主机。每一个虚拟主机相当于一个在同一台服务器中相互独立的站点,从而实现一台主机对外提供多个WEB服务的功能,每个虚拟主机之间是独立的,互不影响的。
在NGINX中,可以指定多个虚拟主机服务器,每个服务器由一个server {} 上下文描述。

虚拟主机的类型

NGINX支持三种类型的虚拟主机配置:

  • 使用IP配置虚拟主机
  • 使用域名配置虚拟主机
  • 使用端口号配置虚拟主机
# 1. 使用IP配置虚拟主机
http {
	server {
		listen 80;
		server_name 115.114.113.111;
		location / {
			# 策略1
			...;
		}
	}
	server {
		listen 80;
		server_name 115.114.113.112;
		location / {
			# 策略2
			...;
		}
	}
}

# 2. 使用域名配置虚拟主机
http {
	server {
		listen 80;
		server_name user.baidu.com;
		location / {
			# 策略1
			...;
		}
	}
	server {
		listen 80;
		server_name blog.baidu.com;
		location / {
			# 策略2
			...;
		}
	}
}

# 3. 使用端口号配置虚拟主机
http {
	server {
		listen 8001;
		server_name www.baidu.com;
		location / {
			# 策略1
			...;
		}
	}
	server {
		listen 8002;
		server_name www.baidu.com;
		location / {
			# 策略2
			...;
		}
	}
}

SERVER-NAME指令

http {
	server {
		listen 80;
		server_name 115.114.113.111;
		location / {
			# 策略1
			...;
		}
	}
}
1. 语法
server_name NAME1 [NAME2] ... [NAMEN];
2. 原则
  1. 不区分大小写,都按照小写字母来处理
  2. 可以同时配置一个或者多个NAME;
  3. 如果不配置server_name,则对应的默认值是“”;
  4. 可以使用全字符串,用于完全匹配名称;
  5. 可以使用通配符★,通配符的位置只能出现在头部或者末尾,如:★.baidu.com,www.baidu.★ ;
  6. 可以使用正则表达式。
3. 匹配顺序
  1. 首选匹配全字符串;
  2. 如果全字符串没有命中,则进行最长前缀通配符匹配;
  3. 如果前缀通配字符没有命中,则进行最长后缀通配符匹配;
  4. 如果后缀通配字符没有命中,则进行正则表达式类型匹配,按照在配置文件中出现的顺序,第一个匹配到的正则表达式就是匹配结果;
  5. 如果正则表达式也没有命中,则选择这个IP和PORT对应的default_server。
4. 示例
示例1
http {
	server {
		listen 80 ;
		# 匹配到该SERVER时,不记录日志
		access_log off;
		# 返回一个NGINX特有的、非HTTP标准的返回码444, 它可以用来关闭连接
		return 444;
	}
}
示例2
http {

	# 当请求为: http://localhost/test时,这里$uri就是 /test, try_files指令会到硬盘找这个文件。
	# 如果存在名为/$root/test(其中$root是nginx中配置的网页文件根目录)的文件, 则直接把该文件的内容发送给用户;
	# 如果不存在  /$root/test的文件, 就会去匹配 $uri/(增加了一个/), 也就是看有没有名为: /$root/test/ 的目录;
	# 如果没有该目录, 就发起一个内部子请求给@hadoopx, 这时会匹配location @hadoopx, 
	# 将请求转发到http://127.0.0.1:8080
	
	server {
		listen 80;
		server_name 115.114.113.112;
		location / {
			try_files $uri $uri/ @hadoopx;
		}
		location @hadoopx {
			proxy_pass http://127.0.0.1:8080;
		}
	}
}

如何使用DEFAULT_SERVER?

1. 说明

NGINX的 default_server 指令可以定义默认的SERVER块,用于处理一些没有成功匹配 server_name 的请求。
匹配SERVER块时,是根据请求的 “IP地址:端口号” 进行匹配的。可以理解为多个SERVER会根据监听的“IP地址:端口号”,将SERVER块分为若干组,若SERVER匹配失败,则由该组的default_server进行请求处理(没有显式指定default_server时,则匹配的是监听该“IP地址:端口号”所对的第一个SERVER块)。
所以,如果根据SERVER-NAME的匹配规则,匹配不到对应的SERVER块,则:

  1. 匹配LISTEN指令且被 default_server 显示标记的SERVER块,匹配到则使用且停止搜索;
  2. 如果第1步未匹配到,则匹配LISTEN指令的第一个SERVER块。
2. 示例
server {
    listen 80 default_server;
    server_name baidu.com www.baidu.com;
    ...
}
# listen指令后面有一个参数 default_server , 这个参数是在 0.8.21 版本以后才有的, 
# 之前是 default 指令(如果没有匹配到对应的SERVER, 请求都会到这个SERVER里执行)。
3. 场景
# 用来处理未备案域名指向自己时非常有用, 一般都使用 444 , 不要随意修改
server {
    listen 80 default_server;
    server_name _;
    return 444;
}

如何使用PROXY_PASS?

# 注意: 当配置 proxy_pass 指令时, 在 URI 后面加和不加 /, 处理方式是不一样的。
server {
    listen 80;
    location /test/ {
		proxy_pass http://127.0.0.1/;
	}
	location /test/ {
		proxy_pass http://127.0.0.1;
	}
}
# 加上 / : 相当于是绝对路径, NGINX不会把 location 中匹配的路径部分加入到代理URI。
# 如:当我们访问 http://IP/test/proxy.html, 最终代理到 URL 是: http://127.0.0.1/proxy.html
# 不加 / : NGINX则会把 location 中匹配的路径部分加入到代理URI。
# 如: 当我们访问 http://IP/test/proxy.html, 最终代理到 URL 是: http://127.0.0.1/test/proxy.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值