泰尔克建站

买的服务器做两个网站怎么部署才不踩坑

通讯科技行业深度文章,专业内容持续更新

泰
泰尔克编辑部
发布时间:2026/11/4 13:22:20
浏览量:1,286 分类:通讯科技

买的服务器做两个网站怎么部署才不踩坑

买的服务器做两个网站怎么部署才不踩坑

找建站公司报价时,是不是经常听到“加个模块500,改个颜色300”?这种按次收费的模式,让很多老板在后期维护中钱包大出血。其实,只要你懂一点底层逻辑,自己从零搭建环境,完全能省下这笔冤枉钱。尤其是当你手里有一台服务器,想要同时跑两个网站时,很多新手容易犯“资源冲突”或“配置混乱”的错误,导致一个站挂了另一个也访问不了。

今天咱们不整虚的,直接聊实操。我做过上百个企业站和商城,见过太多因为不懂Nginx配置而把服务器搞崩的案例。这篇文章就是给你一份避坑指南,讲清楚如何在单台服务器上安全、高效地部署两个网站,同时保持性能稳定。哪怕你是技术小白,照着这个流程走,也能让网站跑得比外包公司做的还稳。

为什么一台服务器跑两个站容易出问题

很多项目经理问,既然服务器内存够、CPU够,为什么直接开两个服务就行?这里有个巨大的误区:资源隔离不等于逻辑隔离。

如果你只是简单地装两个Apache或Nginx,或者在同一端口下配置不同的域名,很容易遇到以下三个“隐形杀手”:

  1. 端口冲突与域名解析错误: 最常见的情况是,你给网站A配了80端口,给网站B也配了80端口,但在Nginx里没写对server_name。结果就是,你访问B域名,出来的却是A的首页。对于SEO来说,这简直是灾难,搜索引擎爬虫会认为你的网站内容重复,权重直接腰斩。

  2. PHP版本与扩展依赖打架: 网站A用的是WordPress,依赖PHP 7.4;网站B是最新的Laravel应用,需要PHP 8.1。如果你只在服务器里装了一个PHP版本,要么A报错,要么B报错。很多外包公司为了省事,只装一个PHP版本,导致后期升级系统时牵一发而动全身,修复成本极高。

  3. 日志混淆导致排查困难: 当其中一个网站出现502 Bad Gateway时,如果你没把日志分开,你得在同一个巨大的error.log里翻找,根本分不清是哪个站的错误。对于运维来说,时间就是金钱,排查效率低意味着宕机时间长。

所以,买的服务器做两个网站,核心不在于“装得下”,而在于“分得清”。我们需要通过反向代理(Reverse Proxy)和进程隔离,让两个网站在同一个IP下“各过各的日子”,互不干扰。

架构选型与Nginx反向代理配置详解

在开始动手前,我们先定好架构。对于绝大多数企业站和中型商城,Nginx + PHP-FPM + MySQL 是性价比最高的组合。Nginx作为前置网关,负责接收请求、静态文件加速和SSL证书处理;PHP-FPM负责处理动态请求;MySQL负责数据存储。

这里的关键技术点是:使用不同的Server Block(服务器块)来区分两个网站,并指向不同的PHP-FPM Socket。

假设你的服务器IP是 192.168.1.100,两个域名分别是 site-a.com 和 site-b.com。

1. 安装基础环境(以Ubuntu 20.04为例)

不要手动编译源码,直接用包管理器,稳定且方便更新:

sudo apt update
sudo apt install nginx mysql-server php-fpm php-mysql php-cli

安装完成后,你需要确认PHP-FPM的Socket路径。默认通常在 /run/php/php8.1-fpm.sock(假设你装的是8.1版本)。如果你要跑两个不同版本的PHP,比如7.4和8.1,你需要安装多个PHP-FPM包:

sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.4-fpm php8.1-fpm

这样你就拥有了两个独立的PHP处理池。

2. 配置Nginx核心逻辑

编辑Nginx配置文件 /etc/nginx/sites-available/default,或者新建两个配置文件 /etc/nginx/sites-available/site-a.conf 和 site-b.conf。

关键配置解析:

  • listen 80: 两个站都监听80端口,这是正常的,Nginx会根据Host头区分。
  • server_name: 必须精确匹配你的域名。
  • root: 指向各自独立的目录,如 /var/www/site-a 和 /var/www/site-b。
  • fastcgi_pass: 这是最关键的。Site A 指向 PHP 7.4 的 Socket,Site B 指向 PHP 8.1 的 Socket。

以下是 site-a.conf 的完整配置示例:

server {listen 80;server_name site-a.com www.site-a.com;root /var/www/site-a;index index.php index.html;# 访问日志单独存放,方便排查access_log /var/log/nginx/site-a.access.log;error_log /var/log/nginx/site-a.error.log;location / {try_files $uri $uri/ =404;}location ~ \.php$ {include snippets/fastcgi-php.conf;# 指向 PHP 7.4 的 Socketfastcgi_pass unix:/run/php/php7.4-fpm.sock;}location ~ /\.ht {deny all;}
}

