- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个在安装了 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 上重现我的问题的最小示例
最佳答案
从您对 nginx 进行的故障排除来看,您拥有的 nginx 配置文件实际上没有任何效果 - 您报告除了索引页面以外的所有内容以及所有指令都出现 404 Not Found
错误,从 location/
中的 try_files
到更具体的 location 中的
,没有效果。proxy_pass
和 return 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 官方镜像。
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/
所以我目前在 http://www.example.com 有一个网站我希望来自的所有请求 http://www.example.com/api/v2/ 被代理到 http://api.v2.com/
我有一个服务在低端机器上运行(在 Nginx 之后)并且 CPU 性能相当弱。其中一个 API 需要大量的 CPU 时间,因此需要限制最大并发请求数。但是如果请求被缓存,它可以更快地响应。 我想做的是
我的 Nginx 配置类似于: server { listen 80; listen 443; server_name api.mysite.dev; location
如何设置 nginx 将单个文件夹反向代理到一台服务器,并将根目录的其余部分反向代理到另一台服务器? 根“/”由CMS管理,而“其他”是我自己的程序(独立于CMS)。 这是我目前的配置 server
我正在尝试使用此配置设置 nginx。要访问 backend.mygreat.server.com,我必须通过我的公司代理,即 myproxy.server.com:80。 因此,我在/etc/env
当 proxy_pass 设置为变量时,Nginx 似乎无法支持重定向。有没有办法实现这个功能,例如以某种方式链接服务器或其他解决方法?不支持的原因是什么? .conf 是: proxy_pass $
我正在尝试在 nginx 中使用 proxy_pass 将请求转发到本地主机上的另一个端口,如下所示: location /foo { rewrite ^/foo/(.*) /$1 break
我有一个网站叫 http://example.com ,运行的应用程序可以通过 http://example.com/app1 访问. app1 位于 nginx 反向代理后面,如下所示: locat
下面是一个非常标准的 nginx proxy_pass 设置: server { listen 80; server_name ireport.jungdigital.com; acces
当 nginx proxy_pass 是一个动态值,预计通过替换 URL 中的主机名部分来构建时,nginx 无法代理请求并出现错误:没有定义解析器来解析服务,其中服务=1 美元。它似乎只是尝试解析服
我的 nginx 配置有问题。 当我这样设置配置时: server { server_name redmine; listen 80;
我有以下设置 主服务器 - 称之为 https://master.com 从属服务器 - 称之为 https://slave.com 两者都在 Ubuntu 16.04 上运行 Nginx 在主服务器
我在 Doccker 容器中使用 Nginx 来托管我的应用程序 我正在尝试将 Nginx 配置为将到/.well-known/目录的流量代理到另一个处理 letsencrypt 过程以设置和更新 S
我开发了一个 URL 缩短 Web 应用程序。 它由两个独立的 docker 容器组成:一个包含后端 REST api,另一个包含前端静态网站。 这两个容器链接到一个 nginx 容器。 这个 ngi
我有一个从外部地址接收请求的服务,例如https://example.com ,以及一个内部地址,例如本地主机:8080。 我必须使所有针对此服务的请求看起来好像它们将被定向到相同的主机名。 我最初的
我正在尝试通过代理传递在 nginx 中执行 auth_request,但我不断收到: 1 auth request unexpected status: 301 这是我的配置: server {
我有两台服务器: NGINX(它将文件 ID 交换为文件路径) Golang(它接受文件 ID 并返回它的路径) 例如:当浏览器客户端向 https://example.com/file?id=123
http://mydomain.com/ => 127.0.0.1:4567 但 http://mydomain.com/FOO => 127.0.0.1:3000 那可能吗? 到目前为止,我有: u
我想将请求传递给上游服务器。原始 url 不受密码保护,但上游服务器受密码保护。我需要在请求中注入(inject)一个基本身份验证用户名/密码,但在执行时会出错: upstream supportba
我遇到了以下问题,我希望能够从带有尾部斜杠的主网站访问代理传递的位置(托管 docker 容器中的 React/NextJs webApp)和 没有尾部斜杠。 目前,当我点击: http://my-w
我是一名优秀的程序员,十分优秀!