技术解析

一个 Node.js 部署的常见错误,但我就是搜不到解决方案,搞不定,求高人指点
0
2021-05-20 21:36:11
idczone
## 我把 log 在 google 上搜了一下,很多人描述这个问题,我也尝试了 2 天了,都搞不定,特来求助

## 环境:
- Node.js v8.9.1
- ExpressJS
- Ubuntu 16.04 LTS
- pm2

## 错误
- 描述 1:如果短时间内多次刷新首页,出现 502 Bad Gateway 错误
- 描述 2:代码里,用户注册或登陆成功后会自动跳转到首页,在本机 OK,但部署到服务器之后,跳转出现 502 Bad Gateway

## 配置:
### Nginx 配置文件:

1 upstream helloworld {
2 server :3000 max_fails=0 fail_timeout=10s weight=1;
3 ip_hash;
4 keepalive 512;
5 }
6
7 server {
8 listen 80;
9 server_name helloworld.com www.helloworld.com;
10
11 #charset koi8-r;
12 access_log /app/archives/logs/nginx/helloworld .host.access.log main;
13 error_log /app/archives/logs/nginx/helloworld .host.error.log debug;
14
15 root /app/helloworld ;
16
17 location / {
18 proxy_pass http://helloworld;
19 proxy_set_header X-Real-IP $remote_addr;
20 proxy_set_header X-Forwarded-Proto $scheme;
21 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
22 proxy_set_header Host $host;
23 proxy_set_header X-NginX-Proxy true;
24 proxy_http_version 1.1;
25 proxy_set_header Upgrade $http_upgrade;
26 proxy_set_header Connection 'upgrade';
27 proxy_set_header Host $host;
28 proxy_cache_bypass $http_upgrade;
29
30 }
31 }

## error log
2017/12/11 09:22:23 [error] 29952#29952: *81 connect() failed (111: Connection refused) while connecting to upstream, client: 169.228.200.160, server: helloworld.com, request: "GET /美国服务器 HTTP/1.1", upstream: "http://:3000/", host: "www.helloworld.com", referrer: "http://www.helloworld.com/user/signin"
之前遇到过,修改下 proxy_set

proxy_set_header

其实可以考虑用我的方案 http://blog.qfdk.me/post/2017-10-23

请问能具体说一下吗?谢谢

我是部署一个 expressjs,您的代码我有点看不懂

location / {
18 proxy_pass http://helloworld;

这里有问题吧 自己 proxy 自己 死循环了

这一段是我抄网上的,因为 log 里有个 upstream,我搜了一下, 说是这样写。
其实这样写没问题,我的网站可以工作,就是登陆成功后跳转就出 502
当然,22 和 27 行是重复的,已经去掉了一行了。

建议先定位问题出在 Node 代码层面还是 nginx。
不要反向代理,打开浏览器 Network 里面的 preserve log 再尝试重现问题。

看看 node 的日志吧,感觉是 node 有问题 crash 了然后瞬间被 pm 又拉起来了

应该是 nginx 的问题,我在本地没任何问题,跳转都 OK,部署之后,也能正常打开网站。
刚才按照您的建议,打开了 preserve log,显示进入登陆页,GET 200,提交用户名和密码,POST 302 (因为登陆成功就跳转),然后立刻就 502 了。

是的,就是这个原因。google 上好几个人都这么说。但我就是不知道怎么修。

把 12345 去掉。

把 12345 删掉
proxy_pass http://helloworld; 这个直接给你本地的 ip 和端口。
server {
listen 80;
server_name abc.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://172.18.0.5:3000;
}
}

如 所说的,先看看 node 的日志吧

nodejs 做反代对比 nginx 有什么优势吗

nginx 配置不对吧;

302 跳转有多种情况,可以看下 303 或者 307。我个人倾向于认为是你的 302,POST 请求发给 node 端导致 express 那里崩溃了,然后被 pm2 直接瞬间拉起来了。nginx 出问题的几率不大。刷新速度过快 502 应该也是你 express 那里程序写的问题,但两个问题可能没有关联。建议你看看 express 的日志,考虑把所有的详细日志打出来。你的情况下,默认日志的位置应该在~/.pm2/log 之类的地方,有几个 worker 就有几个日志,挨个检查一下。

另外,nginx 和 pm2 合用似乎是重复的。因为 pm2 起多个 worker,但是只代理一个端口,pm2 也是会作为负载均衡转发请求给各个 worker 的。不过它的自动重启对于 express 这种没有最外层 ExceptionHandler,崩溃就 GG 的程序还是很有必要的。

简单:) 不用搞 nginx 复杂肥肉编译 几行代码搞定 加个 forever 美滋滋

开 ssh,上去帮你看看

是的,我把 pm2 一停,就用 npm start,一切都 OK 了。

但只用 npm start 也很原始,而且 log 都输出到 console 来了。最好还是用 pm2 的吧?否则怎么自动重启呢?

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服