Введение
Ранее я рассказывал о настройке nginx и php-fpm. В принципе, статья полностью актуальна, по ней получится настроить веб сервер, если вас устраивают версии предложенных в стандартном репозитории пакетов. Если же хочется версий посвежее, то читайте далее.
В своей тестовой среде я буду использовать следующие сущности.
hl.zeroxzed.ru | имя тестового виртуального хоста и сайта |
/web/sites | директория для размещения виртуальных хостов |
95.169.190.64 | внешний ip адрес сервера |
p1m2a.zeroxzed.ru | имя виртуального хоста для phpmyadmin |
Подопытным сервером будет выступать виртуальная машина от ihor, характеристики следующие:
Процессор | 2 ядра |
Память | 8 Gb |
Диск | 150 Gb SSD |
Установка версии PHP от Remi
для CentOS 7
Активируем репу remi-php72, для этого выполняем команду:
# yum-config-manager --enable remi-php72
Устанавливаем php7.2 выполнив команду:
yum install php72
Лучше указывать php72 и тогда пакеты будут установлены только из репозитория remi. Например, я всегда внимательно смотрю какая версия php будет установлена в списке устанавливаемых пакетов.
Установим php-fpm и наиболее популярные модули, которые могут пригодится в процессе эксплуатации веб сервера.
yum install php-fpm php-cli php-mysqlnd php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip php-opcache php-imap
Проверим установленную версию выполнив команду в консоли сервера:
php -v = вывод команды = PHP 7.2.16 (cli) (built: Mar 5 2019 14:45:10) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.16, Copyright (c) 1999-2018, by Zend Technologies
для CentOS 8
Активируем репу php remi-7.2, для этого выполняем команды:
dnf module reset php dnf module enable php:remi-7.2 = вывод команды =
Последняя проверка окончания срока действия метаданных: 1:53:36 назад, Пн 28 окт 2019 08:05:09. Зависимости разрешены. ==================================================================================================== Пакет Архитектура Версия Репозиторий Размер ==================================================================================================== Enabling module streams: httpd 2.4 php remi-7.2 Результат транзакции ==================================================================================================== Продолжить? [д/Н]: д Выполнено! Switching module streams does not alter installed packages (see 'module enable' in dnf(8) for details)
Убедимся что версия выбрана правильно:
dnf module list php = вывод команды = Последняя проверка окончания срока действия метаданных: 1:55:03 назад, Пн 28 окт 2019 08:05:09. CentOS-8 - AppStream Name Stream Profiles Summary php 7.2 common , devel, minimal PHP scripting language Remi's Modular repository for Enterprise Linux 8 - x86_64 Name Stream Profiles Summary php remi-7.2 common , devel, minimal PHP scripting language php remi-7.3 common , devel, minimal PHP scripting language php remi-7.4 common , devel, minimal PHP scripting language Hint: efault, nabled, disabled, nstalled
Всё правильно.
Установим php remi-7.2 и все популярные модули следующей командой:
dnf install php php-fpm php-cli php-mysqlnd php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip php-opcache php-imap
Установка phpmyadmin
Кратко расскажу про установку phpmyadmin в контексте данной статьи. Подробно не буду останавливаться на этом, так как статья и так получается очень объемная, а я еще не все рассказал. Вопрос настройки phpmyadmin я очень подробно рассмотрел отдельно. За подробностями можно сходить туда.
Устанавливаем phpmyadmin через yum. Если ранее все сделали правильно, то конфликтов с зависимостями быть не должно.
# yum install phpmyadmin
Phpmyadmin по-умолчанию сконфигурирована для работы с httpd. Для того, чтобы в будущем автоматически обновлять ее, просто сделаем символьную ссылку из директории с исходниками панели в наш виртуальный хост.
# rm -df /web/sites/p1m2a.zeroxzed.ru/www # ln -s /usr/share/phpMyAdmin /web/sites/p1m2a.zeroxzed.ru/www
Выставляем правильные права на директорию с php сессиями. Без этого работать phpmyadmin не будет.
# chown nginx:nginx /var/lib/php/session/
Можно заходить и проверять работу phpmyadmin. Ее установка закончена.
Установка и настройка FTP-сервера
Мы настроим ProFTPd, так как он позволит использовать виртуальных пользователей с uid пользователя www-data.
Для его установки вводим следующую команду:
apt-get install proftpd
Смотрим uid пользователя www-data:
id www-data
* в Ubuntu это, как правило, 33.
Создаем виртуального пользователя:
ftpasswd —passwd —file=/etc/proftpd/ftpd.passwd —name=ftpwww —uid=33 —gid=33 —home=/var/www —shell=/usr/sbin/nologin
* где /etc/proftpd/ftpd.passwd — путь до файла, в котором хранятся пользователи; ftpwww — имя пользователя (логин); uid и gid — идентификаторы пользователя и группы системной учетной записи (www-data); /var/www — домашний каталог пользователя; /usr/sbin/nologin — оболочка, запрещающая локальный вход пользователя в систему.
Открываем основной конфигурационный файл:
vi /etc/proftpd/proftpd.conf
Снимаем комментарий или редактируем опцию:
DefaultRoot ~
* данная опция говорит о том, что корневой директорией для пользователя будет домашняя директория. Это нужно, чтобы FTP-пользователи не могли выйти за пределы дозволенного и видеть на сервере сайты друг друга.
Создаем дополнительный конфигурационный файл для proftpd:
vi /etc/proftpd/conf.d/custom.conf
Со следующим содержимым:
UseIPv6 off
IdentLookups off
PassivePorts 60000 65535
RequireValidShell off
AuthUserFile /etc/proftpd/ftpd.passwd
AuthPAM off
LoadModule mod_auth_file.c
AuthOrder mod_auth_file.c
* где 60000 — 65535 — диапазон динамических портов для пассивного режима.
Разрешаем автозапуск FTP-серверу и запускаем его:
systemctl enable proftpd
systemctl restart proftpd
Пробуем подключиться к серверу, использую любые FTP-клиенты, например, FileZilla, Total Commander или тот же браузер.
При необходимости, можно настроить шифрование и хранение пользователей в базе данных. Подробнее в инструкции Установка и настройка ProFTPd на Ubuntu Server.
Шаг #6: Установка и настройка php-fpm
В отличии, например от Apache, Nginx самостоятельно работает только со статикой, если в запросе к нему попадается php код, то Nginx сам его не обрабатывает, а проксирует (передает) на специальный php-обработчик, в роли которого выступает один из php модулей — php-fpm (fastCGI process manager).
На момент написания статьи php-fpm последней версии 7.1 нельзя установить из стандартных репозиториев, поэтому в наш список репозиториев () нужно добавить два дополнительных репозитория: EPEL-release и remirepo, а затем уже установить пакет , а также несколько других нужных модулей. Так установка EPEL-release описана ранее в шаге по установке Nginx, то сейчас коснемся только установки remirepo.
Установим репозиторий от remirepo.com:
Установим дополнительные инструменты для активации дополнительного репозитория remi-php71:
Теперь, из уже подключенного репозитория установим необходимые php-пакеты:
- php-fpm — обработчик php кода для Nginx
- php-mysqlnd — содержит функции для работы с БД
- php-mbstring — содержит функции для работы со строками
- php-cli — позволяет запускать php код прямо в консоли
Запустим php-fpm.
Настройка файла конфигурации php-fpm
Откроем главный конфиг php — :
На данный момент нас интересует одна директива — , которая «говорит» php, чтобы он выполнил любой ближайший файл, если изначально запрашиваемый файл не был найден.
Существует опасность в том, что пользователь может создавать вредоносные запросы на сервер, которые будут беспрепятственно выполнены, чего допустить никак нельзя. Чтобы этого не случилось, найдем директиву , раскоментируем и отключим, установив ее параметр в значение — 0.
Также откройте для редактирования файл конфигурации php-fpm — и измените в нем имя пользователя и группы (по умолчанию установлен пользователь apache). Это позволит избежать проблем с правами на запись файлов сайта.
Если вы используете тестовый сервер и вам необходимо выводить ошибки PHP когда они случаются, то также укажите следующие директивы.
После правки всех конфигов, перезапустим php-fpm.
Проверка работы php-скриптов
Создайте тестовый файл для сайта, например , и вставьте в него следующий код:
Далее в браузере перейдите по адресу example.ru/test.php, если на полученной странице отобразится результат выполнения функции , то это значит, что php-код успешно обрабатывается и на этом установка LEMP-стека завершена.
Проверка работы PHP
Теперь файл нужно удалить.
Apache
Для поддержки файла .htaccess, который используется многими сайтами, необходимо установить и настроить веб-сервер Apache.
Устанавливаем apache и модуль для php:
apt-get install apache2 libapache2-mod-php
Заходим в настройки портов:
vi /etc/apache2/ports.conf
И редактируем следующее:
Listen 8080
#<IfModule ssl_module>
# Listen 443
#</IfModule>
#<IfModule mod_gnutls.c>
# Listen 443
#</IfModule>
* мы настроили прослушивание на порту 8080, так как на 80 уже работает NGINX. Также мы закомментировали прослушивание по 443, так как и он будет слушаться NGINX.
Теперь открываем настройку следующего модуля:
vi /etc/apache2/mods-available/dir.conf
И добавляем впереди индексных файлов index.php:
<IfModule dir_module>
DirectoryIndex index.php index.html …
</IfModule>
* если не указан конкретный скрипт, сначала веб-сервер пытается найти и запустить index.php, затем index.html и так далее.
Открываем основной конфигурационный файл для apache:
vi /etc/apache2/apache2.conf
Рядом с опциями Directory дописываем:
<Directory /var/www/*/www>
AllowOverride All
Options Indexes ExecCGI FollowSymLinks
Require all granted
</Directory>
* где Directory указывает на путь, для которого мы хотим задать настройки; AllowOverride — позволит переопределить все настройки с помощью файла .htaccess; Options задает некоторые настройки: Indexes разрешает списки каталогов, ExecCGI разрешает запуск cgi скриптов, Require all granted — предоставляет всем доступ к сайтам в данном каталоге.
Ниже допишем:
<IfModule setenvif_module>
SetEnvIf X-Forwarded-Proto https HTTPS=on
</IfModule>
* этой настройкой мы при получении заголовка X-Forwarded-Proto со значением https задаем переменную $_SERVER равную on. Данная настройки критична для функционирования некоторых CMS.
Запрещаем mpm_event:
a2dismod mpm_event
* по умолчанию, apache2 может быть установлен с модулем мультипроцессовой обработки mpm_event. Данный модуль не поддерживает php 7 и выше.
Разрешаем модуль мультипроцессовой обработки mpm_prefork:
a2enmod mpm_prefork
Разрешаем модуль php:
a2enmod php7.4
* в данном примере установлен php версии 7.4.
Разрешаем модуль setenvif:
a2enmod setenvif
Разрешаем модуль rewrite:
a2enmod rewrite
В процессе включения модулей, если мы видим «Module … already enabled», значит модуль уже включен.
Разрешаем автозапуск Apache и перезапускаем службу:
systemctl enable apache2
systemctl restart apache2
Открываем браузер и вводим в адресную строку http://<IP-адрес сервера>:8080. Мы должны увидеть привычную страницу:
* в разделе Server API мы должны увидеть Apache.
NGINX + Apache
Ранее мы настроили связку nginx + php-fpm. Теперь настроим nginx + apache. Открываем конфигурационный файл nginx для сайта по умолчанию:
vi /etc/nginx/sites-enabled/default
Находим наш настроенный location для php-fpm:
…
location ~ \.php$ {
set $root_path /var/www/html;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $root_path;
}
…
и меняем на:
…
location ~ \.php$ {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
…
Проверяем и перезапускаем nginx:
nginx -t
systemctl restart nginx
Пробуем открыть в браузере http://<IP-адрес сервера> — должна открыться та же страница, что при проверке Apache (с добавлением 8080):
Apache Real IP
Запросы на apache приходят от NGINX, и они воспринимаются первым как от IP-адреса 127.0.0.1. На практике, это может привести к проблемам, так как некоторым сайтам необходимы реальные адреса посетителей. Для решения проблемы будем использовать модуль remoteip.
Создаем конфигурационный файл со следующим содержимым:
vi /etc/apache2/mods-available/remoteip.conf
<IfModule remoteip_module>
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1/8
</IfModule>
Активируем модуль:
a2enmod remoteip
Перезапускаем apache:
systemctl restart apache2
Для проверки настройки открываем браузер и вводим в адресную строку http://<IP-адрес сервера>, где откроется наша страница phpinfo. В разделе Apache Environment мы должны увидеть внешний адрес компьютера, с которого обращаемся к серверу в опции REMOTE_ADDR.
Шаг 1 — Установка веб-сервера Nginx
Установите пакет с помощью следующей команды:
При получении запроса введите для подтверждения того, что вы хотите установить nginx.
После завершения установки запустите следующую команду, чтобы активировать и запустить сервер:
Если вы активировали брандмауэр в соответствии с руководством по начальной настройке сервера, вам нужно будет разрешить подключение к Nginx. Следующая команда будет постоянно активировать подключения по HTTP, запущенные на порту по умолчанию:
Чтобы подтвердить применение изменений, вы можете использовать следующую команду:
Вывод будет выглядеть следующим образом:
Выполните перезапуск конфигурации брандмауэра, чтобы изменения вступили в силу:
После добавления нового правила брандмауэра вы можете проверить, запущен ли сервер, запросив доступ к публичному IP-адресу или доменному имени сервера из вашего веб-браузера.
Примечание: если вы используете DigitalOcean в качестве провайдера хостинга DNS, вы можете изучить нашу для получения подробных инструкций по настройке нового доменного имени и указать ваш сервер.
Если у вас нет доменного имени, указывающего на ваш сервер, и вы не знаете публичный IP-адрес вашего сервера, вы можете найти его, введя следующую команду:
Команда выведет несколько IP-адресов. Вы можете попробовать каждый из них в своем браузере.
Также вы можете проверить доступность IP-адреса из других мест в интернете:
Введите полученный адрес в браузере, после чего вы попадете на страницу Nginx по умолчанию:
Если вы увидите эту страницу, это значит, что ваш веб-сервер установлен корректно.
Настройка FirewallD
Установка и настройка
Проверим наличие firewalld:
systemctl status firewalld = вывод команды = Unit firewalld.service could not be found.
Если устанавливали с минимальной версии CentOS то Firewalld там не установлен.
Установим FirewallD вез вопросов командой:
yum -y install firewalld
Добавим в автозагрузку и запустим:
systemctl enable firewalld systemctl start firewalld
Проверим статус:
systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since Чт 2017-04-13 20:22:40 MSK; 14s ago Docs: man:firewalld(1) Main PID: 2099 (firewalld) CGroup: /system.slice/firewalld.service └─2099 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid апр 13 20:22:39 nginx.sevo44.loc systemd: Starting firewalld - dynamic firewall daemon... апр 13 20:22:40 nginx.sevo44.loc systemd: Started firewalld - dynamic firewall daemon.
Или короткой командой:
firewall-cmd --state = вывод команды = running
Всё хорошо. Можно приступать к настройке доступа к серверу.
Открытие портов http и https
Добавим сразу 80 и 443 порты в наш FirewallD:
firewall-cmd --permanent --zone=public --add-service=http firewall-cmd --permanent --zone=public --add-service=https
Перезагрузим правила FirewallD:
firewall-cmd --reload = вывод команды = success
Проверим:
firewall-cmd --permanent --list-all public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client http https ssh ports: protocols: masquerade: no forward-ports: sourceports: icmp-blocks: rich rules:
Мне не нужны лишние допуски поэтому удалю dhcpv6-client командой:
firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client = вывод команды = success
Перезагрузим и проверим:
firewall-cmd --reload = вывод команды = success firewall-cmd --permanent --list-all = вывод команды = public target: default icmp-block-inversion: no interfaces: sources: services: http https ssh ports: protocols: masquerade: no forward-ports: sourceports: icmp-blocks: rich rules:
Все прошло успешно. Теперь открыт доступ к серверу по нужным нам портам.
Настройка блоков сервера (опция)
Если вы хотите разместить несколько сайтов на одном и том же веб-сервере Nginx, вам придется создать блоки сервера. Блоки сервера Nginx работают аналогичным с виртуальными хостами Apache образом, позволяя одному серверу реагировать на запросы к нескольким доменным именам и предоставлять разное содержимое для каждого домена. В CentOS 8 серверные блоки определяются в файлах
Мы создадим серверный блок для домена с именем your_domain.
По умолчанию Nginx на CentOS 8 настроен для предоставления документов из директории в
Создайте директорию для your_domain следующим образом, используя флаг
# sudo mkdir -p /var/www/your_domain/html
1 | # sudo mkdir -p /var/www/your_domain/html |
Затем необходимо назначить права владения для директории с помощью переменной среды
# sudo chown -R $USER:$USER /var/www/your_domain/html
1 | # sudo chown -R $USER:$USER /var/www/your_domain/html |
Затем мы создадим образец страницы
# sudo dnf install nano
1 | # sudo dnf install nano |
Теперь вы можете использовать
nano /var/www/your_domain/html/index.html
1 | nanovarwwwyour_domainhtmlindex.html |
В этом файле добавьте следующий код HTML:/var/www/your_domain/html/index.html
<html>
<head>
<title>Welcome to your_domain</title>
</head>
<body>
<h1>Success! Your Nginx server is successfully configured for <em>your_domain</em>. </h1>
<p>This is a sample page.</p>
</body>
</html>
1 |
<html> <head> <title>Welcome toyour_domain<title> <head> <body> <h1>Success!Your Nginx server issuccessfully configured for<em>your_domain<em>.<h1> <p>Thisisasample page.<p> <body> <html> |
Сохраните файл и закройте его после завершения. Если вы используете nano, вы можете сделать это, нажав CTRL + X, Y, а затем ENTER.
Чтобы Nginx обслуживал это содержимое, нам нужно создать серверный блок с правильными директивами, которые указывают на наш настраиваемый корневой каталог. Мы создадим новый серверный блок в
# sudo nano /etc/nginx/conf.d/your_domain.conf
1 | # sudo nano /etc/nginx/conf.d/your_domain.conf |
Вставьте следующий блок конфигурации:/etc/nginx/conf.d/your_domain.conf
server {
listen 80;
listen :80;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain www.your_domain;
location / {
try_files $uri $uri/ =404;
}
}
1 |
server{ listen80; listen::80; rootvarwwwyour_domainhtml; index index.html index.htm index.nginx-debian.html; server_name your_domain www.your_domain; location{ try_files$uri$uri=404; } } |
Сохраните и закройте файл после внесения изменений в его содержимое.
Чтобы убедиться, что в файлах Nginx нет синтаксических ошибок, запустите следующую команду:
# sudo nginx -t
1 | # sudo nginx -t |
Если проблем нет, вы увидите на экране следующие результаты:
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
1 |
Outputnginxthe configuration fileetcnginxnginx.conf syntax isok nginxconfiguration fileetcnginxnginx.conf test issuccessful |
После тестирования конфигурации перезапустите Nginx для активации изменений:
# sudo systemctl restart nginx
1 | # sudo systemctl restart nginx |
Прежде чем вы сможете проверить изменения в браузере, вам нужно будет обновить контексты безопасности SELinux вашего сервера, чтобы позволить Nginx обслуживать содержание из директории
Следующая команда позволит использовать ваш настраиваемый корневой каталог документов в качестве содержимого HTTP:
chcon -vR system_u:object_r:httpd_sys_content_t:s0 /var/www/your_domain/
1 | chcon-vR system_uobject_rhttpd_sys_content_ts0varwwwyour_domain |
Теперь вы можете проверить настройку вашего пользовательского домена, перейдя на
Эта страница отображает код HTML, который мы задали в корневой директории документов, созданной для серверного блока. Если вы увидите эту страницу, это означает, что ваш сервер Nginx настроен корректно для обслуживания вашего домена.
Установка php в CentOS 8
Установка php в Centos 8 сильно упростилась по сравнению с предыдущей версией, потому что в базовом репозитории хранится актуальная версия php 7.2, которой можно пользоваться. Пока нет необходимости подключать сторонние репозитории, так как версия 7.2 вполне свежа и актуальна. Если у вас нет необходимости использовать что-то новее, то можно остановиться на этой версии.
Устанавливаем php в CentOS 8, а так же некоторые популярные модули, которые могут пригодиться для того же phpmyadmin.
Выполним перезапуск apache:
Создадим файл в директории виртуального хоста и проверим работу php:
Заходим по адресу http://z.serveradmin.ru/index.php
Вы должны увидеть вывод информации о php. Если что-то не так, возникли какие-то ошибки, смотрите лог ошибок виртуального хоста, php ошибки будут тоже там.
Где лежит php.ini
После установки часто возникает вопрос, а где хранятся настройки php? Традиционно они находятся в едином файле настроек. В CentOS php.ini лежит в /etc, прямо в корне. Там можно редактировать глобальные настройки для всех виртуальных хостов. Персональные настройки каждого сайта можно сделать отдельно в файле конфигурации виртуального хоста, который мы сделали раньше. Давайте добавим туда несколько полезных настроек:
Добавляем в самый конец, перед </VirtualHost>
Для применения настроек нужно сделать restart apache. Если у вас полностью дефолтная установка, как у меня, то скорее всего вы увидите ошибку.
Суть ошибки в том, что у нас не загружен модуль mod_php. Проверим, где он подключается. Это файл /etc/httpd/conf.modules.d/15-php.conf.
Тут стоит проверка на запуск модуля. Он загружается только, если у нас загружен модуль prefork. Давайте попробуем его загрузить принудительно. Для этого комментируем все строки, кроме основной.
Проверяем конфигурацию apache.
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.
Получили новую ошибку. Смысл в том, что изначально apache сконфигурирован на работу модуля mpm_event, он подключается в конфиге /etc/httpd/conf.modules.d/00-mpm.conf.
Стандартный модуль mod_php скомпилирован с поддержкой модуля mpm_prefork. С другими он работать не будет. Таким образом, чтобы у нас нормально заработал php, нам надо вместо модуля mpm_event подключить модуль mpm_prefork. Для этого в конфиге 00-mpm.conf закомментируем подключение mpm_event_module и раскомментируем prefork.
После этого проверяйте конфигурацию и перезапускайте apache. Все должно заработать. Теперь в выводе phpinfo можно увидеть изменение настроек.
Я подробно разобрал эти ошибки, чтобы у вас было понимание, как все устроено и куда смотреть в случае проблем. Более подробно о работе и выборе mpm модулей читайте в официальной документации apache — http://httpd.apache.org/docs/2.4/mpm.html.
Подготовка nginx к мониторингу
Я планирую мониторить следующие параметры nginx:
accepts per second | Число принятых соединений в секунду |
active connections | Текущие активные соединения |
handled per second | Число обработанных соединений в секунду |
latency | Время ответа сервера в миллисекундах |
memory allocated | Занимаемая память |
process count | Число запущенных процессов |
reading state connection count | Текущее число соединений, в которых nginx в настоящий момент читает заголовок запроса |
requests per second | Число запросов в секунду |
waiting state connection count | Текущее число бездействующих соединений в ожидании запроса |
writing state connection count | Текущее число соединений, в которых nginx в настоящий момент отвечает |
memory allocated | Сколько памяти занимают все worker process |
Сервер nginx умеет отдавать часть необходимой нам информации о своем состоянии. Для этого его надо соответствующим образом подготовить. Открываем конфиг сервера и добавляем туда следующую конструкцию:
server { listen localhost; server_name localhost; keepalive_timeout 0; allow 127.0.0.1; allow ::1; deny all; access_log off; location /nginx-status { stub_status on; }
Я обычно добавляю в самый конец основного конфига nginx.conf. Сохраняем и перечитываем конфигурацию, перед этим проверив его конфиг на ошибки:
# nginx -t # nginx -s reload
Проверяем, можем ли мы получить необходимую информацию для настройки мониторинга:
# curl http://localhost/nginx-status Active connections: 89 server accepts handled requests 1374661 1374661 9511381 Reading: 0 Writing: 1 Waiting: 87
Теперь проверим, сможет ли zabbix получать эту страницу.
# zabbix_agentd -t web.page.get
Если у вас так же, то все в порядке, можно двигаться дальше. Если что-то не получается, то проверяйте конфиги, смотрите логи. Это штатный функционал, он должен без проблем настраиваться и работать.
Сразу обращаю внимание на один важный момент, на котором я застрял на приличное время. Через curl я без проблем забирал страничку со статусом nginx, а вот через zabbix никак не получалось
Была ошибка:
:80]: Connection refused]
Я всю голову сломал, 10 раз перепроверил конфиги, никак не мог понять, почему не работает. Оказалось, дело было вот в чем. Zabbix-agent обращался к серверу Nginx по протоколу ipv6. Это при том, что как агент, так и nginx работали по ipv4. Я принудительно отключаю у служб ipv6, если он не используется.
Обнаружил это случайно, когда от безысходности запустил Nginx на всех интерфейсах и снял ограничения allow/deny в конфиге. Тогда запрос прошел нормально. Я посмотрел access лог и увидел, что zabbix-agent обращается с адреса ::1. И все стало ясно. Я так и не понял, как заставить агента ходить по ipv4. В итоге запустил nginx на обоих протоколах и разрешил забирать страницу статуса с адреса ::1. После этого заработало.
Самое неприятное в этой ситуации было то, что в логах нигде не было никаких ошибок, отклоненных запросов или чего-то еще, что могло бы дать зацепку. Zabbix agent просто писал, что подключение отклонено и все. О том, что он обращается по ipv6, не было никакого намека.
Установка и настройка FTP-сервера
В качестве FTP-сервера будем использовать ProFTPd, так как он позволяет авторизовываться под uid системных учетных записей.
ProFTPd можно устанавливать командой:
dnf install proftpd
Загружаем скрипт ftpasswd:
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=ftpwww —uid=48 —gid=48 —home=/var/www —shell=/sbin/nologin
* где
- /etc/proftpd/ftpd.passwd — путь до файла, в котором хранятся пользователи;
- ftpwww — имя пользователя (логин);
- 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:
vi /etc/proftpd.conf
И редактируем следующее (комментируем):
#AuthOrder …
Создадим конфигурационный файл со своими настройками:
vi /etc/proftpd/conf.d/custom.conf
И добавим следующее:
UseIPv6 off
IdentLookups off
PassivePorts 60000 65535
RequireValidShell off
AuthUserFile /etc/proftpd/ftpd.passwd
AuthPAM off
LoadModule mod_auth_file.c
AuthOrder mod_auth_file.c
* где 60000 — 65535 — диапазон динамических портов для пассивного режима.
Разрешаем автозапуск FTP-серверу и запускаем его:
systemctl enable proftpd —now
Пробуем подключиться к серверу, использую любые FTP-клиенты, например, FileZilla, Total Commander или тот же браузер.
Это базовая и самая простая настройка ProFTPd, но если необходимо настроить TLS или хранить виртуальных пользователей в базе MySQL, читайте подробнее инструкцию по настройке ProFTPd на CentOS.
Тюнинг веб-сервера
PHP
Открываем на редактирование следующий файл:
vi /etc/php.ini
И правим следующее:
upload_max_filesize = 512M
…
post_max_size = 512M
…
short_open_tag = On
…
date.timezone = «Europe/Moscow»
Перезапускаем php-fpm и httpd:
systemctl restart php-fpm
systemctl restart httpd
NGINX
Открываем на редактирование следующий файл:
vi /etc/nginx/nginx.conf
И внутри секции http добавляем:
client_max_body_size 512M;
После перезапускаем nginx:
systemctl restart nginx
Подробнее про тюнинг NGINX в статье Практические советы по тюнингу веб-сервера NGINX.
Postfix
Чтобы отправляемая почта меньше попадала в СПАМ, необходимо выполнить следующие шаги:
- Прописать PTR-запись.
- Создать запись SPF.
- Настроить DKIM.
Установка и настройка FTP-сервера
В качестве FTP-сервера будем использовать ProFTPd, так как он позволяет авторизовываться под uid системных учетных записей. Для его установки вводим следующую команду:
yum install proftpd proftpd-utils
Создаем каталог для хранения настроек:
mkdir /etc/proftpd.d
Создаем виртуального пользователя:
ftpasswd —passwd —file=/etc/proftpd.d/ftpd.passwd —name=ftpwww —uid=48 —gid=48 —home=/var/www —shell=/sbin/nologin
* где /etc/proftpd/ftpd.passwd — путь до файла, в котором хранятся пользователи; ftpwww — имя пользователя (логин); uid и gid — идентификаторы пользователя и группы системной учетной записи (apache); /var/www — домашний каталог пользователя; /sbin/nologin — оболочка, запрещающая локальный вход пользователя в систему.
Открываем на редактирование конфигурационный файл proftpd:
vi /etc/proftpd.conf
И редактируем следующее (комментируем):
#AuthOrder …
В конце файла добавим следующее:
UseIPv6 off
IdentLookups off
PassivePorts 40900 40999
RequireValidShell off
AuthUserFile /etc/proftpd.d/ftpd.passwd
AuthPAM off
LoadModule mod_auth_file.c
AuthOrder mod_auth_file.c
* где 40900 — 40999 — диапазон динамических портов для пассивного режима.
Разрешаем автозапуск FTP-серверу и запускаем его:
systemctl enable proftpd
systemctl start proftpd
Пробуем подключиться к серверу, использую любые FTP-клиенты, например, FileZilla, Total Commander или тот же браузер.
Это базовая и самая простая настройка ProFTPd, но если необходимо настроить TLS или хранить виртуальных пользователей в базе MySQL, читайте подробнее инструкцию по настройке ProFTPd на CentOS 7.
Настройка SELinux для web сервера apache
Раздел для тех, кто хочет настроить SELinux на своем web сервере. Сначала ставим пакет policycoreutils-python-utils если он еще не установлен. Он нам нужен для утилиты semanage.
# dnf install policycoreutils-python-utils
Теперь автоматически сформируем модуль для selinux на основе событий аудита, которые накопились, пока мы настраивали сайт. Посмотреть их можно командой.
# grep httpd /var/log/audit/audit.log | audit2why
Создаем модуль selinux.
# grep httpd /var/log/audit/audit.log | audit2allow -M my-httpd
Загружаем его.
# semodule -i my-httpd.pp
То же самое делаем для php.
# grep php /var/log/audit/audit.log | audit2allow -M my-php # semodule -i my-php.pp
Добавим нашу директорию /web/sites в соответствующие таблицы selinux для контента и логов.
# semanage fcontext -a -t httpd_sys_content_t "/web/sites(/.*)?" # semanage fcontext -a -t httpd_log_t "/web/sites(/.*)?/log(/.*)?"
И отдельно добавим каталог, куда web сервер сможет писать данные. Я покажу на примере правила для сайтов wordpress, где web сервер должен уметь писать в директорию wp-content для загрузки медиафайлов, установки тем и плагинов, а так же изменять файл wp-config.php.
# semanage fcontext -a -t httpd_sys_rw_content_t "/web/sites/\*/www/wp-content(/.\*)?" # semanage fcontext -a -t httpd_sys_rw_content_t "/web/sites/\*/www/wp-config.php"
Обновляем атрибуты файлов новым контекстом SELinux.
# restorecon -Rv /web/sites
В завершении настройки selinux для apache, добавим еще один параметр, без которого httpd не сможет писать файлы в указанные каталоги.
# setsebool -P httpd_unified 1
Теперь активируем защиту selinux и проверяем, что она работает.
# setenforce 1 # getenforce Enforcing
Режим работы Enforcing означает, что selinux работает. Убедиться, что модули загружены, можно командой.
# semodule -l | grep my-
В целом, по selinux все. Мы просто разрешили все, что веб сервер просил. По идее, надо вдумчиво во всех правилах разбираться и разрешать только то, что считаешь нужным. Я честно скажу, что selinux знаю не очень хорошо. Дальше загрузки готовых модулей и автоматического создания модулей с помощью audit2allow я не двигался. Руками модули никогда не писал. Если есть какой-то более осмысленный и правильный способ настройки selinux на кастомной конфигурации веб сервера, буду рад полезной информации.
Хорошая практическая статья по ручной настройке selinux для web сервера — https://habr.com/ru/post/322904/. Там же есть ссылки на другие статьи автора на тему selinux. Написано содержательно и наглядно, рекомендую для тех, кто будет знакомиться с технологией.