1. 项目概述与准备工作
在Kali Linux环境下使用Nginx部署前后端分离项目是一个常见的运维任务。作为一名长期从事Web开发和系统运维的技术人员,我发现这种部署方式既能充分利用Nginx的高性能特性,又能保持前后端开发的独立性。下面我将详细介绍整个部署流程,包括一些在实际操作中容易忽视的关键细节。
首先需要明确的是,Kali Linux虽然主要作为安全测试工具使用,但其基于Debian的特性使其同样适合作为开发环境。在开始部署前,请确保你的系统已经安装了以下基础组件:
- Node.js(建议使用LTS版本)
- npm或yarn
- MariaDB/MySQL
- Nginx
- PM2(用于Node.js进程管理)
提示:在Kali中安装这些组件时,建议使用
sudo apt update && sudo apt install -y命令来确保获取最新版本并自动确认安装。
2. 项目结构分析与准备
2.1 目录结构解析
前后端分离的项目通常有两种主要结构形式,理解它们的区别对后续部署至关重要:
典型分离式结构:
code复制blog/
├── node-mysql-api/ # 后端服务
│ ├── app.js # 主入口文件
│ ├── package.json # 后端依赖
│ └── ... # 其他后端文件
├── blog-admin/ # 前端项目
│ ├── package.json # 前端依赖
│ ├── public/ # 静态资源
│ └── src/ # 源代码
└── blog.sql # 数据库备份
单体式结构(不推荐但常见于旧项目):
code复制blog/
├── package.json # 项目依赖
├── server.js # 后端入口
├── public/ # 前端构建产物
└── database.sql # 数据库文件
在实际操作中,我强烈建议采用分离式结构,因为它具有以下优势:
- 前后端可以独立开发和部署
- 更清晰的职责划分
- 便于团队协作
- 更适合现代CI/CD流程
2.2 环境检查与准备
在开始部署前,请执行以下检查:
bash复制# 检查Node.js和npm版本
node -v
npm -v
# 检查MySQL/MariaDB服务状态
sudo systemctl status mariadb
# 检查Nginx安装情况
nginx -v
如果发现任何组件缺失,可以使用以下命令安装:
bash复制# 安装Node.js和npm
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install -y nodejs
# 安装MariaDB
sudo apt install -y mariadb-server
# 安装Nginx
sudo apt install -y nginx
3. 数据库配置详解
3.1 数据库初始化
数据库是Web应用的核心组件,正确的配置可以避免后期很多问题。以下是详细的配置步骤:
bash复制# 登录MariaDB控制台
sudo mariadb -u root
在MariaDB控制台中执行以下SQL语句(请根据实际情况修改用户名和密码):
sql复制-- 创建使用utf8mb4字符集的数据库,支持完整Unicode(包括emoji)
CREATE DATABASE blog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建专用数据库用户
CREATE USER 'blog_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
-- 授予权限(生产环境应根据最小权限原则调整)
GRANT ALL PRIVILEGES ON blog.* TO 'blog_user'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
-- 退出
EXIT;
3.2 数据库导入
如果你的项目已有数据库备份文件(通常为.sql格式),可以使用以下命令导入:
bash复制sudo mariadb -u root blog < /path/to/your/blog.sql
注意事项:导入大型数据库文件时,可能会遇到超时问题。解决方法是在MariaDB配置文件中增加
max_allowed_packet参数值,或者使用mysqlimport工具分批导入。
4. 后端服务部署
4.1 项目文件部署
将后端代码部署到生产环境目录:
bash复制# 创建项目目录结构
sudo mkdir -p /var/www/blog/backend
# 复制项目文件(假设项目在~/桌面/project/blog/node-mysql-api)
sudo cp -r ~/桌面/project/blog/node-mysql-api/* /var/www/blog/backend/
# 设置正确的文件权限
sudo chown -R kali:kali /var/www/blog
4.2 依赖安装与配置
进入后端目录安装生产环境依赖:
bash复制cd /var/www/blog/backend
npm install --production
经验分享:在生产环境中,务必使用
--production标志,这样可以避免安装开发依赖,减少不必要的安全风险和磁盘空间占用。
4.3 使用PM2管理Node进程
PM2是Node.js应用的进程管理器,提供了很多实用功能:
bash复制# 全局安装PM2
sudo npm install -g pm2
# 启动应用(假设入口文件是app.js)
pm2 start app.js --name "blog_api"
# 设置开机自启
pm2 startup
# 执行上面命令后,会显示一个需要以sudo执行的命令,复制并执行它
pm2 save
PM2常用命令备忘:
pm2 list:查看运行中的进程pm2 logs:查看日志pm2 restart <app_name>:重启应用pm2 delete <app_name>:停止并删除应用
5. 前端项目部署
5.1 前端项目构建
进入前端项目目录并构建生产版本:
bash复制cd ~/桌面/project/blog/blog-admin
npm install
npm run build
构建完成后,会在项目目录下生成dist文件夹,包含优化后的静态文件。
5.2 部署静态文件
将构建好的静态文件部署到Nginx服务目录:
bash复制# 创建前端部署目录
sudo mkdir -p /var/www/blog/frontends/admin
# 复制构建产物
sudo cp -r ~/桌面/project/blog/blog-admin/dist/* /var/www/blog/frontends/admin/
# 设置权限
sudo chown -R kali:kali /var/www/blog
提示:对于多环境部署(如开发、测试、生产),可以在
frontends目录下创建不同的子目录来区分,例如/var/www/blog/frontends/admin-prod和/var/www/blog/frontends/admin-staging。
6. Nginx配置与优化
6.1 基本反向代理配置
创建Nginx配置文件:
bash复制sudo vim /etc/nginx/sites-available/blog-admin
写入以下配置(根据实际情况修改):
nginx复制server {
listen 81;
server_name your_server_ip_or_domain;
root /var/www/blog/frontends/admin;
index index.html;
# 前端路由处理(Vue/React等SPA必需)
location / {
try_files $uri $uri/ /index.html;
}
# API请求代理到后端
location /api {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 静态资源缓存设置
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
# 错误页面配置
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
6.2 启用配置并优化
启用站点配置并测试:
bash复制# 创建符号链接
sudo ln -sf /etc/nginx/sites-available/blog-admin /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重启Nginx
sudo systemctl restart nginx
# 开放防火墙端口
sudo ufw allow 81/tcp
6.3 性能优化建议
-
启用Gzip压缩:
在Nginx配置的http块中添加:nginx复制gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_comp_level 6; gzip_min_length 1000; -
调整工作进程:
在/etc/nginx/nginx.conf中,根据CPU核心数设置:nginx复制worker_processes auto; -
连接数优化:
nginx复制events { worker_connections 1024; multi_accept on; }
7. 系统维护与监控
7.1 日志管理
- Nginx访问日志:
/var/log/nginx/access.log - Nginx错误日志:
/var/log/nginx/error.log - PM2应用日志:
pm2 logs blog_api
建议定期轮转日志文件,可以使用logrotate工具自动管理。
7.2 性能监控
bash复制# 查看系统资源使用情况
htop
# 监控Nginx连接数
sudo ngxtop
# 监控Node.js进程
pm2 monit
7.3 备份策略
建议设置定期备份:
- 数据库备份:
bash复制mysqldump -u root -p blog > /backup/blog_$(date +%F).sql - 项目文件备份:
bash复制tar -czvf /backup/blog_files_$(date +%F).tar.gz /var/www/blog
8. 常见问题与解决方案
8.1 502 Bad Gateway错误
可能原因:
- Node.js后端服务未运行
- 端口配置错误
- 权限问题
排查步骤:
bash复制# 检查Node服务是否运行
pm2 list
# 检查端口占用
sudo ss -tulnp | grep 3000
# 检查Nginx错误日志
sudo tail -f /var/log/nginx/error.log
8.2 静态资源加载失败
可能原因:
- 文件路径错误
- 权限不足
- Nginx配置错误
解决方案:
bash复制# 检查文件是否存在
ls -la /var/www/blog/frontends/admin
# 修正权限
sudo chmod -R 755 /var/www/blog
# 检查Nginx配置中的root路径
sudo nginx -t
8.3 数据库连接问题
排查命令:
bash复制# 测试数据库连接
mysql -u blog_user -p -e "SHOW DATABASES;"
# 检查.env文件配置
cat /var/www/blog/backend/.env
9. 安全加固建议
-
防火墙配置:
bash复制sudo ufw enable sudo ufw allow 81/tcp sudo ufw allow ssh -
定期更新:
bash复制sudo apt update && sudo apt upgrade -y -
最小权限原则:
- 数据库用户只授予必要权限
- 应用程序使用专用系统用户运行
-
禁用不必要的服务:
bash复制sudo systemctl disable --now apache2 -
SSL/TLS加密(强烈建议):
可以使用Let's Encrypt免费证书:bash复制sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d your_domain.com
10. 项目下线与清理
当不再需要该项目时,应按以下步骤安全移除:
-
停止相关服务:
bash复制
pm2 stop blog_api pm2 delete blog_api -
移除Nginx配置:
bash复制sudo rm /etc/nginx/sites-enabled/blog-admin sudo rm /etc/nginx/sites-available/blog-admin sudo nginx -t sudo systemctl reload nginx -
清理项目文件(可选):
bash复制sudo rm -rf /var/www/blog -
删除数据库(谨慎操作):
bash复制sudo mariadb -u root -e "DROP DATABASE blog; DROP USER 'blog_user'@'localhost';"
在实际操作中,我发现很多开发者容易忽视权限管理和日志监控这两个关键点。正确的文件权限可以防止很多安全问题,而完善的日志系统则能在出现问题时快速定位原因。建议在部署完成后,花些时间设置好这两方面的配置。