问题描述
我们正在使用 pm2 设置基于 Express 的 Node.JS 应用程序。
我们感到困惑的是,pm2 应用程序的每个实例是否都需要在自己的端口上运行,然后配置 Nginx 来处理每个实例的负载均衡?
另外,我们如何告诉 pm2 为每个实例使用单独的日志文件?
我们的 pm2 配置:
{
"apps": [{
"name": "myapp","script": "dist/index.js","args": ["server"],"watch": false,"merge_logs": true,"error_file": "/var/log/myapp/stderr-web.log","out_file": "/var/log/myapp/stdout-web.log","pid_file": "/var/run/myapp/myapp.pid","instance_var": "NODE_INSTANCE_ID","env": {
"LOGGING_MAIN_FILENAME": "main-web-%DATE%.log","LOGGING_MAIN_SYMLINK_NAME": "main-web.log","ENV": "dev","NODE_ENV": "development","DOTENV_CONfig_PATH": "/home/myapp-user/.myapp-server-env","SERVER_BASE_URL": "http://localhost:3000"
}
}]
}
我们的 Nginx 配置的位置部分:
location /api {
root /var/www/sites/myapp.mydomain.com-api;
proxy_pass http://localhost:300;
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-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_set_header x-forwarded-host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Nginx-Proxy true;
}
解决方法
PM2 具有内置的负载平衡,因此如果应用程序在集群模式下运行,它将允许在所有实例上使用相同的端口。 Nginx 将以循环方式解析每个请求的实例
此行为也记录在 Node.js 集群模式文档中 https://nodejs.org/api/cluster.html#cluster_how_it_works