Устанавливая 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 и выбрать «Нет».
Поделиться с друзьями
darken99
wmlex
Спасибо за Ваш комментарий. О каких параметрах идет речь?
VBart
Практически обо всех, что вы бездумно накрутили. Больше половины директив в данной конфигурации nginx лишено смысла.
wmlex
Давайте конструктивно. Если вы про nginx.conf, то там написано примерный. А если про default.conf, то я не совсем понимаю какие из них Вы посчитали лишними.
darken99
Не думаю что Валентин будет вам проводить ликбез по конфигурации ;)
Уберите все и оставьте только те, которые четко понимаете для чего нужны именно в данном случае.
VBart
Вот, убрали все proxy_*, и уже стало заметно лучше (ещё бы один
proxy_set_header
убрать для приличия). Можно еще почистить, как минимум, убрав дублирующиеся директивы. Директивы в nginx наследуются с предыдущего уровня, если не переопределены на текущем. Поэтому нет смысла явно указыватьgzip on
на уровнеlocation
, если у вас с уровняhttp
и так унаследуется данное значение (то же касаетсяaccess_log off
). Практически все директивыfastcgi_param
присутствуют в файлеfastcgi_params
, который поставляет с nginx-ом, и достаточно его включит в конфигурацию директивойinclude
. А если ещё выкинуть из конфигурации кучу других настроек, которые не относятся непосредственно к делу, а просто сделаны вами на свой вкус, то конфигурация станет гораздо лаконичнее и за счет этого легче читаться.wmlex
Спасибо за Ваш комментарий. Ваши замечания исправил.