在现代网络服务管理中,单台服务器承载多个网站或应用是一种极为常见且高效的做法,这种方法不仅能显著降低硬件成本,还能简化运维流程,Nginx,作为一款高性能的 HTTP 和反向代理 Web 服务器,凭借其灵活的配置和卓越的性能,成为实现这一目标的首选工具,其核心机制在于通过“服务器块”(Server Block,在其他 Web 服务器中常称为虚拟主机)和
server_name
指令,来精确地将不同的域名请求导向到服务器上对应的网站内容,本文将深入探讨如何利用 Nginx 实现多个域名的绑定与访问。
核心概念:理解块与
server_name
指令
要掌握多域名绑定,首先必须理解 Nginx 的两个核心概念:块和
server_name
指令。
块是 Nginx 配置文件中的一个独立单元,用于定义一个虚拟服务器的设置,每个块可以包含监听的端口、服务器名称、网站根目录、索引文件等一系列配置,逻辑上它就代表了一个独立的网站。
server_name
指令则是块内的关键指令,它告诉 Nginx 这个服务器块应该响应哪些域名的请求,当一个 HTTP 请求到达 Nginx 时,Nginx 会检查请求头中的字段(该字段包含了用户在浏览器中输入的域名),然后将其与所有块中的
server_name
值进行匹配,一旦找到匹配项,Nginx 就会将请求交给对应的块进行处理。
可以形象地将 Nginx 比作一位高效的公寓前台接待员,而不同的网站则是公寓内不同的住户,当访客(用户请求)到达前台时,会报出要找的住户姓名(域名),前台接待员(Nginx)通过查看住户名单(
server_name
配置),准确地将访客引导至正确的住户(块)。
实践配置:分步实现多域名绑定
下面,我们通过一个具体的分步指南,展示如何为两个不同的域名(
example-a.com
和
example-b.com
)配置独立的网站。
准备网站目录和测试文件
为了保持结构的清晰,最佳实践是为每个域名创建独立的根目录。
# 创建两个网站的根目录sudo mkdir -p /var/www/example-a.comsudo mkdir -p /var/www/example-b.com# 为每个网站创建一个简单的首页用于测试echo "Welcome to Example A!
" | sudo tee /var/www/example-a.com/index.htmlecho "Welcome to Example B!
" | sudo tee /var/www/example-b.com/index.html# 设置正确的目录权限,确保 Nginx 可以读取sudo chown -R www-data:www-data /var/www
为每个域名创建独立的 Nginx 配置文件
在 Debian 或 Ubuntu 系统中,通常将站点配置文件存放在
/etc/nginx/sites-available/
目录下,然后通过创建符号链接到
/etc/nginx/sites-enabled/
来启用它们。
# 为 example-a.com 创建配置文件sudo nano /etc/nginx/sites-available/example-a.com.conf# 为 example-b.com 创建配置文件sudo nano /etc/nginx/sites-available/example-b.com.conf
编写配置文件内容
example-a.com.conf
的配置:
server {listen 80;listen [::]:80; # 同时监听 IPv6root /var/www/example-a.com;index index.html index.htm;server_name example-a.com www.example-a.com;location / {try_files $uri $uri/ =404;}}
example-b.com.conf
的配置:
server {listen 80;listen [::]:80;root /var/www/example-b.com;index index.html index.htm;server_name example-b.com www.example-b.com;location / {try_files $uri $uri/ =404;}}
这里的关键区别在于和
server_name
指令的值,它们分别指定了不同的网站文件根目录和要匹配的域名。
启用站点并重新加载 Nginx
创建符号链接以启用这两个站点,然后测试并重新加载 Nginx 配置。
# 创建符号链接sudo ln -s /etc/nginx/sites-available/example-a.com.conf /etc/nginx/sites-enabled/sudo ln -s /etc/nginx/sites-available/example-b.com.conf /etc/nginx/sites-enabled/# 测试配置文件语法是否正确sudo nginx -t# 如果测试通过,重新加载 Nginx 配置使其生效sudo systemctl reload nginx
修改 DNS 或 Hosts 文件进行测试
为了让域名能指向你的服务器,你需要在域名服务商处将这两个域名的 A 记录解析到你服务器的 IP 地址,在 DNS 生效前,你也可以通过修改本地电脑的文件(windows:
C:WindowsSystem32driversetchosts
;Linux/macOS:
/etc/hosts
)进行快速测试:
your_server_ip example-a.com www.example-a.comyour_server_ip example-b.com www.example-b.com
保存后,在浏览器中访问这两个域名,你将看到各自对应的欢迎页面。
进阶场景与
server_name
匹配规则
server_name
指令不仅支持精确匹配,还提供了强大的通配符和正则表达式匹配功能,以应对更复杂的场景。
| 匹配模式 | 描述 | 示例 |
|---|---|---|
| 精确匹配 | 完全匹配指定的名称 |
server_name example.com;
|
| 通配符匹配 | 使用匹配域名的开始或结束部分 |
server_name *.example.com;
server_name.example.*;
|
| 正则表达式 | 使用开头进行正则匹配 |
server_name ~^(?
|
默认服务器处理
:当一个请求的头部无法匹配到任何一个
server_name
时,Nginx 会将其交给第一个块处理,或者显式标记为
default_server
的块,这是一种良好的安全实践,可以用来丢弃未知请求或返回一个自定义的错误页面。
server {listen 80 default_server;server_name _; # 使用一个无效的域名作为占位符return 444; # 直接关闭连接,不返回任何响应}
通过以上配置,Nginx 就能够在一个 IP 地址上优雅地管理多个域名,将访问请求准确无误地分发到各自的网站内容,为构建高效、可扩展的 Web 服务架构提供了坚实的基础。
相关问答FAQs
Q1:配置修改后,Nginx 不生效怎么办?
A:这是一个常见问题,可以按照以下步骤进行排查:
Q2:如何将多个域名(例如主域名和带 www 的前缀)指向同一个网站?
A:非常简单,你只需要在同一个块的
server_name
指令中,用空格分隔所有需要指向该网站的域名即可,要让
example.com
和
www.example.com
都访问同一个网站,可以这样配置:
server {listen 80;server_name example.com www.example.com;# ... 其他配置 ...}
这样,无论用户访问哪个域名,Nginx 都会使用这个块的配置来响应,这是处理主域名及其别名的标准且最高效的方法。














发表评论