Установка и настройка Nginx reverse proxy, web сервер на на CentOS 8
После установки на сервер CentOS 8 (Minimal) (x86_64) 2Gb RAM, 4 CPU, 16Gb SSD, приступаем к подготовке сервера.
Подготовка сервера
Обновляем CentOS 8:
dnf update -y
Устанавливаем репозиторий EPEL и дополнительные пакеты для загрузки и распаковки:
dnf install epel-release wget nano mc open-vm-tools dnf-utils net-tools -y
Настройка времени
Устанавливаем корректный часовой пояс:
\cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
* данной командой мы установим часовой пояс по московскому времени.
Теперь устанавливаем и запускаем службу для автоматической синхронизации времени:
dnf install chrony -y systemctl enable chronyd systemctl start chronyd
Безопасность
Если на сервере используется SELinux (по умолчанию, на системах RPM), рекомендуется ее отключить.
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config setenforce 0
* первая команда редактирует конфигурационный файл, чтобы SELinux не запускался автоматически, вторая — отключает его разово.
Брандмауэр
Для нормальной работы proxy сервера нужно открыть порты:
- 80 — основной порт (http).
- 443 — SSL порт (https).
firewall-cmd --permanent --add-port={80,443}/tcp
firewall-cmd --reload
* Команда (firewall-cmd --reload) перезапускает firewalld, чтобы применить новые правила.
Установка NGINX
Для установки самой свежей стабильной версии nginx создаем конфиг:
nano /etc/yum.repos.d/nginx.repo
Есть 2 версии nginx. Stable version (Стабильная) и Mainline version (Основная). Основная версия — это последняя версия nginx с новыми функционалом. Стабильная версия — это версия, которая нацелена на стабильность и безопасность. Новый функционал не добавляется.
[nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/8/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/8/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true
Можно прописать в файл все два репозитория. Если нужна стабильная версия, тогда ее нужно указать программе dnf, что бы она использовала репозиторий стабильной версии.
dnf config-manager --set-enabled nginx-stable
Устанавливаем NGINX:
dnf install nginx -y
Внесем небольшую корректировку в файл nginx.conf:
nano /etc/nginx/nginx.conf
http {
...
server_names_hash_bucket_size 64;
....
}
* на практике, может встретиться ошибка could not build server_names_hash, you should increase server_names_hash_bucket_size: 32. Она возникает при большом количестве виртуальных серверов или если один из них будет иметь длинное название. Данная строка в конфиге исправит ситуацию.
Разрешаем автозапуск сервиса и запустим его:
systemctl enable nginx systemctl start nginx
Проверим, что веб-сервер работает. Для этого открываем браузер на другом компьютере, который находится в одной сети и вводим в адресной строке IP-адрес сервера. В итоге мы должны увидеть заголовок «Welcome to nginx!»:
- обратите внимание, что данное приветствие может иметь и другой вид.
Редактируем rонфиг:
nano /etc/nginx/conf.d/default.conf
Пример моей настройки.
map $scheme $port { default 80; http 80; https 443; }
server {
listen 80;
server_name wiki.putyato.ru;
# enforce https
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
# SSL config
ssl_certificate /etc/letsencrypt/live/wiki.putyato.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wiki.putyato.ru/privkey.pem;
server_name wiki.putyato.ru;
set $upstream 10.1.1.5;
access_log /var/log/nginx/wiki.putyato.ru-access.log;
error_log /var/log/nginx/wiki.putyato.ru-error.log;
set_real_ip_from 34.238.98.137;
real_ip_header X-Real-IP;
location / {
proxy_pass_header Authorization;
proxy_pass https://$upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off;
client_max_body_size 0;
proxy_read_timeout 36000s;
proxy_redirect off;
proxy_ssl_session_reuse off;
}
}
#----------------------------------------------------------------------------
server {
listen 80;
server_name www.putyato.ru putyato.ru;
access_log /var/log/nginx/www.putyato.ru-access.log;
error_log /var/log/nginx/www.putyato.ru-error.log;
set_real_ip_from 34.238.98.137;
real_ip_header X-Real-IP;
location / {
proxy_pass http://10.1.1.5:80;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
#---------------------------------------------------------------------------------
- proxy_http_version 1.1 — определяет версию протокола HTTP для проксирования, по умолчанию она установлена на 1.0. Для Websockets и keepalive соединений вам необходимо использовать версию 1.1.
- proxy_cache_bypass $http_upgrade — Устанавливает условия, при которых ответ не будет взят из кеша.
- Upgrade $http_upgrade и Connection "upgrade" — эти поля заголовка необходимы, если ваше приложение использует веб-сокеты.
- Host $host — Переменная $host в следующем порядке приоритета содержит: имя хоста из строки запроса, или имя хоста из поля заголовка запроса Host , или имя сервера, соответствующее запросу.
- X-Real-IP $remote_addr — перенаправляет удаленный IP-адрес реального посетителя на прокси-сервер.
- X-Forwarded-For $proxy_add_x_forwarded_for — список, содержащий IP-адреса каждого сервера, через который клиент прошел проксирование.
- X-Forwarded-Proto $scheme — при использовании внутри блока HTTPS-сервера каждый HTTP-ответ от проксируемого сервера перезаписывается на HTTPS.
- X-Forwarded-Host $host — определяет исходный хост, запрошенный клиентом.
- X-Forwarded-Port $server_port — определяет исходный порт, запрошенный клиентом.
Проверяем правильность настроек nginx:
nginx -t
И перезагружаем его:
systemctl restart nginx