nginx 代理 supervisor WebUI 到子目录。supervisor WebUI 开放的地址是在根目录下,直接代理到公网的话会占用根目录,所以推荐将其代理到子目录下。
接上篇 linux进程监管工具Supervisor ,配置后又想远程操控一些硬件、程序的启停。所以搜罗了解了 nginx 代理。
1. 代理
用到的知识有,
- nginx 请求参数,参考链接: nginx 配置$Query String
- location 匹配,参考链接: Nginx的location详解
- rewrite 的 last和 break,参考链接: nginx rewrite 指令last break区别
配置为:
location ~ /chdpath {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host/chdpath/;
proxy_redirect off;
rewrite ^/chdpath(.*)$ /$1 break;
proxy_pass http://127.0.0.1:5555;
}
location ~ /(index\.html|tail\.html) {
set $param $1;
if ($query_string ~ "processname.+") {
# add_header Content-Type text/plain; # debug
# return 200 $param; # debug
rewrite ^ /chdpath/$param?$1 last;
}
}
需要修改 chdpath
为自己的子目录,以及 proxy_pass
字段的端口号。
第一部分为反代理 supervisor WebUI,第二部分反代理 supervisor WebUI 根目录的内容到子地址,效果为将 supervisor 原本地址,如 yourhost.com/index.html?processname=A-camera&action=start 经过第二部分代理到 yourhost.com/chdpath/index.html?processname=A-camera&action=start, 再由第一部分传递信息给 supervisor web 后台。
这里解释下第二部分:
- location 匹配:
~
:区分大小写的正则匹配,匹配成功立即返回结果并结束解析过程/(index\.html|tail\.html)
:匹配地址 index.html 或 tail.html,其中 \. 意为将 . 标记为原义字符而非元字符,外层括号表示匹配并获取这一组匹配
set $param $1;
:$1
是上面匹配并获取的结果,这里其等于 index.html 或 tail.html,并将此结果赋值给 param。因为后面会再次正则匹配,所以需要赋值给 param 保存起来。if ($query_string ~ "processname.+")
:如果请求参数以 processname 开头就进入函数体,并且将此匹配结果保存到变量$1
。rewrite ^ /chdpath/$param?$1 last;
:rewrite
: 重定向,此处将^
(字符串的起始位置,后面跟空表示任意的地址) 定向到 /chdpath/\$param?\$1。$param
:上面解释 2 中的变量,内容是 location 匹配的结果?
: 去除后面的请求参数$1
: 解释3 中的变量,内容是请求参数匹配结果last
: 在 location 内部时,停止当前这个请求,并根据 rewrite 匹配的规则重新发起一个请求。新请求重新开始执行,并匹配到第一部分,让第一部分proxy_pass。这里提下 break 作用是跳过当前请求的 rewrite 阶段,并继续执行本请求的其他阶段,比如第一部分后续的 proxy_pass。
2. supervisor Web界面美化
supervisor Web文件在: /usr/local/lib/python3.5/dist-packages/supervisor/ui
,主界面文件是: status.html
,可以在里面加自己的样式以及其他内容。
有一些第三方的插件,可以集中管理多个设备的 supervisor ,如:cesi, multivisor, supervisord-monitor, flatfish
不过现在都有些不完美(2019年6月17日)。。。要么不支持显示日志(multivisor),要么不支持移动端(supervisord-monitor),要么不支持用户认证(cesi, multivisor),flatfish 算是功能比较全界面也支持多设备,但是功能还没有写完,有很多 bug。 等着他们更新完善把~。