vicanso / pingap

A reverse proxy like nginx, built on pingora, simple and efficient.
http://pingap.io/pingap-zh/
Apache License 2.0
311 stars 19 forks source link

一些pingap的功能需求(为开发一个文档托管平台做准备) #52

Open i18nsite opened 4 hours ago

i18nsite commented 4 hours ago

我在开发一个基于机器翻译的markdown文档做国际化的工具( https://i18n.site )。

接下来,我想做一个文档托管的平台(类似 https://about.readthedocs.com

我想选一个rust写的服务器,方便二次开发。

我之前也提过一些问题

https://github.com/vicanso/pingap/issues/30#issuecomment-2333174071

今天想进一步探讨下pingap用来做文档托管平台的可行性(我比较刚需的一些特性)。

我会把文件会放在对象存储上,如果前面用pingap反向代理,可能需要以下的特性。

  1. 根据子域名前缀做不同的 url 重写,比如 访问 https://abc.md1.host ,请求重写到

https://upsteam/abc/index.html

这个怎么做,我看了Upsteam的文档没搞明白

  1. 代理缓存和清理代理缓存(不用频繁的访问后面的对象存储,用户更新文档,我需要刷新对应的缓存)

  2. 我想支持用户用cname绑定自己的域名,有没有办法动态地用api添加域名和对应的重写规则。

  3. 持久化配置可以支持从redis中读取吗(并且支持SELECT数据库)?(我没搭建etcd,用redis比较方便)

另外,就是如果有多台pingap服务器,有办法让他们共享配置吗(比如,一台能写入,其他只读),然后用redis stream ( https://redis.io/docs/latest/develop/data-types/streams/ ) 通知配置的更新。

  1. 如何从远程获取https证书

因为用户绑定域名都需要不同的https证书 我会把证书放在一个https网址上(比如 https://user:password@xxx.com/abc.com.cert) 有没有办法通过某种方式当pingap发现本地缓存的域名证书不存在(或者过期)的时候,从网址尝试加载域名证书

  1. https 证书要过期的时候,再次从网址请求,不重启服务器和影响其他其他域名访问请求的情况下,自动热重载此域名的证书

我对rust代码比较熟悉,不过还没研究过pingap的代码,也许可以参与部分功能的二次开发,添加这些功能。

不过目前还有一些其他需求在开发,可能需要1-2月后才能进入这个托管平台的开发。

等托管平台做好之后,也可以帮忙做一些pingap文档国际化的相关工作( https://fcdoc.github.io 这是我最近给朋友做的一个文档国际化的演示 )

vicanso commented 4 hours ago

1、变量未支持子域名,因此请求重写也无法支持此类型,有nginx或者其它的示例,我参考一下它们的规则实现 2、缓存可以cache插件可以实现,建议使用短缓存的cache-control,若使用较为长时间的缓存,则需要主动通过purge来清除 3、admin管理后台就是使用接口更新配置,可以每次覆盖location的配置 4、持久化现只支持文件或者etcd的形式存储,如果是多机器部署,建议单独创建cp节点用于配置,其它实例监听配置更新执行upgrade即可 5、不支持,现只能自己去刷新配置中的证书配置。此类处理有否标准的处理方式,如果有可以提供我参考 6、若配置为使用let's encrypt,在证书要过期时会自动刷新。若是在配置中直接配置证书对应的pem数据,在配置更新时也会自动刷新(无中断式)

最后感谢你愿意尝试使用pingap,暂时pingap还只是个人业务开发,可能还会有较多的调整,尽量在1.0版本之前保证调整时的兼容性。

i18nsite commented 1 hour ago
  1. nginx 可以这么写 https://tsingpost.com/content/devops/nginx.html#nginx%E6%B3%9B%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90%EF%BC%8C%E5%AE%9E%E7%8E%B0%E5%A4%9A%E4%B8%AA%E4%BA%8C%E7%BA%A7%E5%9F%9F%E5%90%8D

    server {
        listen       80;
        server_name  ~^(?<subdomain>.+)\.yourdomain\.com$;
        root   html/$subdomain; 
  2. 主动通过purge来清除这个现在有文档吗?(也可以作为一个trait暴露出来,这样我可以干脆在程序内部用拉的方式实现监听更新列表,自动purge)

  3. 这个配置存储和加载能抽象出一个trait吗?我可以写一个支持redis库实现这个trait,作为一个feature按需启用(我觉得应该有这么3个接口,第一个是启动加载,第二个保存,第三个是一个参数为添加配置回调函数的更新函数,方便用来做监听部分配置的更变并更新)

  4. 证书生成的保存、加载和过期更新也能给一个trait吗? 我可以来实现它。 因为如果服务器比较多,没必要每个都申请一次,let's encrypt也有访问频率的限制。另外我可以定制一些逻辑,比如支持泛域名证书(因为我打算每个托管文档用独立的子域名,这样没必要每个文档都申请一个证书,我可以用acme.sh生成好了之后,这里就只负责加载就好)。

现在rust支持异步的trait了,感觉这种接口应该都是async的 ( Rust 1.75带来的async traits支持

  1. 我知道项目是个人业务,我的翻译目前也是个人项目,我也是基于rust写的后端

我希望可以方便提供一些二次开发的trait、hook, 这样我可以按我的需求定制一些逻辑,并作为feature合并到pingap中去

在时间上,因为我可能还需要等1-2个月才有空写这个托管平台,所以没那么紧迫,我就想能提前商量好一些方便我二次开发的trait,我可以在这个基础上去定制需求。