Содержание
Установка Nginx
Установим пакеты, необходимые для подключения yum-репозитория:
yum install yum-utils
Для подключения yum-репозитория нужно создать файл с именем /etc/yum.repos.d/nginx.repo со следующим содержимым:
[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=https://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
По умолчанию используется репозиторий для стабильной версии nginx. Ветка mainline – основная, ветка stable – это bug-fix-only.
Разработка новых фич и исправление всех багов происходит на основной ветке, но критические багфиксы при этом попадают в стабильную ветвь.
В целом, рекомендуется использовать mainline, самые последние версии – в ней.

Для переключения на ветку mainline нужно ввести следующую команду:
yum-config-manager --enable nginx-mainline
Чтобы установить nginx, выполните следующую команду:
yum install nginx
Полезные команды nginx
Проверка конфигурации nginx:
nginx -t
Команда, с помощью которой можно применить новую конфигурацию nginx без остановки и перезапуска веб сервера. Будет запущен новый рабочий процесс с новой конфигурацией, а старые процессы плавно завершатся:
nginx -s reload
Следующая команда помимо тестирования конфигурации, выводит полный конфиг на экран. Вывод можно направить в отдельный файл и там проанализировать. Это удобно, когда у вас конфигурация состоит из множества вложенных конфигов, правильность которых трудно оценить разом.
nginx -T
Посмотреть полную информацию о версии nginx, параметрах сборки, модулях и т.д.
nginx -V
Настройка nginx
В конфигах виртуальных хостов важно не забыть, что мы используем сокет для php-fpm, я не сетевой порт.
Первым делом, настроим конфигурацию по-умолчанию.
По-умолчанию nginx слушает на 80 порту и пускает в папку /usr/share/nginx/html, мы же отменим это и создадим для “заглушки” свою директорию и логи.
Можно просто стереть всё содержимое имеющегося файла и заменить его на приложенное ниже.
vi /etc/nginx/default.conf
server {
#listen 80;
#server_name localhost;
access_log /www/default-site/logs/access.log main;
error_log /www/default-site/logs/error.log;
location / {
root /www/default-site/html;
index index.html index.htm;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
log_not_found off;
access_log off;
}
}
mkdir /www
mkdir /www/default-site
mkdir /www/default-site/html
mkdir /www/default-site/logs
chown -R nginx:nginx /www
chmod -R 775 /www
Для создания сайтов структуру папок будем использовать следующую:
/www/site1/html – для файлов сайта
/www/site1/logs – для логов
Каждому сайту (виртуальному хосту) создаём свой конфиг:
vi /etc/nginx/conf.d/site1.conf
Сертификаты для сайтов будем класть сюда:
mkdir /etc/nginx/ssl_cert
Далее я приведу конфиг для сайта на WordPress
server {
listen 80;
server_name your-domain.com www.your-domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name your-domain.com www.your-domain.com;
root /www/your-domain.com/html;
access_log /www/your-domain.com/logs/access.log;
error_log /www/your-domain.com/logs/error.log;
ssl_certificate /etc/nginx/ssl_cert/your-domain.com/your-domain.com.pem;
ssl_certificate_key /etc/nginx/ssl_cert/your-domain.com/your-domain.com.key;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:20m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
ssl_stapling on;
ssl_stapling_verify on;
index index.php index.html;
client_max_body_size 22M;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_ignore_client_abort on;
fastcgi_param SERVER_NAME $http_host;
fastcgi_intercept_errors on;
fastcgi_hide_header X-Powered-By;
}
location ~ /\.ht {
deny all;
}
}
Установка PHP и php-fpm
Подключаем репозиторий remi:
CentOS 7:
yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
CentOS 8:
yum install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
Активируем нужную ветку PHP:
yum-config-manager --disable remi-php54
yum-config-manager --enable remi-php74
Для WordPress:
yum -y install php php-fpm php-dom php-simplexml php-ssh2 php-xml php-xmlreader php-curl php-date php-exif php-filter php-ftp php-gd php-hash php-iconv php-json php-libxml php-pecl-imagick php-mbstring php-mysqlnd php-openssl php-pcre php-posix php-sockets php-spl php-tokenizer php-zlib php-zip php-devel php-mcrypt php-pear php-bcmath php-pdo
Настройка php.ini
vi /etc/php.ini
Нужно настроить часовой пояс, список именованных часовых зон можно посмотреть, например, здесь.
Также можно указать сдвиг относительно GMT вручную. Однако, обозначения временных зон Etc/GMT+n и Etc/GMT-n обратны общепринятым. Например GMT+3 в нотации PHP будет выглядеть как “Etc/GMT-3”.
cgi.fix_pathinfo=0 нужно для работы php-fpm и соответственно Nginx.
memory_limit требуется увеличить для некоторых админок или сайтов (ModX)
date.timezone = Europe/Moscow
date.timezone = Asia/Dubai
cgi.fix_pathinfo=0
memory_limit = 512M
upload_max_filesize = 30M
post_max_size = 40M
expose_php = Off
Выставляем правильные права на директорию с php, по-умолчанию там права для apache
chown -R nginx:nginx /var/lib/php
Настройка php-fpm
Открываем файл конфигурации:
vi /etc/php-fpm.d/www.conf
По-умолчанию php-fpm запускается на порту 9000 адреса 127.0.0.1. Запустим его через unix сокет, это быстрее и безопаснее.
; комментируем эту строчку
;listen = 127.0.0.1:9000
; вписываем строки про сокет
listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx
Также заменим имя пользователя, от которого будет работать php-fpm. Вместо apache укажем nginx.
user = nginx
group = nginx
Запускаем php-fpm и добавляем в автозагрузку.
systemctl start php-fpm
systemctl enable php-fpm
Проверяем, стартовал ли указанный сокет.
ll /var/run/php-fpm/php-fpm.sock
srw-rw---- 1 nginx nginx 0 Jul 3 21:21 /var/run/php-fpm/php-fpm.sock
Установка MariaDB
Для того, чтобы подключить репозиторий MariaDB, можно воспользоваться специальной страницей на официальном сайте, где можно задать параметры системы и получить конфиг репозитория.
Создаём в системе файл с настройками репозитория:
vi /etc/yum.repos.d/mariadb.repo
Вставляем конфиг с сайта, в данном случае версия 10.5 [Stable] для CentOS 7 (x86_64):
[mariadb]
name = MariaDB
baseurl = https://yum.mariadb.org/10.5/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
Запускаем установку:
yum install -y MariaDB-server MariaDB-client
Запускаем mariadb и добавляем в автозагрузку:
systemctl start mariadb
systemctl enable mariadb
Запускаем скрипт начальной конфигурации mysql и задаем пароль для root. Все остальное можно оставить по-умолчанию.
mysql_secure_installation
После обновления операционной системы (yum update)
После обновления софта yum update и соответственно обновления версии php происходит сброс прав на папки php, которые мы вручную назначали для nginx. Необходимо задать владельца и установить права заново:
chown -R nginx:nginx /var/lib/php/*
chmod -R 770 /var/lib/php/*