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

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

Настройка Nginx для GLPI и OsTicket: пошаговая инструкция по совместной работе двух приложений на одном сервере

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

Особенностью данной конфигурации является то, что два приложения работают на одном сервере Nginx: GLPI — в корне сайта, а OsTicket — в поддиректории /tickets/, оба через PHP-FPM.


Требования к окружению

Конфигурация протестирована на следующем стеке:

  • ОС: Ubuntu 22.04 / 24.04 LTS
  • Nginx: 1.24.x — 1.26.x
  • PHP: 8.2-FPM
  • GLPI: 10.0.x
  • OsTicket: 1.18.x
  • СУБД: MariaDB 10.6+

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

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/.

Обратите внимание: для OsTicket используется директива alias (а не root), поскольку приложение размещено в поддиректории — это ключевое отличие alias vs root в Nginx.

Настройка Nginx предполагает следующую структуру каталогов:

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

Настройка Nginx: полный конфигурационный файл

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

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

Важно: Настройка Nginx включает редирект HTTP → HTTPS, SSL-сертификат, заголовки безопасности, защиту чувствительных каталогов GLPI и OsTicket, а также маршрутизацию API OsTicket. Далее каждый блок разбирается построчно.

Схема маршрутизации Nginx: браузер → Nginx → GLPI (/) и OsTicket (/tickets/) через PHP-FPM
Схема маршрутизации запросов через Nginx к GLPI и OsTicket
				
					# Редирект HTTP → HTTPS
server {
    listen 80;
    server_name help.itforprof.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    http2 on;  # Для Nginx < 1.25.1 используйте: 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; includeSubDomains" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "0" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    # add_header Content-Security-Policy "default-src 'self'; ..." always;

    client_max_body_size 200m;

    # Кэширование только для статических файлов
    location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg|woff|woff2|ttf|eot)$ {
        add_header Cache-Control "public, max-age=8640000";
        access_log off;
    }

    # Защита служебных файлов
    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;

        # Запрет доступа к каталогу include (конфиги OsTicket)
        location ~ /tickets/include {
            deny all;
            return 403;
        }

        # Маршрутизация API OsTicket
        location ~ ^/tickets/api/(?:tickets|tasks).*$ {
            try_files $uri $uri/ /tickets/api/http.php?$query_string;
        }

        # AJAX для admin-панели (SCP)
        location ~ ^/tickets/scp/ajax.php/.*$ {
            try_files $uri $uri/ /tickets/scp/ajax.php?$query_string;
        }

        # Обработка PHP
        location ~ ^/tickets/(.+\.php)(/.*)?$ {
            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;
            access_log /var/log/nginx/osticket_access.log;
            error_log /var/log/nginx/osticket_error.log;
        }

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

    # === GLPI ===
    # Защита внутренних каталогов GLPI
    location ~ ^/(config|files|lib|locales|install|phpunit|tests|tools|vendor)/ {
        deny all;
        return 403;
    }

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

    location ~ \.php$ {
        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;
        access_log /var/log/nginx/glpi_access.log;
        error_log /var/log/nginx/glpi_error.log;
    }
}
				
			

Разбор конфигурации

Настройка Nginx для совместной работы GLPI и OsTicket опирается на несколько ключевых директив. Рассмотрим каждую из них.

Редирект HTTP → HTTPS

Первый блок server на порту 80 перенаправляет все HTTP-запросы на HTTPS с кодом 301 (Moved Permanently). Без этого блока пользователи, набравшие адрес без https://, получат ошибку подключения.

Основные директивы и SSL

1. listen 443 ssl; и http2 on;

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

Важно: Начиная с Nginx 1.25.1 (июнь 2023), параметр http2 в директиве listen объявлен deprecated. Вместо listen 443 ssl http2; используйте отдельную директиву http2 on;. Для Nginx версий ниже 1.25.1 оставьте старый синтаксис: listen 443 ssl http2;

2. ssl_certificate и ssl_certificate_key

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

3. server_name help.itforprof.com;

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

Заголовки безопасности

Настройка Nginx включает четыре заголовка безопасности:

  • Strict-Transport-Security с includeSubDomains — заставляет браузер всегда использовать HTTPS в течение указанного времени (в секундах), включая поддомены.
  • X-Content-Type-Options “nosniff” — запрещает браузеру определять тип контента самостоятельно («MIME-sniffing»).
  • X-XSS-Protection “0” — заголовок X-XSS-Protection официально устарел (deprecated). Chrome удалил XSS Auditor в версии 78 (2019), Firefox его никогда не поддерживал. По рекомендации OWASP, значение 1; mode=block может создавать дополнительные уязвимости. Вместо него используйте заголовок Content-Security-Policy (CSP).
  • Referrer-Policy “strict-origin-when-cross-origin” — современный заголовок безопасности, рекомендованный OWASP, контролирует передачу заголовка Referer.

