一个 Node.js 部署的常见错误,但我就是搜不到解决方案,搞不定,求高人指点

2017-12-12 01:45:24 +08:00
 ericgui
## 我把 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 <server-ip-address>: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://<server-ip-address>:3000/", host: "www.helloworld.com", referrer: "http://www.helloworld.com/user/signin"
5306 次点击
所在节点    NGINX
22 条回复
lucas56
2017-12-12 04:46:28 +08:00
之前遇到过,修改下 proxy_set
lucas56
2017-12-12 04:47:07 +08:00
proxy_set_header
qfdk
2017-12-12 05:49:27 +08:00
其实可以考虑用我的方案 http://blog.qfdk.me/post/2017-10-23
ericgui
2017-12-12 06:39:16 +08:00
@lucas56 请问能具体说一下吗?谢谢
ericgui
2017-12-12 06:46:13 +08:00
@qfdk 我是部署一个 expressjs,您的代码我有点看不懂
marknote
2017-12-12 06:57:48 +08:00
location / {
18 proxy_pass http://helloworld;


这里有问题吧 自己 proxy 自己 死循环了
ericgui
2017-12-12 07:01:42 +08:00
@marknote 这一段是我抄网上的,因为 log 里有个 upstream,我搜了一下, 说是这样写。

其实这样写没问题,我的网站可以工作,就是登陆成功后跳转就出 502

当然,22 和 27 行是重复的,已经去掉了一行了。
tlday
2017-12-12 08:18:15 +08:00
建议先定位问题出在 Node 代码层面还是 nginx。
不要反向代理,打开浏览器 Network 里面的 preserve log 再尝试重现问题。
mcfog
2017-12-12 08:28:25 +08:00
看看 node 的日志吧,感觉是 node 有问题 crash 了然后瞬间被 pm 又拉起来了
ericgui
2017-12-12 08:32:27 +08:00
@tlday 应该是 nginx 的问题,我在本地没任何问题,跳转都 OK,部署之后,也能正常打开网站。

刚才按照您的建议,打开了 preserve log,显示进入登陆页,GET 200,提交用户名和密码,POST 302 (因为登陆成功就跳转),然后立刻就 502 了。
ericgui
2017-12-12 08:41:59 +08:00
@mcfog 是的,就是这个原因。google 上好几个人都这么说。但我就是不知道怎么修。
yimity
2017-12-12 09:29:45 +08:00
把 12345 去掉。
yimity
2017-12-12 09:32:44 +08:00
把 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;
}
}
crz
2017-12-12 09:44:38 +08:00
@ericgui 如 @mcfog 所说的,先看看 node 的日志吧
KuroNekoFan
2017-12-12 09:56:16 +08:00
@qfdk nodejs 做反代对比 nginx 有什么优势吗
whypool
2017-12-12 09:58:42 +08:00
nginx 配置不对吧;
tlday
2017-12-12 12:46:52 +08:00
302 跳转有多种情况,可以看下 303 或者 307。我个人倾向于认为是你的 302,POST 请求发给 node 端导致 express 那里崩溃了,然后被 pm2 直接瞬间拉起来了。nginx 出问题的几率不大。刷新速度过快 502 应该也是你 express 那里程序写的问题,但两个问题可能没有关联。建议你看看 express 的日志,考虑把所有的详细日志打出来。你的情况下,默认日志的位置应该在~/.pm2/log 之类的地方,有几个 worker 就有几个日志,挨个检查一下。
tlday
2017-12-12 12:51:51 +08:00
另外,nginx 和 pm2 合用似乎是重复的。因为 pm2 起多个 worker,但是只代理一个端口,pm2 也是会作为负载均衡转发请求给各个 worker 的。不过它的自动重启对于 express 这种没有最外层 ExceptionHandler,崩溃就 GG 的程序还是很有必要的。
qfdk
2017-12-12 14:53:13 +08:00
@KuroNekoFan 简单:) 不用搞 nginx 复杂肥肉编译 几行代码搞定 加个 forever 美滋滋
defunct9
2017-12-12 18:28:49 +08:00
开 ssh,上去帮你看看

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/413940

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX