linux服务器搭建多个网站
- 网络安全
- 2025-08-04
- 1
基于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.com
和 http://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;" &
️ 警告:频繁重载可能导致短暂连接中断,建议在低峰期操作