1. 问题背景
在 Linux 服务器中完成域名解析后,未配置对应 Nginx 跳转规则时,访问该域名会默认打开服务器中已存在的其他项目。后续补充配置 HTTP(80 端口)默认服务器返回 404 后,HTTP 访问问题解决,但 HTTPS(443 端口)访问仍会跳转至其他项目。
2. 问题核心原因
Nginx 接收请求时会按优先级匹配 server 块,未匹配到对应域名的 server 块时,会使用默认 server 块处理请求,具体分两种场景:
-
未显式配置
default_server时,Nginx 会将配置中第一个加载 的server块作为默认,导致未配置域名的请求被该默认server对应的项目处理; -
仅配置了 HTTP(80 端口)的默认
server块,未配置 HTTPS(443 端口)的默认server块时,HTTPS 请求会匹配 443 端口下第一个加载的server块,从而跳转至其他项目(Nginx 处理 HTTPS 请求需配套 SSL 配置,否则无法正常响应)。
3. 前置排查步骤
3.1 确认是否存在显式默认服务器
执行以下命令检查 Nginx 配置中是否存在 default_server 配置:
bash
nginx -T | grep -n "default_server"
若仅返回配置语法正常提示,无其他匹配内容,则说明未显式配置默认服务器。
3.2 定位当前默认 server 块
执行以下命令筛选所有 server 块的核心配置,定位默认匹配的项目:
bash
nginx -T | grep -E -A 5 -B 5 "server_name|root " | grep -v "#"
输出结果中最先出现的 server块,即为当前默认服务器,其 root 字段对应的目录就是访问未配置域名时打开的项目目录。
4. 解决方案
核心思路:为新域名配置独立 server 块,并补充 HTTP(80 端口)和 HTTPS(443 端口)的默认 server 块,确保未配置域名的请求统一返回 404 或关闭连接。
4.1 为新域名配置独立 server 块
4.1.1 创建虚拟主机配置目录
为便于管理,在 Nginx 配置目录下新建 vhost 文件夹存放虚拟主机配置:
bash
mkdir -p /usr/local/nginx/conf/vhost
4.1.2 新建新域名配置文件
bash
vim /usr/local/nginx/conf/vhost/your-domain.conf
写入以下配置(替换 your-domain.com 为实际域名,/usr/local/nginx/html/your-project 为实际项目根目录):
nginx
# 新域名独立 server 块
server {
listen 80;
server_name your-domain.com www.your-domain.com; # 配置目标域名
root /usr/local/nginx/html/your-project; # 项目根目录
index index.html index.htm index.php; # 默认索引文件
# 基础路由配置
location / {
try_files $uri $uri/ /index.html;
}
# 日志配置(便于排查问题)
access_log /usr/local/nginx/logs/your-domain_access.log;
error_log /usr/local/nginx/logs/your-domain_error.log;
}
4.1.3 加载虚拟主机配置
编辑 Nginx 主配置文件,在 http 块末尾添加虚拟主机配置加载指令:
bash
vim /usr/local/nginx/conf/nginx.conf
nginx
# 加载虚拟主机配置(添加至 http 块末尾)
include /usr/local/nginx/conf/vhost/*.conf;
4.2 配置 HTTP + HTTPS 默认 server 块
4.2.1 新建默认服务器配置文件
bash
vim /usr/local/nginx/conf/vhost/default.conf
写入以下配置,同时覆盖 HTTP 和 HTTPS 未配置域名的请求:
nginx
# 处理 HTTP (80 端口) 未配置域名
server {
listen 80 default_server; # 标记为 80 端口默认服务器
server_name _; # 匹配所有未配置域名
return 404 "Domain not configured (HTTP)"; # 返回 404 提示
}
# 处理 HTTPS (443 端口) 未配置域名
server {
listen 443 ssl http2 default_server; # 标记为 443 端口默认服务器
server_name _; # 匹配所有未配置域名
# SSL 证书配置(自签名或正规证书均可)
ssl_certificate /usr/local/nginx/conf/ssl/default.crt; # 证书路径
ssl_certificate_key /usr/local/nginx/conf/ssl/default.key; # 私钥路径
# 基础 SSL 协议配置(必填,避免 Nginx 启动报错)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
return 404 "Domain not configured (HTTPS)"; # 返回 404 提示
# 可选:直接关闭连接(更安全,无任何响应)
# return 444;
}
4.2.2 生成自签名 SSL 证书(若无可信证书)
若服务器无现成 SSL 证书,可通过以下命令生成自签名证书(浏览器会提示不安全,但不影响功能):
bash
# 1. 创建证书存放目录
mkdir -p /usr/local/nginx/conf/ssl
# 2. 生成自签名证书(一路回车即可,无需额外填写信息)
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /usr/local/nginx/conf/ssl/default.key \
-out /usr/local/nginx/conf/ssl/default.crt
4.3 验证配置并重启 Nginx
bash
# 检查配置语法是否正确
/usr/local/nginx/sbin/nginx -t
# 重载 Nginx 配置(使配置生效)
/usr/local/nginx/sbin/nginx -s reload
5. 验证步骤
-
访问新配置的域名(
http://your-domain.com或https://your-domain.com),应正常加载对应项目; -
访问未配置的任意域名(已解析至服务器),HTTP 和 HTTPS 均应返回 404 提示(或无响应,若配置
return 444); -
(可选)执行以下命令确认默认服务器配置生效:
/usr/local/nginx/sbin/nginx -T | grep -E "listen 80 default_server|listen 443 default_server" | grep -v "#"输出应包含 80 端口和 443 端口的default_server配置。
6. 注意事项
-
Nginx 配置文件加载顺序由文件名字母顺序决定,建议默认服务器配置文件命名为
default.conf(确保优先加载,避免被其他配置覆盖); -
修改 Nginx 配置前,建议备份原有配置文件(如
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak),避免配置错误导致服务异常; -
自签名证书仅用于功能验证,若需消除浏览器"不安全"提示,需为默认服务器配置正规 SSL 证书(如 Let's Encrypt 免费证书);
-
执行 Nginx 相关命令时,需确保拥有对应目录的读写权限(建议使用 root 用户操作)。
7. 相关命令汇总
bash
# 1. 检查 Nginx 配置语法
/usr/local/nginx/sbin/nginx -t
# 2. 重载 Nginx 配置
/usr/local/nginx/sbin/nginx -s reload
# 3. 查看默认服务器配置
nginx -T | grep -n "default_server"
# 4. 定位默认 server 块核心配置
nginx -T | grep -E -A 5 -B 5 "server_name|root " | grep -v "#"
# 5. 生成自签名 SSL 证书
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /usr/local/nginx/conf/ssl/default.key -out /usr/local/nginx/conf/ssl/default.crt
# 6. 重命名文件(用于临时禁用配置)
mv /usr/local/nginx/conf/vhost/xxx.conf /usr/local/nginx/conf/vhost/xxx.conf.bak