IT For Prof - Настройка Nginx для GLPI и OsTicket

Настройка Nginx для GLPI и OsTicket

Инструкция по настройке Nginx

Пошаговая инструкция по настройке Nginx для работы GLPI в корне сайта и OsTicket по адресу /tickets/

Руководство по настройке веб-сервера Nginx для размещения двух популярных систем технической поддержки и учёта IT-активов: GLPI и OsTicket. В данном материале мы рассмотрим установку и настройку на примере домена help.itforprof.com

Особенностью данной конфигурации является то, что OsTicket работает не в корне сайта, а в директории /tickets/ и использует Nginx + php-fpm.


Предварительные требования

1. Установленный веб-сервер Nginx

Убедитесь, что Nginx установлен и работает на вашем сервере.

2. Установленная СУБД MySQL (MariaDB)

Обе платформы (GLPI и OsTicket) требуют для работы базу данных MySQL или MariaDB.

3. Установленный PHP-FPM

Для корректной работы PHP-скриптов (как в GLPI, так и в OsTicket) необходимо использовать PHP-FPM. В данном конфигурационном файле указан сокет php8.2-fpm. Если у вас установлена другая версия PHP, замените путь сокета на соответствующий.

4. SSL-сертификат

Настройка предполагает работу по протоколу HTTPS (порт 443). Сертификат можно выпустить любым удобным способом, например, через:

В конфигурационном файле Nginx указывается путь к этим файлам сертификатов и ключу:

				
					ssl_certificate /path_to_cert/help.itforprof.com_ecc/fullchain.cer;
ssl_certificate_key /path_to_cert/help.itforprof.com_ecc/help.itforprof.com.key;
				
			

Где располагаются GLPI и OsTicket

GLPI: в корне сайта /, физически в каталоге /var/www/glpi.

OsTicket: по адресу /tickets/, физически в каталоге /var/www/osticket/upload/.

Структура каталогов:

				
					/var/www/glpi          # Файлы GLPI
/var/www/osticket/upload  # Файлы OsTicket
				
			

Конфигурационный файл Nginx

Ниже приведён полный конфигурационный файл, расположенный по адресу:

/etc/nginx/sites-enabled/help_https.conf

Внимание! Конфиг не обрезан и не изменён — приводим его целиком, затем разберём построчно.

				
					server {
   listen 443 ssl http2;
 
   ssl_certificate /path_to_cert/help.itforprof.com_ecc/fullchain.cer;
   ssl_certificate_key /path_to_cert/help.itforprof.com_ecc/help.itforprof.com.key;
 
   server_name help.itforprof.com;
 
   add_header Strict-Transport-Security max-age=31536000;
   add_header Cache-Control "public, max-age=8640000";
   add_header X-Content-Type-Options "nosniff";
   add_header X-XSS-Protection "1; mode=block";
 
   client_max_body_size 200m;
 
   location ~ /\.ht {
       deny all;
   }
 
   location = /robots.txt {
       add_header Content-Type text/plain;
       return 200 "User-agent: *\nDisallow: /\n";
   }
 
   location = /favicon.ico {
       log_not_found off;
       access_log off;
   }
 
   location ^~ /.well-known/acme-challenge/ {
       root /tmp;
       allow all;
       default_type "text/plain";
   }
   
   #OsTicket        
   location ^~ /tickets/ {
       alias /var/www/osticket/upload/;
       index index.php;
       access_log /var/log/nginx/osticket_access.log;
       error_log /var/log/nginx/osticket_error.log;
 
       location ~ ^/tickets/(.+\.php)(/.*)?$ {
           error_log /var/log/nginx/osticket_error.log;
           access_log /var/log/nginx/osticket_access.log;
           include snippets/fastcgi-php.conf;
           fastcgi_pass unix:/run/php/php8.2-fpm.sock;
           fastcgi_split_path_info ^/tickets/(.+\.php)(/.*)$;
           set $path_info $fastcgi_path_info;
           fastcgi_param PATH_INFO $path_info;
           fastcgi_param SCRIPT_FILENAME $request_filename;
           fastcgi_param PHP_VALUE "cgi.fix_pathinfo=1";
           fastcgi_param HTTPS on;
           include fastcgi_params;
       }
 
       try_files $uri $uri/ /tickets/index.php?$query_string;
   }
   
   #GLPI
   location / {
       error_log /var/log/nginx/glpi_error.log;
       access_log /var/log/nginx/glpi_access.log;
       root /var/www/glpi;
       index index.php;
       try_files  $uri /public/index.php$is_args$args;
   }
 
   location ~ \.php$ {
       error_log /var/log/nginx/glpi_error.log;
       access_log /var/log/nginx/glpi_access.log;
 
       root /var/www/glpi;
       fastcgi_pass unix:/run/php/php8.2-fpm.sock;
       fastcgi_split_path_info ^(.+\.php)(/.*)$;
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param HTTP_COOKIE $http_cookie;
       fastcgi_param HTTPS on;
       proxy_cookie_path / "/; secure; HttpOnly";
   }
}
				
			