Кэширование статических файлов

Важно: Заголовок Cache-Control применяется только к статике (CSS, JS, изображения, шрифты) через отдельный блок location. Не следует применять Cache-Control на уровне server ко всем ответам — это приведёт к кэшированию динамических PHP-страниц (тикеты, формы, авторизация) и проблемам в продакшене.

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 (/tickets/)

				
					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;

    # Запрет доступа к /include/
    location ~ /tickets/include {
        deny all;
        return 403;
    }

    # Маршрутизация API
    location ~ ^/tickets/api/(?:tickets|tasks).*$ {
        try_files $uri $uri/ /tickets/api/http.php?$query_string;
    }

    # AJAX для admin-панели
    location ~ ^/tickets/scp/ajax.php/.*$ {
        try_files $uri $uri/ /tickets/scp/ajax.php?$query_string;
    }
    ...
}
				
			

alias /var/www/osticket/upload/;

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

index index.php;

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

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

Защита каталога /include/:

Блок location ~ /tickets/include { deny all; } запрещает доступ к каталогу /include/, в котором хранятся конфигурационные файлы OsTicket с паролями БД и другими чувствительными данными.

Маршрутизация API и SCP:

Блоки для /tickets/api/ и /tickets/scp/ajax.php обеспечивают корректную работу REST API тикетов и AJAX-запросов в админ-панели (SCP). Без этих блоков часть функциональности OsTicket может не работать.

Настройка Nginx дополняется внутренним блоком обработки PHP:

				
					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: настройка Nginx для корня сайта

				
					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;

Настройка Nginx для GLPI: все запросы к / обрабатываются из каталога /var/www/glpi.

Примечание о безопасности: Начиная с GLPI 10.0.7, официальная документация рекомендует указывать root на /var/www/glpi/public. В нашей конфигурации root указывает на /var/www/glpi, а try_files перенаправляет в /public/index.php — это необходимо из-за совместного размещения с OsTicket. Для защиты чувствительных каталогов (config, files, vendor и др.) добавлен отдельный блок location с deny all.

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

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

				
					location ~ \.php$ {
    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;
    access_log /var/log/nginx/glpi_access.log;
    error_log /var/log/nginx/glpi_error.log;
}
				
			

location ~ \.php$ { … }

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

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

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

Примечание: В оригинальной конфигурации использовалась директива proxy_cookie_path / “/; secure; HttpOnly”, однако она предназначена для проксируемых ответов и не работает с fastcgi_pass. Для настройки атрибутов cookie (secure, HttpOnly) в PHP-FPM лучше использовать session.cookie_secure и session.cookie_httponly в php.ini или через fastcgi_param PHP_VALUE.

Проверка и запуск конфигурации

После того как настройка Nginx завершена, выполните проверку синтаксиса и перезагрузите веб-сервер:

1. Проверка конфигурации:

nginx -t

Ожидаемый результат: nginx: configuration file /etc/nginx/nginx.conf test is successful

2. Перезагрузка Nginx:

systemctl reload nginx

3. Проверка заголовков ответа:

curl -I https://help.itforprof.com

Убедитесь, что в ответе присутствуют заголовки Strict-Transport-Security, X-Content-Type-Options и Referrer-Policy.

Типичные ошибки и их решение

502 Bad Gateway — проверьте, что PHP-FPM запущен и сокет соответствует вашей версии PHP: systemctl status php8.2-fpm

403 Forbidden — проверьте права доступа к каталогам GLPI и OsTicket (владелец www-data).

Ошибка PATH_INFO в OsTicket — убедитесь, что директивы fastcgi_split_path_info и fastcgi_param PATH_INFO присутствуют в блоке OsTicket.

GLPI показывает предупреждение о безопасности — это связано с тем, что root указывает на /var/www/glpi, а не на /var/www/glpi/public. Блок deny all для внутренних каталогов (config, files, vendor) компенсирует это.

Ошибки в логах — раздельные лог-файлы позволяют быстро локализовать проблему: tail -f /var/log/nginx/glpi_error.log или tail -f /var/log/nginx/osticket_error.log. Для постоянного отслеживания рекомендуем настроить комплексный мониторинг сервера.

Итог

Настройка Nginx для GLPI и OsTicket на одном сервере позволяет:

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

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

• Работать по HTTPS с поддержкой HTTP/2 и современными заголовками безопасности.

• Защищать чувствительные каталоги GLPI и OsTicket от прямого доступа. Для дополнительного контроля целостности файлов на сервере рекомендуем ознакомиться с настройкой AIDE.

• Обеспечивать корректную работу API OsTicket и маршрутизацию PATH_INFO.

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


Нужна помощь с настройкой Nginx, GLPI или OsTicket? Мы выполним установку, настройку и тестирование под ключ в рамках нашей услуги «Администрирование серверов». Оставьте заявку — мы свяжемся с вами!