网站首页 > 技术教程 正文
问题概述:
一般情况下,一个部署了Nginx的服务器中的Nginx配置中,会配置多个Server块,且Server块都会监听在80端口;如配置如下
http {
# 定义日志格式
log_format combined_with_upstream '$remote_addr -$remote_user [$time_local] '
'"$request"$status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$host$upstream_addr $upstream_status';
# 第一个Server块,server_name为a.com
server {
listen 80;
server_name a.com;
access_log /var/log/nginx/a.com-access.log combined_with_upstream;
location / {
proxy_pass http://upstream_a;
proxy_set_header Host $host;
}
}
# 第二个Server块,server_name为b.com
server {
listen 80;
server_name b.com;
access_log /var/log/nginx/b.com-access.log combined_with_upstream;
location / {
proxy_pass http://upstream_b;
proxy_set_header Host $host;
}
}
# 第三个Server块,server_name为c.com
server {
listen 80;
server_name c.com;
access_log /var/log/nginx/c.com-access.log combined_with_upstream;
location / {
proxy_pass http://upstream_c;
proxy_set_header Host $host;
}
}
}
那么这么多Server块,Nginx到底如何处理的,经常会让人感到疑惑
问题1:Nginx是如何根据用户的请求匹配Server块
用户请求到Nginx匹配到Server块的实践结果,回答如下:
第一步:浏览器解析用户输入URL(http://c.com),并向DNS服务器发送请求,获取URL对应的IP地址
第二步:浏览器向IP地址对应的Nginx服务器发送HTTP请求
第三步:Nginx读取请求头中的Host值(c.com)
第四步:Nginx根据Host按照配置依次查找Server块中的server_name,找到server_name为c.com的server块,
第五步:Nginx根据请求的URL和配置文件中的location指令,匹配到一个合适的处理模块
第六步:处理模块输出内容给用户
问题2:如果用户输入的域名,在DNS服务器获取对应的IP对应的Nginx服务器上面没有找到server_name为用户输入域名的server块,Nginx会用那个server块呢?
根据实践结果如下:
比如用户输入d.com;而这个d.com也是到上面的一台服务器;那么Nginx会采用第一个Server块,也就是说会给用户响应a.com的内容
问题3:如果用户输入的域名,在DNS服务器获取对应的IP对应的Nginx服务器上面没有找到server_name为用户输入域名的server块,但有一个server块配置成为默认default_server服务;Nginx会用那个server块呢?
配置如下
http {
# 定义日志格式
log_format combined_with_upstream '$remote_addr -$remote_user [$time_local] '
'"$request"$status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$host$upstream_addr $upstream_status';
# 第一个Server块,server_name为a.com
server {
listen 80;
server_name a.com;
access_log /var/log/nginx/a.com-access.log combined_with_upstream;
location / {
proxy_pass http://upstream_a;
proxy_set_header Host $host;
}
}
# 第二个Server块,server_name为b.com,设置为默认服务器
server {
listen 80 default_server;
server_name b.com;
access_log /var/log/nginx/b.com-access.log combined_with_upstream;
location / {
proxy_pass http://upstream_b;
proxy_set_header Host $host;
}
}
# 第三个Server块,server_name为c.com
server {
listen 80;
server_name c.com;
access_log /var/log/nginx/c.com-access.log combined_with_upstream;
location / {
proxy_pass http://upstream_c;
proxy_set_header Host $host;
}
}
}
根据实践结果如下:
比如用户输入d.com;而这个d.com也是到上面的一台服务器;那么Nginx会采用默认default_server服务,也就是说会给用户响应b.com的内容
总结
- nginx会先读取用户的请求头中的host值
- 然后会按配置server中的先后顺序依次查找匹配server_name
- 如果没有找到匹配的,则会找是否有配置了default_server(默认服务)
- 如果仍然没有,则取第一个server块
[微笑]现在你是不是清晰多了,欢迎评论区留言
猜你喜欢
- 2024-10-13 nginx请求头数据读取流程(nginx查看请求header)
- 2024-10-13 Nginx获取请求响应时间,可配合狐表进行请求耗时统计
- 2024-10-13 日常Bug排查-Nginx重复请求?(nginx频繁502)
- 2024-09-28 nginx反向代理负载均衡如何解决超长请求串
- 2024-09-28 从PHP-FPM、NGINX的请求处理来学习阻塞与非阻塞
- 2024-09-28 意犹未尽的一篇Nginx详解原理,面试官看了都忍不住给我点赞
- 2024-09-28 linux里查看web服务器(nginx,http的并发请求数及其tcp连接转态
- 2024-09-28 详解nginx日志中添加请求的response日志
- 2024-09-28 nginx实现range请求(nginx用法)
- 2024-09-28 Web性能优化之-HTTP长连接(电脑性能优化插件)
你 发表评论:
欢迎- 最近发表
-
- Win10 TH2正式版官方ESD映像转换ISO镜像方法详解
- 使用iso镜像升级到Windows 10的步骤
- macOS Ventura 13.2 (22D49) Boot ISO 原版可引导镜像
- 安利一个用ISO镜像文件制作引导U盘的的小工具RUFUS
- CentOS 7使用ISO镜像配置本地yum源
- 用于x86平台的安卓9.0 ISO镜像发布下载:通吃I/A/N、完全免费
- AlmaLinux 9.6发布:升级工具、初步支持IBM Power虚拟化技术
- Rufus写入工具简洁介绍与教程(写入模式)
- 新硬件也能安装使用了,Edge版Linux Mint 21.3镜像发布
- 开源工程师:Ubuntu应该抛弃32位ISO镜像
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)