Jetty — HTTP/HTTPS-сервер и сервлет-контейнер (Jakarta EE Servlet), написанный на Java. Главное архитектурное решение: Jetty проектировался как встраиваемый компонент — его можно запустить внутри Java-приложения четырьмя строками кода без отдельной установки сервера. Дистрибутив занимает около 6 МБ; потребление RAM в режиме ожидания — 20–50 МБ JVM heap.
Архитектура
Jetty использует неблокирующий I/O (NIO) через Java NIO2 Selectors и Executors для обработки тысяч соединений в небольшом пуле потоков. Поддерживает Servlet API (Jakarta EE 10+), WebSocket (JSR 356), HTTP/2, HTTP/3 (через QUIC, начиная с Jetty 12). Конфигурируется через XML-файлы или программно через Jetty API:
Server server = new Server(8080);
server.setHandler(new HelloHandler());
server.start();
server.join();
Этот подход используют Apache Solr (поиск), Eclipse IDE (встроенный preview-сервер), Apache Maven Jetty-плагин (разработка без деплоя), а также unit-тесты — запуск встроенного сервера без Docker-контейнеров.
История
Jetty создан Грегом Уилкинсом (Greg Wilkins) в 1995 году — один из старейших Java-веб-серверов, предшествующий Tomcat. Первоначально разрабатывался в компании Mort Bay Consulting. В 2009 году Jetty 7 передан в Eclipse Foundation под двойной лицензией EPL и Apache 2.0. Ключевые версии: Jetty 9 (2013) требует Java 7+; Jetty 10 (2021) — Java 11+; Jetty 11 (2021) — Java 11+, Jakarta EE namespace (javax → jakarta); Jetty 12 (2023) — Java 17+, унификация Jakarta EE 8/9/10, нативный HTTP/3. Google App Engine (2008–2013) использовал Jetty для Java-хостинга.
Jetty vs Tomcat vs Undertow
| Параметр | Jetty 12 | Tomcat 10 | Undertow |
|---|---|---|---|
| Встраиваемый | Да (нативно) | Ограниченно | Да |
| Размер дистрибутива | ~6 МБ | ~12 МБ | ~2 МБ |
| HTTP/2 | Да (с Jetty 9.3) | Да (Tomcat 8.5+) | Да |
| HTTP/3 | Да (Jetty 12+) | Экспериментально | Нет |
| Jakarta EE | Полный (EE 10) | Полный (EE 10) | Частичный (в WildFly) |
| Применение | Встраивание, инструменты | Корпоративные приложения | WildFly, Quarkus |
Применение на хостинге
На VPS Jetty запускают через systemd-юнит или в Docker-контейнере. Типичный стек: OpenJDK 17/21 + Jetty 12 + приложение в fat JAR. Java-сервисы требуют минимум 256 МБ JVM heap; при реальной нагрузке — 512 МБ–2 ГБ. На PaaS-платформах (Heroku, Render) Jetty-приложения деплоятся как fat JAR с встроенным сервером. Перед Nginx как reverse proxy Jetty слушает на внутреннем порту (8080); Nginx принимает внешние HTTPS-запросы и проксирует на Jetty.
На что обращать внимание
При выборе между Jetty и Tomcat: Jetty лучше для встраивания и микросервисов (Spring Boot, Quarkus); Tomcat — для классических Jakarta EE-приложений с готовой документацией команды. В Spring Boot Jetty подключается заменой зависимости spring-boot-starter-tomcat на spring-boot-starter-jetty. Убедитесь, что порты приложения не блокируются firewall на VPS. Для HTTPS на Jetty без reverse proxy нужен JKS-keystore или PKCS#12 с сертификатом — либо используйте ACME-клиент Jetty.
Конфигурация SSL/TLS в Jetty 12
Для включения HTTPS в standalone-режиме Jetty нужен keystore. Пример с сертификатом Let's Encrypt через PKCS#12: конвертируйте PEM через openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out jetty.p12 -name jetty, затем укажите в jetty-ssl.xml. Для встроенного Jetty в Java-приложении сертификат загружается через SslContextFactory.Server с указанием пути к P12-файлу. Автообновление сертификата обеспечивает периодическое обращение к ACME-эндпоинту или внешний certbot с перезагрузкой Jetty.