nginx 代理传递给supervisord

nginx 代理传递给supervisord

我正在尝试使supervisord Web界面在http://example.com/supervisor

尝试了很多个小时后,我终于可以用斜线 (http://example.com/supervisor/)。我也让它显示时不带尾部斜杠,但图像/css 等均不起作用。

我是 nginx 新手,所以我猜我的重写规则有问题。第一次重写时我尝试添加尾部斜杠。

监控配置文件

[unix_http_server]
  file = /tmp/supervisor.sock  ; (the path to the socket file)
  chmod=0700                   ; socket file mode (default 0700)

nginx.conf

location ~* ^/supervisor/? {
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header Host $http_x_host;
     proxy_set_header X-NginX-Proxy true;

     rewrite ^(.*[^/])$ $1/;
     rewrite /supervisor/(.*) /$1 break;
     proxy_pass http://unix:/tmp/supervisor.sock:;
     proxy_redirect off;
     proxy_buffering off;
}

我已经为此苦苦挣扎了好久,不知道该怎么办。有人能给我指明正确的方向吗?

谢谢。

编辑: 谢谢 Richard,这帮助我更进一步。我不得不将重定向更改为return 301 $scheme://$host$request_uri/;才能在这里工作,但现在它重定向到主管/

现在看起来没问题了,但是按刷新、重启等命令可以正常工作,但不会返回到 /supervisor/。我将supervisord 更改为 inet_server 进行测试,当转到 example.com:9001 时一切正常。我尝试代理到 inet 服务器,但仍然不起作用。例如刷新按钮发送:/supervisor/index.html?action=refresh并返回/?message=Page%20refreshed%20at%20Sat%20Jul%20%201%2014%3A10%3A27%202017 它看起来没有返回到 /supervisor/,而是返回到服务器的根目录(example.com/?message=...)?有什么想法可以解决这个问题吗?

编辑2: 好吧,在谷歌搜索了几个小时后,我找到了这个对我有用的解决方案。读到我应该远离 nginx 中的 if,所以它可能不是一个很好的解决方案。至少它现在在这里有效。我将其添加到我的 conf 中:

if ($http_referer ~* example.com/supervisor ) {
    set $test supervisor;
}

if ($request_uri ~* message ) {
    set $test  "${test}+message";
}

if ($request_uri !~ supervisor ) {
    set $test  "${test}+addsup";
}

if ($test = "supervisor+message+addsup") {
  return $scheme://$host/supervisor$request_uri;
  break;
}

答案1

如果使用路径相对 URI 指定资源文件,浏览器可能需要看到尾部斜杠。在这种情况下,您可以重定向/supervisor/supervisor/,这也会简化您现有的location块。例如:

location = /supervisor {
    return 301 /supervisor/;
}
location ^~ /supervisor/ {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_x_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://unix:/tmp/supervisor.sock/;
    proxy_redirect off;
    proxy_buffering off;
}

请注意,第二个块现在是一个前缀位置,而前一个rewrite语句现在通过proxy_pass(使用尾随/)实现。参见这个文件了解更多信息。

相关内容