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

Nginx 中 server_name 的详细使用

目录

  1. 简介
  2. DNS: 域名与 IP 地址之间的转换
  3. server_name 的作用
  4. 基本用法
  5. 通配符和正则表达式
  6. 默认服务器
  7. 多域名配置
  8. 子域名配置
  9. 端口监听与 server_name 结合
  10. 主机文件配置
  11. 测试和验证
  12. 其他注意事项

简介

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


DNS 解析的过程

  1. 客户端发起请求:当用户在浏览器中输入一个域名(如 example.com)时,浏览器会向本地 DNS 服务器发送查询请求。

  2. 递归查询:本地 DNS 服务器会检查其缓存,如果找到了该域名对应的 IP 地址,则直接返回给客户端;如果没有找到,则继续向其他 DNS 服务器(如根 DNS 服务器、顶级域 DNS 服务器等)进行递归查询,直到找到目标 IP 地址。

  3. 返回结果:一旦找到目标 IP 地址,DNS 服务器会将结果返回给客户端,浏览器就可以使用该 IP 地址与目标服务器建立连接。

  4. 缓存结果:为了提高效率,DNS 服务器通常会缓存查询结果一段时间(称为 TTL,Time To Live),以便后续相同的查询可以直接从缓存中获取结果,而无需再次进行完整的解析过程。

主机文件的作用

在开发环境中,我们通常使用 主机文件/etc/hostsC:\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.comadmin.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 支持通配符和正则表达式,以便更灵活地匹配域名。

通配符

  • 前缀通配符*.example.com 可以匹配任何以 .example.com 结尾的子域名,如 sub1.example.comsub2.example.com 等。

    server {
        listen 80;
        server_name *.example.com;
    
        root /var/www/example.com;
        index index.html;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
    
  • 后缀通配符:Nginx 不直接支持后缀通配符,但可以通过正则表达式实现类似功能。

正则表达式

使用 ~ 开头的 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_name ""; 表示这个 server 块是默认服务器。
  • 下划线server_name _; 也可以表示默认服务器。

例如:

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.comwww.example.com 的请求都路由到这个 server 块。


子域名配置

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

修改主机文件

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

Windows
  • 打开记事本(以管理员身份运行),然后打开 C:\Windows\System32\drivers\etc\hosts 文件。
  • 在文件末尾添加以下行:
    192.168.154.101 api.example.com
    192.168.154.101 admin.example.com
    
macOS 和 Linux
  • 打开终端,并使用文本编辑器(如 nano, vim, emacs 等)编辑 /etc/hosts 文件。例如,使用 nano 编辑器,你可以运行:

    sudo nano /etc/hosts
    
  • 在文件末尾添加以下行:

    192.168.154.101 api.example.com
    192.168.154.101 admin.example.com
    
  • 保存并退出编辑器(对于 nano,按 Ctrl + X,然后按 Y 确认保存更改,最后按 Enter 退出)。

配置 Nginx

接下来,我们需要在 Nginx 中为 api.example.comadmin.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

测试和验证

  1. 测试配置文件

    • 在修改完 Nginx 配置文件后,先测试配置文件是否有语法错误:
      sudo nginx -t
      
  2. 重载 Nginx

    • 如果没有问题,重新加载 Nginx 使配置生效:
      sudo systemctl reload nginx
      
      或者,如果你的系统使用的是不同的初始化系统,可能需要使用 sudo service nginx reload
  3. 访问 URL

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

其他注意事项

  1. 防火墙设置:确保你的防火墙允许通过端口 8082 的流量。你可以使用以下命令检查和配置防火墙规则:

    sudo ufw allow 8082/tcp  # 对于 UFW
    sudo firewall-cmd --add-port=8082/tcp --permanent  # 对于 firewalld
    sudo firewall-cmd --reload
    
  2. SELinux 设置(适用于 CentOS/RHEL):如果你的系统启用了 SELinux,确保 Nginx 有权限监听非标准端口。你可以使用以下命令:

    sudo semanage port -a -t http_port_t -p tcp 8082
    
  3. HTTPS 配置:如果你希望为 admin.dhl101 配置 HTTPS,可以使用 mkcert 工具生成自签名证书。以下是 HTTPS 配置的示例:

    server {
        listen 192.168.154.101:8082 ssl;
        server_name admin.dhl101;
    
        ssl_certificate /path/to/admin.dhl101.pem;
        ssl_certificate_key /path/to/admin.dhl101-key.pem;
    
        root /var/www/login;
        index index.html;
    
        location / {
            try_files $uri $uri/ =404;
        }
    }
    

总结

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

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


参考资料


希望这篇笔记能帮助你更好地理解和使用 Nginx 中的 server_name 指令。如果有任何疑问或需要进一步的解释,请随时联系我!

### 安装和配置 `ngx_http_ssl_module` 模块 为了在 Linux 上为 Nginx 配置 SSL 模块,需要按照特定流程操作以确保安全性和功能性。 #### 准备环境 确认当前系统的开发工具链已安装完毕。对于基于 Red Hat 的系统可以执行命令 `yum groupinstall "Development Tools"`;而对于 Debian 或 Ubuntu,则应运行 `apt-get install build-essential` 来获取必要的编译工具集[^1]。 #### 下载并解压源码包 如果尚未下载 Nginx 源码包,可以从官方网站获得最新版本,并将其放置于 `/usr/local/src/` 目录下。假设已经存在名为 `nginx-1.16.1.tar.gz` 的压缩文件,在此位置执行如下命令来解压缩: ```bash tar -zxvf nginx-1.16.1.tar.gz cd nginx-1.16.1/ ``` #### 编译前准备 进入解压后的源码目录后,需先清理任何之前的构建残留物,再进行新的配置。这一步骤可通过下面两条命令完成: ```bash make clean ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module ``` 这里指定了 Nginx 的安装路径以及启用了 HTTP 状态统计模块 (`--with-http_stub_status_module`) 和 HTTPS 支持所需的 SSL/TLS 加密传输功能 (`--with-http_ssl_module`) 。 #### 执行编译过程 一旦上述配置成功结束,就可以继续实际的编译阶段了。只需简单输入以下指令即可启动这一进程: ```bash make ``` 请注意此时并不建议立即覆盖现有服务程序,而是应当测试新生成的服务能否正常运作后再决定是否替换旧版软件。 #### 更新或重新安装 Nginx 当验证过新版 Nginx 能够顺利启动之后,可以选择用新版本替代现有的部署。为此目的可采用如下方法之一: - 如果之前未曾安装过 Nginx ,那么可以直接通过 `make install` 命令来进行首次安装; - 若已有实例正在运行,则推荐先停止其服务(`service nginx stop`),接着备份原有配置文件以防万一,最后才实施更新动作(`cp objs/nginx /usr/sbin/nginx && service nginx start`) 。 #### 修改配置文件启用 SSL 功能 编辑位于 `/usr/local/nginx/conf/nginx.conf` 文件中的虚拟主机部分,加入有关证书的信息以便开启加密连接的支持。具体来说就是添加类似于这样的设置项: ```nginx server { listen 443 ssl; server_name example.com; ssl_certificate cert.pem; ssl_certificate_key key.pem; ... } ``` 此处 `cert.pem` 和 `key.pem` 应指向有效的 X.509 数字证书及其私钥的位置 [^2]。 #### 测试更改并重启服务 保存修改过的配置文档以后,记得利用 `-t` 参数检验语法无误,随后让改动生效: ```bash /usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx -s reload ``` 这样就完成了整个过程中最重要的几个环节——即从编译到应用层面的操作指南 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值