Веб-сервер, настроенный по данной инструкции можно будет использовать для размещения собственных сайтов в локальной сети или сети Интернет. Данная инструкция проверена для CentOS 8.
Тематические термины: Linux, CentOS, NGINX, Apache, MySQL, MariaDB, PHP-FPM, FTP, phpMyAdmin, Memcached, Postfix.
Содержание:
Общая настройка системыУстановка NGINXУстановка PHP и PHP-FPMУстановка MariaDB или MySQLУстановка phpMyAdminУстановка MemcachedУстановка и настройка FTP-сервераApache (httpd)PostfixТюнинг веб-сервераСоздание первого сайта
1. Обновляем CentOS:
dnf update
2. Устанавливаем репозиторий EPEL и дополнительные пакеты для загрузки и распаковки:
dnf install epel-release wget unzip
1. Устанавливаем часовой пояс:
\cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
* данной командой мы установим часовой пояс по московскому времени.
2. Устанавливаем и запускаем службу для автоматической синхронизации времени:
dnf install chrony
systemctl enable chronyd
systemctl start chronyd
1. Отключаем SELinux:
sed -i “s/SELINUX=enforcing/SELINUX=disabled/” /etc/selinux/config
setenforce 0
* первая команда редактирует конфигурационный файл, чтобы SELinux не запускался автоматически, вторая — отключает его разово. Подробнее читайте статью Как отключить SELinux.
2. Открываем необходимые порты в брандмауэре:
firewall-cmd –permanent –add-port={80,443,8080}/tcp
firewall-cmd –permanent –add-port={20,21,60000-65535}/tcp
firewall-cmd –permanent –add-port={25,465,587}/tcp
firewall-cmd –reload
* 80, 443 и 8080 порты для веб-сервера; 20, 21 порты нужны для работы FTP; 60000-65535 также необходимы для работы FTP (динамические порты для пассивного режима); 25, 465 и 587 порты нужны для работы почтового сервера по SMTP; последняя команда перезапускает firewalld, чтобы применить новые правила. Подробнее про настройку firewalld.
Устанавливаем NGINX:
dnf install nginx
Внесем небольшую корректировку в файл nginx.conf:
vi /etc/nginx/nginx.conf
В секцию http добавим строку:
http { … server_names_hash_bucket_size 64; ….}
* на практике, может встретиться ошибка could not build server_names_hash, you should increase server_names_hash_bucket_size: 32. Она возникает при большом количестве виртуальных серверов или если один из них будет иметь длинное название. Данная строка в конфиге исправит ситуацию.
Разрешаем автозапуск сервиса и запустим его:
systemctl enable nginx
systemctl start nginx
Проверим, что веб-сервер работает. Для этого открываем браузер на другом компьютере, который находится в одной сети и вводим в адресной строке IP-адрес сервера. В итоге мы должны увидеть заголовок «Welcome to nginx!»:
* обратите внимание, что данное приветствие может иметь и другой вид.
Устанавливаем PHP и php-fpm следующей командой:
dnf install php php-fpm
* В CentOS 8 будет установлена версия php 7.2 и выше
Запускаем php-fpm и разрешаем его автозапуск:
systemctl enable php-fpm –now
Открываем файл для настройки виртуального домена по умолчанию:
В секции location редактируем параметр index на следующее значение:
location / { index index.php index.html index.htm; }
* добавляем index.php в начало списка. Если параметра index нет, создаем его.
А внутри секции server добавим следующее:
location ~ \.php$ { set $root_path /usr/share/nginx/html; fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name; include fastcgi_params; fastcgi_param DOCUMENT_ROOT $root_path; }
* где /usr/share/nginx/html — корневой путь хранения скриптов; unix:/run/php-fpm/www.sock — файл для взаимодействия с php-fpm.
Открываем настройки php-fpm:
vi /etc/php-fpm.d/www.conf
Проверяем, что параметр listen настроен так:
listen = /run/php-fpm/www.sock
… иначе, меняем значение. После перезагружаем php-fpm:
systemctl restart php-fpm
* в данном примере мы указываем, что php-fpm будет использовать сокетный файл /run/php-fpm/www.sock для взаимодействия. Этот файл мы указали выше в настройке NGINX.
Проверяем правильность настроек nginx:
И перезагружаем его:
systemctl restart nginx
Создаем index.php в каталоге сайта по умолчанию со следующим содержимым:
vi /usr/share/nginx/html/index.php
<?php phpinfo(); ?>
Открываем в браузере IP-адрес нашего сервера. Теперь мы должны увидеть сводную информацию по PHP и его настройкам, например:
В данной статье мы установим MariaDB, но процедура установки и настройки MySQL аналогичная. Все расхождения будут отмечены явно в инструкции.
Устанавливаем MariaDB следующей командой:
dnf install mariadb mariadb-server
* для установки mysql выполняем команду dnf install mysql
Разрешаем автозапуск и запускаем СУБД:
systemctl enable mariadb –now
* для работы с mysql меняем mariadb на mysql.
Сразу создаем пароль для учетной записи root:
mysqladmin -u root password
Для возможности подключаться к базе данных скриптами PHP необходимо установить следующие модули:
dnf install php-mysqli
Если мы установили php5, также ставим php-mysql:
dnf install php-mysql
После перезагружаем php-fpm:
И открываем наш сайт в браузере. В phpinfo появится новая секция MySQL:
* нас не должно смущать, что установили мы mariadb, а заголовок mysql. Если посмотреть в таблицу, можно увидеть ячейку Client API version, в которой указано, что используется именно mariadb.
Переходим на сайт разработчика phpMyAdmin и копируем ссылку на нужную нам версию, например, последнюю:
Воспользовавшись скопированной ссылкой, скачиваем архив с установочными файлами:
wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.zip
Распаковываем скачанный архив:
unzip phpMyAdmin-*-all-languages.zip
Создаем каталог для phpmyadmin:
mkdir /usr/share/phpMyAdmin
… и переносим в него содержимое распакованного архива:
mv phpMyAdmin-*-all-languages/* /usr/share/phpMyAdmin/
Задаем владельца для каталога:
chown -R apache:apache /usr/share/phpMyAdmin
* как правило, сервис, которых обрабатываем php-запросы работает от пользователя apache.
Устанавливаем модули php, необходимые для корректной работы phpMyAdmin:
dnf install php-json php-mbstring php-mysqli
Внесем небольшую настройку в конфигурацию phpMyAdmin.
Сгенерируем случайную последовательность символов:
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo ”
Откроем на редактирование или создадим файл:
vi /usr/share/phpMyAdmin/config.inc.php
Внесем в него строку:
<?php…$cfg[‘blowfish_secret’] = ‘jd7n6yIcHOl55ikE7l5HAdNaWwunSHvR’;
?>
* где jd7n6yIcHOl55ikE7l5HAdNaWwunSHvR — последовательность, которую нам выдала команда head /dev/urandom …; Также обратите внимание на <?php ?> — если мы создали новый файл, необходимо указать данные теги, так как они открывают код PHP. В противном случае, настройка не применится.
Теперь создадим для phpmyadmin отдельный виртуальный домен в NGINX:
vi /etc/nginx/conf.d/phpMyAdmin.conf
И добавим в него следующее содержимое:
server { listen 80; server_name phpmyadmin.admins24.local; set $root_path /usr/share/phpMyAdmin;
location / { root $root_path; index index.php; }
location ~ \.php$ { fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name; include fastcgi_params; fastcgi_param DOCUMENT_ROOT $root_path; fastcgi_read_timeout 300; }}
* где phpmyadmin.admins24.local — адрес для виртуального домена, именно этот адрес должен быть введен в адресную строку браузера, чтобы открылся нужный сайт. Поэтому если нет возможности зарегистрировать домен и имя узла в DNS, можно воспользоваться локальным файлом hosts. /usr/share/phpMyAdmin — это каталог, в который по умолчанию устанавливается phpMyAdmin.
После перезапускаем NGINX:
systemctl reload nginx
Также нужно перезапустить php-fpm, так как в процессе установки были добавлены модули для PHP:
И открываем в браузере наш домен, в данном примере, http://phpmyadmin.admins24.local. Откроется форма для авторизации — вводим логин root и пароль, который мы указали после установки и запуска mariadb.
Первым этапом мы установим и настроим сервис memcached. Вторым — модуль php-memcached.
Выполняем установку пакетов:
dnf install memcached libmemcached
Создаем или открываем на редактирование конфигурационный файл для запуска сервиса:
vi /etc/sysconfig/memcached
Приводим его к виду:
PORT=”11211″USER=”memcached”MAXCONN=”1024″CACHESIZE=”512″OPTIONS=”-l 127.0.0.1 -U 0″
* где PORT указываем на каком порту будет слушать сервис кэширования; USER — пользователь, под которым должен запускаться сервис; MAXCONN — максимальное число одновременных подключений; CACHESIZE — размер под кэш в мегабайтах; OPTIONS — параметры запуска (в данном примере наш сервис будет принимать запросы только с адреса локальной петли).
После разрешаем автозапуск и запускаем сервис кэширования:
systemctl enable memcached –now
Переходим на страницу загрузки memcached сайта pecl.php.net и копируем ссылку на стабильную версию memcached:
Обратите внимание, что у каждой версии пакета есть свои требования к версии PHP. Внимательно изучаем, подойдет ли версия php-memcached для нашего сервера.
Скачиваем архив, ссылку на который мы скопировали:
wget http://pecl.php.net/get/memcached-3.1.5.tgz
Устанавливаем пакеты, необходимые для сборки php-pecl-memcached:
dnf install php-devel zlib-devel make
dnf –enablerepo=PowerTools install libmemcached-devel
tar -xvzf memcached-*.tgz
Переходим в распакованный каталог:
cd memcached-*/
Запускаем компиляцию php-расширения:
Конфигурируем исходник:
./configure
Собираем расширение:
Копируем созданный модуль в каталог php-модулей:
cp modules/memcached.so /usr/lib64/php/modules/
Создаем конфигурационной файл для подключения расширения:
vi /etc/php.d/20-memcached.ini
extension=memcached.so
После установки модуля перезапускаем php-fpm:
Чтобы проверить, что модуль memcached работаем, открываем наш сайт в браузере — в phpinfo должна появиться новая секция:
… или вводим команду:
php -m | grep memcached
Мы должны получить:
В качестве 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
* где
Изменим права для созданного файла с паролями:
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 offIdentLookups offPassivePorts 60000 65535
RequireValidShell offAuthUserFile /etc/proftpd/ftpd.passwdAuthPAM offLoadModule mod_auth_file.cAuthOrder mod_auth_file.c
* где 60000 – 65535 — диапазон динамических портов для пассивного режима.
Разрешаем автозапуск FTP-серверу и запускаем его:
systemctl enable proftpd –now
Пробуем подключиться к серверу, использую любые FTP-клиенты, например, FileZilla, Total Commander или тот же браузер.
Это базовая и самая простая настройка ProFTPd, но если необходимо настроить TLS или хранить виртуальных пользователей в базе MySQL, читайте подробнее инструкцию по настройке ProFTPd на CentOS.
Несмотря на то, что мы установили и настроили PHP-FPM, Apache нам понадобится, как минимум, по двум причинам. Во-первых, многие сайты используют файл .htaccess, который читает Apache. Во-вторых, последний включает большое число модулей, которые может использовать портал.
В некоторых случаях, можно обойтись без Apache, но в данной инструкции мы опишем процедуру его установки и настройки.
И так, устанавливаем httpd:
dnf install httpd
Заходим в настройки:
vi /etc/httpd/conf/httpd.conf
И редактируем следующее:
Listen 8080
* наш веб-сервер будет слушать на порту 8080, так как на 80 уже работает NGINX.
<IfModule dir_module> DirectoryIndex index.php index.html</IfModule>
* если не указан конкретный скрипт, сначала веб-сервер пытается найти и запустить index.php, затем index.html
Добавляем:
<Directory /var/www/*/www> AllowOverride All Options Indexes ExecCGI FollowSymLinks Require all granted</Directory>
* где Directory — разрешенные каталоги для запуска из apache; Options — разрешенные опции; Require — с каких IP-адресов можно открывать сайты, определенные в данном каталоге. Итого, мы разрешаем все каталоги в /var/www, но только если следующий каталог будет www; разрешаем опции Indexes (возвращает список файлов, если нет индексного файла, например, index.php), ExecCGI (разрешены сценарии CGI), FollowSymLinks (включены символические ссылки в этом каталоге); доступ для данных каталогов разрешен со всех адресов (all granted).
Проверяем синтаксис конфигурационного файла httpd:
apachectl configtest
И если получаем ответ:
… разрешаем автозапуск и запускаем службу:
systemctl enable httpd
systemctl start httpd
Создаем php-файл со следующим содержимым:
vi /var/www/html/index.php
Открываем браузер и вводим в адресную строку IP-адрес нашего сервера и добавляем :8080 (http://<IP-адрес нашего сервера>:8080). Откроется привычная нам страница с информацией о PHP. В разделе «PHP Variables» мы должны увидеть Apache для опции $_SERVER[‘SERVER_SOFTWARE’]:
Ранее нами была настроена связка nginx + php-fpm. Теперь проверяем совместную работу первого с apache.
Открываем конфигурационный файл nginx:
Находим наш настроенный location для php-fpm:
… location ~ \.php$ { set $root_path /usr/share/nginx/html; fastcgi_pass unix:/run/php-fpm/www.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; }…
Проверяем, есть ли файл:
vi /etc/nginx/default.d/php.conf
… и если есть, комментируем его содержимое:
#index index.php index.html index.htm;##location ~ \.(php|phar)(/.*)?$ {# fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;## fastcgi_intercept_errors on;# fastcgi_index index.php;# include fastcgi_params;# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;# fastcgi_param PATH_INFO $fastcgi_path_info;# fastcgi_pass php-fpm;#}
* в данном примере мы отключили обработку всех php-файлов с помощью php-fpm, так как это у нас должен делать apache.
Проверяем и перезапускаем nginx:
Пробуем снова открыть в браузере адрес http://<IP-адрес нашего сервера> (уже без 8080) — должна открыться та же страница, что при проверке Apache (с добавлением 8080):
Так как все запросы на httpd приходят от NGINX, они воспринимаются как от IP-адреса 127.0.0.1. На практике, это может привести к проблемам, так как некоторым сайтам необходимы реальные адреса посетителей.
Для решения проблемы будем использовать модуль mod_rpaf. Устанавливаем набор разработчика для apache:
dnf install httpd-devel gcc unzip redhat-rpm-config
Переходим в каталог /usr/local/src:
cd /usr/local/src
Скачиваем модуль:
wget https://github.com/gnif/mod_rpaf/archive/stable.zip
Распаковываем его:
unzip stable.zip
cd mod_rpaf-stable/
Собираем модуль и устанавливаем его:
make install
* при возникновении ошибки ./apxs.sh: line 15: -c: command not found, необходимо поставить which командой dnf install which.
Создаем конфигурационный файл со следующим содержимым:
vi /etc/httpd/conf.d/mod_rpaf.conf
LoadModule rpaf_module modules/mod_rpaf.soRPAF_Enable OnRPAF_ProxyIPs 127.0.0.1RPAF_SetHostName OnRPAF_SetHTTPS OnRPAF_SetPort OnRPAF_ForbidIfNotProxy Off
Перезапускаем httpd:
systemctl restart httpd
Для проверки открываем нашу страницу с phpinfo и находим $_SERVER[‘REMOTE_ADDR’] — его значение должно быть равно адресу компьютера, с которого мы открыли страницу:
Устанавливаем postfix командой:
dnf install postfix
Теперь нам необходимо сделать несколько простых настроек:
vi /etc/postfix/main.cf
Редактируем:
…myorigin = $mydomain…inet_protocols = ipv4…
smtp_generic_maps = hash:/etc/postfix/generic_map
* myorigin — имя домена, которое будет подставляться всем отправляемым сообщениям без явного указания оного; inet_protocols — задает версию IP, с которой будет работать Postfix (если на нашем сервере используется ipv6, значение параметра стоит оставить all); smtp_generic_maps указывает на карту с общими правилами пересылки.
Открываем карту пересылки:
vi /etc/postfix/generic_map
И добавляем:
@admins24.local [email protected]
* данной настройкой мы будем подставлять всем отправляемым письмам без поля FROM адрес [email protected].
Создаем карту:
postmap /etc/postfix/generic_map
Для применения настроек перезагружаем почтовый сервер:
systemctl restart postfix
Открываем на редактирование следующий файл:
vi /etc/php.ini
И правим следующее:
upload_max_filesize = 512M…post_max_size = 512M…short_open_tag = On…date.timezone = “Europe/Moscow”
Перезапускаем php-fpm и httpd:
И внутри секции http добавляем:
client_max_body_size 512M;
После перезапускаем nginx:
Подробнее про тюнинг NGINX в статье Практические советы по тюнингу веб-сервера NGINX.
Чтобы отправляемая почта меньше попадала в СПАМ, необходимо выполнить следующие шаги:
Задаем переменную, значение которой будет домен сайта:
TMP_SITE=site1
* где site1 — имя домена. Нам будет намного удобнее копировать и вставлять команды с переменной (не придется править после копипасты).
Создаем новый файл виртуального домена NGINX:
vi /etc/nginx/conf.d/$TMP_SITE.conf
* обязательно на конце должен быть .conf, так как только такие файлы веб-сервер подгружает в конфигурацию.
И добавляем следующее содержимое.
Для HTTP:
server { listen 80; server_name site1.local www.site1.local; set $root_path /var/www/site1/www;
access_log /var/www/site1/log/nginx/access_log; error_log /var/www/site1/log/nginx/error_log; gzip on; gzip_disable “msie6”; gzip_min_length 1000; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
root $root_path;
location / { 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; } location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|docx|xls|xlsx|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ { expires modified +1w; }}
* где site1.local — домен, для которого создается виртуальный домен; /var/www/site1 — каталог, в котором будет размещаться сайт.** все запросы будут переводиться на локальный сервер, порт 8080, на котором работает apache, кроме обращений к статическим файла (jpg, png, css и так далее).*** обратите внимание на выделения полужирным — здесь нужно подставить свои данные.
Для HTTPS:
server { listen 80; server_name site1.local www.site1.local; return 301 https://$host$request_uri;}
server { listen 443 ssl; ssl on; ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/cert.key;
server_name site1.local www.site1.local; set $root_path /var/www/site1/www;
* в первой секции server мы перенаправляем все запросы по незащищенному http на https.** ssl_certificate и ssl_certificate_key — пути к публичному и приватному ключам соответственно.*** для получения бесплатного сертификата читайте статью Получение бесплатного SSL сертификата Let’s Encrypt.
Теперь настроим виртуальный домен в Apache:
vi /etc/httpd/conf.d/$TMP_SITE.conf
<VirtualHost *:8080> Define root_domain site1.local Define root_path /var/www/site1
ServerName ${root_domain} ServerAlias www.${root_domain} DocumentRoot ${root_path}/www
ErrorLog ${root_path}/log/apache/error_log TransferLog ${root_path}/log/apache/access_log</VirtualHost>
Создаем каталоги для сайта:
mkdir -p /var/www/$TMP_SITE/{www,tmp}
mkdir -p /var/www/$TMP_SITE/log/{nginx,apache}
Создаем индексный файл со следующим содержимым:
vi /var/www/$TMP_SITE/www/index.php
<?php echo “<h1>Hello from site1</h1>”; ?>
Задаем права на папки:
chown -R apache:apache /var/www/$TMP_SITE
chmod -R 775 /var/www/$TMP_SITE
Проверяем корректность настроек конфигурационных файлов:
Перезапускаем веб-сервер:
systemctl reload httpd
Открываем сайт в браузере.
Не забываем, что обращаться к сайту нужно по его доменному имени. Например, если мы создали сайт site1.local, то нужно в браузере набрать http://site1.local. При этом, данное имя должно разрешаться в IP-адрес с помощью DNS или локального файла hosts.
При необходимости, создаем базу данных.
mysql -uroot -p
> CREATE DATABASE site1 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
> GRANT ALL PRIVILEGES ON site1.* TO [email protected] IDENTIFIED BY ‘password’ WITH GRANT OPTION;
* данными sql-командами мы создаем базу данных site1 и предоставляем к ней доступ для учетной записи dbuser с паролем password. При желании сделать соединение более безопасным, можно убрать WITH GRANT OPTION.
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies