admin管理员组

文章数量:1438389

Nginx 配置指令之 server

Nginx 配置指令之 server_name 超详细参数解析与应用场景

在Nginx的配置中,server_name 是一个非常重要的指令,用于指定域名与服务器之间的映射关系。它决定了哪些请求会被当前虚拟主机(Server Block)处理。理解 server_name 指令的功能与配置方式,对于正确配置Nginx的虚拟主机,提升网站的稳定性和性能非常关键。本文将对 server_name 的用法、参数解析以及实际应用场景进行详细讲解,帮助开发者更好地使用这一指令。

正文

一、什么是 server_name

在 Nginx 配置文件中,server_name 用于定义与当前虚拟主机相匹配的域名或 IP 地址。Nginx 会根据请求中的 Host 头部来匹配到对应的 server_name,从而决定请求应该交由哪个虚拟主机(Server Block)处理。

server_name 通常在虚拟主机的配置段(server block)中进行配置。一个 Nginx 配置文件可以包含多个虚拟主机配置,每个虚拟主机可以有自己的 server_name,并根据请求的域名不同分发到不同的应用。

基本语法:
代码语言:javascript代码运行次数:0运行复制
server {
    listen 80;
    server_name example www.example;
    root /var/www/example;
    # 更多配置...
}

在上面的示例中,server_name 配置了 examplewww.example,表示所有访问这两个域名的请求都会被该虚拟主机配置处理。

二、server_name 配置参数详解

1. 完全匹配

最常见的配置方式是指定完全匹配的域名。例如:

代码语言:javascript代码运行次数:0运行复制
server {
    listen 80;
    server_name example;
    root /var/www/example;
    # 更多配置...
}

在此配置下,所有访问 example 的请求都会由该虚拟主机处理。

2. 支持多个域名

server_name 允许通过空格分隔多个域名。这样可以让一个虚拟主机处理多个域名的请求。例如:

代码语言:javascript代码运行次数:0运行复制
server {
    listen 80;
    server_name example www.example api.example;
    root /var/www/example;
    # 更多配置...
}

在该配置中,server_name 同时匹配 examplewww.exampleapi.example,所有访问这三个域名的请求都会由同一个虚拟主机处理。

3. 通配符匹配

Nginx 支持通配符匹配域名。通配符可以用来匹配多个域名或子域名。

星号(*)作为前缀匹配:星号用来匹配子域名的任意部分。

代码语言:javascript代码运行次数:0运行复制
server {
    listen 80;
    server_name *.example;
    root /var/www/example;
    # 更多配置...
}

这个配置表示匹配所有 example 域下的子域名(如 api.examplewww.example),但不包括 example 本身。

星号(*)作为后缀匹配:如果星号出现在域名后,表示匹配所有以该字符串开头的域名。

代码语言:javascript代码运行次数:0运行复制
server {
    listen 80;
    server_name example.*;
    root /var/www/example;
    # 更多配置...
}

这个配置会匹配所有以 example. 为前缀的域名,例如 exampleexampleexample 等。

4. 正则表达式匹配

Nginx 支持使用正则表达式来匹配 server_name。通过在域名模式前加上波浪线(~)来启用正则表达式匹配。例如:

代码语言:javascript代码运行次数:0运行复制
server {
    listen 80;
    server_name ~^www\.(.+)\$;
    root /var/www/example;
    # 更多配置...
}

在此配置中,server_name 使用正则表达式匹配所有以 www. 开头并以 结尾的域名(例如 www.examplewww.test)。此时,正则表达式的捕获组将包含域名的核心部分(exampletest),这些信息可以用于进一步的配置或重定向。

5. 默认虚拟主机配置

当 Nginx 无法根据请求的 Host 头部找到匹配的 server_name 时,会使用默认的虚拟主机配置。如果有多个虚拟主机配置匹配同一个请求,Nginx 会选择 server_name 最先匹配的配置。

代码语言:javascript代码运行次数:0运行复制
server {
    listen 80 default_server;
    server_name _;
    root /var/www/default;
    # 更多配置...
}

在该配置中,server_name _ 表示一个默认的虚拟主机,这种配置通常用于处理所有未匹配的请求。default_server 关键字使得该虚拟主机成为默认虚拟主机。

三、server_name 的应用场景

1. 配置多个域名和子域名

在实际开发中,很多网站不仅仅使用一个域名,通常会有多个子域名。使用 server_name 可以轻松配置多个域名或子域名指向同一个虚拟主机配置。

例如,你可以将 www.exampleapi.example 都指向同一个网站,方便管理:

代码语言:javascript代码运行次数:0运行复制
server {
    listen 80;
    server_name www.example api.example;
    root /var/www/example;
    # 更多配置...
}
2. 配置基于域名的虚拟主机

通过使用不同的 server_name,你可以配置多个虚拟主机,并根据域名来分发请求。例如,配置 www.exampleblog.example 两个虚拟主机:

代码语言:javascript代码运行次数:0运行复制
server {
    listen 80;
    server_name www.example;
    root /var/www/www;
    # 更多配置...
}

server {
    listen 80;
    server_name blog.example;
    root /var/www/blog;
    # 更多配置...
}

这样,访问 www.example 的请求将由第一个虚拟主机处理,访问 blog.example 的请求将由第二个虚拟主机处理。

3. 使用正则表达式动态匹配域名

在一些复杂的应用中,可能需要根据域名的特征动态地匹配请求。通过正则表达式的方式,可以更灵活地配置 server_name,比如根据子域名的不同部分进行处理。

例如,配置一个虚拟主机处理以 www. 开头的所有域名:

代码语言:javascript代码运行次数:0运行复制
server {
    listen 80;
    server_name ~^www\.(.+)\$;
    root /var/www/$1;
    # 更多配置...
}

在该配置中,$1 是正则表达式捕获组的内容,表示匹配的域名部分(如 example),通过这种方式可以动态地为不同的子域名提供服务。

4. 配置默认虚拟主机

在某些情况下,可能需要配置一个默认的虚拟主机来处理所有未匹配的请求。比如,在配置多个虚拟主机时,可以使用一个默认虚拟主机来处理没有明确指定域名的请求:

代码语言:javascript代码运行次数:0运行复制
server {
    listen 80 default_server;
    server_name _;
    root /var/www/default;
    # 更多配置...
}

此时,所有没有匹配到 server_name 的请求将被该默认虚拟主机处理。

四、总结

server_name 是 Nginx 配置中不可或缺的指令之一。理解它的用法可以帮助我们更灵活地配置虚拟主机、管理多个域名、提高站点的可维护性与扩展性。通过本文的解析,你可以掌握 server_name 的多种配置方式,包括精确匹配、通配符匹配、正则表达式匹配等,帮助你在实际生产环境中灵活配置Nginx,提升网站的性能和稳定性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-04-22,如有侵权请联系 cloudcommunity@tencent 删除虚拟主机域名nginxserver配置

本文标签: Nginx 配置指令之 server