site-b.conf 的配置几乎一样,只需修改 server_name、root 和 fastcgi_pass(指向 /run/php/php8.1-fpm.sock)。

避坑提示: 很多新手在配置 fastcgi_pass 时,直接写 127.0.0.1:9000。这是错误的!Socket通信比TCP通信效率更高,且更安全。务必使用 unix: 前缀指向具体的Socket文件。

数据库隔离与安全策略设计

网站前端分开了,后端数据库不能混。很多人为了省事,在一个MySQL数据库里建两个库,或者甚至共用一个用户。这在生产环境中是大忌。

1. 数据库层面的物理隔离

在MySQL中创建两个独立的库:

CREATE DATABASE site_a_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE site_b_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

字符集必须统一为 utf8mb4,否则后期插入Emoji表情或特殊字符时会报 Incorrect string value 错误,这种低级错误会让你的网站在社交分享时丢脸。

2. 最小权限原则(Least Privilege)

不要给两个网站都分配 root 权限。为每个网站创建独立的MySQL用户,并只授权其对应的数据库。

-- 创建 Site A 的用户
CREATE USER 'user_a'@'localhost' IDENTIFIED BY 'StrongPasswordA123!';
GRANT ALL PRIVILEGES ON site_a_db.* TO 'user_a'@'localhost';-- 创建 Site B 的用户
CREATE USER 'user_b'@'localhost' IDENTIFIED BY 'StrongPasswordB456!';
GRANT ALL PRIVILEGES ON site_b_db.* TO 'user_b'@'localhost';FLUSH PRIVILEGES;

为什么强调localhost? 除非你有特定的跨服务器数据库需求,否则数据库访问权限应限制在 localhost。如果黑客通过Webshell入侵了Site A,他只能操作 site_a_db,而无法拖库 site_b_db。这就是隔离的价值。

3. 文件权限与目录隔离

网站根目录的权限设置直接影响安全。

  • 目录权限: 设置为 755,所有者为 www-data(Nginx默认用户)。
  • 配置文件权限: 如 wp-config.php 或 .env,权限设置为 640,所有者为 www-data,组为 root。这样Web服务器可以读取,但普通用户无法篡改。
chown -R www-data:www-data /var/www/site-a
chown -R www-data:www-data /var/www/site-b
chmod -R 755 /var/www/site-a
chmod -R 755 /var/www/site-b

特别注意: 不要给整个网站目录设置 777 权限!这是新手最大的坑,相当于把家门钥匙挂在大门上。

性能优化与前端资源加载策略

买了服务器做两个网站,最怕的就是资源抢占。如果Site A是一个大流量活动页,Site B是一个后台管理系统,A的流量高峰可能会把B拖死。我们需要通过配置限制单个站的资源消耗。

1. PHP-FPM进程池配置

默认情况下,PHP-FPM可能会启动过多的子进程,导致内存耗尽。我们需要为每个PHP版本单独配置池(Pool)。

编辑 /etc/php/7.4/fpm/pool.d/www.conf:

; 启动进程数
pm.start_servers = 2
; 最大进程数,根据服务器内存调整
pm.max_children = 5
; 最小空闲进程数
pm.min_spare_servers = 2
; 最大空闲进程数
pm.max_spare_servers = 3

对于PHP 8.1,同样修改其配置文件。假设你的服务器是2GB内存,每个PHP进程大约占用30-50MB,设置 max_children = 5 是比较安全的阈值。如果两个站都满负荷运行,总共也就10个PHP进程,不会撑爆内存。

2. Nginx缓存静态资源

企业官网大量的CSS、JS和图片是静态资源。利用Nginx的 expires 指令,让浏览器缓存这些文件,减少服务器请求量。

在 site-a.conf 的 server 块中添加:

location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2)$ {expires 30d;add_header Cache-Control "public, immutable";access_log off;
}

access_log off 是个小技巧:静态资源的访问日志量巨大且无分析价值,关闭它不仅能减少I/O,还能提升Nginx性能。

3. 监控与告警

不要等网站挂了才知道。安装 htop 和 nethogs 实时监控CPU、内存和网络带宽。

sudo apt install htop nethogs

在服务器上运行 htop,你可以清晰地看到Nginx、PHP-FPM和MySQL的资源占用情况。如果发现某个站的PHP进程数飙升,立刻去查该站的代码逻辑,通常是死循环或N+1查询问题。

前端代码示例与响应式布局实现

很多项目经理关心,技术架构搭好了,前端怎么改?其实,只要后端路由分对了,前端代码可以完全独立。这里我们展示一个通用的响应式导航栏组件,适用于两个网站,且代码极简,易于维护。