Построчный разбор конфигурационного файла

Рассмотрим ключевые директивы, которые влияют на работу GLPI и OsTicket.

1. listen 443 ssl http2;

Указывает, что сервер принимает запросы на порт 443 по протоколу HTTPS и поддерживает HTTP/2.

2. ssl_certificate /…/fullchain.cer; и ssl_certificate_key /…/help.itforprof.com.key;

Пути к файлам SSL-сертификата и его приватному ключу. Сертификат обеспечивает шифрование соединения.

3. server_name help.itforprof.com;

Имя сервера (домен), к которому будет обращаться браузер.

4. Безопасные заголовки:

  • add_header Strict-Transport-Security max-age=31536000;

Заставляет браузер всегда использовать HTTPS в течение указанного времени (в секундах).

  • add_header Cache-Control «public, max-age=8640000»;

Управляет кэшированием. max-age=8640000 секунд (примерно 100 дней).

  • add_header X-Content-Type-Options «nosniff»;

Запрещает браузеру определять тип контента самостоятельно («MIME-sniffing»).

  • add_header X-XSS-Protection «1; mode=block»;

Включает встроенный механизм защиты от XSS-векторных атак в браузерах.

5. client_max_body_size 200m;

Ограничивает максимальный размер загружаемых файлов до 200 МБ. Это нужно, например, при загрузке вложений в систему поддержки.

6. location~/\.ht { deny all; }

Защищает .ht* файлы (например, .htaccess) от прямого доступа.

7. location= /robots.txt { … }

Определяет поведение для файла robots.txt, который запрещает индексировать сайт поисковым системам. (Если хотите разрешить, отредактируйте это).

8. location= /favicon.ico { … }

Оптимизация логов — отключается вывод об отсутствии favicon.

9. location^~ /.well-known/acme-challenge/ { … }

Директива, позволяющая верифицировать домен при выпуске сертификатов через ACME-клиенты (certbot, acme.sh). Папка /tmp выбрана как пример для хранения challenge-файлов

Блок OsTicket

				
					location ^~ /tickets/ {
   alias /var/www/osticket/upload/;
   index index.php;
   access_log /var/log/nginx/osticket_access.log;
   error_log /var/log/nginx/osticket_error.log;
   ...
}
				
			

alias /var/www/osticket/upload/;

Заменяет путь /tickets/ на физический каталог /var/www/osticket/upload/.

index index.php;

При обращении к /tickets/ запускается index.php OsTicket.

access_log и error_log указывают, где хранятся логи для удобства мониторинга.

