1. 为什么要在Nginx服务器上安装Node.js?
在Web服务架构中,Nginx和Node.js通常需要协同工作。Nginx作为高性能的反向代理服务器,擅长处理静态资源、负载均衡和SSL终端;而Node.js则更适合处理动态内容和实时应用。这种组合在现代Web开发中非常常见,比如:
- 用Nginx做前端代理,将/api请求转发到Node.js后端
- 用Nginx处理静态文件,减轻Node.js的负担
- 利用Nginx的缓存能力提升Node.js应用的性能
我管理的几十台生产服务器都采用这种架构,实测下来这种组合既保持了Nginx的高性能,又能发挥Node.js的开发效率优势。
2. 环境准备与Node.js安装
2.1 系统环境检查
在开始安装前,建议先检查系统环境:
bash复制# 查看系统版本
cat /etc/redhat-release
# 检查现有Node.js版本(如果已安装)
node -v 2>/dev/null || echo "Node.js未安装"
# 检查yum源配置
yum repolist
注意:本文以CentOS/RHEL系统为例,其他Linux发行版的安装方式可能不同
2.2 通过EPEL仓库安装Node.js
EPEL(Extra Packages for Enterprise Linux)仓库提供了许多额外的软件包,包括较新版本的Node.js:
bash复制# 安装EPEL仓库
sudo yum install -y epel-release
# 更新yum缓存
sudo yum makecache
# 查看可用的Node.js版本
yum list nodejs --showduplicates
# 安装Node.js(默认安装最新稳定版)
sudo yum install -y nodejs
安装完成后验证版本:
bash复制node -v
npm -v
实操心得:生产环境建议锁定特定版本,避免自动升级导致兼容性问题。可以通过
yum install nodejs-<version>指定版本。
2.3 替代安装方案
如果EPEL中的Node.js版本过旧,还可以考虑:
- 使用NodeSource仓库(推荐获取最新版):
bash复制curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash -
sudo yum install -y nodejs
- 使用nvm安装(适合多版本管理):
bash复制curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
source ~/.bashrc
nvm install 16
3. NPM配置优化
3.1 更换国内镜像源
默认npm源在国外,国内访问速度慢,建议更换为淘宝镜像:
bash复制npm config set registry https://registry.npmmirror.com
# 验证配置
npm config get registry
3.2 全局安装路径设置
避免使用root权限安装全局包,更安全的做法是:
bash复制mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
3.3 常用工具安装
推荐安装的实用工具:
bash复制npm install -g yarn pm2 nrm
# yarn加速
yarn config set registry https://registry.npmmirror.com
# nrm管理镜像源
nrm use taobao
4. Nginx与Node.js集成配置
4.1 基本反向代理配置
在Nginx配置文件中添加:
nginx复制server {
listen 80;
server_name yourdomain.com;
location / {
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;
}
}
4.2 负载均衡配置
当有多个Node.js实例时:
nginx复制upstream node_servers {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
server {
location / {
proxy_pass http://node_servers;
}
}
4.3 静态文件分离
让Nginx直接处理静态文件:
nginx复制location / {
try_files $uri @nodejs;
}
location @nodejs {
proxy_pass http://localhost:3000;
}
location /static/ {
alias /path/to/static/files/;
expires 30d;
}
5. 进程管理与监控
5.1 使用PM2管理Node应用
bash复制npm install -g pm2
# 启动应用
pm2 start app.js
# 设置开机启动
pm2 startup
pm2 save
# 监控日志
pm2 logs
5.2 系统服务集成
创建systemd服务文件/etc/systemd/system/nodeapp.service:
ini复制[Unit]
Description=Node.js Application
After=network.target
[Service]
ExecStart=/usr/bin/pm2 start /path/to/app.js
Restart=always
User=nodeuser
Group=nodeuser
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
然后启用服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable nodeapp
sudo systemctl start nodeapp
6. 安全加固措施
6.1 防火墙配置
bash复制# 开放必要端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
6.2 Node.js安全配置
- 使用helmet中间件:
javascript复制const helmet = require('helmet');
app.use(helmet());
- 限制请求体大小:
nginx复制client_max_body_size 10m;
- 禁用不必要HTTP方法:
nginx复制if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
7. 性能调优技巧
7.1 Nginx调优参数
nginx复制# worker进程数
worker_processes auto;
# 每个worker的连接数
events {
worker_connections 1024;
}
# 启用gzip压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript;
7.2 Node.js性能优化
- 使用cluster模块:
javascript复制const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
require('./app');
}
- 调整垃圾回收参数:
bash复制node --max-old-space-size=4096 app.js
8. 常见问题排查
8.1 Node.js应用无法启动
检查步骤:
- 查看错误日志:
journalctl -u nodeapp -n 50 - 检查端口占用:
ss -tulnp | grep :3000 - 测试直接运行:
node app.js
8.2 Nginx 502 Bad Gateway
可能原因:
- Node.js进程崩溃 - 使用PM2自动重启
- 权限问题 - 确保Nginx用户能访问socket
- 资源不足 - 检查内存和CPU使用率
8.3 性能瓶颈分析
使用工具定位问题:
bash复制# Node.js进程CPU分析
node --prof app.js
node --prof-process isolate-0xnnnnnnnnnnnn-v8.log > processed.txt
# Nginx状态监控
ngxtop
goaccess /var/log/nginx/access.log
9. 最佳实践总结
- 版本控制:生产环境锁定Node.js和npm版本
- 权限分离:不要用root运行Node应用
- 日志管理:配置日志轮转和集中收集
- 监控告警:设置进程存活和性能监控
- 持续集成:自动化测试和部署流程
我在实际运维中发现,这套组合最稳定的配置是:
- Nginx 1.18+
- Node.js LTS版本
- PM2进程管理
- 独立的系统用户和权限
- 完善的日志和监控
最后分享一个实用技巧:使用acme.sh自动管理SSL证书,配合Nginx和Node.js可以实现全自动的HTTPS部署,这是我多年运维经验中验证过的最稳定方案。