Comments 27
Итак, что бы проксировать http(s) в localhost:8080 вы выбрали такой путь:
Nginx, возможно даже из сторонних репозиториев, конфиги, установка sertbot и какие-то там подтверждения соглашений, ручные правки, кроны…
Предлагаю заменить этот паровоз на два элемента systemd+traefik. Без каких-либо ручных правок файлов.
Алгоритм автоматизации:
- скопировать юнит-файл
- скопировать бинарник traefik
- cкопировать конфиг traefik
- установка вашего или любого другого сервиса на local host:8080 ( кстати, а почему не на сокете?)
- настройка fw
- reboot
Tomcat умеет в Ajp и есть связка Apache + tomcat по AJP (и в этом варианте, насколько мне помнится) даже не нужно ничего в томкате кофигурить — Apache Web Server сам корретно ip, порты и пр. прокидывает.
Наверняка можно и nginx + tomcat ajp настроить.
Он прекрасно работает с докерами, динамические конфиги и всякая радость.
Немаловажно, что traefik дает производительность сравнимую с nginx, а пользоваться им намного удобнее.
Также traefik прозрачно интегруется с LE и не нужно тащить всякую дрянь в систему.
Еще я бы обязательно обратил внимание автора статьи на такой чудесный прокси, как envoy.
Ну, что опять за дет сад.
Я полностью согласен с комментарием пользователя BOPOHA
Эти действия можно сделать один раз. А дальше уже нужна автоматизация (покажите мне свои манифесты/роли и я скажу, кто Вы!!!). Я на третий раз уже всегда пишу ansible/salt роль/манифест/state, ну, либо на край — башник.
К тому же, выкинуты за борт пользователи альтернативных дистрибутивов. Ну, там centos и прочее.
https://hub.docker.com/r/marvambass/nginx-ssl-secure
docker run -d -p 80:80 -p 443:443 -e 'DH_SIZE=512' -v $EXT_DIR:/etc/nginx/external/marvambass/nginx-ssl-secure
Или еще 100500 альтернатив гуглятся.
И еще раз спасибо за комментарий.
А потом придется еще бороться с особенностями docker (совместимость версий, настройка firewall, настройка драйверов storage etc).
С другой стороны, если в инфраструктуре докер уже есть, то почему бы им не воспользоваться? К тому же, docker реально позволяет избежать «замусоривания» основной системы лишними пакетами, конфигами etc.
Запускать ВМ для каждого сервлета и инсталлировать все окружение на нем, имхо, еще больший оверкил. Контейнер, наверняка, уже готовый можно найти, вверху, в другом комменте есть ссылка, например.
(совместимость версий, настройка firewall, настройка драйверов storage etc).
Все не актуально в данном конкретном случае.
А можете написать то же самое про tomcat 9? Его нет в apt-get, а ручная настройка мне не далась вообще нивкакую — systemd скрипты которые скопипащены по всем туториалам в интернете просто не работают :(
Спасибо!
Точнее так. Судя по данным с сайта Ubuntu пакет tomcat9 появится только в версии disco AKA 19.04 А чем плох вариант скачать zip/gzip и установить 9 или версию 8.5 (ее к слову тоже нет в пакетах). Шаги по томкату брать отсюда, например.
Все прочее кроме расположение tomcat файлов (в том числе и config) у вас останется без изменения (т.е. чуть больше будет прыжков по автозапуску и пр. и прописывать org.apache.catalina.valves.RemoteIpValve нужно будет в файле conf/server.xml и все, как кажется).
Самое интересное, что я этому туториалу и следовал, но застрял на настройке systemctl.
https://serverfault.com/questions/946034/systemctl-stops-tomcat-service-immediately-after-start
Вот здесь я подробно изложил проблему
<Server port="8005" shutdown="SHUTDOWN">
Он, скорее всего, уже чем-то занят на это виртуалке. lsof Вам в помощь
> lsof -i :8005
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 3433 tomcat 86u IPv6 32276 0t0 TCP localhost:8005 (LISTEN)
Что по поводу 8005 порта — то это была моя первоначальная догадка. Потом я все-таки выяснил, что причина в другом. Systemctl по какой-то причине останавливает сервис сразу же после того, как стартует его.
В итоге, я все-таки сделал себе Tomcat8 через apt-get — требование о 9м томкате было некритичным. Обидно просто было, что так и не выяснил в чем причина ошибки.
p.s. Большое спасибо за ваше время
Я бы на Вашем месте очистил каталог logs (сделал его пустым) и перезапустил tomcat9 сервис и посмотрел в логи.
Если логи пустые, то томкат даже не смог стартануть (обычно сообщения о занятых портах пишутся сильно позже). Те это или права или путь к jvm (хотя я в tutorial’e налажал и не изменил JAVA_HOME, так эти сообщения в логах были).
Во-первых, как любой опенсурс — он не безгрешен. И может подвести. Ну, например, github.com/fail2ban/fail2ban/issues/798 Это все очень version-related.
Но, во-вторых, кмк, лучше защиты выносить на другой уровень — инфраструктуры (зоны безопасности в облачном провайдере, например), так и приложения (basic auth etc.).
Кстати, отдельный вопрос как будет дружить fail2ban c docker, учитывая, что оба переписывают правила файрволла.
За кадром еще два вопроса — вопрос идентификации клиентов за NAT'ом (для них f2b бесполезен, т.к. он не видит оригинальный IP) и еще вопрос нагрузки (т.к. каждое правило файрволла — снижение быстродействия, причем когда правил много, то значительное)
1) как запустить tomcat
2) как сделать сертификат в letsencrypt
3) основы proxypass (без кеша)
Все можно нагуглить элементарными запросами.
Если честно статья ни о чем. Кеш не рассмотрен. Минусы tomcat не показаны. Конфиг томката, дочки — ничего не рассмотрено.
Теперь — "по условиям задачи нужен Tomcat" — orly?
Задача поставлена самостоятельно, потому, что не смогли приготовить jetty или потому, что Jetty просто напросто отшила говнокод в отличие от tomcat, который жрет всё?
Ейбогу, вместо того, чтобы треш писать, лучше его удалить и потратить лишние 3 часа времени, но написать нормальный материал. Заодно и самому разобраться.
Сам себе devops или настраиваем Nginx прокси для Apache Tomcat на Ubuntu за 5 минут c https и firewall'ом