多项目共存部署方案 – WordPress博客与餐厅预订系统(不同接口)

一、问题背景

原始需求

  • 服务器上已有运行的 WordPress 博客(example.com,端口 80/443)
  • 需要在同一服务器上部署餐厅预订系统
  • 两个系统需要完全独立,互不影响

遇到的问题

  1. 路径冲突:尝试将餐厅系统部署在博客子路径(/restaurant),会影响博客原有路径结构
  2. 端口访问失败:配置独立端口后,访问出现空白页和 502 Bad Gateway
  3. 防火墙限制:云服务商安全组已配置,但服务器本地 firewalld 未开放端口

二、最终解决方案:独立端口部署

架构设计

服务器 (YOUR_SERVER_IP)
├── WordPress 博客
│   ├── 域名:https://example.com
│   ├── 端口:80/443
│   └── 配置:/www/server/panel/vhost/nginx/example.com.conf
│
└── 餐厅预订系统
    ├── 访问地址:http://YOUR_SERVER_IP:8081
    ├── 前端:Nginx 8081 → /home/restaurant-reservation/frontend/dist
    ├── 后端:Spring Boot 8080 → /api/*
    └── 配置:/www/server/panel/vhost/nginx/restaurant.conf

三、详细配置步骤

1. Nginx 配置(餐厅系统独立端口)

文件路径: /www/server/panel/vhost/nginx/restaurant.conf

nginx

server {
    listen 8081;
    server_name YOUR_SERVER_IP;

    root /home/restaurant-reservation/frontend/dist;
    index index.html;

    # 前端路由配置
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 后端 API 代理
    location /api/ {
        proxy_pass http://127.0.0.1:8080/api/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    access_log  /www/wwwlogs/restaurant.log;
    error_log   /www/wwwlogs/restaurant.error.log;
}

测试并重启 Nginx

bash

nginx -t
/etc/init.d/nginx restart

2. 防火墙配置(关键步骤)

第一层:云服务商安全组

  1. 登录云服务器控制台
  2. 进入 云服务器 → 安全组
  3. 添加入站规则:
    • 协议端口:TCP:8081
    • 来源:0.0.0.0/0
    • 策略:允许

第二层:服务器本地防火墙(firewalld)

bash

# 检查 firewalld 状态
systemctl status firewalld

# 永久开放 8081 端口
firewall-cmd --permanent --add-port=8081/tcp

# 重载防火墙规则
firewall-cmd --reload

# 验证端口已开放
firewall-cmd --list-ports

# 测试外部访问
curl -I http://YOUR_SERVER_IP:8081/

注意:必须同时配置两层防火墙,缺一不可!

3. 前端构建配置

Vite 配置( frontend/vite.config.js ):

javascript

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
  // 不需要设置 base 路径,使用根路径
  plugins: [react()],
  server: {
    port: 3000,
    proxy: {
      '/api': {
        target: 'http://localhost:8080',
        changeOrigin: true
      }
    }
  }
})

构建并上传

bash

# 本地构建
cd frontend
npm run build

# 上传到服务器
scp -r dist root@YOUR_SERVER_IP:/home/restaurant-reservation/frontend/

4. 后端启动脚本

启动脚本( start-server.sh ):

bash

#!/bin/bash

echo "启动餐厅预订系统(服务器版)"

# 1. 重启 Nginx
/etc/init.d/nginx restart

# 2. 停止旧的后端进程
pkill -f 'reservation-system'

# 3. 启动后端服务
nohup java -jar backend/target/reservation-system-1.0.0.jar \
  > backend.log 2>&1 &

echo "系统启动完成!"
echo "访问地址: http://YOUR_SERVER_IP:8081"

四、问题排查流程

问题1:空白页

排查步骤

bash

# 1. 检查前端文件是否上传成功
ls -lh /home/restaurant-reservation/frontend/dist/
ls -lh /home/restaurant-reservation/frontend/dist/assets/

# 2. 检查 Nginx 配置
cat /www/server/panel/vhost/nginx/restaurant.conf

# 3. 测试静态文件访问
curl -I http://localhost:8081/

解决方案

  • 确认 dist 目录及 assets 子目录完整上传
  • 使用 F12 开发者工具查看 Console 和 Network 错误

问题2:502 Bad Gateway

排查步骤

bash

# 1. 检查 Nginx 是否监听 8081
netstat -tlnp | grep 8081

# 2. 测试内部访问
curl -I http://127.0.0.1:8081/

# 3. 测试外部访问
curl -I http://YOUR_SERVER_IP:8081/

错误诊断

  • 内部访问成功,外部访问失败 → 防火墙问题
  • 内部外部都失败 → Nginx 配置问题

问题3:No route to host

原因:服务器本地防火墙(firewalld)未开放端口

解决方案

bash

# 开放端口
firewall-cmd --permanent --add-port=8081/tcp
firewall-cmd --reload

# 验证
curl -I http://YOUR_SERVER_IP:8081/
# 应该返回:HTTP/1.1 200 OK

五、验证清单

服务器端验证

bash

# ✅ Nginx 监听 8081
netstat -tlnp | grep 8081

# ✅ 后端运行在 8080
ps aux | grep java | grep reservation

# ✅ 防火墙开放 8081
firewall-cmd --list-ports | grep 8081

# ✅ 内部访问正常
curl -I http://127.0.0.1:8081/

# ✅ 外部访问正常
curl -I http://YOUR_SERVER_IP:8081/

浏览器端验证

  • ✅ 访问 http://YOUR_SERVER_IP:8081 显示登录页面
  • ✅ F12 Console 无错误
  • ✅ Network 标签所有资源加载成功(200 状态)

六、最终访问地址

  • WordPress 博客: https://example.com
  • 餐厅预订系统: http://YOUR_SERVER_IP:8081

七、方案优势

  1. 完全独立:两个系统使用不同端口,互不影响
  2. 配置简单:不需要修改代码的 base 路径
  3. 易于维护:可以分别重启、升级,不互相干扰
  4. 扩展性好:未来可以轻松添加更多项目(使用不同端口)

八、注意事项

  1. 防火墙双重配置:必须同时配置云服务商安全组和服务器 firewalld
  2. 端口规划:避免端口冲突,建议记录已使用的端口
  3. HTTPS 配置(可选):如需 HTTPS,可申请 SSL 证书并配置到 8081 端口
  4. 性能监控:生产环境建议监控端口占用和进程状态

Leave a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注