我正在尝试使用nginx对一个angular通用应用程序进行dockerizing,这给了我很大的困难。它一直在说502坏网关,我无法把我的头绕过去。
这是我的Dockerfile
FROM node:14-alpine AS builder
WORKDIR /app
COPY . .
RUN npm i && npm run build:ssr
FROM nginx:alpine
WORKDIR /usr/share/nginx/html
RUN rm -rf ./*
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/dist/front-end-kevi .
ENTRYPOINT ["nginx", "-g", "daemon off;"]
在我的server.ts文件中,我在端口4000上启动应用程序。所以我使用这个命令启动docker镜像
docker run -d -p 4000:80 kevin
这里是我的nginx conf文件。
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
location ~* \.(eot|ttf|woff|woff2)$ {
add_header Access-Control-Allow-Origin *;
}
location / {
proxy_pass http://localhost:4000;
try_files $uri $uri/ =404;
}
location /OrderMationApi/api/v3/ {
proxy_pass http://102.133.225.222;
}
}
我在错误日志中看到了这个错误
7#7:*1 connect()失败(111:连接被拒绝),同时连接到上游,客户端:172.17.0.1,服务器:localhost,请求:“GET / HTTP/1.1”,上行:“http://127.0.0.1:4000/“,host:“localhost:4000”
你知道我哪里做错了吗?任何帮助是高度赞赏。先谢谢你了。
2条答案
按热度按时间2hh7jdfx1#
你说你的服务器是在:4000上启动的,但我在你的Dockerfile中没有看到。从你在问题中发布的配置来看,在我看来,你相信你的容器将同时运行Nginx和你的应用程序。但会发生的是只有Nginx会运行,而你的应用程序不会启动。这就是为什么你会得到一个错误- Nginx无法在
http://localhost:4000
上找到任何东西,因为那里没有任何东西在监听。要解决这个问题,您有几个选择。一个是你可以构建另一个容器来运行你的应用程序,然后将Nginx指向该容器。最好的方法是使用
docker compose
运行这两个容器,并将Nginx指向http://<service-name>:4000
,其中<service_name>
是另一个容器的名称。另一种可能性是将入口点替换为同时启动它们的脚本。这不是一个容器最佳实践,但它是可能的。在这种情况下,您可以编写脚本(例如:
/docker-entrypoint.sh
),内容如下:这将在后台启动nginx,并在前台运行您的服务器。同样,这不是一个最佳实践,因为现在Nginx没有登录到stdout/stderr。因此,我建议使用
docker compose
之类的东西进行多容器设置。velaa5lx2#
问题主要出在nginx配置上。这个问题已经在这里提出了。https://serverfault.com/questions/317393/connect-failed-111-connection-refused-while-connecting-to-upstream