Устанавливая Helpdesk OTRS я столкнулся с тем, что работа официально поддерживается только с Apache HTTP Server, а мне нужен был Nginx. Как оказалось, подробного руководства по установке OTRS на WEB-сервер под управлением Nginx в интернете нет, попробуем это исправить. В этой статье будет описана только установка OTRS версии 5.0.13, а его настройка это отдельная тема. В качестве ОС, на которой будет развернут сервер, выступит CentOS 7.

Nginx


Подключаем репозитории Epel и Nginx.

yum install epel-release
yum localinstall http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Устанавливаем Nginx.

yum update && yum install wget bzip2 nginx


Создаем примерный конфигурационный файл Nginx, за основу была взята эта статья.

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig
vi /etc/nginx/nginx.conf

Скрытый текст
user				nginx;
worker_processes        2;
worker_rlimit_nofile    4096;
error_log            /var/log/nginx/error.log warn;
pid                   /var/run/nginx.pid;

events {
        worker_connections      1024;
}

http {
        include                 /etc/nginx/mime.types;
        default_type            application/octet-stream;

        log_format  main        '\$remote_addr - \$remote_user [\$time_local] "\$request" '
                                '\$status \$body_bytes_sent "\$http_referer" '
                                '"\$http_user_agent" "\$http_x_forwarded_for"';

        access_log              /var/log/nginx/access.log main;

        sendfile     			on;
        tcp_nopush   			on;
	keepalive_timeout  		65;
        server_names_hash_bucket_size 128;
		
	server_tokens           off;
		
	gzip on;

        include                 /etc/nginx/conf.d/*.conf;
}


Создаем конфиг хоста, заменяя HOST на ваше доменное имя.

vi /etc/nginx/conf.d/default.conf

Скрытый текст
#server {
#    listen 80;
#    server_name otrs.HOST;
#    rewrite ^ https://$http_host$request_uri? permanent;
#}

server {
  listen 80;
  listen 443 ssl;
  server_name otrs.HOST;
  root /opt/otrs/var/httpd/htdocs;

  error_log       /var/log/nginx/otrs-error.log warn;

  ssl_certificate /etc/letsencrypt/live/HOST/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/HOST/privkey.pem;
  ssl_dhparam /etc/ssl/HOST/dhparam.pem;

  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout  1h;

  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_trusted_certificate /etc/letsencrypt/live/otrs.HOST/fullchain.pem;
  resolver 77.88.8.88 8.8.8.8 valid=300s;
  resolver_timeout 10s;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!EXP:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
  ssl_prefer_server_ciphers  on;

  add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
  add_header X-Content-Type-Options nosniff;
  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-XSS-Protection "1; mode=block";
  add_header X-Robots-Tag none;
  add_header X-Download-Options noopen;
  add_header X-Permitted-Cross-Domain-Policies none;

  location = / {
    return 301 https://otrs.HOST/otrs/customer.pl;
  }

  location /otrs-web {
    gzip on;
    alias /opt/otrs/var/httpd/htdocs;
  }

  location ~ ^/otrs/(.*.pl)(/.*)?$ {
    fastcgi_pass unix:/var/run/fcgiwrap.sock;
    fastcgi_index index.pl;
    fastcgi_param SCRIPT_FILENAME   /opt/otrs/bin/fcgi-bin/$1;
    include fastcgi_params;
  }
}


Firewalld


Останавливаем и маскируем NetworkManager.

systemctl stop NetworkManager
systemctl mask NetworkManager

systemctl stop NetworkManager-wait-online.service
systemctl mask NetworkManager-wait-online.service

Настраиваем Firewall, будем считать что внешний интерфейс у нас называется enp5s0.

firewall-cmd --permanent --zone=external --change-interface=enp5s0
firewall-cmd --permanent --zone=external --add-icmp-block=echo-reply
firewall-cmd --permanent --zone=external --add-icmp-block=destination-unreachable
firewall-cmd --permanent --zone=external --add-icmp-block=echo-request
firewall-cmd --permanent --zone=external --add-icmp-block=time-exceeded
firewall-cmd --permanent --zone=external --add-icmp-block=parameter-problem
firewall-cmd --permanent --zone=external --add-service=http
firewall-cmd --permanent --zone=external --add-service=https
firewall-cmd --reload

Перезапускаем Firewall и проверяем, что получилось.

systemctl restart firewalld.service
firewall-cmd --reload

FastCGI


Для взаимодействия OTRS и Nginx нам понадобится FCGI wrapper. Тут выбор особо не велик — использовать скрипт на Perl от Denis S. Filimonov, либо FastCGI wrapper от Grzegorz Nosek. В качестве примера привожу оба варианта, но далее буду использовать последний.

fastcgi-wrapper.pl


wget http://nginxlibrary.com/downloads/perl-fcgi/fastcgi-wrapper -O /usr/bin/fastcgi-wrapper.pl

Для работы через Unix socket, вставляем в секцию sub main

$socket = FCGI::OpenSocket( "/var/run/perl-fcgi/perl-fcgi.sock", 10 );

и комментируем.

$socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 );

Так же вносим соответствующие изменения в конфиг Nginx.

fastcgi_pass unix:/var/run/perl-fcgi/perl-fcgi.sock;

Для его работы написал Systemd сервис.

vi /etc/systemd/system/perl-fcgi.service

[Unit]
Description=Perl FastCGI service

[Install]
WantedBy=multi-user.target

[Service]
User=otrs
Group=nginx
Type=simple
Restart=always
PermissionsStartOnly=true
ExecStartPre=/usr/bin/mkdir -p /var/run/perl-fcgi
ExecStartPre=/usr/bin/chown otrs.nginx /var/run/perl-fcgi
ExecStart=/usr/local/bin/fastcgi-wrapper.pl
ExecStop=/usr/bin/rm -rf /var/run/perl-fcgi

fcgiwrap


Просто устанавливаем пакет fcgiwrap

yum localinstall https://dl.dropboxusercontent.com/u/2709550/FCGIwrap/fcgiwrap-1.1.0-3.20150530git99c942c.el7.centos.x86_64.rpm

и запускаем его:

systemctl enable fcgiwrap.socket
systemctl start fcgiwrap.socket

Если у кого то возникнет приступ паранойи, вот srpm, можете собрать его сами.

MySQL


Подключаем репозиторий MariaDB.

vi /etc/yum.repos.d/MariaDB.repo

# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Устанавливаем MariaDB сервер.

yum update && yum install MariaDB-server MariaDB-client

Запускаем службу.

systemctl start mysql

Выполняем первоначальную настройку.

/usr/bin/mysql_secure_installation

Создаем базу данных.

mysql -u root -p
create database `otrs-db` character set utf8;
create user 'USER'@'localhost' identified by 'PASS';
GRANT ALL PRIVILEGES ON `otrs-db`.* to `USER`@`localhost`;
FLUSH PRIVILEGES;
exit;

Останавливаем сервис.

systemctl stop mysql

Для нормальной работы OTRS вносим небольшие корректировки в server.cnf.

vi /etc/my.cnf.d/server.cnf 

[mysqld]
max_allowed_packet   = 20M
query_cache_size     = 32M
innodb_log_file_size = 256M

Чтобы MySQL запустился после изменения параметра innodb_log_file_size необходимо переименовать или удалить старые лог-файлы.

mv /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile0_1
mv /var/lib/mysql/ib_logfile1 /var/lib/mysql/ib_logfile1_1

Запускаем службу и добавляем ее в автозагрузку.

systemctl start mysql
systemctl enable mysql

OTRS


Устанавливаем зависимости.

yum install bash-completion perl perl-Archive-Zip perl-Crypt-SSLeay perl-DBI perl-IO-Socket-SSL perl-LDAP perl-Net-DNS perl-Template-Toolkit perl-TimeDate perl-URI perl-XML-LibXML perl-XML-LibXSLT perl-XML-Parser perl-Digest-SHA perl-LWP-Authen-Negotiate perl-DBD-MySQL perl-YAML-LibYAML perl-Crypt-Eksblowfish perl-Mail-IMAPClient perl-Text-CSV_XS perl-core perl-libwww-perl procmail

Отключаем SELINUX.

vi /etc/selinux/config

SELINUX=permissive

Выполняем команду для отключения без перезагрузки.

setenforce 0

Скачиваем и распаковываем архив OTRS.

wget http://ftp.otrs.org/pub/otrs/otrs-5.0.13.tar.gz
tar -xvf otrs-5.0.13.tar.gz -C /opt/
mv /opt/otrs-5.0.13 /opt/otrs
cd /opt/otrs

Создаем на сервере «пользователя otrs».

useradd -d /opt/otrs/ -g nginx -s /sbin/nologin -c 'OTRS System User' otrs

С помощью утилиты otrs.CheckModules.pl проверяем наличие необходимых Perl модулей и если все в порядке продолжаем дальше.

su otrs -s /bin/bash -c "/opt/otrs/bin/otrs.CheckModules.pl"

Активируем «Default Config Files».

cp Kernel/Config.pm.dist Kernel/Config.pm
for foo in var/cron/*.dist; do mv $foo var/cron/`basename $foo .dist`; done
cp .procmailrc.dist .procmailrc
cp .fetchmailrc.dist .fetchmailrc
cp .mailfilter.dist .mailfilter

Проверяем что все требуемые модули установлены.

perl -cw /opt/otrs/bin/cgi-bin/index.pl
/opt/otrs/bin/cgi-bin/index.pl syntax OK

perl -cw /opt/otrs/bin/cgi-bin/customer.pl
/opt/otrs/bin/cgi-bin/customer.pl syntax OK

perl -cw /opt/otrs/bin/otrs.Console.pl
/opt/otrs/bin/otrs.Console.pl syntax OK

Настраиваем права доступа к файлам OTRS.

/opt/otrs/bin/otrs.SetPermissions.pl --otrs-user=otrs --web-group=nginx

Обновляем конфигурацию и удаляем кеш.

su otrs -s /bin/bash -c "/opt/otrs/bin/otrs.Console.pl Maint::Config::Rebuild";
su otrs -s /bin/bash -c "/opt/otrs/bin/otrs.Console.pl Maint::Cache::Delete";

Создаем systemd сервис OTRS.

vi /etc/systemd/system/otrs.service

[Unit]
Description=OTRS Help Desk.
After=network.target

[Service]
Type=forking
User=otrs
Group=nginx
ExecStart=/opt/otrs/bin/otrs.Daemon.pl start
ExecStop=/opt/otrs/bin/otrs.Daemon.pl stop

[Install]
WantedBy=multi-user.target

Запускаем сервисы

systemctl enable nginx.service
systemctl enable otrs.service
systemctl start nginx.service
systemctl start otrs.service

и переходим к веб интерфейсу для завершения настройки.

Нажимаем кнопку «Вперед».


Принимаем пользовательское соглашение.


Выбираем тип базы данных, в моем случае это MySQL.


Вводим учетные данные: IP-адрес и имя базы данных.


Проверяем подключение и если все нормально идем дальше.


На этом шаге выбираем нумерацию тикетов, указываем FQDN-имя сервера и аккаунт почтового ящика на который будут приходить письма.


Здесь указываем настройки почтового сервера для получения и отправки почты.


Переходим по адресу, который мы указали и авторизуемся в WEB-интерфейсе.



Let's Encrypt


Для получения сертификата Let's Encrypt необходимо установить CertBot.

yum install certbot

Здесь указываем свою почту и доменное имя на которое получаем сертификат.

certbot certonly --webroot --email mail@HOST -w /opt/otrs/var/httpd/htdocs -d otrs.HOST

Создаем systemd сервис для CertBot, чтобы автоматически продлить действие сертификата.

vi /etc/systemd/system/certbot.service

[Unit]
Description=Renew Certbot certificate (nginx)
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --renew-hook "/usr/bin/systemctl reload nginx.service"

Создаем таймер

vi /etc/systemd/system/certbot.timer

[Unit]
Description=Renew Certbot certificate (nginx)

[Timer]
OnCalendar=daily
RandomizedDelaySec=1day
Persistent=true

[Install]
WantedBy=timers.target

И активируем.

sudo systemctl daemon-reload
systemctl start certbot.timer
systemctl enable certbot.timer

Проверить запланированное задание можно командой

systemctl list-timers

Создаем файл с параметрами для DHE-шифров.

openssl dhparam -out /etc/ssl/HOST/dhparam.pem 2048

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

server {
    listen 80;
    server_name otrs.HOST;
    rewrite ^ https://$http_host$request_uri? permanent;
}

и закомментировать в секции с ssl.

listen 80;

После чего перезапустить Nginx.

systemctl reloadt nginx.service

Что еще можно сделать?


Автоматическая загрузка писем в тикеты


По умолчанию опрос почтового сервера происходит раз в 10 минут, чтобы изменить этот параметр необходимо.

OTRS: Администрирование > Администрирование системы > Конфигурация системы

В поле «Действие» вставить Daemon::SchedulerCronTaskManager::Task и нажать на «Поиск».
Найти параметр MailAccountFetch и изменить значение с 10 минут, например, на 5.

Отключение регистрации пользователей через Web-интерфейс


Если нет необходимости регистрации пользователей через WEB-интерфейс его нужно отключить.

Системы > Конфигурация системы и в поле «Действие» вставить Frontend::Customer и нажать на «Поиск». Найти пункт CustomerPanelCreateAccount и выбрать «Нет».
Поделиться с друзьями
-->

Комментарии (10)


  1. darken99
    06.10.2016 19:14
    +1

    1. Уберите из конфига параметры, значения которых вы не понимаете (иначе зачем они там?)
    2. Останавливать Nginx перед каждой попыткой обновить сертификат — мощно, вы бы еще сервер перезагружали… откройте для себя параметр --renew-hook. Nginx кстати отлично подтягивает обновленный сертификат при reload
    3. Текущая stable версия MariaDB — 10.1


    1. wmlex
      06.10.2016 19:35

      Спасибо за Ваш комментарий. О каких параметрах идет речь?


      1. VBart
        09.10.2016 15:55
        +1

        Практически обо всех, что вы бездумно накрутили. Больше половины директив в данной конфигурации nginx лишено смысла.


        1. wmlex
          09.10.2016 16:54

          Давайте конструктивно. Если вы про nginx.conf, то там написано примерный. А если про default.conf, то я не совсем понимаю какие из них Вы посчитали лишними.


          1. darken99
            10.10.2016 00:28
            +1

            Не думаю что Валентин будет вам проводить ликбез по конфигурации ;)
            Уберите все и оставьте только те, которые четко понимаете для чего нужны именно в данном случае.


          1. VBart
            10.10.2016 23:59

            Вот, убрали все proxy_*, и уже стало заметно лучше (ещё бы один proxy_set_header убрать для приличия). Можно еще почистить, как минимум, убрав дублирующиеся директивы. Директивы в nginx наследуются с предыдущего уровня, если не переопределены на текущем. Поэтому нет смысла явно указывать gzip on на уровне location, если у вас с уровня http и так унаследуется данное значение (то же касается access_log off). Практически все директивы fastcgi_param присутствуют в файле fastcgi_params, который поставляет с nginx-ом, и достаточно его включит в конфигурацию директивой include. А если ещё выкинуть из конфигурации кучу других настроек, которые не относятся непосредственно к делу, а просто сделаны вами на свой вкус, то конфигурация станет гораздо лаконичнее и за счет этого легче читаться.


            1. wmlex
              11.10.2016 13:06

              Спасибо за Ваш комментарий. Ваши замечания исправил.


  1. awgur
    07.10.2016 06:51

    Daemon::SchedulerCronTaskManager::Task###MailAccountFetch


    1. wmlex
      07.10.2016 06:54

      Спасибо! Исправил.


  1. NikiN
    10.10.2016 12:58

    может быть уже в докере?