Установка Nginx, PHP, PHP-fpm, MariaDB

Установка 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/*