Установка Tomcat на FreeBSD для xwiki

Версия 5.1 от Антон Волков на 2025/10/30 17:57

Установка Tomcat

Будем рассматривать установку tomcat на freeBSD 14.1 для развертывания xwiki в качестве примера.

Установка пакетов

Поскольку последняя xwiki поддерживает версию tomcat не выше 9, да и то с определенными оговорками

будем ставить версию 8.5, для этого посмотрим какие пакеты есть в репозитории:

root@jail:~ # pkg search tomcat
tomcat-devel-11.0.0.m22        Open-source Java web server by Apache, 11.0.x branch
tomcat-native-1.3.0_1          Tomcat native library
tomcat-native2-2.0.7           Tomcat native library
tomcat101-10.1.26              Open-source Java web server by Apache, 10.1.x branch
tomcat85-8.5.100               Open-source Java web server by Apache, 8.5.x branch
tomcat9-9.0.91                 Open-source Java web server by Apache, 9.0.x branch
root@jail:~ # pkg install tomcat85
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 28 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        alsa-lib: 1.2.12
        apache-commons-daemon: 1.4.0
        brotli: 1.1.0,1
        dejavu: 2.37_3
        fontconfig: 2.15.0_3,1
        freetype2: 2.13.2
        giflib: 5.2.2
        java-zoneinfo: 2021.e
        javavmwrapper: 2.7.10
        libICE: 1.1.1,1
        libSM: 1.2.3_1,1
        libX11: 1.8.9,1
        libXau: 1.0.9_1
        libXdmcp: 1.1.5
        libXext: 1.3.6,1
        libXfixes: 6.0.0_1
        libXi: 1.8_1,1
        libXrender: 0.9.10_2
        libXt: 1.3.0,1
        libXtst: 1.2.3_3
        libfontenc: 1.1.8
        libinotify: 20211018_1
        libxcb: 1.17.0
        mkfontscale: 1.2.3
        openjdk8: 8.412.08.1
        png: 1.6.43
        tomcat85: 8.5.100
        xorgproto: 2024.1

Number of packages to be installed: 28

The process will require 248 MiB more space.
103 MiB to be downloaded.

Proceed with this action? [y/N]:

Открываем файлы 

/usr/local/apache-tomcat-8.5/webapps/host-manager/META-INF/context.xml

/usr/local/apache-tomcat-8.5/webapps/manager/META-INF/context.xml

и правим ip адрес с которого планируем подключаться к панели менеджера в блоке allow=:

<Context antiResourceLocking="false" privileged="true" >
 <CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
                  sameSiteCookies="strict" />
 <Valve className="org.apache.catalina.valves.RemoteAddrValve"
        allow="10\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
 <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

Добавляем пользователя и назначаем ему роли, редактируя файл /usr/local/apache-tomcat-8.5/conf/tomcat-users.xml 

<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="P@ssw0rd" roles="manager-gui,admin-gui"/>
</tomcat-users>

Добавляем службу tomcat в rc.conf и запускаем:

root@jail:~ # sysrc tomcat85_enable="YES"
tomcat85_enable:  -> YES
root@jail:~ # service tomcat85 start

Теперь можем зайти по адресу http://x.x.x.x:8080, что бы проверить все ли у нас работает.

1723112667346-190.png

Установка xwiki

