我使用Clojure的Aleph库编写了一个相对简单的HTTP服务器.这不是很复杂:
(ns cxpond.xmlrpc.core
(:gen-class)
(:require [aleph.http :as http]))
(defn handler [req]
{:status 200
:headers {"Content-Type" "text/plain"}
:body "HELLO, WORLD!"})
(defn -main [& args]
(http/start-server service/handler {:port 8005}))
Run Code Online (Sandbox Code Playgroud)
显然它非常简单,并且非常接近Aleph的文档中给出的示例.编译很好,但是当我运行它(通过lein run)它只是......什么都不做.该计划立即退出; 显然它不会听8005端口或类似的东西.我在这里错过了什么?显然,在Aleph中启动服务器时,我需要做一些其他工作.
我有一个基于 Netty 的服务器,它使用 PEM 编码的证书文件,这些文件定期重新发布(通过 Let's Encrypt)。Netty 完全支持加载 PEM 加密材料,但是稍后重新颁发证书(.cer 文件)时,需要重新启动服务器才能看到它。
到目前为止,我一直通过添加自定义通道初始化处理程序来添加重新加载证书的逻辑并添加从中构建的适当 SSLHandler 来处理此问题。但是现在我想使用 Aleph,它需要一个用于 TLS 的 Netty SSLContext 对象。
随着 Let's Encrypt 及其相对短暂的证书越来越受欢迎,这似乎是一个热门和普遍的问题,我想正确解决它。这意味着创建 SSLContext 的 Netty 兼容方式,如果它们在磁盘上发生更改,它将重新加载其证书。
我想出的一些方法:
创建一个动态信任管理器/信任存储,然后将其插入 Netty SSLContextBuilder。可以使用这是一个起点https://jcalcote.wordpress.com/2010/06/22/managing-a-dynamic-java-trust-store/,并使用一些代码以编程方式加载密钥/证书从 PEM 获取 KeyStore(Netty 的 PEM -> KeyStore 逻辑在 SSLContext 类中不是公开的)。好处:也可以在 Netty 之外使用。缺点:复杂且不重用 Netty 的现有逻辑来加载 PEM 密钥和证书。
将此添加为 Netty 支持的选项。
任何人都可以指出我的解决方案,或提出构建解决方案的最佳方法吗?
下面详细说明的路线设置会导致错误:Wrong number of args (0) passed to: PersistentArrayMap任何人都可以帮我理解这个错误以及如何解决它?
(defn sign-in [req]
({:status 200 :body "hello world" :headers {"content-type" "text/plain"}}))
(defroutes paths
(GET "/connect" {} connect-socket)
(POST "/sign-in" {} sign-in)
(route/resources "/")
(route/not-found "Resource not found."))
(def app
(-> (defaults/wrap-defaults #'paths defaults/api-defaults)
wrap-json-params))
Run Code Online (Sandbox Code Playgroud)