Пример установки NGINX

Любая инструкция является примерной,
и создана для того, чтобы показать основные команды и действия,
в связи с очень большим разнообразием linux-систем и windows-систем

Установка дополнительного ПО

Установку программного обеспечения должен выполнять технический специалист с базовыми знаниями и навыками администрирования систем Linux и Windows

Для работы Докзиллы через безопасный протокол HTTPS необходимо установить дополнительное ПО - "NGINX", для этого необходимо воспользоваться инструкцией с официального сайта https://nginx.org/ru/docs/install.html, или использовать примеры из нашей краткой инструкции

CentOS / Rocky Linux / Ред ОС

## устанавливаем
yum install nginx
## разрешаем автоматический запуск службы
systemctl enable nginx
## запускаем службу
systemctl start nginx

-----

Debian / Ubuntu / Astra Linux

## устанавливаем
apt-get install nginx
## разрешаем автоматический запуск службы
systemctl enable nginx
## запускаем службу
systemctl start nginx

-----

Windows Server 2012 / 2016 / 2019 / 2022

Nginx для Windows скачивается на официальном сайте https://nginx.org/ru/download.html

Необходимо распаковать архив (например в c:\nginx) и запустить файл c:\nginx\nginx.exe




Конфигурация

Настройка везде одинаковая, необходимо создать файл конфигурации в директории conf, например doczilla.conf, и отредактировать его

## создание файла конфигурации на linux
touch /etc/nginx/conf.d/doczilla.conf
## редактирование файла конфигурации на linux
vi  /etc/nginx/conf.d/doczilla.conf

## создание и редактирование файла конфигурации на windows notepad.exe c:\nginx\conf\doczilla.conf

HTTP протокол

Для работы по HTTP протоколу, рекомендуем вот такое содержимое

server {
  listen 80;
  server_name _;
  client_max_body_size 50m;
  large_client_header_buffers 8 64k;

  location / {
    proxy_pass http://127.0.0.1:9080;
    # Add WSS protocol (WebSocket)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;
  }
}

HTTPS протокол

Для работы по HTTPS протоколу, необходимо скопировать два сертификата (открытую часть cert.crt и закрытую часть cert.key) в папку /etc/nginx/ssl/ и вставить в файл конфига вот такое содержимое.

## перенаправление с HTTP на HTTPS
server {
  listen 80;
  server_name _;
  return 301 https://$host$request_uri;
}
## подключение сертификатов и перенаправление на сайт Докзиллы
server {
  listen 443 ssl;
  server_name _;
  ssl_certificate      /etc/nginx/ssl/cert.crt;
  ssl_certificate_key  /etc/nginx/ssl/cert.key;
  client_max_body_size 50m;
  large_client_header_buffers 8 64k;

  location / {
    proxy_pass http://127.0.0.1:9080;
    # Add WSS protocol (WebSocket)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;
  }
}

Балансировка

Nginx позволяет работать как балансировщик, для отказоустойчивости и разделения нагрузки между серверами. Рекомендуем настроить метод балансировки как на примере:

