2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面,了解更多关于该平台如何工作的小信息。

0

编辑

我正在设置一个返回 JSON 的服务,多亏了 Ring, Compojure 和 Jetty。我遇到的问题是在我想使用 Nginx 作为反向代理时。如果使用以下处理器,它不起作用。

(def wrapped-handler
  ;; Handler middlewares
  (-> all-routes
      (wrap-defaults (assoc-in site-defaults [:security :anti-forgery] false))
      wrap-params
      wrap-session
      ))

我收到的消息是

java.lang.NullPointerException
        at ring.adapter.jetty$proxy_handler$fn__6990.invoke(jetty.clj:26)
        at ring.adapter.jetty.proxy$org.eclipse.jetty.server.handler.AbstractHandler$ff19274a.handle(Unknown Source)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
        at org.eclipse.jetty.server.Server.handle(Server.java:503)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
        at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
        at java.base/java.lang.Thread.run(Thread.java:834)

但如果添加 wrap-reload,一切都会变好。

(def wrapped-handler
  ;; Handler middlewares
  (-> all-routes
      (wrap-defaults (assoc-in site-defaults [:security :anti-forgery] false))
      wrap-params
      wrap-session
      (#(if (config :debug) (wrap-reload %)))
      ))

我的 Nginx 部署如下。

server {        

        server_name domain.com;

        location / {
            proxy_pass https://127.0.0.1:9000/;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_redirect  off;
        }
}

在生产中保留 wrap-reload 是否安全?
我留下了什么?

感谢各位。

1 答案

0

仅基于这些信息确实很难判断。在交互环境中(如在 Clojurians Slack 中)调试此类问题要容易得多,在那里人们可以向您索要更多信息,并让您实时尝试不同的事情。

https://clojurians.slack.com -- 自助注册:http://clojurians.net

我会说,您绝对不希望在生产环境中运行 not wrap-reload。

问题已解决,感谢您的建议。

以下是我的

(#(if (config :debug) (wrap-reload %)))

这产生了空值并中断了执行。解决方案是

(#(if (config :debug) (wrap-reload %) %))

或者使用 cond->

(cond-> (config :debug) wrap-reload)))
嗯,我一开始看帖子时没有看到这个条件...

cond-> 对于这类事情非常合适(并且比尝试将内容穿入匿名函数更容易阅读!)
...