- Home »

Как установить Nginx на CentOS 8
Настройка веб-сервера — это одна из тех задач, которые рано или поздно встретятся на пути любого системного администратора или DevOps-инженера. Nginx завоевал популярность благодаря своей производительности, гибкости и относительной простоте настройки. Если вы выбрали CentOS 8 как операционную систему для своего сервера, то эта статья поможет вам разобраться с установкой и базовой настройкой Nginx от A до Z.
Здесь мы пройдём весь путь — от подготовки системы до запуска первого сайта. Разберём типичные подводные камни, покажем полезные трюки и дадим практические рекомендации, которые пригодятся в реальной работе. Неважно, настраиваете ли вы VPS или выделенный сервер — принципы остаются теми же.
Как работает Nginx и почему именно он?
Nginx использует асинхронную, событийно-ориентированную архитектуру, которая позволяет обрабатывать тысячи одновременных соединений с минимальным потреблением ресурсов. В отличие от Apache, который создаёт отдельный процесс или поток для каждого соединения, Nginx работает с событиями через epoll/kqueue, что делает его невероятно эффективным для высоконагруженных проектов.
Основные преимущества:
- Низкое потребление памяти (около 2.5MB на 10,000 неактивных keep-alive соединений)
- Отличная производительность при обслуживании статического контента
- Встроенные возможности балансировки нагрузки
- Гибкая система модулей
- Простая и понятная конфигурация
Подготовка системы
Перед установкой Nginx нужно убедиться, что система готова. Начнём с обновления пакетов:
sudo dnf update -y
sudo dnf install -y epel-release
CentOS 8 использует dnf вместо yum, хотя yum всё ещё доступен как символическая ссылка. EPEL (Extra Packages for Enterprise Linux) даёт доступ к дополнительным пакетам, включая более свежие версии Nginx.
Установка Nginx: три способа
Способ 1: Установка из репозитория CentOS
sudo dnf install nginx -y
Способ 2: Установка из официального репозитория Nginx
Этот способ даёт более свежую версию:
# Создаём файл репозитория
sudo tee /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
# Устанавливаем Nginx
sudo dnf install nginx -y
Способ 3: Компиляция из исходников
Для максимального контроля над функциональностью:
# Устанавливаем зависимости
sudo dnf groupinstall "Development Tools" -y
sudo dnf install pcre-devel zlib-devel openssl-devel -y
# Скачиваем и компилируем
cd /tmp
wget http://nginx.org/download/nginx-1.20.2.tar.gz
tar -xzf nginx-1.20.2.tar.gz
cd nginx-1.20.2
./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_gzip_static_module
make && sudo make install
Сравнение способов установки
Способ | Плюсы | Минусы | Рекомендуется для |
---|---|---|---|
Репозиторий CentOS | Простота, интеграция с системой | Может быть устаревшая версия | Стандартные задачи |
Официальный репозиторий | Свежая версия, простота обновления | Может конфликтовать с системными пакетами | Продакшен-серверы |
Компиляция | Полный контроль, оптимизация | Сложность, время, ручные обновления | Специфические требования |
Запуск и настройка автозагрузки
После установки нужно запустить Nginx и добавить его в автозагрузку:
# Запускаем Nginx
sudo systemctl start nginx
# Добавляем в автозагрузку
sudo systemctl enable nginx
# Проверяем статус
sudo systemctl status nginx
Если всё прошло успешно, вы увидите что-то вроде:
● nginx.service - The nginx HTTP and reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2023-01-01 12:00:00 UTC; 1min ago
Настройка firewall
По умолчанию CentOS 8 блокирует HTTP/HTTPS трафик. Открываем нужные порты:
# Разрешаем HTTP и HTTPS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# Применяем изменения
sudo firewall-cmd --reload
# Проверяем открытые порты
sudo firewall-cmd --list-all
Структура конфигурации Nginx
Основные файлы и директории:
- /etc/nginx/nginx.conf — главный конфигурационный файл
- /etc/nginx/conf.d/ — директория для дополнительных конфигов
- /usr/share/nginx/html/ — документы по умолчанию
- /var/log/nginx/ — логи
Посмотрим на базовую структуру главного конфига:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
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;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
}
Создание первого виртуального хоста
Создаём конфигурацию для вашего сайта:
sudo tee /etc/nginx/conf.d/example.com.conf << 'EOF'
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.php;
# Логи для домена
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ =404;
}
# Настройки для PHP (если нужно)
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Кеширование статики
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1M;
add_header Cache-Control "public, immutable";
}
# Безопасность
location ~ /\.ht {
deny all;
}
}
EOF
Создаём директорию для сайта и тестовый файл:
sudo mkdir -p /var/www/example.com
sudo chown -R nginx:nginx /var/www/example.com
sudo chmod -R 755 /var/www/example.com
# Создаём тестовую страницу
sudo tee /var/www/example.com/index.html << 'EOF'
Добро пожаловать на example.com
Nginx успешно установлен!
Сервер работает на CentOS 8
EOF
Проверка конфигурации и перезапуск
Перед применением изменений всегда проверяем конфигурацию:
# Проверяем синтаксис
sudo nginx -t
# Если всё ОК, перезагружаем конфигурацию
sudo systemctl reload nginx
Типичные ошибки и их решения
Ошибка: "nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)"
Скорее всего, порт уже занят. Проверяем:
# Смотрим, что слушает 80 порт
sudo netstat -tulpn | grep :80
# Или с помощью ss
sudo ss -tulpn | grep :80
Ошибка: "403 Forbidden"
Проблемы с правами доступа. Проверяем:
# Права на директорию
ls -la /var/www/example.com/
# SELinux контекст
ls -Z /var/www/example.com/
# Исправляем SELinux контекст
sudo setsebool -P httpd_can_network_connect 1
sudo restorecon -R /var/www/example.com/
Настройка SSL/TLS с Let's Encrypt
Устанавливаем Certbot:
sudo dnf install certbot python3-certbot-nginx -y
# Получаем SSL сертификат
sudo certbot --nginx -d example.com -d www.example.com
# Проверяем автообновление
sudo certbot renew --dry-run
Оптимизация производительности
Несколько полезных настроек для повышения производительности:
# Добавляем в /etc/nginx/nginx.conf в блок http
http {
# Оптимизация worker_processes
worker_processes auto;
worker_rlimit_nofile 65535;
# Настройки событий
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
# Сжатие
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript
application/javascript application/xml+rss application/json;
# Кеширование файлов
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# Буферизация
client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
output_buffers 1 32k;
postpone_output 1460;
}
Мониторинг и логирование
Полезные команды для мониторинга:
# Просмотр логов в реальном времени
sudo tail -f /var/log/nginx/access.log
# Анализ наиболее частых запросов
sudo awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
# Статистика по кодам ответов
sudo awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
# Топ IP-адресов
sudo awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Интеграция с другими сервисами
Nginx отлично работает в связке с различными backend-сервисами:
Проксирование на Node.js приложение
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
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_cache_bypass $http_upgrade;
}
Балансировка нагрузки
upstream backend {
least_conn;
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
Альтернативы и сравнение
Веб-сервер | Потребление RAM | Производительность | Сложность настройки | Модульность |
---|---|---|---|---|
Nginx | Низкое | Высокая | Средняя | Хорошая |
Apache | Среднее | Средняя | Простая | Отличная |
Lighttpd | Низкое | Высокая | Простая | Средняя |
Caddy | Среднее | Высокая | Простая | Хорошая |
Интересные факты и возможности
Nginx может работать не только как веб-сервер, но и как:
- Mail proxy — для проксирования IMAP/POP3/SMTP
- TCP/UDP load balancer — начиная с версии 1.9.13
- WebSocket proxy — для real-time приложений
- HTTP/2 server — с поддержкой server push
Пример конфигурации для WebSocket:
location /ws {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400;
}
Автоматизация и скрипты
Полезный bash-скрипт для быстрого создания виртуальных хостов:
#!/bin/bash
# create-vhost.sh
DOMAIN=$1
WEBROOT="/var/www/$DOMAIN"
if [ -z "$DOMAIN" ]; then
echo "Использование: $0 domain.com"
exit 1
fi
# Создаём директорию
sudo mkdir -p $WEBROOT
sudo chown -R nginx:nginx $WEBROOT
# Создаём конфигурацию
sudo tee /etc/nginx/conf.d/$DOMAIN.conf << EOF
server {
listen 80;
server_name $DOMAIN www.$DOMAIN;
root $WEBROOT;
index index.html index.php;
location / {
try_files \$uri \$uri/ =404;
}
access_log /var/log/nginx/$DOMAIN.access.log;
error_log /var/log/nginx/$DOMAIN.error.log;
}
EOF
# Создаём тестовую страницу
sudo tee $WEBROOT/index.html << EOF
$DOMAIN
$DOMAIN работает!
EOF
# Проверяем конфигурацию и перезагружаем
sudo nginx -t && sudo systemctl reload nginx
echo "Виртуальный хост $DOMAIN создан успешно!"
Полезные ссылки
Заключение и рекомендации
Nginx на CentOS 8 — это мощное сочетание для создания высокопроизводительных веб-серверов. Основные моменты, которые стоит запомнить:
- Для большинства задач достаточно установки из официального репозитория Nginx
- Всегда проверяйте конфигурацию перед применением изменений
- Не забывайте про SELinux и firewall — они могут стать источником проблем
- Регулярно мониторьте логи и производительность
- Используйте SSL/TLS для всех публичных сайтов
Nginx особенно хорош для:
- Высоконагруженных проектов
- Статических сайтов
- Микросервисной архитектуры
- API-серверов
- Балансировки нагрузки
Если вы только начинаете работать с серверами, рекомендую потренироваться на тестовом VPS, а для продакшена рассмотреть выделенный сервер с достаточными ресурсами.
Помните: хорошая конфигурация Nginx — это не только производительность, но и безопасность. Регулярно обновляйте систему, следите за логами и не забывайте делать бэкапы конфигураций!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.