Nginx 中 `server_name` 的详细使用指南

打印 上一主题 下一主题

主题 940|帖子 940|积分 2820

Nginx 中 server_name 的详细使用

目次


  • 简介
  • DNS: 域名与 IP 地点之间的转换
  • server_name 的作用
  • 根本用法
  • 通配符和正则表达式
  • 默认服务器
  • 多域名配置
  • 子域名配置
  • 端口监听与 server_name 联合
  • 主机文件配置
  • 测试和验证
  • 其他留意事项

简介

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

DNS 剖析的过程


  • 客户端发起哀求:当用户在欣赏器中输入一个域名(如 example.com)时,欣赏器会向本地 DNS 服务器发送查询哀求。
  • 递归查询:本地 DNS 服务器会查抄其缓存,如果找到了该域名对应的 IP 地点,则直接返回给客户端;如果没有找到,则继承向其他 DNS 服务器(如根 DNS 服务器、顶级域 DNS 服务器等)举行递归查询,直到找到目标 IP 地点。
  • 返回效果:一旦找到目标 IP 地点,DNS 服务器会将效果返回给客户端,欣赏器就可以使用该 IP 地点与目标服务器创建连接。
  • 缓存效果:为了提高效率,DNS 服务器通常会缓存查询效果一段时间(称为 TTL,Time To Live),以便后续相同的查询可以直接从缓存中获取效果,而无需再次举行完整的剖析过程。
主机文件的作用

在开发环境中,我们通常使用 主机文件(/etc/hosts 或 C:\Windows\System32\drivers\etc\hosts)来模拟 DNS 剖析。主机文件允许我们在本地将特定的域名映射到指定的 IP 地点,而无需依赖外部 DNS 服务器。这对于测试和开发非常有用,由于它可以快速配置自定义域名,并且不会影响其他用户的网络环境。
比方,在主机文件中添加以下行:
  1. 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 块。比方:
  1. server {
  2.     listen 80;
  3.     server_name example.com;
  4.     root /var/www/example.com;
  5.     index index.html;
  6.     location / {
  7.         try_files $uri $uri/ =404;
  8.     }
  9. }
复制代码
在这个例子中,Nginx 将会查抄全部进来的 HTTP 哀求,并检察哀求头中的 Host 字段。如果 Host 字段的值是 example.com,那么 Nginx 就会使用这个 server 块中的配置来处置惩罚该哀求。

通配符和正则表达式

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



  • 前缀通配符:*.example.com 可以匹配任何以 .example.com 结尾的子域名,如 sub1.example.com、sub2.example.com 等。
    1. server {
    2.     listen 80;
    3.     server_name *.example.com;
    4.     root /var/www/example.com;
    5.     index index.html;
    6.     location / {
    7.         try_files $uri $uri/ =404;
    8.     }
    9. }
    复制代码
  • 后缀通配符:Nginx 不直接支持后缀通配符,但可以通过正则表达式实现类似功能。
正则表达式

使用 ~ 开头的 server_name 可以包罗正则表达式。比方:
  1. server {
  2.     listen 80;
  3.     server_name ~^(?<sub>.+)\.example\.com$;
  4.     root /var/www/$sub.example.com;
  5.     index index.html;
  6.     location / {
  7.         try_files $uri $uri/ =404;
  8.     }
  9. }
复制代码
在这个例子中,(?<sub>.+) 是一个捕获组,它允许你在后续配置中引用匹配到的子域名部分。

默认服务器

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


  • 空字符串:server_name ""; 表示这个 server 块是默认服务器。
  • 下划线:server_name _; 也可以表示默认服务器。
比方:
  1. server {
  2.     listen 80 default_server;
  3.     server_name _;
  4.     root /var/www/default;
  5.     index index.html;
  6.     location / {
  7.         try_files $uri $uri/ =404;
  8.     }
  9. }
复制代码

多域名配置

你可以为同一个 server 块指定多个域名,用空格分隔。比方:
  1. server {
  2.     listen 80;
  3.     server_name example.com www.example.com;
  4.     root /var/www/example.com;
  5.     index index.html;
  6.     location / {
  7.         try_files $uri $uri/ =404;
  8.     }
  9. }
