实用指南:【Nginx开荒攻略】深度解析基于域名的虚拟主机配置:从域名解析到实战部署

目录

引言

1 基于域名的虚拟主机基础概念

1.1 什么是基于域名的虚拟主机?

1.2 基于域名虚拟主机的特点

1.3 三种虚拟主机配置方式对比

1.4 基于域名虚拟主机的应用场景

2 域名解析与网络基础

2.1 DNS解析原理

2.2 DNS配置

2.3 本地hosts文件配置

2.4 验证域名解析

3 Nginx基于域名的虚拟主机配置基础

3.1 Nginx配置文件结构

3.2 server_name指令详解

3.3 基础配置示例

3.4 创建网站目录和测试文件

3.5 重启Nginx服务

3.6 测试访问

4 域名匹配规则详解

4.1 server_name匹配优先级

4.2 精确匹配

4.3 通配符匹配

4.4 正则表达式匹配

4.5 默认虚拟主机配置

4.6 域名匹配实战示例

5 高级配置技巧

5.1 多域名配置

5.2 泛域名配置

5.3 HTTPS配置

5.4 反向代理配置

5.5 负载均衡配置

6 总结


引言

在现代Web服务器架构中,虚拟主机技术是实现多站点托管的核心技术之一。Nginx作为业界领先的高性能Web服务器,提供了灵活多样的虚拟主机配置方案。其中,基于域名的虚拟主机配置是最常用、最灵活的方式,特别适合互联网环境下的多网站托管需求。
基于域名的虚拟主机通过不同的域名来区分不同的虚拟主机,多个域名可以指向同一个IP地址,通过Nginx的server_name指令进行匹配和路由。这种配置方式不仅节省了IP地址资源,还能为每个网站提供独立的配置和运行环境。

1 基于域名的虚拟主机基础概念

1.1 什么是基于域名的虚拟主机?

基于域名的虚拟主机是指通过不同的域名来区分不同的虚拟主机。多个域名可以指向同一个服务器的IP地址,Nginx根据客户端请求中的Host头部字段,将请求路由到对应的虚拟主机进行处理。

1.2 基于域名虚拟主机的特点

特点描述:
  • 资源高效:多个域名共享同一个IP地址,节省IP资源
  • 配置灵活:每个虚拟主机拥有独立的配置文件和根目录
  • 用户友好:用户通过熟悉的域名访问网站,无需记忆端口号
  • SEO友好:每个域名有独立的SEO优化空间

1.3 三种虚拟主机配置方式对比

配置方式

区分依据

适用场景

优势

劣势

基于域名

域名

外部网站、互联网应用

用户友好、利于SEO

需要域名解析

基于IP

IP地址

独立IP需求、SSL绑定

完全隔离、独立SSL

需要多个IP

基于端口

端口号

内部服务、测试环境

简单易用、无需额外IP

用户需记忆端口

1.4 基于域名虚拟主机的应用场景

  • 企业多站点:企业官网、产品站、博客等独立站点
  • 多租户系统:SaaS平台中不同租户的独立站点
  • 电商平台:主站、商城、社区等不同功能模块
  • 内容分发:不同语言版本、不同地区版本的网站

2 域名解析与网络基础

2.1 DNS解析原理

  • 用户输入域名:用户在浏览器中输入要访问的域名
  • 检查本地DNS缓存:浏览器首先检查本地是否有该域名的DNS缓存记录
  • 本地DNS缓存查询:如果本地缓存中有,直接返回IP地址
  • 询问本地DNS服务器:如果本地缓存没有,询问本地DNS服务器(如路由器、ISP提供的DNS)
  • 本地DNS服务器查询:如果本地DNS服务器有记录,直接返回IP地址
  • 询问根DNS服务器:如果本地DNS服务器没有,询问根DNS服务器
  • 询问顶级DNS服务器:根DNS服务器返回顶级域名服务器地址
  • 询问权威DNS服务器:顶级域名服务器返回权威DNS服务器地址
  • 返回IP地址:权威DNS服务器返回域名的IP地址
  • 建立连接:浏览器获取IP地址后,建立TCP连接访问网站

2.2 DNS配置

# Linux系统DNS配置
vim /etc/resolv.conf
# 添加DNS服务器
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 114.114.114.114

2.3 本地hosts文件配置

# Linux/Mac系统hosts文件
vim /etc/hosts
# 添加域名解析记录
192.168.1.100    www.site1.com
192.168.1.100    www.site2.com
192.168.1.100    www.site3.com

2.4 验证域名解析

# 查看域名解析
nslookup www.site1.com
dig www.site1.com
ping www.site1.com
# 查看DNS缓存
systemd-resolve --statistics  # Linux

3 Nginx基于域名的虚拟主机配置基础

3.1 Nginx配置文件结构

