Веб-сервер на CentOS 7 (Apache, NGINX, PHP 8 FastCGI, MySQL 8)

В данном примере использована — связка двух веб-серверов Nginx и Apache, PHP 8 (в режиме FastCGI) и сервер баз данных MySQL 8.

Подготовка системы

Обновление системы

yum update -y

Удаление SELinux

yum remove -y selinux*

Установка репозитория EPEL и REMI

yum install epel-release -y

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

Перезагрузка системы

reboot

Установка утилит

yum install -y wget mc net-tools unzip tar htop

Настройка брандмауэра

В качестве межсетевого экрана будет использоваться iptables.

Удаление Firewalld

Остановка сервиса firewalld:

systemctl stop firewalld

Выключение сервиса автозагрузки firewalld:

systemctl disable firewalld

Удаление firewalld:

yum remove -y firewalld

Установка iptables:

yum install -y iptables-services

Включение сервиса iptables в автозагрузку:

systemctl enable iptables

Запуск сервиса iptables:

systemctl start iptables

Проверка статуса службы iptables:

systemctl status iptables

Перезагрузка системы:

reboot

Создадим файл настроек iptables:

mcedit iptables.sh

и внесем в него следующее содержимое:

#!/bin/sh
# - Очищаем таблицы
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
# - Политики по умолчанию
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# - Разрешить трафик по петлевому интерфейсу
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# - Разрешим передавать пакеты, относящиеся к уже установленным соединениям
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# - Разрешить входящий PING
iptables -A INPUT -p icmp -j ACCEPT
# - Разрешить все исходящие
iptables -I OUTPUT 1 -j ACCEPT
# - Доступ по SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# - Разрешить доступ к WEB серверу
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
# - Сохранить настройки
service iptables save

Сохраняем и назначаем права на выполнение:

chmod +x iptables.sh

Выполняем скрипт:

./iptables.sh

Посмотреть список правил iptables можно командой:

iptables --line-numbers -L -v -n

Установка Apache (httpd)

Устанавливаем Apache:

yum install -y httpd

Для настройка Apache работы в связке с Nginx открываем конфигурационный файл:

mcedit /etc/httpd/conf/httpd.conf

Находим параметр:

Listen 80

Меняем значение на:

Listen 8080

Apache будет слушать порт 8080, так как на порту 80 будет работать Nginx.

Включение сервиса Apache в автозагрузку:

systemctl enable httpd

Запуск сервиса Apache:

systemctl start httpd

Проверка статуса сервиса Apache:

systemctl status httpd

