Статьи

Быстрые Clojure / Java веб-приложения на NGINX без веб-сервера Java

Nginx-Clojure   — это модуль Nginx для встраивания программ Clojure или Java, обычно это обработчики на основе Ring . Это проект с открытым исходным кодом, размещенный на Github, URL сайта — ЗДЕСЬ . С его помощью мы можем разрабатывать высокопроизводительные веб-приложения Clojure / Java на Nginx без какого-либо веб-сервера Java и с рядом преимуществ:

  • Статические файлы, управляемые Clojure / Java, получат почти такую ​​же производительность со статической файловой службой Nginx.
  • Мы просто развернем один сервер Nginx (скомпилированный с модулем Nginx-Clojure) вместо Nginx + некоторый веб-сервер Java, например. Tomcat, Jetty и т. Д.
  • Ring Handler   очень прост по сравнению с сервлетом Java
  • Мы можем использовать модули Nginx, такие как GZip, Image Filter и т. Д., С нашим статическим и динамическим контентом на лету без каких-либо затрат на уровень Proxy.
  • Мы можем использовать обработчик перезаписи Java + proxy_pass для очень быстрой реализации динамического прокси / балансировщика.

Существует три типичных примера написания конфигурации для обработчиков кольца:

1. Чистый обработчик Java

package my;

import static nginx.clojure.MiniConstants.CONTENT_TYPE;
import static nginx.clojure.MiniConstants.NGX_HTTP_OK;

import java.io.IOException;
import java.util.Map;

import nginx.clojure.java.ArrayMap;
import nginx.clojure.java.NginxJavaRingHandler;

public class HelloHandler implements NginxJavaRingHandler {

@Override
public Object[] invoke(Map<String, Object> request) throws IOException {

return new Object[] { 
NGX_HTTP_OK, //http status 200
ArrayMap.create(CONTENT_TYPE, "text/plain"), //headers map
"Hello, Java & Nginx!"  //response body can be string, File or Array/Collection of string or File
};
}
}

В nginx.conf, например.

location /java {
  content_handler_type java;
  content_handler_name my.HelloHandler;
 }

2. Встроенный обработчик Clojure

       location /clojure {
          content_handler_code ' 
                        (fn[req]
                          {
                            :status 200,
                            :headers {"content-type" "text/plain"},
                            :body  "Hello Clojure & Nginx!" 
                            })
          ';
       }

3. Внешний обработчик Clojure

(ns my.hello)
(defn hello-world [request]
  {:status 200
  :headers {"Content-Type" "text/plain"}
  :body "Hello World"})

Вы должны установить для ваших файлов JAR clojure путь к классу, см. Путь JVM и путь к классу на веб-сайте Nginx-Clojure.

       location /myClojure {
          content_handler_name 'my.hello/hello-world';
       }

Для получения более подробной информации о функциях nginx-clojure, пожалуйста, посетите веб-сайт  https://nginx-clojure.github.io/ .

Более подробную информацию и полезные примеры для Compojure, которая представляет собой небольшую библиотеку маршрутизации для Ring, которая позволяет веб-приложениям состоять из небольших независимых частей, см. По адресу https://github.com/weavejester/compojure.

Кстати, результат простого теста производительности с Nginx-Clojure вдохновляет, более подробную информацию можно получить ЗДЕСЬ   . Вот простые результаты тестирования, Nginx-Clojure почти в 6 раз быстрее, чем Nginx-Php5