相同server_name多个虚拟主机优先级访问

本文详细介绍了如何在Nginx中配置两个虚拟主机,通过不同的根目录和索引文件实现同一IP下不同站点的区分。并通过测试验证了Nginx配置文件的读取顺序对虚拟主机选择的影响。
1、在/etc/nginx/conf.d/添加两个虚拟主机server1.conf、server2.conf
server1.conf:
server {
    listen       443;
    server_name 127.0.0.1;
 
 
    location / {
        root /home/testzq/app/code1;
        index index.html;
    }
}
server2.conf:
server {
    listen       443;
    server_name 127.0.0.1;
 
 
    location / {
        root /home/testzq/app/code2;
        index index.html;
    }
}
 两配置文件的区别:
[root@zq conf.d]# diff server1.conf  server2.conf
6c6
<         root /home/testzq/app/code1;
---
>         root /home/testzq/app/code2;
访问页面编写:
[root@zq app]# cat /home/testzq/app/code1/index.html
<html>
<head>
    <meta charset="utf-8">
    <title> server 1</title>
</head>
<body>
    <h1>server 1</h1>
</body>
</html>
[root@zq app]# cat /home/testzq/app/code2/index.html
<html>
<head>
    <meta charset="utf-8">
    <title> server 2</title>
</head>
<body>
    <h1>server 2</h1>
</body>
</html>
2、测试nginx配置文件及加载配置
[root@zq conf.d]# nginx -tc /etc/nginx/nginx.conf
nginx: [warn] conflicting server name "127.0.0.1" on 0.0.0.0:443, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
 
