Веб сервер одна из самых востребованных ролей Linux серверов. В данном примере использована связка двух веб-серверов — Nginx в качестве кэширующего прокси-сервера для Apache, интерпретатора PHP и сервера баз данных MySQL.
Подготовка системы
Обновление системы
dnf update -y
dnf remove -y selinux*
Установка репозитория EPEL и REMI
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf install -y wget mc net-tools unzip
Настройка брандмауэра
В качестве межсетевого экрана будет использоваться iptables.
Удаление Firewalld
Остановка сервиса firewalld:
systemctl stop firewalld
Выключение сервиса автозагрузки firewalld:
systemctl disable firewalld
Маскировка сервиса firewalld:
systemctl mask --now firewalld
Удаление firewalld:
dnf remove -y firewalld
Установка и включение iptables
Установка iptables:
dnf install -y iptables-services
Включение сервиса iptables в автозагрузку:
systemctl enable iptables
Запуск сервиса iptables:
systemctl start iptables
Проверка статуса службы iptables:
systemctl status iptables
Перезагрузка ОС:
reboot
Создадим файл настроек iptables в редакторе Midnight Commander:
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 # Разрешить доступ к FTP серверу iptables -A INPUT -p tcp --dport 20 -j ACCEPT iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 60000:65535 -j ACCEPT # - Сохранить настройки service iptables save
Сохраняем и назначаем права доступа:
chmod +x iptables.sh
Выполняем скрипт:
./iptables.sh
Посмотреть список правил iptables можно командой:
iptables --line-numbers -L -v -n
Установка Apache (httpd)
Устанавливаем Apache:
dnf install -y httpd
Для настройка Apache работы в связке с Nginx открываем конфигурационный файл:
mcedit /etc/httpd/conf/httpd.conf
Находим параметр:
Listen 80
Меняем значение на:
Listen 8080
Apache будет слушать порт 8080, так как на порту 80 будет работать Nginx
Проверяем синтаксис конфигурационного файла Apache:
apachectl configtest
Включение сервиса Apache в автозагрузку:
systemctl enable httpd
Запуск сервиса Apache:
systemctl start httpd
Проверка статуса сервиса Apache:
systemctl status httpd
Открываем браузер и вводим в адресную строку IP-адрес или DNS имя сервера и добавляем :8080 (http://<IP-адрес нашего сервера>:8080). Откроется тестовая страница.
http://web.dev.mailns.ru:8080
Установка Ngnix
Устанавливаем Nginx:
dnf 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://web.dev.mailns.ru/
Установка PHP
Вывести список возможных модулей PHP можно следующей командой:
dnf module list php
В данном примере будет установлена PHP 8.0 из репозитория Remi:
dnf module install -y php:remi-8.0
Просмотр установленной версии PHP:
php -v
Установка модулей расширений PHP:
dnf install -y php-{apcu,bcmath,dba,enchant,env,ffi,gd,gearman,geoip,gmp,igbinary,imagick,imap,intl,ldap,libsmbclient,mailparse,mcrypt,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,sodium,sqlite3,swoole,sysvmsg,sysvsem,sysvshm,tidy,uploadprogress,xmlrpc,yaml,zip,opcache}
Установка MySQL
Устанавливаем MySQL:
dnf install -y @mysql
Включение сервиса mysql в автозагрузку:
systemctl enable mysqld
Запуск сервиса mysql:
systemctl start mysqld
Проверим статус сервиса mysql:
systemctl status mysqld
Сразу создаем пароль для учетной записи root:
mysqladmin -u root password
Вводим новый пароль, например:
Ekyj6ZfHabq97MvQ64Nc3@
Создание сайта
В директории /var/www/html создаём первый каталог под веб-сайт, и называем его так же, как и доменное имя нашего сайта, чтобы не было путаницы, если сайтов будет несколько.
Создадим директорию для сайта:
mkdir -p /var/www/html/web.dev.mailns.ru
Назначаем владельца директории:
chown -R apache:apache /var/www
Создаем новый конфигурационный файл виртуального домена Nginx:
mcedit /etc/nginx/conf.d/web.dev.mailns.ru.conf
И добавляем следующее содержимое (для HTTP):
server {
listen 80;
server_name web.dev.mailns.ru;
root /var/www/html/web.dev.mailns.ru;
index index.php index.html index.htm;
access_log /var/log/nginx/web.dev.mailns.ru.access.log main;
error_log /var/log/nginx/web.dev.mailns.ru.error.log;
location / {
root /var/www/html/web.dev.mailns.ru;
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/web.dev.mailns.ru.conf
Содержимое файла:
<VirtualHost *:8080>
ServerName web.dev.mailns.ru
DocumentRoot /var/www/html/web.dev.mailns.ru
SetEnvIf X-Forwarded-Proto https HTTPS=on
<IFModule proxy_fcgi_module>
ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "/var/www/html/web.dev.mailns.ru%{reqenv:SCRIPT_NAME}"
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/"
</FilesMatch>
</IFModule>
ErrorLog /var/log/httpd/web.dev.mailns.ru.error.log
CustomLog /var/log/httpd/web.dev.mailns.ru.access.log common
<Directory /var/www/html/web.dev.mailns.ru>
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Для проверки, создадим файл index.php, с выводом информации о php.
echo '<?php phpinfo(); ?>' > /var/www/html/web.dev.mailns.ru/index.php
systemctl restart nginx
Перезапускаем Apache:
systemctl restart httpd
Открываем браузер, и заходим по адресу нашего сайта. Открывается страница с информацией о php.
В данном примере:
http://web.dev.mailns.ru/
Установка Memcached
Memcache разработан для кэширования данных, генерация которых требует большого количества ресурсов. Такого рода данные могут содержать что угодно, начиная с результатов запроса к базе данных и заканчивая тяжеловесным куском шаблона. Memcached не входит в базовый набор модулей, поставляемых с PHP.
Выполняем установку пакетов:
dnf install -y memcached libmemcached
Создаем или открываем на редактирование конфигурационный файл memcached:
mcedit /etc/sysconfig/memcached
PORT — указываем на каком порту будет слушать сервис кэширования;
USER — пользователь, под которым должен запускаться сервис;
MAXCONN — максимальное число одновременных подключений;
CACHESIZE — размер под кэш в мегабайтах;
OPTIONS — параметры запуска (в данном примере наш сервис будет принимать запросы только с адреса локальной петли).
Включение сервиса memcached в автозагрузку:
systemctl enable memcached
Запуск сервиса memcached:
systemctl start memcached
Проверим статус сервиса memcached:
systemctl status memcached
Чтобы проверить, что модуль memcached работаем создадим файл memcachetest.php:
mcedit /var/www/html/web.dev.mailns.ru/memcachetest.php
со следующим содержимым:
<?php
if (!class_exists("Memcache")) exit("Memcached не установлен");
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or exit("Невозможно подключиться к серверу Memcached");
$version = $memcache->getVersion();
echo "Server's version: ".$version."<br/>\n";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Не получилось оставить запись в Memcached");
echo "Записываем данные в кеш Memcached (данные будут храниться 10 секунд)<br/>\n";
$get_result = $memcache->get('key');
echo "Данные, записанные в Memcached:<br/>\n";
var_dump($get_result);
?>
Открываем браузер, и заходим по адресу нашего сайта с указанием memcachetest.php. Если memcached работает и доступен должна открыться страница со следующим содержимым.
http://web.dev.mailns.ru/memcachetest.php
Установка Redis
Redis (расшифровывается как Remote Dictionary Server) – это быстрое хранилище данных типа «ключ‑значение» в памяти с открытым исходным кодом, Redis используется в качестве базы данных, кэша, брокера сообщений и очереди.
Выполняем установку пакета:
dnf install -y redis
Конфигурационный файл расположен по адресу:
/etc/redis.conf
Включение сервиса redis в автозагрузку:
systemctl enable redis
Запуск сервиса redis:
systemctl start redis
Проверим статус сервиса redis:
systemctl status redis
Пример подключения и выполнения запроса.
Чтобы проверить, что модуль redis работаем создадим файл redistest.php:
mcedit /var/www/html/web.dev.mailns.ru/redistest.php
со следующим содержимым:
<?php
$redis = new Redis();
$redis->connect('localhost', 6379);
$redis->auth('password');
$redis->set("test_php_key", "test php value");
echo $redis->get("test_php_key");
echo "\r\n";
?>
Открываем браузер, и заходим по адресу нашего сайта с указанием redistest.php. Если redis работает и доступен должна открыться страница со следующим содержимым.
http://web.dev.mailns.ru/redistest.php
Установка и настройка FTP-сервера
Устанавливаем proftpd:
dnf install -y proftpd
wget http://www.castaglia.org/proftpd/contrib/ftpasswd -P /etc/proftpd
Разрешаем запуск на выполнение скрипта:
chmod +x /etc/proftpd/ftpasswd
Создаем виртуального пользователя:
/etc/proftpd/ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=wwwroot --uid=48 --gid=48 --home=/var/www --shell=/sbin/nologin
/etc/proftpd/ftpd.passwd — путь до файла, в котором хранятся пользователи;
wwwroot — имя пользователя (логин);
uid и gid — идентификаторы пользователя и группы системной учетной записи (apache);
/var/www — домашний каталог пользователя;
/sbin/nologin — оболочка, запрещающая локальный вход пользователя в систему.
Изменим права для созданного файла с паролями:
chmod 440 /etc/proftpd/ftpd.passwd
в противном случае, при запуске proftpd мы получим ошибку «…fatal: AuthUserFile: unable to use /etc/proftpd.d/ftpd.passwd: Operation not permitted…»
Открываем на редактирование конфигурационный файл proftpd:
mcedit /etc/proftpd.conf
И комментируем следующей параметр:
#AuthOrder
Создадим конфигурационный файл со своими настройками:
mcedit /etc/proftpd/conf.d/custom.conf
AuthUserFile /etc/proftpd/ftpd.passwd IdentLookups off UseReverseDNS off RequireValidShell off AuthPAM off RootLogin off DefaultRoot ~ LoadModule mod_auth_file.c AuthOrder mod_auth_file.c PassivePorts 60000 65535 UseIPv6 off ExtendedLog /var/log/proftpd/proftpd.log
Включение сервиса ProFTPd в автозагрузку:
systemctl enable proftpd
Запуск сервиса ProFTPd:
systemctl start proftpd
Проверка статуса сервиса ProFTPd:
systemctl status proftpd
Пробуем подключиться к серверу, использую любые FTP-клиенты, например, FileZilla, Total Commander или тот же браузер.
Установка и настройка Fail2ban
Выполняем установку пакета fail2ban:
dnf install -y fail2ban
Основной конфигурационный файл находится по пути:
/etc/fail2ban/jail.conf
Однако, его не рекомендуется менять и для настройки используют подключаемые файлы из каталога:
/etc/fail2ban/jail.d
SSH
Для создания нового правила SSH необходимо создать конфигурационный файл:
mcedit /etc/fail2ban/jail.d/sshd.conf
Содержимое:
[ssh] enabled = true bantime = 600 port = ssh filter = sshd action = iptables[name=sshd, port=ssh, protocol=tcp] logpath = /var/log/secure maxretry = 10 findtime = 3600
ssh — название для правила;
enabled — позволяет быстро включать (true) или отключать (false) правило;
bantime — время, на которое будет блокироваться IP-адрес;
port — порт целевого сервиса. Принимается буквенное или цифирное обозначение;
filter — фильтр (критерий поиска), который будет использоваться для поиска подозрительных действий. По сути, это имя файла из каталога /etc/fail2ban/filter.d без .conf на конце;
action — действие, совершаемое в случае срабатывания правила. В квадратных скобках указаны название для правила, сетевой порт и протокол для блокирования;
logpath — расположение лог-файла, в котором фильтр будет искать подозрительную активность на основе описанных критериев;
maxretry — количество действий, которые разрешено совершить до бана;
findtime — время в секундах, в течение которого учитывается maxretry.
File2ban cо стандартным фильтром для ProFTPd не блокировал подключения пришлось создать для него отдельный фильтр.
ProFTPd
Для создания нового фильтра для ProFTPd необходимо создать конфигурационный файл:
mcedit /etc/fail2ban/filter.d/proftpd-custom.conf
Содержимое файла:
# fail2ban filter for the ProFTPD FTP daemon
[INCLUDES]
before = common.conf
[Definition]
_daemon = proftpd
failregex = \(\S+\[<HOST>\]\)[: -]+ USER \S+: no such user found from \S+ \[[0-9.]+\] to \S+:\S+\s*$
\(\S+\[<HOST>\]\)[: -]+ USER \S+ \(Login failed\):.*\s+$
\(\S+\[<HOST>\]\)[: -]+ Maximum login attempts \([0-9]+\) exceeded, connection refused.*\s+$
\(\S+\[<HOST>\]\)[: -]+ SECURITY VIOLATION: \S+ login attempted\.\s+$
\(\S+\[<HOST>\]\)[: -]+ Maximum login attempts \(\d+\) exceeded\s+$
ignoreregex =
После создания фильтра надо добавить новое правило для ProFTPd, создаем конфигурационный файл:
mcedit /etc/fail2ban/jail.d/proftpd.conf
Содержимое файла:
[proftpd] enabled = true bantime = 600 port = ftp filter = proftpd-custom action = iptables[name=ftp, port=ftp, protocol=tcp] logpath = /var/log/messages maxretry = 10 findtime = 3600
Nginx DDoS (req limit)
Для начала, необходимо настроить Nginx:
mcedit /etc/nginx/nginx.conf
В раздел http добавим:
limit_req_zone $binary_remote_addr zone=webdevmailnsru:10m rate=5r/s;
Данная настройка создает зону с интенсивностью запросов в 1 запрос в секунду.
После настраиваем лимит для конкретного виртуального домена в разделе server — location:
mcedit /etc/nginx/conf.d/web.dev.mailns.ru.conf
Добавим:
limit_req zone=webdevmailnsru burst=5 nodelay;
Данная настройка вместе с предыдущей зоной, созданной в секции http, позволит лимитировать запросы — 1 запрос в секунду при всплеске 5 запросов.
Перезапускаем сервис Ngnix:
systemctl reload nginx
Создаем правило в fail2ban:
mcedit /etc/fail2ban/jail.d/nginx-limit-req.conf
Содержимое файла:
[nginx-ddos] enabled = true bantime = 600 port = http,https filter = nginx-limit-req action = iptables-multiport[name=nginx-ddos, port="http,https", protocol=tcp] logpath = /var/log/nginx/*.error.log maxretry = 10 findtime = 3600
Включение сервиса fail2ban в автозагрузку:
systemctl enable fail2ban
Запуск сервиса fail2ban:
systemctl start fail2ban
Проверка статуса сервиса fail2ban:
systemctl status fail2ban
Установка phpMyAdmin
Создадим директорию для сайта:
mkdir -p /var/www/html/phpmyadmin.web.dev.mailns.ru
Создаем новый файл виртуального домена Nginx:
mcedit /etc/nginx/conf.d/phpmyadmin.web.dev.mailns.ru.conf
И добавляем следующее содержимое:
server {
listen 80;
server_name phpmyadmin.web.dev.mailns.ru;
root /var/www/html/phpmyadmin.web.dev.mailns.ru;
index index.php index.html index.htm;
access_log /var/log/nginx/phpmyadmin.web.dev.mailns.ru.access.log main;
error_log /var/log/nginx/phpmyadmin.web.dev.mailns.ru.error.log;
location / {
root /var/www/html/phpmyadmin.web.dev.mailns.ru;
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/phpmyadmin.web.dev.mailns.ru.conf
Содержимое файла:
<VirtualHost *:8080>
ServerName phpmyadmin.web.dev.mailns.ru
DocumentRoot /var/www/html/phpmyadmin.web.dev.mailns.ru
SetEnvIf X-Forwarded-Proto https HTTPS=on
<IFModule proxy_fcgi_module>
ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "/var/www/html/phpmyadmin.web.dev.mailns.ru%{reqenv:SCRIPT_NAME}"
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/"
</FilesMatch>
</IFModule>
ErrorLog /var/log/httpd/phpmyadmin.web.dev.mailns.ru.error.log
CustomLog /var/log/httpd/phpmyadmin.web.dev.mailns.ru.access.log common
<Directory /var/www/html/phpmyadmin.web.dev.mailns.ru>
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
wget -P /var/www/html/phpmyadmin.web.dev.mailns.ru http://files.phpmyadmin.net/phpMyAdmin/5.1.1/phpMyAdmin-5.1.1-all-languages.zip
cd /var/www/html/phpmyadmin.web.dev.mailns.ru
Распаковываем архив phpMyAdmin:
unzip phpMyAdmin-5.1.1-all-languages.zip
Переносим содержимое распакованного архива в директорию сайта:
mv phpMyAdmin-5.1.1-all-languages/* /var/www/html/phpmyadmin.web.dev.mailns.ru/
Назначаем владельца директории:
chown -R apache:apache /var/www/html/phpmyadmin.web.dev.mailns.ru/
Перезапускаем Nginx:
systemctl restart nginx
Перезапускаем Apache:
systemctl restart httpd
Сгенерируем случайную последовательность символов:
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo ''
Cоздадим файл:
mcedit /var/www/html/phpmyadmin.web.dev.mailns.ru/config.inc.php
Содержимое файла:
<?php
/**
* phpMyAdmin sample configuration, you can use it as base for
* manual configuration. For easier setup you can use setup/
*
* All directives are explained in documentation in the doc/ folder
* or at <https://docs.phpmyadmin.net/>.
*/
declare(strict_types=1);
/**
* This is needed for cookie based authentication to encrypt password in
* cookie. Needs to be 32 chars long.
*/
$cfg['blowfish_secret'] = 'rdrWuVryamvtwBuwBobs5fW595x9r6Xy'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
/**
* Servers configuration
*/
$i = 0;
/**
* First server
*/
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;
/**
* phpMyAdmin configuration storage settings.
*/
/* User used to manipulate with storage */
// $cfg['Servers'][$i]['controlhost'] = '';
// $cfg['Servers'][$i]['controlport'] = '';
// $cfg['Servers'][$i]['controluser'] = 'pma';
// $cfg['Servers'][$i]['controlpass'] = 'pmapass';
/* Storage database and tables */
// $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
// $cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
// $cfg['Servers'][$i]['relation'] = 'pma__relation';
// $cfg['Servers'][$i]['table_info'] = 'pma__table_info';
// $cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
// $cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
// $cfg['Servers'][$i]['column_info'] = 'pma__column_info';
// $cfg['Servers'][$i]['history'] = 'pma__history';
// $cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
// $cfg['Servers'][$i]['tracking'] = 'pma__tracking';
// $cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
// $cfg['Servers'][$i]['recent'] = 'pma__recent';
// $cfg['Servers'][$i]['favorite'] = 'pma__favorite';
// $cfg['Servers'][$i]['users'] = 'pma__users';
// $cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
// $cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
// $cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
// $cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
// $cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
// $cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';
/**
* End of servers configuration
*/
/**
* Directories for saving/loading files from server
*/
$cfg['UploadDir'] = '';
$cfg['SaveDir'] = '';
/**
* Whether to display icons or text or both icons and text in table row
* action segment. Value can be either of 'icons', 'text' or 'both'.
* default = 'both'
*/
//$cfg['RowActionType'] = 'icons';
/**
* Defines whether a user should be displayed a "show all (records)"
* button in browse mode or not.
* default = false
*/
//$cfg['ShowAll'] = true;
/**
* Number of rows displayed when browsing a result set. If the result
* set contains more rows, "Previous" and "Next".
* Possible values: 25, 50, 100, 250, 500
* default = 25
*/
//$cfg['MaxRows'] = 50;
/**
* Disallow editing of binary fields
* valid values are:
* false allow editing
* 'blob' allow editing except for BLOB fields
* 'noblob' disallow editing except for BLOB fields
* 'all' disallow editing
* default = 'blob'
*/
//$cfg['ProtectBinary'] = false;
/**
* Default language to use, if not browser-defined or user-defined
* (you find all languages in the locale folder)
* uncomment the desired line:
* default = 'en'
*/
//$cfg['DefaultLang'] = 'en';
//$cfg['DefaultLang'] = 'de';
/**
* How many columns should be used for table display of a database?
* (a value larger than 1 results in some information being hidden)
* default = 1
*/
//$cfg['PropertiesNumColumns'] = 2;
/**
* Set to true if you want DB-based query history.If false, this utilizes
* JS-routines to display query history (lost by window close)
*
* This requires configuration storage enabled, see above.
* default = false
*/
//$cfg['QueryHistoryDB'] = true;
/**
* When using DB-based query history, how many entries should be kept?
* default = 25
*/
//$cfg['QueryHistoryMax'] = 100;
/**
* Whether or not to query the user before sending the error report to
* the phpMyAdmin team when a JavaScript error occurs
*
* Available options
* ('ask' | 'always' | 'never')
* default = 'ask'
*/
//$cfg['SendErrorReports'] = 'always';
/**
* You can find more configuration options in the documentation
* in the doc/ folder or at <https://docs.phpmyadmin.net/>.
*/
где ‘rdrWuVryamvtwBuwBobs5fW595x9r6Xy’ — последовательность, которую нам выдала команда head.
И открываем в браузере наш домен, в данном примере, http://phpmyadmin.web.dev.mailns.ru/. Откроется форма для авторизации — вводим логин root и пароль, который мы указали после установки MySQL.
http://phpmyadmin.web.dev.mailns.ru/
Установка Postfix
Выполняем установку пакета postfix:
dnf install -y postfix
Открываем на редактирование файл:
mcedit /etc/postfix/main.cf
Изменяем несколько настроек:
myorigin = $mydomain ... inet_protocols = ipv4
smtp_generic_maps = hash:/etc/postfix/generic_map
myorigin — имя домена, которое будет подставляться всем отправляемым сообщениям без явного указания оного;
inet_protocols — задает версию IP, с которой будет работать Postfix;
smtp_generic_maps — указывает на карту с общими правилами пересылки.
Открываем карту пересылки:
mcedit /etc/postfix/generic_map
Добавляем:
@web.dev.mailns.ru reply@web.dev.mailns.ru
данной настройкой мы будем подставлять всем отправляемым письмам без поля FROM адрес reply@web.dev.mailns.ru.
Создаем карту:
postmap /etc/postfix/generic_map
Для применения настроек перезагружаем почтовый сервер postfix:
systemctl restart postfix
Проверка статуса службы postfix:
systemctl status postfix
Получение бесплатного SSL сертификата Let’s Encrypt
Запрашивать сертификат Let’s Encrypt проще всего с веб-сервера, на котором запущен сайт для домена.
Открываем файл виртуального домена Nginx:
mcedit /etc/nginx/conf.d/web.dev.mailns.ru.conf
И добавляем следующее содержимое:
location ~ /.well-known {
root /var/www/html/web.dev.mailns.ru;
allow all;
}
Перезапускаем Nginx
systemctl restart nginx
Выполним установку утилиты для получения сертификата Certbot:
dnf install -y certbot
Создадим директорию .well-known:
mkdir /var/www/html/web.dev.mailns.ru/.well-known
Создадим директорию acme-challenge:
mkdir /var/www/html/web.dev.mailns.ru/.well-known/acme-challenge
Запрос на получение сертификата при использовании веб-сервера Nginx:
certbot certonly --webroot --agree-tos --email admin@mailns.ru --webroot-path /var/www/html/web.dev.mailns.ru/ -d web.dev.mailns.ru
certonly — запрос нового сертификата;
webroot — проверка будет выполняться на основе запроса к корню сайта;
agree-tos — даем согласие на лицензионное соглашение;
email — почтовый адрес администратора домена;
webroot-path — каталог в системе Linux, который является корневым для сайта;
d — перечисление доменов, для которых запрашиваем сертификат.
Как только сертификат SSL будет успешно получен, certbot напечатает следующее сообщение:
Изменим файл виртуального домена Nginx для использования полученных сертификатов:
mcedit /etc/nginx/conf.d/web.dev.mailns.ru.conf
Приведем содержимое к следующему виду:
server {
listen 80;
server_name web.dev.mailns.ru;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
# ssl on;
ssl_certificate /etc/letsencrypt/live/web.dev.mailns.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/web.dev.mailns.ru/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/web.dev.mailns.ru/chain.pem;
server_name web.dev.mailns.ru;
index index.php index.html index.htm;
access_log /var/log/nginx/web.dev.mailns.ru.access.log main;
error_log /var/log/nginx/web.dev.mailns.ru.error.log;
location / {
root /var/www/html/web.dev.mailns.ru;
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_set_header X-Forwarded-Proto $scheme;
proxy_set_header HTTPS $scheme;
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 ~ /.well-known {
root /var/www/html/web.dev.mailns.ru;
allow all;
}
location ~ /\. {
deny all;
}
}
Перезапускаем Nginx
systemctl restart nginx
Открываем браузер, набираем адрес нашего сайта и проверяем установленно ли безопасное соединение:
https://web.dev.mailns.ru/
Реальный IP-адрес в Apache
Так как все запросы на Apache приходят от Nginx, они воспринимаются как от IP-адреса 127.0.0.1. На практике, это может привести к проблемам, так как некоторым сайтам необходимы реальные адреса посетителей.
Для решения проблемы будем использовать модуль remoteip_module.
Проверяем включен ли модуль remoteip_module, для этого выполним команду:
httpd -M
В конфигурации виртуального домена Nginx должно быть указано:
proxy_set_header X-Forwarded-For $remote_addr;
Проверяем конфигурацию виртульного домена Nginx:
mcedit /etc/nginx/conf.d/web.dev.mailns.ru.conf
Для того, чтобы в логах записывались реальные IP пользователей нужно в основном конфигурационном файле в переменной LogFormat заменить значение %h на %a:
mcedit /etc/httpd/conf/httpd.conf
Создаем конфигурационный файл remoteip_module модуля:
mcedit /etc/httpd/conf.modules.d/remoteip.conf
добавляем в него:
<IfModule remoteip_module> RemoteIPHeader X-Forwarded-For RemoteIPTrustedProxy 127.0.0.1/8 </IfModule>
systemctl restart httpd
Для проверки открываем нашу страницу с phpinfo и находим $_SERVER[‘REMOTE_ADDR’] — его значение должно быть равно адресу компьютера, с которого мы открыли страницу.
PHP как модуль Apache (mod_php)
Этот режим предполагает подключение модуля mod_php в настройках веб-сервера Apache. В этом случае каждый процесс веб-сервера будет включать в себя этот модуль.
Так как не установлен модуль mod_php, выполним установку php:
dnf install -y php
Apache по умолчанию настроен на работу с модулем mpm_event, а модуль mod_php поддерживает только модуль mpm_prefork, с другим модулем он работать не будет. Таким образом, чтобы нормально заработал php, надо вместо модуля mpm_event подключить модуль mpm_prefork. Для этого в конфигурационном файле 00-mpm.conf закомментируем подключение mpm_event и раскомментируем mpm_prefork.
mcedit /etc/httpd/conf.modules.d/00-mpm.conf
Если в конфигурации виртуального хоста Apache указано использовать сокет FastCGI, то строки необходимо закоментировать либо удалить.
mcedit /etc/httpd/conf.d/web.dev.mailns.ru.conf
# <IFModule proxy_fcgi_module>
# ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "/var/www/html/web.dev.mailns.ru%{reqenv:SCRIPT_NAME}"
# <FilesMatch \.php$>
# SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/"
# </FilesMatch>
# </IFModule>
systemctl restart httpd
Теперь в выводе phpinfo можно увидеть изменение настроек.
Ссылки
Полноценный веб-сервер на CentOS 8 — NGINX + Apache (httpd) + MySQL + PHP-FPM (fastCGI) + FTP + PHPMyAdmin + Memcached
Настройка и использование Fail2ban на Linux
Установка и настройка Memcached
Как оптимизировать производительность MySQL при помощи MySQLTuner


































