Установка 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.debug log;

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 ssl 443;
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-Windows-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 CentOS 5.5 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-perl DBI-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 і вибрати «Ні».
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.