Для установки xwiki нам необходимо скачать Serverlet Container с расширением .war (Можно отсюда: https://www.xwiki.org/xwiki/bin/view/Download/DownloadVersion/?projectVersion=16.6.0 ).

После того как скачали наш файлик советую его переименовать например просто в xwiki.war.

Закидываем его в каталог /usr/local/apache-tomcat-8.5/webapp

Заходим в Manager-App через веб-интерфейс ииии..... видим, что наше приложение не запускается.

А все из-за того что версия tomcat 8.5 тянет с собой зависимости openjdk8: 8.412.08.1, а нам нужна минимум 17 версия.

Ну что ж ставим 17 версию:

root@jail:~ # pkg install openjdk17 openjdk17-jre

Теперь, что бы tomcat понял, что ему надо использовать именно 17 версию java, нам необходимо дописать строчку tomcat85_java_home="/usr/local/openjdk17" в /etc/rc.conf

Перезапускаем tomcat и проверяем, что он использует именно 17, а не 8 версию java:

root@jail:/ # ps -aux | grep tomcat
root 74176  0.0  0.0   12940    2064  -  IsJ  11:12   0:00.00 /usr/local/bin/jsvc -java-home /usr/local/openjdk17 -server -user www -umask 0077

Проверяем, что приложение xwiki у нас запустилось через host-manager и переходим к установке СУБД и настройке соединения с ней.

* В конфиге .../webapps/xwiki/WEB-INF/xwiki.cfg
необходимо добавить или раскомментировать параметр xwiki.home=https://examle.org/xwiki
где example.com это имя нашего домена

Установка Postgresql

В качестве СУБД для XWIKI я использовал postgresql, почему ? Да просто мне так больше нравится.

Ставим пакеты:

root@jail:/ # pkg install postgresql16-server postgresql16-client

Добавляем сервис:

root@jail:/ # sysrc postgresql_enable="YES"
postgresql_enable: YES -> YES
root@jail:/ #

Инициализируем СУБД:

root@jail:/ # postgresql initdb

Далее необходимо отредактировать конфигурационные файлы:

В файле /var/db/postgres/data16/postgresql.conf отредактировать параметр listen_addresses = 'X.X.X.X', где указываем адрес нашего pgsql сервера.

В файле /var/db/postgres/data16/pg_hba.conf  правим блоки с ADDRESS и METHOD.

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     trust
# IPv4 local connections:
host    all             all             10.0.0.0/8            scram-sha-256

В блоке ADDRESS указываем адреса откуда мы сможем присоединяться к СУБД, а в блоке METHOD указываем метод аутентификации, в нашем случае  scram-sha-256 аутентификация по шифрованному паролю.

Перезапускаем службу и цепляемся к серверу СУБД и меняем пользователю postgres пароль:

root@jail:/ # psql -U postgres
psql (16.3)
Type "help" for help.

postgres=# passwd postgres

Cоздаем базу данных xwiki:

CREATE DATABASE xwiki;

Создаем пользователя и даем права на базу

CREATE USER xwiki with encrypted password 'P@ssw0rd';
GRANT ALL PRIVILEGES on database xwiki to xwiki;

P.S. В некоторых случаях потребуется создать схему xwiki в базе данных и сделать владельцем пользователя xwiki.

Что бы наше приложение могло соединяться с СУБД Postgresql, нам надо скачать драйвер odbc postgresql-42.7.3.jar и положить в каталог /usr/local/apache-tomcat-8.5/webapps/xwiki/WEB-INF/lib/

Редактируем конфиг /usr/local/apache-tomcat-8.5/webapps/xwiki/WEB-INF/hibernate.cfg.xml и добавляем туда следующий текст (а лучше заменяем):

<!--
  ~ Hibernate, Relational Persistence for Idiomatic Java
  ~
  ~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.
  ~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
  -->

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">


<hibernate-configuration>
       <session-factory>
               <property name="connection.url">jdbc:postgresql://x.x.x.x/xwiki</property> <!-- BD Mane -->
               <property name="connection.driver_class">org.postgresql.Driver</property> <!-- DB Driver -->
               <property name="connection.username">xwiki</property> <!-- DB User -->
               <property name="connection.password">P@ssw0rd</property> <!-- DB Password -->
               <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
               <property name="jdbc.use_streams_for_binary">false</property>
               <property name="xwiki.virtual_mode">schema</property>
               <mapping resource="xwiki.postgresql.hbm.xml"/>
               <mapping resource="feeds.hbm.xml"/>
               <mapping resource="notification-filter-preferences.hbm.xml"/>
               <mapping resource="activitystream.hbm.xml"/>
               <mapping resource="instance.hbm.xml"/>
       </session-factory>
</hibernate-configuration>

 Перезапускаем tomcat и заходим в менеджер приложений http://x.x.x.x:8080/manager/html

1723111316578-101.png

Видим, что наше приложение запущено, жмем на него и ждем когда закончится инициализация и создание схемы базы данных.

Установка Nginx

Теперь необходимо установить nginx, который мы будем использовать в качестве обратного прокси, а так же для настройки ssl.

# pkg install nginx

Открываем /usr/local/etc/nginx.conf.

Конфиг у нас будет выглядеть следующим образом:

events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
server {
  server_name xwiki.krasikra.com;
    client_max_body_size 1000m; #Размер вложений для загрузки\скачивания
   listen 443 ssl;
    ssl_certificate /etc/ssl/xwiki.pem;
    ssl_certificate_key /etc/ssl/example.key;

  location / {
    rewrite ^ $scheme://$server_name/xwiki$request_uri? permanent;
       }
  location ^~ /xwiki {
   proxy_set_header Host $host;
   proxy_set_header X-Forwarded-Host $host;
   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_http_version 1.1; # Директива используется для указания версии протокола HTTP, которую Nginx должен использовать при общении с Tomcat
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #Переменная $proxy_add_x_forwarded_for содержит полученный заголовок X-Forwarder-For плюс добавляет свой сервер в этот список.
   proxy_set_header X-Real-IP $remote_addr; #Эти заголовки содержать содержат ip адрес и порт с которого подключается клиент
   proxy_set_header  X-Forwarded-Proto https; # Этот заголовок передает бэкенду протокол, который используется клиентом.
   proxy_pass http://127.0.0.1:8080; # куда будем проксировать, то есть на 127.0.0.1:8080 в каталог /wiki.
   proxy_redirect off;
#    return 301 https://$host$request_uri;
       }
 }

upstream xwiki {
  server     127.0.0.1:8080;
}

server {
   if ($host = xwiki.example.com) {
       return 301 https://$host$request_uri;
   } # managed by Certbot


  listen 80;
  server_name xwiki.example.com;
   return 404;
}
}
root@xwiki:/home/xwiki #

  Далее открываем  /usr/local/apache-tomcat-8.5/conf/server.xml и добавляем следующий блок:

    <Connector port="8080" protocol="HTTP/1.1"
              connectionTimeout="20000"
              redirectPort="8443"
              maxParameterCount="1000"
              scheme="https"
              proxyName="vawiki.duckdns.org"
              proxyPort="443"/>

Перезапускаем nginx и tomcat и пробуем зайти по имени хоста или адресу, который слушает nginx.

Установка Certbot

Что бы включить https нам нужно скачать скрипт certbot:

# pkg install py311-certbot-nginx

Если в репозиториях по каким то причинам отсутствует пакет certbot, то можно скачать скрипт с официального сайта:

wget -O /usr/local/bin/certbot-auto https://dl.eff.org/certbot-auto
chmod +x /usr/local/bin/certbot-auto
ln -s /usr/local/bin/certbot-auto /usr/local/bin/certbot

Запускаем скрипт certbot где параметр -d указывает на имя нашего доменного имени для которого необходимо выдать сертификат.

# certbot --nginx -d xwiki.hostname.com

Запустится мастер, в котором мы должны будем ответить на предложенные вопросы и указать свой email если мы еще не зарегистрированы. 

Скрипт сам установит все необходимые сертификаты и внесет изменения в конфигурацию nginx.

Поскольку сертификат Let's Encrypt выдается всего на 90 дней то необходимо создать в cron задание на обновление сертификатов.

# crontab -e

Добавляем строку:

 0 0,12 * * * /usr/local/bin/certbot renew

Все!