Далее внутри этого блока:

				
					location ~ ^/tickets/(.+\.php)(/.*)?$ {
   error_log /var/log/nginx/osticket_error.log;
   access_log /var/log/nginx/osticket_access.log;
   include snippets/fastcgi-php.conf;
   fastcgi_pass unix:/run/php/php8.2-fpm.sock;
   fastcgi_split_path_info ^/tickets/(.+\.php)(/.*)$;
   set $path_info $fastcgi_path_info;
   fastcgi_param PATH_INFO $path_info;
   fastcgi_param SCRIPT_FILENAME $request_filename;
   fastcgi_param PHP_VALUE "cgi.fix_pathinfo=1";
   fastcgi_param HTTPS on;
   include fastcgi_params;
}
				
			

fastcgi_pass unix:/run/php/php8.2-fpm.sock;

Указывает, что обработка PHP-сценариев идёт через сокет PHP-FPM (версии 8.2).

fastcgi_split_path_info ^/tickets/(.+\.php)(/.*)$;

Делит URI на две части: скрипт и дополнительный путь.

set $path_info $fastcgi_path_info;

Устанавливает переменную $path_info, чтобы передать её в OsTicket.

fastcgi_param PATH_INFO $path_info;

Передача $path_info в окружение PHP. Зачем это нужно в OsTicket?

o OsTicket (как и некоторые другие PHP-приложения) использует «PATH_INFO» для корректной маршрутизации и работы с «дружественными» URL. Если этот параметр не передавать, система может некорректно обрабатывать некоторые запросы, связанные с путями внутри /tickets.

fastcgi_param SCRIPT_FILENAME $request_filename;

Сообщает PHP-FPM, какой файл должен быть интерпретирован как скрипт.

fastcgi_param PHP_VALUE «cgi.fix_pathinfo=1»;

Дополнительная настройка для корректной обработки путей при работе с PHP в CGI-режиме.

Наконец:

				
					try_files $uri $uri/ /tickets/index.php?$query_string;
				
			

try_files

Пытается найти реальный файл или директорию, если не находит — перенаправляет на index.php с исходными параметрами ?$query_string.

Блок GLPI

				
					location / {
   error_log /var/log/nginx/glpi_error.log;
   access_log /var/log/nginx/glpi_access.log;
   root /var/www/glpi;
   index index.php;
   try_files  $uri /public/index.php$is_args$args;
}
				
			

root /var/www/glpi;

Все запросы к / обрабатываются файловым каталогом GLPI.

try_files $uri /public/index.php$is_args$args;

Если запрашиваемый файл не найден, то запрос направляется в /public/index.php, используя параметры GET ($args).

				
					location ~ \.php$ {
   error_log /var/log/nginx/glpi_error.log;
   access_log /var/log/nginx/glpi_access.log;
   root /var/www/glpi;
   fastcgi_pass unix:/run/php/php8.2-fpm.sock;
   fastcgi_split_path_info ^(.+\.php)(/.*)$;
   include fastcgi_params;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   fastcgi_param HTTP_COOKIE $http_cookie;
   fastcgi_param HTTPS on;
   proxy_cookie_path / "/; secure; HttpOnly";
}

				
			

location ~ \.php$ { … }

Обработчик всех PHP-файлов в корне.

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Определяет физический путь исполняемого PHP-файла.

proxy_cookie_path / «/; secure; HttpOnly»;

Настраивает атрибуты secure; HttpOnly для cookie. Это повышает безопасность, запрещая доступ к cookies через JS и передавая их только по HTTPS.

Вывод

В итоге получаем единую конфигурацию Nginx, которая позволяет:

• Обслуживать GLPI с корневого адреса домена (/), используя каталог /var/www/glpi.

• Обслуживать OsTicket по адресу /tickets/, используя каталог /var/www/osticket/upload/.

• Работать по HTTPS (порт 443), используя выданный сертификат.

• Безопасно обрабатывать файлы PHP через php-fpm.

• Контролировать логи и удобнее вести отладку благодаря раздельным лог-файлам.

• Передавать переменную $path_info в OsTicket для корректной маршрутизации.

Если у вас возникли сложности или вопросы при настройке, мы будем рады помочь. Обращайтесь к специалистам itforprof.com за профессиональной поддержкой, чтобы быть уверенными в бесперебойной и безопасной работе ваших сервисов!