Ran*_*ndy 5 nginx reverse-proxy docker
我将 nginx 设置为 docker 容器中的反向代理,以链接到容器外的站点。我有一个 vhost 配置设置如下(我尝试在家庭助理的位置之前添加 ^~ ):
server { # simple reverse-proxy
listen 80;
location / {
proxy_pass http://192.168.1.99:6789;
}
location ^~ /home-assistant {
proxy_pass http://192.168.1.99:8123/;
}
location /calibre-web/ {
proxy_pass http://192.168.1.99:8181/;
}
}
Run Code Online (Sandbox Code Playgroud)
对于 home-assistant 和 calibre-web 站点,页面都会加载,但我收到所有其他项目(图像、CSS 等)的 404 错误。 如果我尝试单击应用程序中的链接,它会将我链接到 192.168.1.99/file 而不是 192.168.1.99/site-folder/file。下面是日志中的一些记录(注意一个 200 响应和其他 404 响应)。我在这里做错了什么?在此先感谢您的帮助。
192.168.1.6 - randy [15/Aug/2016:03:15:42 +0000] "GET /frontend/panels/dev-template-0a099d4589636ed3038a3e9f020468a7.html HTTP/1.1" 404 199 "http://192.168.1.99/home-assistant/" "Mozilla/5.0 (X11; CrOS x86_64 8350.60.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.85 Safari/537.36"
192.168.1.6 - randy [15/Aug/2016:03:15:42 +0000] "GET /frontend/panels/logbook-66108d82763359a218c9695f0553de40.html HTTP/1.1" 404 199 "http://192.168.1.99/home-assistant/" "Mozilla/5.0 (X11; CrOS x86_64 8350.60.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.85 Safari/537.36"
192.168.1.6 - randy [15/Aug/2016:03:17:54 +0000] "GET /home-assistant/ HTTP/1.1" 200 1654 "-" "Mozilla/5.0 (X11; CrOS x86_64 8350.60.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.85 Safari/537.36"
192.168.1.6 - randy [15/Aug/2016:03:17:55 +0000] "GET /static/icons/favicon-192x192.png HTTP/1.1" 404 91 "http://192.168.1.99/home-assistant/" "Mozilla/5.0 (X11; CrOS x86_64 8350.60.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.85 Safari/537.36"
192.168.1.6 - randy [15/Aug/2016:03:17:55 +0000] "GET /static/core-457d5acd123e7dc38947c07984b3a5e8.js HTTP/1.1" 404 91 "http://192.168.1.99/home-assistant/" "Mozilla/5.0 (X11; CrOS x86_64 8350.60.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.85 Safari/537.36"
Run Code Online (Sandbox Code Playgroud)
这是我的根 nginx.conf 的副本。我猜错误就在这里的某个地方,我就是不知道在哪里。
您正在尝试从原始应用程序未知的位置代理传递请求。在 docker 容器应用程序中,仍然认为它是从网站根目录 ( http://192.168.1.99:8123/) 访问的,因此它会生成与 相关的所有 URL /,而不是与您的/home-assistant/或 相关的 URL /calibre-web/。
有很多方法可以解决这个问题,您应该选择最适合您的方法:
首先,在使用ngx_http_sub_module向客户端提交结果之前,它会替换从代理应用程序收到的每个链接。默认情况下它没有启用,因此如果您的发行版没有它,您可能必须从源代码编译 nginxnginx -V (以检查此模块 run 的可用性,该模块应该显示--with-http_sub_module在配置参数的某处)。
如果您选择此方法,请将以下指令添加到您的配置中:
location ^~ /home-assistant {
rewrite ^/home-assistant(/.*)$ $1 break;
proxy_pass http://192.168.1.99:8123/;
sub_filter "<head>" "<head><base href=\"${scheme}://${host}/home-assistant\">";
}
Run Code Online (Sandbox Code Playgroud)
将 docker 容器内的应用程序移动到/home-assistantroot 而不是 root,因此它将在与该路径而不是 root 相关的服务内容中生成所有 URL/。这是一个明显的(可能也是最简单的)解决方案,它根本不需要接触 nginx 配置(而是在 docker 内编辑配置)
根据Referer标头确定应使用哪个上游。取自这里。看起来很聪明,尽管我自己不会在生产中使用它(注意它仅适用于 css/js 文件)。
location ~* ^/(css|js)/.+\.(css|js)$ {
#checking if referer is from home-assistant
if ($http_referer ~ "^.*/home-assistant"){
return 417;
}
#checking if referer is from calibre-web
if ($http_referer ~ "^.*/calibre-web"){
return 418;
}
}
error_page 417 /home-assistant$request_uri;
error_page 418 /calibre-web$request_uri;
location ^~ /home-assistant {
proxy_pass http://192.168.1.99:8123/;
}
location /calibre-web {
proxy_pass http://192.168.1.99:8181/;
}
Run Code Online (Sandbox Code Playgroud)
如果我是你,我会选择#2 - 将应用程序移动到容器内,这是获得所需内容的最简单且最不容易出错的方法。
PS 我完全忘记了你可以直接从硬盘驱动器提供静态文件,因为你的后端与 nginx 位于同一服务器上。它将需要一些依赖于应用程序的配置,但最终您将获得最有效的解决方案。
| 归档时间: |
|
| 查看次数: |
13749 次 |
| 最近记录: |