假设我们使用纯HTML/CSS实现一个移动端优先的导航栏。这种写法没有依赖,加载速度快,适合对性能要求高的企业站。

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Site A - 高效响应式布局</title><style>:root {--primary-color: #007bff;--bg-color: #ffffff;--text-color: #333333;--spacing-unit: 8px;}* {box-sizing: border-box;margin: 0;padding: 0;}body {font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;line-height: 1.6;color: var(--text-color);background-color: var(--bg-color);}/* 导航栏容器 */.navbar {display: flex;justify-content: space-between;align-items: center;padding: calc(var(--spacing-unit) * 2) calc(var(--spacing-unit) * 4);background-color: #fff;box-shadow: 0 2px 4px rgba(0,0,0,0.1);position: sticky;top: 0;z-index: 1000;}.nav-brand {font-size: 1.25rem;font-weight: 700;color: var(--primary-color);text-decoration: none;}.nav-links {list-style: none;display: flex;gap: calc(var(--spacing-unit) * 3);}.nav-links a {text-decoration: none;color: var(--text-color);font-weight: 500;transition: color 0.3s ease;}.nav-links a:hover {color: var(--primary-color);}/* 移动端汉堡菜单按钮(默认隐藏) */.nav-toggle {display: none;background: none;border: none;cursor: pointer;padding: var(--spacing-unit);}.nav-toggle span {display: block;width: 25px;height: 3px;background-color: var(--text-color);margin: 5px 0;transition: all 0.3s ease;}/* 响应式断点:768px以下 */@media (max-width: 768px) {.nav-toggle {display: block;}.nav-links {display: none;flex-direction: column;position: absolute;top: 100%;left: 0;width: 100%;background-color: #fff;box-shadow: 0 4px 6px rgba(0,0,0,0.1);padding: calc(var(--spacing-unit) * 2) 0;}.nav-links.active {display: flex;}.nav-links li {padding: calc(var(--spacing-unit) * 2) calc(var(--spacing-unit) * 4);text-align: center;}}</style>
</head>
<body><nav class="navbar"><a href="#" class="nav-brand">Site A</a><button class="nav-toggle" id="navToggle" aria-label="Toggle Menu"><span></span><span></span><span></span></button><ul class="nav-links" id="navLinks"><li><a href="#">首页</a></li><li><a href="#">产品</a></li><li><a href="#">关于我们</a></li><li><a href="#">联系我们</a></li></ul>
</nav><script>// 简单的移动端菜单切换逻辑const navToggle = document.getElementById('navToggle');const navLinks = document.getElementById('navLinks');navToggle.addEventListener('click', () => {navLinks.classList.toggle('active');});
</script></body>
</html>

这段代码的核心在于CSS变量的使用。通过定义 :root 中的变量,你可以轻松地为Site A和Site B设置不同的品牌色,而不需要修改具体的CSS规则。对于Site B,只需复制这个文件,修改 --primary-color 的值即可。这种模块化思维,能让你在维护多个网站时效率提升一倍。

上线部署与长期运维建议

配置完成,不要直接重启Nginx。先用 nginx -t 检查语法错误。

sudo nginx -t

如果显示 syntax is ok 和 test is successful,再执行 sudo systemctl restart nginx。

验证是否成功:

  1. 修改本地 hosts 文件,将 192.168.1.100 分别指向 site-a.com 和 site-b.com。
  2. 在浏览器中访问这两个域名,确认页面加载正常,且PHP版本符合预期(可以在页脚输出一行 phpinfo() 代码验证)。
  3. 检查Nginx日志 /var/log/nginx/site-a.error.log,确保没有报错。

长期运维的三点建议:

  1. 定期备份:使用 cron 任务每天备份MySQL数据库和网站文件。不要依赖云服务商的自动快照,那是最后的一道防线,不是日常操作。
  2. SSL证书管理:两个域名需要两个证书。如果预算允许,使用Let's Encrypt的自动续期脚本,避免证书过期导致网站变“不安全”。
  3. 关注GitHub开源项目:不要闭门造车。很多优秀的运维脚本和监控工具都开源在GitHub上。例如,搜索 "nginx load balancer script" 或 "mysql backup cron",你会发现大量经过社区验证的高质量代码。直接复用这些开源方案,比你自己写脚本要安全得多。特别是对于买的服务器做两个网站这种常见场景,GitHub上有很多现成的Docker Compose配置,可以直接部署,大大降低了运维难度。

技术不是魔法,它是一套严谨的规则和流程。只要你掌握了隔离、配置和监控这三个核心要素,单台服务器跑两个网站不仅可行,而且非常高效。别被外包公司的高价吓住,自己动手,丰衣足食。

你踩过哪些建站的坑?评论区交流

❖
通讯科技行业动态技术分享

这篇文章对您有启发吗?

泰尔克建站专注通讯科技官网定制,8年服务280+通讯科技企业,预约免费方案沟通。

本周热门

今日推荐

本月精选

需要为您的通讯科技企业定制专业官网?

泰尔克建站提供从整站搭建、设计开发到SEO运维的全链路服务,预约免费方案沟通。