Установка OTRS 5 на сервер с Nginx
Устанавливая 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
и переходим к веб интерфейсу для завершения настройки.
Нажимаем кнопку «Вперед».
Принимаем пользовательское соглашение.
Выбираем тип базы данных, в моем случае это 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
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 и выбрать «Нет».