nginx proxypass monit 链接

nginx proxypass monit 链接

我正在尝试设置 Nginx 以使用 proxy_pass 将请求转发到多个后端服务。

加载https://example.com/monit成功,但是页面内的链接https://example.com/sshd指向https://example.com/monit/sshd

我正在运行 monit 5.2.5

我尝试过使用和不使用下面的重写规则。

配置文件;

代理配置文件

location /monit {
#       rewrite /monit/(.*) /$1 break;
        proxy_pass        http://localhost:2812/;
        include proxy.inc;
}
.... more entries ....

站点启用/主要

server {
    listen 443;

    server_name example.com;
    server_name_in_redirect off;

    include proxy.conf;

    ssl on;
}

代理公司

proxy_connect_timeout   59s;
proxy_send_timeout      600;
proxy_read_timeout      600;
proxy_buffer_size       64k;
proxy_buffers           16 32k;
proxy_pass_header       Set-Cookie;
proxy_redirect          off;
proxy_hide_header       Vary;

proxy_busy_buffers_size         64k;
proxy_temp_file_write_size      64k;

proxy_set_header        Accept-Encoding         '';
proxy_ignore_headers    Cache-Control           Expires;
proxy_set_header        Referer                 $http_referer;
proxy_set_header        Host                    $host;
proxy_set_header        Cookie                  $http_cookie;
proxy_set_header        X-Real-IP               $remote_addr;
proxy_set_header        X-Forwarded-Host        $host;
proxy_set_header        X-Forwarded-Server      $host;
proxy_set_header        X-Forwarded-For         $proxy_add_x_forwarded_for;
proxy_set_header        X-Forwarded-Ssl         on;
proxy_set_header        X-Forwarded-Proto       https;

答案1

我修改了重写规则,并确保清除了缓存,并且这样做有效;

location /monit {
        rewrite ^/monit/(.*) /$1 break;
        proxy_pass        http://localhost:2812/;
        include proxy.inc;
}

答案2

有个技巧可以做到这一点。在 monit 中,我为每个检查使用一个固定的起始字符,例如减号:

check process -openvpn with pidfile /run/openvpn/server.pid
  start = "/usr/bin/systemctl start openvpn.service"

在 nginx 的配置中我引入了一个以 '/-' 开头的位置,当找到时,它将重定向到 referer:

location /monit/ {
  rewrite ^/monit/(.*) /$1 break;
  proxy_ignore_client_abort on;
  proxy_set_header X-uri "check-headeruri";
  add_header X-debug-message $http_referer;
  proxy_cache_bypass 1;
  proxy_pass http://<mylocaladdress>:2812/;
}
location /- {
  proxy_cache_bypass 1;
  return 302 $http_referer;
}

引用者仍然具有正确的 URI,因此“返回 302”即可解决问题。此外,浏览器被迫不使用页面的缓存版本,因此需要 proxy_cache_bypass。

运用这个技巧后,我不再收到 404 错误。

答案3

遗憾的是,monit 没有允许它定义其请求的 BASE_URL 的配置,这意味着它将始终将其服务直接添加到 / 下,这会破坏您的 /monit 代理匹配。:( 一种解决方法,但可能很丑陋,是以您可以在 nginx 中匹配该名称的方式命名您的 monit 服务。

这是唯一能做到的方法,除非你以某种方式破解监控源,将 URL 更改为http://本地主机:2812/monit/但我相信那更难?

另一个选择可能是,如果您可以在并行端口上运行 nginx,并只重写针对此端口的访问以访问 monit URL/端口,那么您就可以重写/代理整个 / 而不是 /monit,从而使链接正常工作。这取决于您的公共 IP 和可用端口,但应该可以解决问题吗?

相关内容