Skip to content

基于域名的虚拟主机

基于域名的虚拟主机是最常用的虚拟主机配置方式,通过不同的域名访问不同的网站。

基本配置

配置示例

nginx
server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

server {
    listen 80;
    server_name test.com www.test.com;

    root /var/www/test.com;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

配置说明

  • listen 80:监听80端口
  • server_name:指定域名,可以指定多个
  • root:网站根目录
  • index:默认首页文件

server_name匹配规则

精确匹配

nginx
server_name example.com;

通配符匹配

nginx
# 前缀通配符
server_name *.example.com;

# 后缀通配符
server_name example.*;

正则表达式匹配

nginx
server_name ~^(?<subdomain>.+)\.example\.com$;

优先级

  1. 精确匹配
  2. 前缀通配符(*.example.com)
  3. 后缀通配符(example.*)
  4. 正则表达式匹配

完整配置示例

多域名配置

nginx
# 站点1
server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.html index.htm;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

# 站点2
server {
    listen 80;
    server_name test.com www.test.com;

    root /var/www/test.com;
    index index.html index.htm;

    access_log /var/log/nginx/test.com.access.log;
    error_log /var/log/nginx/test.com.error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

# 默认站点
server {
    listen 80 default_server;
    server_name _;

    root /var/www/default;
    index index.html index.htm;

    location / {
        return 404;
    }
}

配置文件组织

单文件配置

将所有虚拟主机配置放在一个文件中:

nginx
# /etc/nginx/nginx.conf
http {
    include /etc/nginx/mime.types;

    server {
        listen 80;
        server_name example.com;
        root /var/www/example.com;
    }

    server {
        listen 80;
        server_name test.com;
        root /var/www/test.com;
    }
}

多文件配置

将每个虚拟主机配置放在独立文件中:

/etc/nginx/
├── nginx.conf
└── conf.d/
    ├── example.com.conf
    └── test.com.conf

example.com.conf

nginx
server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

test.com.conf

nginx
server {
    listen 80;
    server_name test.com www.test.com;

    root /var/www/test.com;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

nginx.conf

nginx
http {
    include /etc/nginx/mime.types;
    include /etc/nginx/conf.d/*.conf;
}

域名解析

配置DNS

将域名解析到服务器IP地址:

example.com    A    192.168.1.100
www.example.com A    192.168.1.100
test.com       A    192.168.1.100
www.test.com   A    192.168.1.100

本地测试

修改本地hosts文件进行测试:

Windows

C:\Windows\System32\drivers\etc\hosts

Linux/Mac

/etc/hosts

添加内容:

192.168.1.100 example.com
192.168.1.100 www.example.com
192.168.1.100 test.com
192.168.1.100 www.test.com

常见配置

主域名和www域名

nginx
server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com;
    index index.html index.htm;
}

多个域名指向同一站点

nginx
server {
    listen 80;
    server_name example.com www.example.com example.net www.example.net;

    root /var/www/example.com;
    index index.html index.htm;
}

子域名配置

nginx
# 主域名
server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;
}

# 子域名
server {
    listen 80;
    server_name blog.example.com;
    root /var/www/blog.example.com;
}

server {
    listen 80;
    server_name api.example.com;
    root /var/www/api.example.com;
}

通配符子域名

nginx
server {
    listen 80;
    server_name *.example.com;

    root /var/www/$subdomain;
    set $subdomain $host;

    if ($host ~* ^(.*)\.example\.com$) {
        set $subdomain $1;
    }

    location / {
        try_files $uri $uri/ =404;
    }
}

域名跳转

HTTP跳转HTTPS

nginx
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    root /var/www/example.com;
    index index.html index.htm;
}

www跳转到非www

nginx
server {
    listen 80;
    server_name www.example.com;
    return 301 http://example.com$request_uri;
}

server {
    listen 80;
    server_name example.com;
    root /var/www/example.com;
}

非www跳转到www

nginx
server {
    listen 80;
    server_name example.com;
    return 301 http://www.example.com$request_uri;
}

server {
    listen 80;
    server_name www.example.com;
    root /var/www/example.com;
}

测试配置

测试配置文件

bash
nginx -t

重载配置

bash
nginx -s reload

查看域名解析

bash
nslookup example.com
dig example.com

测试访问

bash
curl -H "Host: example.com" http://localhost

常见问题

域名无法访问

检查项:

  1. DNS解析是否正确
  2. 防火墙是否开放80端口
  3. Nginx配置是否正确
  4. 网站目录权限是否正确

访问错误站点

原因: server_name配置错误

解决: 检查server_name配置

默认站点问题

解决: 配置default_server

nginx
server {
    listen 80 default_server;
    server_name _;
    return 404;
}

总结

基于域名的虚拟主机配置要点:

  • server_name:指定域名,支持通配符和正则表达式
  • root:设置网站根目录
  • 日志:为每个站点配置独立的日志
  • 文件组织:建议将每个站点配置放在独立文件中
  • 域名解析:确保DNS解析正确

合理配置虚拟主机,可以在一台服务器上托管多个网站。