复制代码
如许,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



  • 打开记事本(以管理员身份运行),然后打开 C:\Windows\System32\drivers\etc\hosts 文件。
  • 在文件末尾添加以下行:
    1. 192.168.154.101 api.example.com
    2. 192.168.154.101 admin.example.com
    复制代码
macOS 和 Linux



  • 打开终端,并使用文本编辑器(如 nano, vim, emacs 等)编辑 /etc/hosts 文件。比方,使用 nano 编辑器,你可以运行:
    1. sudo nano /etc/hosts
    复制代码
  • 在文件末尾添加以下行:
    1. 192.168.154.101 api.example.com
    2. 192.168.154.101 admin.example.com
    复制代码
  • 保存并退出编辑器(对于 nano,按 Ctrl + X,然后按 Y 确认保存更改,末了按 Enter 退出)。
配置 Nginx

接下来,我们必要在 Nginx 中为 api.example.com 和 admin.example.com 分别创建 server 块。
  1. # 主站配置server {
  2.     listen 80;
  3.     server_name example.com www.example.com;
  4.     root /var/www/example.com;
  5.     index index.html;
  6.     location / {
  7.         try_files $uri $uri/ =404;
  8.     }
  9. }
  10. # 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 的哀求:
  1. server {
  2.     listen 192.168.154.101:8082;
  3.     server_name admin.dhl101;
  4.     root /var/www/login;
  5.     index index.html;
  6.     location / {
  7.         try_files $uri $uri/ =404;
  8.     }
  9. }
复制代码

主机文件配置

确保你的主机文件中有以下条目,以便欣赏器能够准确剖析 admin.dhl101:
  1. 192.168.154.101 admin.dhl101
复制代码

测试和验证


  • 测试配置文件

    • 在修改完 Nginx 配置文件后,先测试配置文件是否有语法错误:
      1. sudo nginx -t
      复制代码

  • 重载 Nginx

    • 如果没有题目,重新加载 Nginx 使配置见效:
      1. sudo systemctl reload nginx
      复制代码
      大概,如果你的系统使用的是不同的初始化系统,可能必要使用 sudo service nginx reload。

  • 访问 URL

    • 打开欣赏器,访问 http://admin.dhl101:8082/,确认是否能够正常加载 /var/www/login 目次下的内容。


其他留意事项


  • 防火墙设置:确保你的防火墙允许通过端口 8082 的流量。你可以使用以下下令查抄和配置防火墙规则:
    1. sudo ufw allow 8082/tcp  # 对于 UFW
    2. sudo firewall-cmd --add-port=8082/tcp --permanent  # 对于 firewalld
    3. sudo firewall-cmd --reload
    复制代码
  • SELinux 设置(实用于 CentOS/RHEL):如果你的系统启用了 SELinux,确保 Nginx 有权限监听非标准端口。你可以使用以下下令:
    1. sudo semanage port -a -t http_port_t -p tcp 8082
    复制代码
  • HTTPS 配置:如果你渴望为 admin.dhl101 配置 HTTPS,可以使用 mkcert 工具生成自签名证书。以下是 HTTPS 配置的示例:
    1. server {
    2.     listen 192.168.154.101:8082 ssl;
    3.     server_name admin.dhl101;
    4.     ssl_certificate /path/to/admin.dhl101.pem;
    5.     ssl_certificate_key /path/to/admin.dhl101-key.pem;
    6.     root /var/www/login;
    7.     index index.html;
    8.     location / {
    9.         try_files $uri $uri/ =404;
    10.     }
    11. }
    复制代码

总结

通过准确配置 server_name,你可以在同一台服务器上托管多个不同的网站,并确保每个域名的哀求都能被准确处置惩罚。server_name 支持多种匹配方式,包罗具体域名、通配符和正则表达式,可以根据实际需求机动使用。别的,联合端口监听和主机文件配置,你可以轻松实现复杂的域名和端口映射,满足各种开发和生产环境的需求。
如果你有更多题目或必要进一步的帮助,请随时查阅 Nginx 官方文档或寻求社区支持。

参考资料



  • Nginx 官方文档
  • Nginx server_name 指令
  • mkcert: 生成自签名证书

渴望这篇笔记能帮助你更好地理解和使用 Nginx 中的 server_name 指令。如果有任何疑问或必要进一步的表明,请随时接洽我!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表