# 主配置文件:nginx.conf
http {
    # 全局配置
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    # 虚拟主机配置
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

3.2 server_name指令详解

# server_name指令语法
server_name name1 name2 ...;
参数说明:
  • name1 name2 ...:一个或多个域名,用空格分隔
  • 支持的域名类型:
    • 精确域名:www.example.com
    • 通配符域名:*.example.com、www.example.*
    • 正则表达式:~^www\d+\.example\.com$

3.3 基础配置示例

# 虚拟主机1:www.site1.com
server {
    listen 80;
    server_name www.site1.com;
    root /var/www/site1;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
}
# 虚拟主机2:www.site2.com
server {
    listen 80;
    server_name www.site2.com;
    root /var/www/site2;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
}
# 虚拟主机3:www.site3.com
server {
    listen 80;
    server_name www.site3.com;
    root /var/www/site3;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
}

3.4 创建网站目录和测试文件

# 创建网站目录
mkdir -p /var/www/{site1,site2,site3}
# 设置权限
chown -R www-data:www-data /var/www
chmod -R 755 /var/www
# 创建测试页面
echo "

Site 1 - www.site1.com

Welcome to Site 1

" | tee /var/www/site1/index.html echo "

Site 2 - www.site2.com

Welcome to Site 2

" | tee /var/www/site2/index.html echo "

Site 3 - www.site3.com

Welcome to Site 3

" | tee /var/www/site3/index.html

3.5 重启Nginx服务

# 测试配置文件语法
nginx -t
# 重启Nginx服务
systemctl restart nginx

3.6 测试访问

# 测试各个虚拟主机
curl -H "Host: www.site1.com" http://192.168.1.100
curl -H "Host: www.site2.com" http://192.168.1.100
curl -H "Host: www.site3.com" http://192.168.1.100

4 域名匹配规则详解

4.1 server_name匹配优先级

  • 精确匹配:完全匹配请求的域名
  • 通配符匹配:支持*.example.com或www.example.*格式
  • 正则表达式匹配:使用正则表达式进行匹配
  • 默认server块:如果都没有匹配,使用默认的server块

4.2 精确匹配

# 精确匹配示例
server {
    listen 80;
    server_name www.site1.com;  # 精确匹配
    root /var/www/site1;
    index index.html;
}
server {
    listen 80;
    server_name site1.com;  # 精确匹配
    root /var/www/site1-alt;
    index index.html;
}

4.3 通配符匹配

# 通配符匹配示例
server {
    listen 80;
    server_name *.site1.com;  # 匹配所有site1.com的子域名
    root /var/www/site1-wildcard;
    index index.html;
}
server {
    listen 80;
    server_name www.site.*;  # 匹配www.site.anydomain
    root /var/www/site-wildcard;
    index index.html;
}

4.4 正则表达式匹配

# 正则表达式匹配示例
server {
    listen 80;
    server_name ~^www\d+\.site1\.com$;  # 匹配www1.site1.com, www2.site1.com等
    root /var/www/site1-regex;
    index index.html;
}
server {
    listen 80;
    server_name ~^(?\w+)\.site1\.com$;  # 捕获子域名
    root /var/www/site1-capture;
    index index.html;
    # 使用捕获的变量
    location / {
        echo "Subdomain: $subdomain";
    }
}

4.5 默认虚拟主机配置

# 默认虚拟主机
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    root /var/www/default;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
}
# 普通虚拟主机
server {
    listen 80;
    server_name www.site1.com;
    root /var/www/site1;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
}

4.6 域名匹配实战示例

# 多域名配置
server {
    listen 80;
    server_name www.site1.com site1.com;  # 多个精确域名
    root /var/www/site1;
    index index.html;
}
# 通配符域名
server {
    listen 80;
    server_name *.site2.com;  # 匹配所有site2.com的子域名
    root /var/www/site2;
    index index.html;
}
# 正则表达式域名
server {
    listen 80;
    server_name ~^blog\d+\.site3\.com$;  # 匹配blog1.site3.com, blog2.site3.com等
    root /var/www/site3-blog;
    index index.html;
}
# 默认域名
server {
    listen 80 default_server;
    server_name _;
    root /var/www/default;
    index index.html;
}

5 高级配置技巧

5.1 多域名配置

# 一个server块处理多个域名
server {
    listen 80;
    server_name www.site1.com site1.com api.site1.com;
    root /var/www/site1;
    index index.html;
    # 根据路径处理不同功能
    location / {
        try_files $uri $uri/ =404;
    }
    location /api {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

5.2 泛域名配置

# 泛域名配置
server {
    listen 80;
    server_name *.site1.com;  # 匹配所有site1.com的子域名
    # 根据子域名设置不同的根目录
    set $subdomain "";
    if ($host ~* ^(?\w+)\.site1\.com$) {
        set $root_path "/var/www/site1/$subdomain";
    }
    root /var/www/site1/default;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
}

5.3 HTTPS配置

# HTTPS虚拟主机配置
server {
    listen 443 ssl;
    server_name www.site1.com;
    root /var/www/site1;
    index index.html;
    ssl_certificate /etc/nginx/ssl/site1.crt;
    ssl_certificate_key /etc/nginx/ssl/site1.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
    location / {
        try_files $uri $uri/ =404;
    }
}
# HTTP重定向到HTTPS
server {
    listen 80;
    server_name www.site1.com;
    return 301 https://$host$request_uri;
}

5.4 反向代理配置

# 反向代理配置
server {
    listen 80;
    server_name api.site1.com;
    location / {
        proxy_pass http://localhost: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;
        # 超时设置
        proxy_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
    }
}

5.5 负载均衡配置

# 负载均衡配置
upstream backend {
    least_conn;
    server 192.168.1.101:3000;
    server 192.168.1.102:3000;
    server 192.168.1.103:3000 backup;
}
server {
    listen 80;
    server_name www.site1.com;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

6 总结

基于域名的虚拟主机配置是Nginx的重要功能之一,掌握这一技能对于Web服务器管理和运维工作具有重要意义。

posted on 2025-11-07 17:13  blfbuaa  阅读(13)  评论(0)    收藏  举报