Открываем браузер и вводим в адресную строку IP-адрес или DNS имя сервера и добавляем :8080 (http://<IP-адрес нашего сервера>:8080). Должна откроется тестовая страница.

В данном примере:

http://dev.mailns.local:8080

Установка Ngnix

Устанавливаем Nginx:

yum install -y nginx

Внесем небольшую корректировку в конфигурационный файл Ngnix:

mcedit /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. Она возникает при большом количестве виртуальных серверов или если один из них будет иметь длинное название. Данная строка в конфиге исправит ситуацию.

Включение сервиса Nginx в автозагрузку:

systemctl enable nginx

Запуск сервиса Nginx:

systemctl start nginx

Проверка статуса сервиса Nginx:

systemctl status nginx

Открываем браузер и вводим в адресную строку IP-адрес или DNS имя сервера (http://<IP-адрес нашего сервера>). Должна откроется страница приветствия.

В данном примере:

http://dev.mailns.local

Установка PHP

Remi имеет отдельный конфигурационный файл для каждой версии php, нужно включить нужную вам версию в конфигурационном файле, например на сервере будет установлена версия php 8.0, для этого включаем именно этот репозиторий в файле remi-php80.repo меняем значение на enabled=1.

Открываем файл remi-php80.repo:

mcedit /etc/yum.repos.d/remi-php80.repo

Меняем значение на enabled=1.

Устанавливаем PHP и php-fpm:

yum install -y php php-fpm


Просмотр установленной версии PHP:

php -v

Установка модулей расширений PHP (можно ставить только необходимые для работы):

yum install php-{apcu,bcmath,dba,enchant,env,ffi,gd,gearman,geoip,gmp,igbinary,imagick,imap,intl,ldap,libsmbclient,mailparse,pecl-xmlrpc,memcache,memcached,msgpack,mysqli,mysqlnd,odbc,pdo,pdo_dblib,pdo_firebird,pdo_mysql,pdo_odbc,pdo_pgsql,pdo_sqlite,pgsql,posix,pspell,psr,redis,shmop,smbclient,snmp,soap,sqlite3,swoole,sysvmsg,sysvsem,sysvshm,tidy,uploadprogress,pecl-xmlrpc,yaml,zip,opcache}

Включение сервиса php-fpm в автозагрузку:

systemctl enable php-fpm

Запуск сервиса php-fpm:

systemctl start php-fpm

Проверка статуса сервиса php-fpm:

systemctl status php-fpm

Открываем настройки php-fpm:

mcedit /etc/php-fpm.d/www.conf

Меняем, настройки параметров для работы Apache с PHP в режиме FastCGI:

listen = /var/run/php-fpm/www.sock

listen.backlog = 4096

listen.owner = apache

listen.group = apache

listen.mode = 0666

После перезагружаем php-fpm:

systemctl restart php-fpm

Создание сайта

В директории /var/www/html создаём первый каталог под веб-сайт, и называем его так же, как и доменное имя нашего сайта, чтобы не было путаницы, если сайтов будет несколько.

Создадим директорию для сайта:

mkdir -p /var/www/html/dev.mailns.local

Создаем новый конфигурационный файл виртуального домена Nginx:

mcedit /etc/nginx/conf.d/dev.mailns.local.conf
server {
listen 80;
server_name dev.mailns.local;
root /var/www/html/dev.mailns.local;
index index.php index.html index.htm;
access_log /var/log/nginx/dev.mailns.local.access.log main;
error_log /var/log/nginx/dev.mailns.local.error.log;

location / {
root /var/www/html/dev.mailns.local;
proxy_pass http://127.0.0.1:8080/;
proxy_redirect     off;
proxy_force_ranges on;
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_cache off;
proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
proxy_cache_valid 3s;
proxy_cache_min_uses 2;
client_body_buffer_size    128k;
client_max_body_size       1024m;
proxy_connect_timeout      180;
proxy_send_timeout         180;
proxy_read_timeout         180;
send_timeout               180;
proxy_buffer_size          4k;
proxy_buffers              8 32k;
proxy_busy_buffers_size    68k;
proxy_temp_file_write_size 10m;
}

location ~ /\. {
deny all; 
}

}

Создаем новый конфигурационный файл виртуального домена Apache:

mcedit /etc/httpd/conf.d/dev.mailns.local.conf
<VirtualHost *:8080>
ServerName dev.mailns.local
DocumentRoot /var/www/html/dev.mailns.local
SetEnvIf X-Forwarded-Proto https HTTPS=on
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog /var/log/httpd/dev.mailns.local.error.log
CustomLog /var/log/httpd/dev.mailns.local.access.log common
<Directory /var/www/html/dev.mailns.local>
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
</VirtualHost>

Для проверки, создадим файл index.php, с выводом информации о php.

echo '<?php phpinfo(); ?>' > /var/www/html/dev.mailns.local/index.php

Назначаем владельца директории:

chown -R apache:apache /var/www/html/dev.mailns.local

Перезапускаем Ngnix:

systemctl restart nginx

Перезапускаем Apache:

systemctl restart httpd

Открываем браузер, и заходим по адресу нашего сайта. Открывается страница с информацией о php.

В данном примере:

http://dev.mailns.local

Установка MySQL

Добавим репозиторий:

rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7-6.noarch.rpm

При установке была ошибка:

Неудача получения ключа GPG:[Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022"

Выполним импорт нового ключа:

rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

Устанавливаем MySQL 8:

yum install -y mysql-server

Включение сервиса mysql в автозагрузку:

systemctl enable mysqld

Запуск сервиса mysql:

systemctl start mysqld

Проверим статус сервиса mysql:

systemctl status mysqld

При установке mysqld генерирует временный пароль и сохраняет его в лог-файл /var/log/mysqld.log. Посмотреть пароль можно выполнив команду:

grep 'password' /var/log/mysqld.log

После завершения установки можно запустить встроенный сценарий безопасности MySQL, который изменяет некоторые опции по умолчанию и блокирует удалённый root-логин. Чтобы запустить сценарий, введите:

mysql_secure_installation

Программа запросит root-пароль, который вы получили при установке.

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

Программа оценит ваш новый пароль и сообщит о его надёжности. После этого программа сразу предложит выбрать новый пароль. Поскольку вы выбрали его только что, не нужно этого делать.

После этого сценарий задаст вам ряд вопросов. Чтобы принять данные по умолчанию, можете просто нажать Y и Enter. Сценарий заблокирует анонимных пользователей и удалённый root логин, удалит тестовые таблицы и перезагрузит привилегии.