使用 nginx 代理 webmin

使用 nginx 代理 webmin

由于各种原因,我试图在 nginx 后面代理 webmin,但这些原因超出了这个问题的范围。但是我已经尝试了一段时间,但似乎无法弄清楚,我想我已经用尽了我能想到的所有配置文件的排列方式。

我现在拥有的:相关的 nginx 配置(删除了注释掉的选项,我尝试了很多)

    # Proxy for webmin
    location /admin/quackwall-webmin {
        proxy_pass http://127.0.0.1:10000; # Also tried ending with /admin/quackwall-webmin
        proxy_set_header        Host            $host;
    }

/etc/webmin/config- 相关部分

webprefix=/admin/quackwall-webmin
webprefixnoredir=1
referer=(nginx domain name)

Webmin 本身位于标准端口上,临时监听所有地址以进行调试。SSL 目前已被禁用。

因此,我发出了登录页面的标准请求。但是,所有 CSS 和图像都损坏了,所有资源都返回了标准登录页面。在 webmin miniserv 日志中,我看到

127.0.0.1 - - [29/Oct/2012:12:29:00 -0400] "GET /admin/quackwall-webmin/session_login.cgi HTTP/1.0" 401 2453
127.0.0.1 - - [29/Oct/2012:12:29:01 -0400] "GET /admin/quackwall-webmin/unauthenticated/style.css HTTP/1.0" 401 2453
127.0.0.1 - - [29/Oct/2012:12:29:01 -0400] "GET /admin/quackwall-webmin/unauthenticated/sorttable.js HTTP/1.0" 401 2453
127.0.0.1 - - [29/Oct/2012:12:29:01 -0400] "GET /admin/quackwall-webmin/unauthenticated/toggleview.js HTTP/1.0" 401 2453

因此所有 URL 都返回 401。有趣的是,ngrep 似乎显示请求在 nginx 和 webmin 之间的后端通信上成功

T 127.0.0.1:58908 -> 127.0.0.1:10000 [AP]
  POST /admin/quackwall-webmin/session_login.cgi HTTP/1.0..Host: (host)..Connection: close..User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW
  64; rv:16.0) Gecko/20100101 Firefox/16.0..Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8..Accept-Language: en-US,en;q=0.5.
  .Accept-Encoding: gzip, deflate..Referer: http://(host)/admin/quackwall-webmin/session_login.cgi..Cookie: testing=1..Cache-Control: ma
  x-age=0..Content-Type: application/x-www-form-urlencoded..Content-Length: 41....page=%2F&user=(user)&pass=(pass)

T 127.0.0.1:10000 -> 127.0.0.1:58908 [AP]
  HTTP/1.0 200 Document follows..

这些配置选项和其他配置选项的各种排列组合都显示出类似的结果,nginx 发送给 webmin 的 URL 要么是/admin/quackwall-webmin/session_login.cgi/admin/quackwall-webmin//session_login.cgi,要么只是/session_login.cgi。所有请求都给出 201 未经身份验证的响应。所有请求,即使是那些有点成功的请求(例如我实际上可以加载页面的资源)

是否支持在 webmin 中更改 webprefix?我做错了什么?我还能尝试什么?

答案1

哇,我终于想通了。真希望我在悬赏之前就搞清楚了……

本质上,你必须对你的配置非常具体,因为 webmin 总是想重定向你,而 nginx 很难尝试重写和重定向所有内容

为了帮助下一个人,请确保你已经告诉 webmin 它将位于另一个目录中/etc/webmin/config

笔记:在这个答案的其余部分,斜线非常重要。删除斜线会导致原始问题中的痛苦和折磨

webprefix=/admin/quackwall-webmin
webprefixnoredir=1

接下来,你需要配置 nginx。这是最难的部分,但我试图解释每个部分的作用

# Proxy for webmin
# Last slash is important
location /admin/quackwall-webmin/ {
    # Tell nginx that we want to proxy everything here to the local webmin server
    # Last slash is important
    proxy_pass http://127.0.0.1:10000/;
    # Change the response Location: header to come from our proxy directory, not the server
    # Fixes initial redirect after login
    proxy_redirect http://$host:10000/ /admin/quackwall-webmin/;
    # Also fixes initial redirect after login
    proxy_set_header        Host            $host;
}

重新启动 nginx 和 webmin,然后它们都应该可以正常工作。


附注:如果你通过 nginx 代理 webmin,并且 webmin 恰好与 nginx 位于同一台服务器上,那么你可以设置这些选项,/etc/webmin/miniserv.conf这样它就不会暴露

bind=127.0.0.1
sockets=

答案2

location /admin/quackwall-webmin/ {
    proxy_pass http://127.0.0.1:10000/;
    proxy_set_header Host $host;
}

相关内容