Nginx 502 bad request | Docker | Node.js http-server

发布时间 2023-04-25 16:05:19作者: Boiiea

场景

本地开发的 Vue 项目, 测试之后准备部署;
本地使用 http-server 正常运行;
服务器环境为: Docker 运行的 Nginx 和 Node.js 容器;
目标是将项目通过 Node.js 容器运行
Node.js 容器启动命令为

sudo docker run --name msg_page \
--network nginx_net \
-it -dp 3002:3002 \
--mount type=bind,src=/home/ubuntu/workspace/msg_page,dst=/usr/src/app \
-w /usr/src/app \
node bash

Nginx 对应部分配置

     server {
          listen 80;
          server_name xxx.com;
          location / {
                  proxy_pass http://msg_page:3002;
          }

启动 Node.js 容器后, 安装 http-server
$ npm install http-server -g

错误操作

进入文件挂载目录后, 使用命令
$ http-server -p :3002
错在 3002 前多写了冒号, 这个命令的默认地址就是 0.0.0.0 , 不需要冒号, 而且这个 flag 是 -p , 只是指定端口,
完整命令应该是
$ http-server -a 0.0.0.0 -p 3002
逆天的是把冒号作为端口参数也能运行成功, 显示了两个冒号看到了还没反应过来

bug

导致访问地址出现 502 Bad Gateway 错误, Nginx 查看 access.log, 接入正常, 关闭对应容器, 也是 502 错误, 说明容器内网关服务未启动.

教训|经验

操作过程都应该有明文记录, 不能依赖 history 命令, bash 命令应写入 xxx.sh 然后执行.
第一次执行较复杂的操作应该记录操作过程.
502 Bad Gateway 可能是服务未启动 \ 响应时间过长.
挂载文件修改之后, 需要重启容器才能读取改变.

debug

之前同样的场景成功部署了一个前端服务, 进入其容器查看历史命令后, 发现没有加端口号, 再去查 http-server 命令教程, 发现原因所在.