当前位置:首页 > 网络安全 > 正文

linux服务器搭建多个网站

Linux服务器上,可通过配置Nginx或Apache虚拟主机,为每个网站分配不同域名/端口,设置独立文档根目录与日志,实现多

基于Nginx的虚拟主机配置

在Linux系统中搭建多个网站的核心是通过反向代理服务器(如Nginx/Apache)实现“一对多”的流量分发,每个网站对应一个独立的域名或端口,服务器根据请求头中的Host字段将流量路由到不同的文档根目录,以下是主流方案对比:

特性 Nginx Apache
资源消耗 更低(事件驱动模型) 较高(进程/线程模式)
配置复杂度 简洁直观(基于块结构) 相对复杂
HTTPS支持 原生集成 需模块扩展
静态文件处理效率 极速优化 中等水平

推荐使用Nginx作为主控服务器,因其高性能和灵活的配置系统更适合多站点场景。


实战步骤:从零开始部署

环境准备

  • 操作系统:Ubuntu 22.04 LTS(其他发行版命令类似)
  • 依赖安装
    sudo apt update && sudo apt install nginx -y
  • 防火墙开放端口(若启用了UFW):
    sudo ufw allow 'Nginx HTTP' # 允许80/tcp
    sudo ufw allow 'Nginx HTTPS' # 允许443/tcp

创建站点结构

为每个域名建立独立目录并设置权限:

# 例:创建两个测试站点
sudo mkdir -p /var/www/example1.com /var/www/example2.com
sudo chown -R www-data:www-data /var/www/  # 修改所有者为Web服务器用户
sudo chmod -R 755 /var/www/              # 设置合理权限

安全提示:避免直接以root用户运行Web进程,推荐使用www-data等专用账户。

配置Nginx虚拟主机

编辑主配置文件(/etc/nginx/nginx.conf),取消注释include /etc/nginx/sites-enabled/;,然后在sites-available目录下新建两个配置文件:

文件1:/etc/nginx/sites-available/example1.com

server {
    listen 80;
    server_name example1.com www.example1.com;
    root /var/www/example1.com;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
    access_log /var/log/nginx/example1_access.log combined;
    error_log /var/log/nginx/example1_error.log warn;
}

文件2:/etc/nginx/sites-available/example2.com

server {
    listen 80;
    server_name example2.com;
    root /var/www/example2.com;
    index index.php; # 支持PHP时可改为此值
    location / {
        try_files $uri $uri/ @rewrites;
    }
    location @rewrites {
        rewrite ^(.)$ /index.php?q=$1 last; # 常见框架路由规则
    }
}

关键点server_name必须与域名解析记录完全匹配,root指向对应的物理路径。

符号链接激活配置

sudo ln -s /etc/nginx/sites-available/example1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/

技巧:通过软链接实现启用/禁用站点的快速切换。

验证并重启服务

sudo nginx -t          # 语法检查
sudo systemctl restart nginx

访问 http://example1.comhttp://example2.com 应看到不同内容。


进阶配置:HTTPS与负载均衡

SSL证书自动续签(Let’s Encrypt)

安装Certbot工具并申请通配符证书:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example1.com -d www.example1.com
sudo certbot --nginx -d example2.com

注意:单次最多可添加100个域名,生产环境建议按业务分组申请。

修改后的Nginx配置会自动包含SSL跳转规则:

server {
    listen 443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;
    ...原有配置...
}
server {
    listen 80;
    server_name example1.com www.example1.com;
    return 301 https://$host$request_uri; # 强制HTTPS
}

水平扩展方案

当单台服务器压力过大时,可采用以下架构:

用户请求 → Cloudflare CDN → Nginx负载均衡器 → [后端服务器集群]

通过修改upstream块实现轮询或加权分配:

upstream app_cluster {
    least_conn; # 根据连接数动态分配
    server 192.168.1.101 weight=3;
    server 192.168.1.102 weight=2;
}
server {
    location /api/ {
        proxy_pass http://app_cluster;
    }
}

常见问题排查手册

现象 可能原因 解决方案
所有域名都指向同一站点 server_name未正确区分 检查每个server块的server_name值
502 Bad Gateway错误 后端服务未启动或网络中断 systemctl status backend-service
SSL握手失败 证书路径错误/过期 sudo certbot renew --force-renewal
静态文件404 root路径配置错误 核对root指令与实际目录一致性
CPU突增导致响应变慢 PHP-FPM进程泄漏 调整pm.max_children参数值

相关问题与解答

Q1: 如果两个网站使用相同的文档根目录会怎样?

A: Nginx会优先匹配最先定义的server块,导致第二个站点无法正常访问,必须为每个站点分配唯一的root路径,即使内容相同也应通过子目录区分。

/var/www/shared_content/siteA → root /var/www/siteA
/var/www/shared_content/siteB → root /var/www/siteB

Q2: 如何在不重启Nginx的情况下更新配置?

A: 使用动态重载命令:

sudo nginx -s reload      # 平滑重新加载配置(推荐)
# 或监控配置文件变化自动应用(需安装inotify工具)
sudo apt install inotify-tools
nginx -c `pwd`/nginx.conf -g "daemon off; master_process on;" &

警告:频繁重载可能导致短暂连接中断,建议在低峰期操作

0