插件窝 干货文章 Nginx怎么实现一个服务配置多个站点

Nginx怎么实现一个服务配置多个站点

example server index 配置 216    来源:    2025-04-27

Nginx 配置多个站点的方法

在 Nginx 中实现一个服务配置多个站点(虚拟主机)主要有以下几种方法:

1. 基于域名的虚拟主机(最常用)

这是最常见的多站点配置方式,通过不同的域名来区分不同的站点。

配置步骤:

  1. /etc/nginx/conf.d/ 目录下为每个站点创建单独的配置文件,例如:

    • example1.com.conf
    • example2.com.conf
  2. 每个配置文件内容类似:

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

    root /var/www/example1.com;
    index index.html index.php;

    # 其他配置...
}

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

    root /var/www/example2.com;
    index index.html index.php;

    # 其他配置...
}
  1. 检查配置并重启 Nginx:
sudo nginx -t
sudo systemctl restart nginx

2. 基于端口的虚拟主机

通过不同的端口号来区分不同的站点。

server {
    listen 8080;
    server_name localhost;

    root /var/www/site1;
    index index.html;
}

server {
    listen 8081;
    server_name localhost;

    root /var/www/site2;
    index index.html;
}

3. 基于IP地址的虚拟主机

如果服务器有多个IP地址,可以为每个IP配置不同的站点。

server {
    listen 192.168.1.1:80;
    server_name _;

    root /var/www/site1;
    index index.html;
}

server {
    listen 192.168.1.2:80;
    server_name _;

    root /var/www/site2;
    index index.html;
}

4. 使用通配符或正则表达式匹配域名

server {
    listen 80;
    server_name ~^(www\.)?(?<domain>.+)$;

    root /var/www/$domain;
    index index.html;
}

最佳实践建议

  1. 分离配置文件:为每个站点创建单独的配置文件,便于管理
  2. 使用 include 指令:可以将公共配置提取到单独文件中
  3. 启用 HTTPS:为每个站点配置 SSL 证书
  4. 日志分离:为每个站点配置单独的访问日志和错误日志
  5. 权限管理:确保每个站点的目录有正确的权限设置

示例:完整的虚拟主机配置

# /etc/nginx/conf.d/example1.com.conf
server {
    listen 80;
    server_name example1.com www.example1.com;

    # 重定向到HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example1.com www.example1.com;

    ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;

    root /var/www/example1.com/public;
    index index.html index.php;

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

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

配置完成后,记得测试并重新加载 Nginx:

sudo nginx -t
sudo systemctl reload nginx