一、目录规范
/www/wwwroot/ ├──
my-app/
← 后端 Node.js 项目 │ ├──
app.js │ ├──
package.json │ └──
node_modules/ │ └──
my-app-web/
← 前端静态文件(打包后的) ├──
index.html ├──
css/ ├── js/ └──
assets/
/etc/nginx/
├── nginx.conf
← 主配置(不要动) └──
conf.d/
← 网站配置(所有配置写这里) ├──
my-app.conf └──
my-blog.conf
/var/log/nginx/
├── access.log
← 访问日志 └──
error.log ← 错误日志
| 文件类型 |
存放目录 |
处理方式 |
| 后端 Node.js 项目 |
/www/wwwroot/项目名/ |
Node 处理,Nginx 反向代理 |
| 前端静态文件 |
/www/wwwroot/项目名-web/ |
Nginx 直接返回,速度快 |
二、后端项目部署
2.1 创建项目目录并上传
sudo mkdir -p /www/wwwroot/my-app
cd /www/wwwroot/my-app
npm install
2.2 修改端口
Node 项目不要监听 80 端口,用 3000、3001 等:
app.listen(3000);
2.3 用 PM2 启动
pm2 start app.js --name my-app
pm2 startup
pm2 save
三、前端项目部署
3.1 打包上传
npm run build
sudo mkdir -p /www/wwwroot/my-app-web
3.2 目录结构
/www/wwwroot/my-app-web/ ├──
index.html ├──
css/ ├── js/ ├──
assets/ └──
favicon.ico
3.3 配置 Nginx 直接返回静态文件
server {
listen 80;
server_name _;
location / {
root /www/wwwroot/my-app-web;
index index.html;
try_files $uri $uri/ /index.html;
}
}
四、Nginx 配置
4.1 只有后端(纯 API 服务)
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
4.2 前端 + 后端(最常用)
server {
listen 80;
server_name _;
location / {
root /www/wwwroot/my-app-web;
index index.html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://127.0.0.1:3000;
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;
}
}
4.3 多个项目
server {
listen 80;
server_name a.com;
location / {
root /www/wwwroot/app-a-web;
index index.html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name b.com;
location / {
root /www/wwwroot/app-b-web;
index index.html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://127.0.0.1:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
4.4 修改配置的操作流程
第一步:sudo vi /etc/nginx/conf.d/配置文件名.conf
第二步:sudo nginx -t
第三步:sudo nginx -s reload
注意
第二步如果报错就不要执行第三步,先把语法错误修好。
五、部署一个新项目的完整流程
-
创建目录
sudo mkdir -p /www/wwwroot/项目名
-
上传后端代码
将 app.js、package.json
等文件上传到该目录
-
安装依赖
cd /www/wwwroot/项目名 && npm install
-
修改端口
将 app.js 中的端口改为 3000(或
3001、3002...)
-
用 PM2 启动
pm2 start app.js --name 项目名
-
上传前端打包文件
将 dist 目录内容上传到
/www/wwwroot/项目名-web/
-
编写 Nginx 配置
sudo vi /etc/nginx/conf.d/项目名.conf
-
检查并重载 Nginx
sudo nginx -t 然后
sudo nginx -s reload
- 验证
浏览器访问服务器 IP
六、常用命令速查
Nginx
| 命令 |
作用 |
sudo nginx -t |
检查配置文件语法 |
sudo nginx -s reload |
重载配置(不中断服务) |
sudo systemctl start nginx |
启动 Nginx |
sudo systemctl stop nginx |
停止 Nginx |
sudo systemctl restart nginx |
重启 Nginx |
sudo systemctl status nginx |
查看运行状态 |
sudo systemctl enable nginx |
设为开机自启 |
sudo tail -50 /var/log/nginx/error.log |
查看错误日志 |
PM2
| 命令 |
作用 |
pm2 start app.js --name 名称 |
启动项目 |
pm2 list |
查看所有项目状态 |
pm2 restart 名称 |
重启项目 |
pm2 stop 名称 |
停止项目 |
pm2 delete 名称 |
删除项目 |
pm2 logs 名称 |
查看日志 |
pm2 monit |
实时监控 |
pm2 startup |
设置开机自启 |
pm2 save |
保存当前进程列表 |
pm2 install pm2-logrotate |
安装日志切割插件 |
端口排查
| 命令 |
作用 |
sudo lsof -i :80 |
查看 80 端口占用 |
sudo lsof -i :3000 |
查看 3000 端口占用 |
sudo netstat -tlnp |
查看所有端口占用 |
curl http://127.0.0.1:3000 |
测试本地服务是否正常 |
ps -ef | grep node |
查看所有 Node 进程 |
systemd 服务管理
| 命令 |
作用 |
sudo systemctl stop myapp |
停止服务 |
sudo systemctl disable myapp |
禁止开机自启 |
sudo systemctl start myapp |
启动服务 |
grep -r "app.js" /etc/systemd/system/ |
查找服务文件位置 |
七、常见问题排查
| 问题 |
排查命令 |
解决方法 |
| Nginx 启动失败 |
sudo nginx -t |
语法错误,根据提示修复 |
| 端口被占用 |
sudo lsof -i :80 |
停掉占用端口的进程 |
| 访问显示 502 Bad Gateway |
pm2 list |
Node 没启动,pm2 start 拉起来 |
| 访问显示 404 Not Found |
查看 Nginx location 配置 |
路径写错了,检查配置 |
| 改了配置没生效 |
— |
忘了 sudo nginx -s reload |
| Node 被 kill 后自动重启 |
ps -ef | grep node |
有 systemd 管理,用 systemctl stop 停掉 |
| 前端刷新 404 |
— |
Nginx 缺少 try_files $uri $uri/ /index.html |
八、SSL 证书(免费 HTTPS)
有域名(推荐)
sudo yum install -y epel-release
sudo yum install -y certbot python3-certbot-nginx
sudo certbot --nginx -d 你的域名
sudo certbot renew --dry-run
无域名(自签名证书,浏览器会提示不安全)
sudo openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 \
-keyout /etc/nginx/self.key \
-out /etc/nginx/self.crt \
-subj "/CN=你的IP"
九、服务器当前状态记录
| 组件 |
状态 |
说明 |
| Nginx |
运行中 |
监听 80 端口,配置在 /etc/nginx/conf.d/ |
| 系统自带 Node 服务 |
已停用 |
myapp.service 已 disable |
| 自己的 Node 项目 |
待部署 |
放在 /www/wwwroot/项目名/,用 3000+ 端口 |
| PM2 |
已安装 |
用于管理 Node 进程 |
提示
每次部署新项目,按照第五节「完整流程」走一遍即可。遇到问题先查第七节「常见问题排查」。