nginx作为一款高性能的HTTP和反向代理服务器,在域名处理方面发挥着核心作用,虽然域名的DNS解析是由DNS服务器完成的(将域名映射到IP地址),但nginx可以在服务器层面基于域名对请求进行精细化的分发和管理,这一过程通常通过“虚拟主机”配置实现,本文将详细介绍nginx如何通过配置实现基于域名的请求处理,涵盖基本原理、配置步骤、关键参数及注意事项。

虚拟主机的基本原理
虚拟主机允许一台服务器通过同一个IP地址和端口,根据不同的域名将请求分发到不同的网站或应用,nginx通过server块实现这一功能:每个server块定义一个虚拟主机的配置,包含监听的端口、域名(server_name)、网站根目录(root)等参数,当nginx收到请求时,会首先匹配请求中的Host头字段(即域名),与server块中的server_name进行对比,将请求交由匹配的server块处理,若未匹配到任何server,则由默认的server块(通常配置在第一个server块或显式标记为default_server的块)处理。
基于域名的虚拟主机配置
配置基于域名的虚拟主机,需在nginx的主配置文件(通常为/etc/nginx/nginx.conf)或conf.d目录下的子配置文件中定义server块,以下是一个基础示例:

http {
# 第一个虚拟主机:www.example.com
server {
listen 80; # 监听80端口
server_name www.example.com; # 匹配的域名
root /var/www/example; # 网站根目录
index index.html index.htm; # 默认首页文件
location / {
try_files $uri $uri/ =404; # 请求处理逻辑
}
}
# 第二个虚拟主机:blog.example.com
server {
listen 80;
server_name blog.example.com;
root /var/www/blog;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
}
上述配置中,两个server块分别监听80端口,但通过不同的server_name(www.example.com和blog.example.com)区分请求,当用户访问www.example.com时,nginx会将请求指向/var/www/example目录;访问blog.example.com时,则指向/var/www/blog目录。
关键参数详解
listen:指定服务器监听的IP地址和端口,若仅写listen 80,则表示监听所有IP地址的80端口;可配置为listen 192.168.1.100:80监听特定IP。server_name:定义虚拟主机匹配的域名,支持多种匹配模式:- 精确匹配:
server_name www.example.com(完全匹配域名); - 通配符匹配:
*.example.com(匹配所有二级域名,如www.example.com、test.example.com); - 正则匹配:
~^www\.(\d+)\.example\.com$(使用正则表达式捕获子域名,如www.1.example.com)。
- 精确匹配:
root与index:root指定请求文件的根目录,index定义默认首页文件,如index.html、index.php(需配合PHP-FPM等后端服务)。location:用于匹配请求的URI路径,进一步细化请求处理逻辑。location /images/ { root /var/www/static; }会将/images/开头的请求指向/var/www/static/images/目录。
高级配置场景
- 多域名指向同一目录:若多个域名需访问同一网站,可在
server_name中列出多个域名,用空格分隔:server_name www.example.com example.com; # 访问两个域名均指向同一目录
- HTTPS支持:需配置SSL证书和私钥,并通过
listen 443 ssl启用HTTPS:server { listen 443 ssl; server_name www.example.com; ssl_certificate /etc/nginx/ssl/example.crt; # 证书路径 ssl_certificate_key /etc/nginx/ssl/example.key; # 私钥路径 root /var/www/example; } - 默认服务器:通过
default_server参数指定默认server块,处理未匹配域名的请求:listen 80 default_server; # 将此server块设为默认
注意事项
- 配置验证:修改配置后,需执行
nginx -t检查语法是否正确,确认无误后通过nginx -s reload重载配置。 - 日志区分:建议为每个虚拟主机配置独立的访问日志和错误日志,便于排查问题:
access_log /var/log/nginx/example_access.log; error_log /var/log/nginx/example_error.log;
- 避免冲突:确保
server_name和listen组合的唯一性,避免多个server块因完全相同的配置导致请求分发异常。
nginx通过虚拟主机配置,实现了基于域名的精细化请求管理,使得单台服务器能够高效承载多个网站,合理配置server块、server_name、root等参数,结合HTTPS支持、日志管理等高级功能,可满足不同场景下的域名分发需求,掌握nginx的域名处理机制,对于搭建和维护多网站服务器至关重要,能够显著提升服务器的资源利用率和灵活性。