upstream doczilla {
# задаем балансировку
# ip_hash - перенаправление обязательно по входящему IP (для балансировки нагрузки)
   ip_hash;
# при 3х ошибках в течении 30 сек. переход на следующий сервер
   server 192.168.0.10:9080 max_fails=3 fail_timeout=30s;
   server 192.168.0.11:9080 max_fails=3 fail_timeout=30s;
}
server { ... location / { proxy_pass http://doczilla; ... }
}


После всех изменений конфигурации необходимо проверить конфиг, перечитать настройки или перезапустить службу

## проверить корректность настроек
nginx -t
## перечитать настройки не отключая пользователей
nginx -s reload
## перезапустить службу с отключением всех подключенных пользователей
systemctl restart nginx

-----

Настройка брандмауэра/файрволла

Для работы сайта необходимо открыть нужный порт в файрволле

## для файрволла FIREWALLD
## просмотреть статус службы и открытых портов
firewall-cmd --list-all

## открываем порт 80/tcp HTTP
firewall-cmd --zone=public --add-port=80/tcp --permanent

## другой вариант открытия порта 80/tcp HTTP
firewall-cmd --zone=public --add-service=http --permanent

## открываем порт 443/tcp HTTPS
firewall-cmd --zone=public --add-service=https --permanent

## перезапустить для применения изменений
firewall-cmd --reload


## для файрволла UFW
## просмотреть статус службы и открытых портов
ufw status
## открываем порт 80/tcp HTTP ufw allow 80
## другой вариант открытия порта 80/tcp HTTP ufw allow http
## открываем порт 443/tcp HTTPS ufw allow https


## для файрволла WINDOWS
## открываем порт 80/tcp HTTP
netsh advfirewall firewall add rule name="Web Port 80" dir=in action=allow protocol=TCP localport=80
## открываем порт 443/tcp HTTPS netsh advfirewall firewall add rule name="Web Port 443" dir=in action=allow protocol=TCP localport=443




Дополнительные настройки

Увеличение в конфиге doczilla.conf таймаута ответа сервера до 300 секунд, по умолчанию 60

proxy_read_timeout    300;
proxy_connect_timeout 300;
proxy_send_timeout    300;

так же в файле ./conf/server.properties необходимо добавить параметр

application.server.request.timeout=300


Увеличение в конфиге Nginx размера загружаемого файла до 50Mb (по умолчанию 1Мb) / Ошибка Nginx 413 Payload Too Large 

client_max_body_size 50M;

так же в файле ./conf/server.properties необходимо добавить параметр

web.server.upload.max=50


Указание на конкретный докер контейнер через переменную

server_name _;
set $name thebest;

 location / {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_pass http://$name:9080;
 }


Конвертирование сертификата PFX для Nginx в формате Base 64, с разделением на открытый и закрытый сертификаты

## выгружаем из контейнера закрытый ключ с паролем
openssl pkcs12 -in ./cert.pfx -nocerts -out ./temp.key
## ввести пароль от контейнера и дважды любую парольную фразу
Enter Import Password:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

## переводим ключ в RSA формат без пароля
openssl rsa -in ./temp.key -out ./cert.key
##  ввести парольную фразу
Enter pass phrase for ./temp.key:

## выгружаем из контейнера открытый сертификат
openssl pkcs12 -in ./cert.pfx -clcerts -nokeys  -out ./cert.crt
## ввести пароль от контейнера
Enter Import Password:




Возможные ошибки

nginx: [emerg] 727#727: SSL_CTX_load_verify_locations("/etc/nginx/ssl/cert.cer") failed (SSL: error:0B084088:x509 certificate routines:X509_load_cert_crl_file:no certificate or crl found)

Необходимо пересохранить сертификат из кодировки DER в кодировку Base-64
Windows: запустить сертификат - вкладка 'Состав' - 'Копировать в файл' - 'Далее' -  'Файлы X.509 в кодировке Base-64' - 'Далее' - написать Имя файла - 'Далее' - 'Готово'
Linux: выполнить команды
openssl x509 -inform DER -in cert.сer -out public.crt
openssl rsa -inform DER -in privkey.key -out private.key 

-----

connect() to [::1]:80 failed (13: Permission denied) while connecting to upstream

Необходимо перевести Selinux в режим разрешения и наблюдения Permissive

## просмотреть режимы работы Selinux
getenforce
## установить разрешающий режим Permissive setenforce 0

Для того, чтобы применился режим и после перезагрузки сервера, необходимо изменить конфиг

nano /etc/selinux/config

## отредактировать строку, указав режим наблюдения
SELINUX=permissive

-----

Error 400 Request Header Or Cookie Too Large 

Ошибка при большой длине заголовка тикета Kerberos (например, у пользователя очень много доменных групп), необходимо в конфиге Nginx в разделе server увеличить буфер: 

large_client_header_buffers 8 64k;

и в конфиге server.properties добавить новые параметры

web.server.request.header.size=64536
web.server.response.header.size=64536

-----

Error 413 Payload Too Large 

Ошибка при большой длине передаваемых данных, необходимо в конфиге Nginx в разделе server увеличить размер: 

client_max_body_size 50M;

-----

nginx: [emerg] module "/usr/lib64/nginx/modules/ngx_http_image_filter_module.so" version 1014001 instead of 1024000 in /usr/share/nginx/modules/mod-http-image-filter.conf:1

yum remove nginx-mod* 
yum install nginx-module-*