gpt4 book ai didi

docker - nginx proxy_pass 导致 404 Not Found 页面

转载 作者:行者123 更新时间:2023-12-01 22:56:50 24 4
gpt4 key购买 nike

我有一个在安装了 nginx 的 docker ubuntu 镜像中运行的 Angular 应用程序。我想将此镜像部署到 Kubernetes 并使用 nginx 代理将对/api 的所有调用重定向到 Kubernetes 中的后端服务。

我的静态 Web 资源位于/var/www/html 中,我将以下配置添加到/etc/nginx/conf.d:

upstream backend-service {
server backend-service:8080;
}

server {
listen 80;

location / {
try_files $uri $uri/ /index.html;
}

location ^~ /api {
proxy_pass http://backend-service;
}
}

访问/或/#/dashboard 上的前端服务会返回 Angular 页面的预期组件,但调用/api/v1/data 仅显示默认的 nginx 404 Not Found 页面

我需要修改什么才能将我的后端调用重定向到我的后端?

我在 ubuntu 16.04 上使用 nginx 1.10.3,我的前端 Dockerfile 如下所示:

FROM ubuntu:16.04

# Install curl, nodejs and nginx
RUN apt-get update && \
apt-get install -y curl && \
curl -sL https://deb.nodesource.com/setup_8.x | bash - && \
apt-get install -y nodejs nginx && \
rm -rf /var/lib/apt/lists/*

# Create directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Copy and build rest of the app
COPY . /usr/src/app
RUN npm install
RUN node_modules/@angular/cli/bin/ng build --prod
RUN cp -a dist/. /var/www/html

# Configure and start nginx
COPY frontend.conf /etc/nginx/conf.d

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

编辑:有关后端服务的信息

后端服务监听/api/v1/data 上的 get 和 post 请求,并且可以通过名为 backend-service 的服务在 Kubernetes 中访问。

编辑2:Nginx access.log

https://gist.github.com/Steffen911/a56e3175bf12e511048d01359a475724

172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET / HTTP/1.1" 200 380 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET /styles.d41d8cd98f00b204e980.bundle.css HTTP/1.1" 200 0 "http://192.168.99.100:30497/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET /inline.c9a1a6b995c65c13f605.bundle.js HTTP/1.1" 200 1447 "http://192.168.99.100:30497/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET /polyfills.117078cae3e3d00fc376.bundle.js HTTP/1.1" 200 97253 "http://192.168.99.100:30497/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET /main.3e9a37b4dd0f3bf2465f.bundle.js HTTP/1.1" 200 64481 "http://192.168.99.100:30497/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET /vendor.146173c1a99cc2172a5f.bundle.js HTTP/1.1" 200 661261 "http://192.168.99.100:30497/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET /api/v1/data/ HTTP/1.1" 404 209 "http://192.168.99.100:30497/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET /assets/home.jpg HTTP/1.1" 200 2608 "http://192.168.99.100:30497/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET /assets/busy.gif HTTP/1.1" 200 48552 "http://192.168.99.100:30497/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET /assets/background_light.png HTTP/1.1" 200 170599 "http://192.168.99.100:30497/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET /assets/google.svg HTTP/1.1" 200 2232 "http://192.168.99.100:30497/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET /assets/email.svg HTTP/1.1" 200 1596 "http://192.168.99.100:30497/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:40 +0000] "GET /favicon.ico HTTP/1.1" 200 198 "http://192.168.99.100:30497/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
172.17.0.1 - - [13/Aug/2017:13:11:44 +0000] "GET /api/v1/data/ HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"

error.log 文件为空。

Edit3:新的 nginx 版本和其他 SO 线程

我还尝试了 nginx 1.12.1,它显示了相同的行为。这个问题的答案也没有帮助:nginx proxy_pass 404 error, don't understand why

Edit4:我上传了一个在 GitHub 上重现我的问题的最小示例

https://github.com/Steffen911/nginx-sample

最佳答案

从您对 nginx 进行的故障排除来看,您拥有的 nginx 配置文件实际上没有任何效果 - 您报告除了索引页面以外的所有内容以及所有指令都出现 404 Not Found 错误,从 location/ 中的 try_files 到更具体的 location 中的 proxy_passreturn 200 test ^~/api,没有效果。

因此,问题似乎出在 Dockerfile 中 - 似乎大多数其他 NGINX + Docker 教程都删除了默认配置(例如,使用 RUN rm/etc/nginx/conf.d ) d/default.conf),而您的文件缺少任何此类删除。

事实上,Debian/Ubuntu似乎有可疑实用程序的非标准目录,名为 /etc/nginx/sites-available/etc/nginx/sites-enabled ,默认情况下,必须包含 default具有假定的 listen 80 default_server 的文件,有效地优先于任何其他 listen在没有更具体的 server_name 的情况下使用同一端口。

<小时/>

因此,存在多个独立的解决方案:

<小时/>
  • 不要使用 Debian/Ubuntu 提供的那些根本损坏的软件包。我曾经花了很多时间试图找出原因我的配置不起作用,只是注意到甚至来自 emacs 的备份文件例如 test.conf~ 通过 Debian 默认的 include/etc/nginx/sites-enabled/*; 包含在 Debian 中。启用站点是邪恶的。

    请注意NGINX provides official binary packages for most distributions ,这不会有这个问题,因为它不会尝试在其 /etc/nginx/conf.d/default.conf 中定义 default_server ,而是使用 server_name localhost; 执行 listen 80;,在大多数情况下会自动让路。

    例如,将 Dockerfile 中的 FROM ubuntu:16.04 替换为 FROM nginx 以使用 NGINX 官方镜像。

    <
<小时/>
  • 如果仍在 Debian/Ubuntu 中使用 nginx,请确保RUN rm/etc/nginx/sites-enabled/default 在您的 Dockerfile 中删除 default_server listen
<小时/>
  • 使用server_name指令定义基于主机名的服务器,可能与 listen 一起使用指令也带有 default_server 参数。

    请注意,重复的 server_name 规范会导致配置警告(具有 [warn] 严重性),但重复的 default_server 会导致配置警告。配置错误([emerg] 严重性),这可能有助于尽早解决问题。

关于docker - nginx proxy_pass 导致 404 Not Found 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45660042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com