[root@zq conf.d]# nginx -s reload -c /etc/nginx/nginx.conf
nginx: [warn] conflicting server name "127.0.0.1" on 0.0.0.0:443, ignored
3、访问https://ip/,看到的是 server 1,优先级取的是server1.conf
把server1.conf改名server3.conf,重加载nginx -s reload -c /etc/nginx/nginx.conf,再访问看到的是server 2,此时访问的是server2.conf
4、结论
Nginx读取配置文件的时候是按照文件名顺序进行读取的,server1.conf比server2.conf靠前。
 
 
<think>根据用户提供的引用资料,结合用户当前询问的关于“Nginx配置中server_name_的作用”问题,进行如下结构化回答:###一、`server_name_`的作用解析`server_name`指令用于设置虚拟服务器的主机名,在Nginx配置中具有以下核心功能:1.**请求路由匹配**:根据HTTP请求头中的`Host`字段选择对应的`server`块处理请求```#示例配置server{listen80;server_namewww.example.com;...#处理www.example.com的请求}```2.**特殊值`_`的含义**:-`server_name_;`表示"**默认服务器**",即:-捕获所有**未明确匹配**其他server_name的请求-常用于处理非法域名的请求或作为默认服务入口###二、在反向代理架构中的应用场景在多Web系统部署环境下(如用户所述的两个独立Web系统),典型配置结构:```nginx#主业务系统1(端口8001server{listen80;server_nameweb1.example.com;location/{proxy_passhttp://127.0.0.1:8001;}}#主业务系统2(端口8002)server{listen80;server_nameweb2.example.com;location/{proxy_passhttp://127.0.0.1:8002;}}#处理其他所有非法域名请求server{listen80default_server;server_name_;return444;#强制关闭连接(Nginx特有状态码)}```###三、与WebSocket支持的关联性当配置WebSocket代理时(参考用户提供的引用[1][2][3][4]):1.`server_name_`**不会直接影响**WebSocket功能2.但在**多域名混合场景**中可确保:-合法WebSocket连接(如`ws://web1.example.com/ws`)能被正确路由到后端服务-非法域名的WebSocket连接会被默认服务器拒绝###四、SSL/TLS环境下的特殊注意事项1.HTTPS默认监听配置冲突问题:-对于`listen443ssl;`,如果没有指定`default_server`参数,第一个server块会成为默认SSL服务器2.解决方案:```nginx#通过显式声明避免证书匹配错误server{listen443ssldefault_server;server_name_;ssl_certificate/path/to/default_cert.pem;ssl_certificate_key/path/to/default_key.key;return444;}```###五、典型错误配置案例1.**缺失默认服务器导致日志污染**:```#错误现象2023/01/0112:00:00[error]1234#0:*5678no"ssl_certificate"isdefinedforserver...```2.修复方式:为默认服务器提供有效的证书(即使是自签名证书)---§§相关问题§§1.如何配置Nginx支持多个HTTPS域名的SSL证书?2.`server_name`支持哪些通配符和正则表达式?3.Nginx的`default_server`和`server_name_`有何区别?4.如何防止HTTPS域名的SNI信息泄露风险?[^5][^1]:反向代理实现依赖于Host头部识别[^1][^2]:Nginx默认不处理未匹配的虚拟主机请求[^2][^3]:WebSocket配置需要独立的域名支持[^3][^4]:SSL默认服务器需要独立证书配置[^4][^5]:基于SNI的HTTPS请求路由需要TLS层处理[^5]</think> ### Nginx配置中 `server_name _` 的作用及用法详解 #### 一、核心作用解析 1. **通配符本质** `server_name _;` 中的 `_` 是一个**特殊通配符**,表示该 server 块匹配: - 所有**未被其他 server_name 显式匹配**的请求 - 不携带 Host 头的无效请求 - 任意域名/主机名的请求 > 数学表达:设请求集合为 $R$,其他 server_name 覆盖的集合为 $S$,则 `_` 匹配 $R \setminus S$ 2. **优先级特性** - 在配置中的**执行顺序最后**(类似编程中的 `default` 分支) - 当多个 server 块都使用 `listen default_server` 时,实际生效的取决于配置文件的物理顺序 #### 二、在双Web系统架构中的应用 以两个独立系统(系统1:web1.com,系统2:web2.com)为例: ```nginx # 系统1专属入口 server { listen 443 ssl; server_name web1.com; location / { proxy_pass http://localhost:8001; # 指向系统1 } # WebSocket支持配置(参考引用[1][3]) location /ws { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } # 系统2专属入口 server { listen 443 ssl; server_name web2.com; location / { proxy_pass http://localhost:8002; # 指向系统2 } } # 兜底处理(server_name _核心作用点) server { listen 443 ssl default_server; server_name _; # 安全拦截非法请求 return 444; # Nginx特有状态码,直接关闭连接 # 或者重定向到维护页面 # location / { # proxy_pass http://maintenance-page.com; # } } ``` #### 三、关键功能实现解析 1. **安全防护** 拦截针对服务器IP地址的直接访问(如 `https://203.0.113.25`),避免暴露后端系统结构 2. **平滑升级保障** 配置修改后执行 `nginx -s reload` 时: - 旧进程继续处理现有连接(含WebSocket) - 新进程用新配置处理新请求 - `_` 确保未定义域名的新请求被正确处理 3. **HTTPS/WebSocket 特殊处理**(参考引用[3][4]) ```nginx server { listen 443 ssl default_server; server_name _; # 必须配置证书(可用自签名证书) ssl_certificate /path/to/dummy_cert.pem; ssl_certificate_key /path/to/dummy_key.key; # WebSocket异常连接处理 location /ws { return 403; # 禁止非法WS连接 } } ``` #### 四、性能优化建议 1. **通配匹配加速** ```nginx server_name ""; # 空字符串比 _ 更高效(需Nginx 1.11.6+) ``` 2. **内存占用控制** 对 `_` server 禁用日志记录: ```nginx access_log off; error_log /dev/null crit; ``` #### 五、常见误区说明 | 配置写法 | 实际行为 | 是否推荐 | |----------------|----------------------------|---------| | `server_name _` | 匹配任意Host头(含无Host头) | ✓ 推荐 | | `server_name ""` | 仅匹配无Host头的请求 | ✓ 高性能 | | `server_name *` | 无效语法(Nginx不支持) | ✘ 错误 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值