从零开始:轻量CentOS服务器+Express+MySQL搭建个人网站全攻略

一、技术选型与架构设计

1.1 轻量应用服务器优势

轻量应用服务器(LWS)以低资源占用、高性价比著称,特别适合个人开发者或初创项目。CentOS 7/8作为稳定的企业级Linux发行版,提供长期支持(LTS)和完善的软件包管理(yum/dnf)。相较于传统VPS,LWS通常预装基础环境,简化部署流程。

1.2 技术栈组合逻辑

  • Express.js:基于Node.js的轻量级Web框架,提供路由、中间件等核心功能,适合快速开发RESTful API
  • MySQL:关系型数据库标杆,支持事务处理和复杂查询,与Express通过mysql2sequelize驱动连接
  • CentOS:提供稳定的运行环境,配合Nginx反向代理实现负载均衡

二、服务器环境准备

2.1 基础环境配置

  1. # 更新系统软件包
  2. sudo yum update -y
  3. # 安装必要工具
  4. sudo yum install -y git wget curl vim
  5. # 配置防火墙(放行80/443/3000端口)
  6. sudo firewall-cmd --permanent --add-port=80/tcp
  7. sudo firewall-cmd --permanent --add-port=443/tcp
  8. sudo firewall-cmd --permanent --add-port=3000/tcp
  9. sudo firewall-cmd --reload

2.2 Node.js环境部署

推荐使用nvm管理多版本Node.js:

  1. # 安装nvm
  2. curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
  3. # 重新加载shell配置
  4. source ~/.bashrc
  5. # 安装LTS版本Node.js
  6. nvm install --lts
  7. nvm use --lts
  8. # 验证安装
  9. node -v
  10. npm -v

三、MySQL数据库搭建

3.1 安装与配置

  1. # 添加MySQL Yum仓库
  2. sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm
  3. sudo rpm -ivh mysql80-community-release-el7-6.noarch.rpm
  4. # 安装MySQL服务器
  5. sudo yum install -y mysql-community-server
  6. # 启动服务
  7. sudo systemctl start mysqld
  8. sudo systemctl enable mysqld
  9. # 获取临时密码
  10. sudo grep 'temporary password' /var/log/mysqld.log

3.2 安全配置

执行mysql_secure_installation进行安全设置:

  1. 设置root密码
  2. 移除匿名用户
  3. 禁止root远程登录
  4. 移除测试数据库
  5. 重新加载权限表

3.3 创建应用数据库

  1. CREATE DATABASE personal_site CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  2. CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
  3. GRANT ALL PRIVILEGES ON personal_site.* TO 'app_user'@'localhost';
  4. FLUSH PRIVILEGES;

四、Express应用开发

4.1 项目初始化

  1. mkdir personal-site && cd personal-site
  2. npm init -y
  3. npm install express mysql2 ejs body-parser

4.2 基础结构示例

  1. // app.js
  2. const express = require('express');
  3. const mysql = require('mysql2/promise');
  4. const bodyParser = require('body-parser');
  5. const app = express();
  6. app.set('view engine', 'ejs');
  7. app.use(bodyParser.urlencoded({ extended: true }));
  8. // 数据库连接池
  9. const pool = mysql.createPool({
  10. host: 'localhost',
  11. user: 'app_user',
  12. password: 'StrongPassword123!',
  13. database: 'personal_site',
  14. waitForConnections: true,
  15. connectionLimit: 10,
  16. queueLimit: 0
  17. });
  18. // 路由示例
  19. app.get('/', async (req, res) => {
  20. const [rows] = await pool.query('SELECT * FROM posts');
  21. res.render('index', { posts: rows });
  22. });
  23. const PORT = process.env.PORT || 3000;
  24. app.listen(PORT, () => {
  25. console.log(`Server running on port ${PORT}`);
  26. });

五、生产环境部署

5.1 使用PM2进程管理

  1. npm install pm2 -g
  2. pm2 start app.js --name "personal-site"
  3. pm2 save
  4. pm2 startup # 生成开机自启命令并执行

5.2 Nginx反向代理配置

  1. # /etc/nginx/conf.d/personal-site.conf
  2. server {
  3. listen 80;
  4. server_name yourdomain.com;
  5. location / {
  6. proxy_pass http://127.0.0.1:3000;
  7. proxy_http_version 1.1;
  8. proxy_set_header Upgrade $http_upgrade;
  9. proxy_set_header Connection 'upgrade';
  10. proxy_set_header Host $host;
  11. proxy_cache_bypass $http_upgrade;
  12. }
  13. # 静态文件处理
  14. location /static/ {
  15. alias /path/to/your/static/files/;
  16. expires 30d;
  17. }
  18. }

5.3 HTTPS证书配置

使用Let’s Encrypt免费证书:

  1. # 安装Certbot
  2. sudo yum install -y certbot python3-certbot-nginx
  3. # 获取证书
  4. sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
  5. # 测试自动续期
  6. sudo certbot renew --dry-run

六、性能优化与安全加固

6.1 数据库优化

  • 启用查询缓存(MySQL 8.0需通过配置文件)
  • 为常用查询字段添加索引
  • 定期执行ANALYZE TABLE更新统计信息

6.2 应用层安全

  1. // 安全中间件示例
  2. app.use((req, res, next) => {
  3. res.setHeader('X-Frame-Options', 'DENY');
  4. res.setHeader('X-Content-Type-Options', 'nosniff');
  5. res.setHeader('Content-Security-Policy', "default-src 'self'");
  6. next();
  7. });

6.3 监控与日志

  1. # 安装htop监控
  2. sudo yum install -y htop
  3. # 日志轮转配置
  4. # /etc/logrotate.d/personal-site
  5. /var/log/nginx/personal-site.access.log {
  6. daily
  7. missingok
  8. rotate 14
  9. compress
  10. delaycompress
  11. notifempty
  12. create 640 nginx adm
  13. sharedscripts
  14. postrotate
  15. [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
  16. endscript
  17. }

七、常见问题解决方案

7.1 端口冲突处理

  1. # 查找占用端口的进程
  2. sudo netstat -tulnp | grep :3000
  3. # 终止异常进程
  4. sudo kill -9 <PID>

7.2 数据库连接失败排查

  1. 检查MySQL服务状态:sudo systemctl status mysqld
  2. 验证用户权限:SELECT host, user FROM mysql.user;
  3. 查看错误日志:sudo tail -f /var/log/mysqld.log

7.3 静态资源404错误

确保Nginx配置中的alias路径正确,并检查文件权限:

  1. sudo chown -R nginx:nginx /path/to/static/files
  2. sudo chmod -R 755 /path/to/static/files

八、扩展建议

  1. 数据库分表:当数据量超过500万条时考虑垂直/水平分表
  2. 缓存层:引入Redis缓存热点数据
  3. CI/CD:使用GitHub Actions实现自动化部署
  4. 多环境管理:通过.env文件区分开发/测试/生产环境

本方案通过轻量级服务器实现个人网站的全栈部署,在保证性能的同时控制成本。实际部署时建议先在测试环境验证,再逐步迁移到生产环境。对于高流量场景,可考虑添加CDN加速和数据库读写分离架构。