Ste*_*itz 5 proxy nginx docker kubernetes
我有一个在安装了nginx的docker ubuntu映像中运行的角度应用程序。我想将此映像部署到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;
}
}
Run Code Online (Sandbox Code Playgroud)
在/或/#/ 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;"]
Run Code Online (Sandbox Code Playgroud)
编辑:有关后端服务的信息
后端服务侦听/ api / v1 / data上的获取和发布请求,并且可以通过名为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"
Run Code Online (Sandbox Code Playgroud)
error.log文件为空。
Edit3:新的Nginx版本和其他SO线程
我还尝试了nginx 1.12.1,它显示了相同的行为。这个问题的答案也没有帮助:nginx proxy_pass 404错误,不明白为什么
Edit4:我上传了一个最小的示例,该示例在GitHub上重现了我的问题
\n\n\n对 /api/v1/data 的调用仅显示默认的 nginx 404 Not Found 页面
\n
该proxy_pass指令本身不太可能生成默认的 nginx404 Not Found错误页面。
可能404是由上游生成的,在这种情况下,如果没有进一步的指令,nginx 将简单地从上游传播消息。如果您在 404 中获得 nginx 签名,则意味着上游也在运行 nginx,这可能会让您感到惊讶,从而揭示了配置的罪魁祸首。
如果404确实是由 nginx 生成的,那么可能会出现location不匹配的情况。尝试return 200 thisisatest;代替proxy_pass解决问题。
但是,在您的具体情况下,location ^~ /api {几乎不可能有一个指令与/api/v1/data/请求 URI \xe2\x80\x94 不匹配,我唯一能想到的是,如果您try_files的server配置中可能有一个在任何其他指令之外的配置location,那么可以可能会使所有位置指令无效。您确定您的try_files内容完全包含在location /上下文中吗?
从对nginx的故障排除看来,您拥有的nginx配置文件实际上没有任何作用-您报告404 Not Found除索引页面以外的所有内容都出现错误,并且所有指令从try_filesin location /到proxy_pass以及return 200 test更具体地location ^~ /api来说都无效, 。
因此,问题似乎出在Dockerfile-大多数其他NGINX + Docker教程似乎删除了默认配置(例如使用RUN rm /etc/nginx/conf.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的default包含在Debian中include /etc/nginx/sites-enabled/*;。
网站启用是邪恶的。
请注意,NGINX为大多数发行版提供了官方的二进制软件包,这不会出现此问题,因为在大多数情况下,它不会尝试default_server在自己的中定义a /etc/nginx/conf.d/default.conf,而是使用listen 80;with server_name localhost;进行自动退出。
例如,在您要使用的NGINX官方映像中替换FROM ubuntu:16.04为。FROM nginxDockerfile
RUN rm /etc/nginx/sites-enabled/default您的Dockerfile去除default_server listen。使用server_name伪指令来定义基于主机名的服务器,也可以将其与listen带有default_server参数的伪指令一起使用。
请注意,重复的server_name规范会导致配置警告([warn]严重性),但是重复default_server是配置错误([emerg]严重性),这可能有助于更早地解决问题。
| 归档时间: |
|
| 查看次数: |
6245 次 |
| 最近记录: |