it编程 > 数据库 > Redis

Nginx中server_name的超详细使用指南

10人参与 2025-03-03 Redis

简介

server_name 是 nginx 配置文件中的一个重要指令,用于指定 nginx 服务器块(或虚拟主机)应该响应哪些域名的请求。通过正确配置 server_name,你可以在同一台服务器上托管多个不同的网站,并确保每个域名的请求都能被正确处理。

dns 解析的过程

主机文件的作用

在开发环境中,我们通常使用 主机文件/etc/hosts 或 c:\windows\system32\drivers\etc\hosts)来模拟 dns 解析。主机文件允许我们在本地将特定的域名映射到指定的 ip 地址,而无需依赖外部 dns 服务器。这对于测试和开发非常有用,因为它可以快速配置自定义域名,并且不会影响其他用户的网络环境。

例如,在主机文件中添加以下行:

192.168.154.101 admin.dhl101

这行配置表示,当浏览器尝试访问 admin.dhl101 时,它会直接解析为 ip 地址 192.168.154.101,而不会去查询外部 dns 服务器。

dns 与 nginx 的关系

nginx 使用 server_name 指令来匹配 http 请求中的 host 头字段,以确定哪个 server 块应该处理该请求。因此,dns 解析的结果(即域名对应的 ip 地址)决定了请求会被发送到哪台服务器,而 nginx 则根据 server_name 指令进一步确定具体的处理逻辑。

例如,假设你有两台服务器,分别托管 example.com 和 admin.example.com。用户在浏览器中输入 admin.example.com,dns 会将其解析为某台服务器的 ip 地址,然后 nginx 会根据 server_name 指令判断是否应该由该服务器处理该请求。

server_name 的作用

server_name 指令告诉 nginx,在接收到 http 请求时,如果请求头中的 host 字段匹配指定的域名,则该请求应由这个特定的 server 块来处理。这使得在同一台服务器上托管多个不同域名的网站成为可能。

基本用法

最简单的 server_name 配置是为一个具体的域名指定一个 server 块。例如:

server {
    listen 80;
    server_name example.com;

    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

在这个例子中,nginx 将会检查所有进来的 http 请求,并查看请求头中的 host 字段。如果 host 字段的值是 example.com,那么 nginx 就会使用这个 server 块中的配置来处理该请求。

通配符和正则表达式

server_name 支持通配符和正则表达式,以便更灵活地匹配域名。

通配符

正则表达式

使用 ~ 开头的 server_name 可以包含正则表达式。例如:

server {
    listen 80;
    server_name ~^(?<sub>.+)\.example\.com$;

    root /var/www/$sub.example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

在这个例子中,(?<sub>.+) 是一个捕获组,它允许你在后续配置中引用匹配到的子域名部分。

默认服务器

如果你希望某个 server 块作为默认服务器(即在没有其他服务器块匹配时处理请求),可以使用以下方式:

例如:

server {
    listen 80 default_server;
    server_name _;

    root /var/www/default;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

多域名配置

你可以为同一个 server 块指定多个域名,用空格分隔。例如:

server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

这样,nginx 会将对 example.com 和 www.example.com 的请求都路由到这个 server 块。

子域名配置

如果你想为 example.com 的子域名(如 api.example.com 和 admin.example.com)创建独立的 server 块,可以按照以下步骤进行配置。

修改主机文件

首先,你需要在主机文件中为新的子域名添加条目。假设你已经在主机文件中设置了 192.168.154.101 example.com,现在需要添加 api.example.com 和 admin.example.com

windows

macos 和 linux

配置 nginx

接下来,我们需要在 nginx 中为 api.example.com 和 admin.example.com 分别创建 server 块。

# 主站配置
server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

# api 子域名配置
server {
    listen 80;
    server_name api.example.com;

    root /var/www/api.example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    # 如果你有 api 服务,可以添加以下配置
    location /api {
        proxy_pass http://localhost:3000;  # 假设 api 服务运行在本地端口 3000
        proxy_set_header host $host;
        proxy_set_header x-real-ip $remote_addr;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
        proxy_set_header x-forwarded-proto $scheme;
    }
}

# admin 子域名配置
server {
    listen 80;
    server_name admin.example.com;

    root /var/www/admin.example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

端口监听与 server_name 结合

如果你希望 nginx 在非标准端口(如 8082)上监听请求,并且只处理特定域名的请求,可以在 listen 指令中明确指定 ip 地址和端口组合。

例如,假设你希望 nginx 在 192.168.154.101 上监听端口 8082,并且只处理 admin.dhl101 的请求:

server {
    listen 192.168.154.101:8082;
    server_name admin.dhl101;

    root /var/www/login;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

主机文件配置

确保你的主机文件中有以下条目,以便浏览器能够正确解析 admin.dhl101

192.168.154.101 admin.dhl101

测试和验证

其他注意事项

总结

通过正确配置 server_name,你可以在同一台服务器上托管多个不同的网站,并确保每个域名的请求都能被正确处理。server_name 支持多种匹配方式,包括具体域名、通配符和正则表达式,可以根据实际需求灵活使用。此外,结合端口监听和主机文件配置,你可以轻松实现复杂的域名和端口映射,满足各种开发和生产环境的需求。

如果你有更多问题或需要进一步的帮助,请随时查阅 nginx 官方文档或寻求社区支持。

参考资料

希望这篇笔记能帮助你更好地理解和使用 nginx 中的 server_name 指令。

到此这篇关于nginx中server_name的文章就介绍到这了,更多相关nginx中server_name使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

openwrt中taiscale自动安装脚本方式

03-03

Nginx反代Ollama接口跨域无法逐字输出问题详解

03-03

apache配置访问站点下所有文件的实现

03-03

docker安装redis的完整步骤详解

03-04

redis的两种持久化方式RDB和AOF解读

03-04

redis restore 命令的用法实例详解

02-28

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论