Установка OTRS 5 на сервер с Nginx

5c44152df562482cb55b07244748cd9b.png

Устанавливая 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.conf (это примерный конфиг).
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig
vi /etc/nginx/nginx.conf

Скрытый текст
user                    nginx;
        worker_processes        1;
        worker_rlimit_nofile    8192;

        error_log               /var/log/nginx/error.log debug;

        pid                     /var/run/nginx.pid;

events {
        worker_connections      1024;
        use                     epoll;
}


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;

        charset                 utf-8;

        sendfile                on;
        tcp_nopush              on;
        tcp_nodelay             on;
        server_tokens           off;
        gzip                    on;
        gzip_static             on;
        gzip_comp_level         5;
        gzip_min_length         1024;
        keepalive_timeout       5s;
        limit_conn_zone         $binary_remote_addr zone=perip:10m;
        limit_conn perip        10;

        proxy_set_header        X-Forwarded-For   \$proxy_add_x_forwarded_for;
        proxy_set_header        Host              \$host;
        proxy_set_header        X-Real-IP         \$remote_addr;

        port_in_redirect        off;

        proxy_pass_header       Server;
        proxy_redirect          off;
        proxy_buffering         on;

        proxy_buffer_size       16k;
        proxy_buffers           8 128k;
        proxy_busy_buffers_size 256k;

        proxy_next_upstream     off;
        proxy_intercept_errors  off;
        proxy_connect_timeout   90;
        proxy_read_timeout      90;
        proxy_send_timeout      90;

        proxy_temp_file_write_size      256k;
        proxy_max_temp_file_size        0;

        proxy_temp_path                 /var/spool/nginx_proxy_temp;

        client_header_buffer_size       16k;
        large_client_header_buffers     4 8k;
        client_max_body_size            30m;
        client_body_buffer_size         128k;

        client_header_timeout   10m;
        client_body_timeout     10m;
        send_timeout            10m;

        client_body_temp_path   /var/spool/nginx_client_body_temp;

        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;

  access_log      off;
  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;

  proxy_set_header X-Forwarded-For $remote_addr;

  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;

  if ( $http_user_agent ~* (nmap|nikto|wikto|sf|sqlmap|bsqlbf|w3af|acunetix|havij|appscan) ) {
    return 403;
  }

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

  location = /favicon.ico {
    access_log     off;
    log_not_found  off;
  }

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

  location ~ ^/otrs/(.*.pl)(/.*)?$ {
    gzip on;
    fastcgi_pass unix:/var/run/fcgiwrap.sock;
    fastcgi_index index.pl;
    fastcgi_param SCRIPT_FILENAME   /opt/otrs/bin/fcgi-bin/$1;
    fastcgi_param QUERY_STRING      $query_string;
    fastcgi_param REQUEST_METHOD    $request_method;
    fastcgi_param CONTENT_TYPE      $content_type;
    fastcgi_param CONTENT_LENGTH    $content_length;
    fastcgi_param GATEWAY_INTERFACE CGI/1.1;
    fastcgi_param SERVER_SOFTWARE   nginx;
    fastcgi_param SCRIPT_NAME       $fastcgi_script_name;
    fastcgi_param REQUEST_URI       $request_uri;
    fastcgi_param DOCUMENT_URI      $document_uri;
    fastcgi_param DOCUMENT_ROOT     $document_root;
    fastcgi_param SERVER_PROTOCOL   $server_protocol;
    fastcgi_param REMOTE_ADDR       $remote_addr;
    fastcgi_param REMOTE_PORT       $remote_port;
    fastcgi_param SERVER_ADDR       $server_addr;
    fastcgi_param SERVER_PORT       $server_port;
    fastcgi_param SERVER_NAME       $server_name;
    fastcgi_param HTTPS             on;
    fastcgi_param HTTP_SCHEME       https;
  }
}


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

# MariaDB 5.5 CentOS repository list - created 2016-09-26 11:13 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/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

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

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

64e370230f4c43e2a467460fe28d3e55.PNG

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

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

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

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

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

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

Переходим по адресу, который мы указали и авторизуемся в WEB-интерфейсе.
9b4262b16eec42debf831e76e33628a7.PNG
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
ExecStartPre=/bin/systemctl stop nginx
ExecStart=/usr/bin/certbot renew --standalone
ExecStartPost=/bin/systemctl --no-block start nginx

Создаем таймер
vi /etc/systemd/system/certbot.timer

[Unit]
Description=Renew Certbot certificate (nginx)

[Timer]
OnCalendar=monthly
Persistent=true

[Install]
WantedBy=multi-user.target

И активируем.
systemctl start certbot.service
systemctl enable --now certbot.timer

Создаем файл с параметрами для 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 restart nginx.service

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

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


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

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

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

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


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

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

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

© Habrahabr.ru