У меня было несколько сайтов/проектов которые крутились где попало. Например сайт крутился на OpenServer, облако в виртуалке, pma вообще небыло, пользовался HeidySQL который поставлялся вместе с OpenServer. И в один прекрасный момент мне это всё надоело, и я решил объединить всё на одном сервере. Почему именно на Centos8? Да просто мне нравится эта система. Да, я вкурсе что 31.12.2021 - прекращается её поддержка, поэтому я выбрал Centos8 Stream.
В этой статье я не буду касаться установки и настройки системы. Так не буду затрагивать безопасность, т.е. настройку selinux и собственно firewall. Безопасность это дело сугубо индивидуальное, и настраивать его нужно под свои возможности и потребности. Поэтому после запуска системы, сразу отключаем selinux и firewall
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
Установка и настройка Apache
Начнём с установки Apache.
dnf install httpd
добавляем его в автозагрузку
systemctl enable httpd
и запускаем его
systemctl start httpd
Собственно установка на этом закончена. Уже сейчас если перейти в браузере на ip адрес вашего сервера, то можно увидеть тестовую страницу Apache. Конечно если у вас отключен firewall. Так же работу можно проверить следующей командой
netstat -tulnp | grep httpd
Вывод будет примерно следующий:
tcp6 0 0 :::80 :::* LISTEN 1205/httpd
Теперь можно приступать к непосредственной настройке Apache. У Centos есть фишка. Если не уделить внимания разметке жесткого диска, он сделает разметку примерно следующего вида:
т.е. раздел /home - будет самым большим. Я несколько раз подъёбывался на этот счёт. Вы можете разметку сделать самостоятельно, т.к. вам нужно, или оставить как есть. В этой статье мы этого касаться не будем. Поэтому все файлы веб-сервера будут лежать в директории /home. Я использую примерно следующую структуру:
/home/sites - тут лежат все сайты
/home/sites/site1 - папка с сайтом
/home/sites/site1/www - собственно файлы сайта
/home/sites/site1/log - логи сайта
Создаём все нужные директории одной командой и назначаем владельцем директорий apache
mkdir -p /home/sites/site1.ru/{www,log}
chown -R apache. /home/sites/
Дальше нам нужно посмотреть раскоменчена ли строчка в конце файла /etc/httpd/conf/httpd.conf
IncludeOptional conf.d/*.conf
Эта строчка нужна для того чтобы не городить все найстройки в одном месте, а для каждого сайта будет свой отдельный конфиг. Создадим конфиг для первого сайта:
nano /etc/httpd/conf.d/site1.ru.conf
следующего содержания
<VirtualHost *:80> ServerName site1.ru ServerAlias www.site1.ru DocumentRoot /home/sites/site1.ru/www ErrorLog /home/sites/site1.ru/log/error.log CustomLog /home/sites/site1.ru/log/access.log common <Directory /home/sites/site1.ru/www> Options FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
Проверим конфигурацию
apachectl -t
Apache может ругнуться
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::95:c6f3:e49f:7204. Set the 'ServerName' directive globally to suppress this message
Это просто предупреждение, и его можно игнорировать. А можно отредактировать файл /etc/hostname и указать там имя своего сервера. В любом случае, если всё сделано правильно, Apache должен написать
Syntax OK
После этого можно перезапуститься Apache
systemctl restart httpd
или
apachectl restart
Если Apache не стартанул, то смотрил логи
tail -f /var/log/httpd/error_log
но в текущей конфигурации проблем быть не должно. Для полноценной проверки того что всё работает как надо, создадим файл index.html в директории нашего нового сайта /home/sites/site1.ru/www. Напомню, что по умолчанию директория для файлов сайта /var/www/html. Но мы ей пользоваться не будем.
nano /home/sites/site1.ru/www/index.html
Содержание файла
<center><font color=red size=7>Hello World</font></center>
Сделаем владельцем файла apache
chown apache. /home/sites/site1.ru/www/index.html
Теперь если перейти по адресу вашего сервера, вы увидите не тестовую страницу, а эту страничку которую мы только что создали, а именно: белый фон, и по центру большими красными буквами hello world. Это означает что сам веб сервер уже прекрасно работает, и можно двигаться дальше.
Установка php с последующим обновлением
Одна из причин почему Centos8 а не Centos7, хотя у последнего поддержка до 2024 года, это то что установка php упростилась, т.к. в репозиториях уже есть версия 7.2 и обновить её, не составит большого труда. Можно конечно сразу поставить 7.4, но я хочу всё таки рассказать про процесс обновления. Поэтому вначала устанавливаем php 7.2 и наверно всё что может понадобится для полноценной CMS или того же Nextcloud
dnf install php php-cli php-mysqlnd php-json php-gd php-ldap php-odbc php-pdo php-opcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip
после чего перезапускаем apache
systemctl restart httpd
и для проверки работоспособности создадим info файл. Он нам ещё может пригодиться.
nano /home/sites/site1.ru/www/info.php
со следующим содержимым
<?php phpinfo(); ?>
И выдадим права на файл
chown apache. /home/sites/site1.ru/www/info.php
Теперь заходим через браузер на наш сайт с указанием к какому файлу обратиться, а именно info.php и мы увидем тестовую страницу php с номером версии и со всеми параметрами и настройками.
Посмотрели? А теперь обновим версию php до 7.4. Для этого подключим репозиторий
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
отключим 7.2
dnf module reset php:7.2
подключим 7.4
dnf module enable php:remi-7.4
и запускаем обновление
dnf update
перезапустим на всякий случай apache
systemctl restart apache
и проверим ранее созданый файл info.php. Теперь он должен выглядеть примерно так:
Так же для работы некоторых CMS рекомендую изменить некоторые значения файла /etc/php.ini
max_execution_time 60
max_file_uploads 200
post_max_size 100
upload_max_filesize 100
думаю что за что отвечает и так понятно. Можно конечно оставить как есть, но тогда вы столкнётесь с проблемой загрузки файлов через сайт, т.к. ограничение 2мб.
Установка mariadb
Теперь установим БД. Я, как и многие наверно, предпочитаю форк mysql - mariadb. Вот его ставить и будем
dnf install mariadb mariadb-server
сразу после установки запускаем и добавляем в автозагрузку
systemctl start mariadb
systemctl enable mariadb
и запускаем скрипт начальной конфигурации
/usr/bin/mysql_secure_installation
скрипт простой и интуитивно понятный, поэтому на нём останавливаться не буду. После того как с ним закончили, перезапускаем mariadb
systemctl restart mariadb
Установка ssl сертификата Lets Encrypt
Процедура так же проста, и не требует особых навыков. Для начала установим пакет certbot
dnf install epel-release
dnf install certbot
Сразу запустить certbot не получится, будет ругаться. Поэтому создадим самоподписанный сертификат
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/pki/tls/private/localhost.key -out /etc/ssl/certs/localhost.crt
и перезапустим apache
apachectl restart
и запустим certbot
certbot certonly
Сразу скажу, что для получения сертификата, сервер должен видеться из интернета и у вас должен быть рабочий домен прикрученный к серверу. т.е. сервре должен резолвиться извне.
После запуска выбирайте способ аутентификации
Apache Web Server plugin (apache)
если он не доступен то тогда
Place files in webroot directory (webroot)
Во втором случае, нужно на всякий выдать права 777 на директорую с сайтом. После того как сертификат будет получен, можно вернуть всё обратно.
Теперь отредактируем конфиг нашего сайта, чтобы он работал по https. Приведём его к такому виду
<VirtualHost *:80> ServerName site1.ru ServerAlias www.site1.ru Redirect permanent / https://site1.ru </VirtualHost> <VirtualHost *:443> ServerName site1.ru ServerAlias www.site1.ru DocumentRoot /home/sites/site1.ru/www ErrorLog /home/sites/site1.ru/log/error.log CustomLog /home/sites/site1.ru/log/access.log common SSLEngine on SSLCertificateFile /etc/letsencrypt/live/site1.ru/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/site1.ru/privkey.pem <Directory /home/sites/site1.ru/www> Options FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
Проверяем конфиг на то что в нём нет ошибок
apachectl -t
и перезапускаем apache
systemctl restart httpd
Готово. Сертификат выдан на 3 месяца, и чтобы не забыть его обновить - процесс перевыпуска можно добавить в cron
30 4 * * * root /usr/bin/certbot renew --post-hook "/usr/sbin/apachectl restart" >> /var/log/le-renew.log
каждый день в 4-30 будет запускаться попытка перевыпустить сертификат, и до тех пор пока он будет считаться новым (если не ошибаюсь 2 месяца) то ничего не будет происходить и в логах вы будет видеть примерно следующее с ообщение
[root@web ~]# tail -f /var/log/le-renew.log
Certificate not yet due for renewal
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
The following certificates are not due for renewal yet:
/etc/letsencrypt/live/site1/fullchain.pem expires on 2022-01-11 (skipped)
/etc/letsencrypt/live/site2/fullchain.pem expires on 2022-01-11 (skipped)
/etc/letsencrypt/live/site3/fullchain.pem expires on 2022-01-11 (skipped)
No renewals were attempted.
No hooks were run.
Вот на этом всё. Это полноценный сервер который позволит держать несколько сайтов, нужно только создать для них директории в /home/sites и конфиги в /etc/httpd/conf.d/. У меня на это веб-сервере крутиться собственно данный сайт, а так же облако, и pma. Для облака нужно было ещё пару модулей доставить и настроить cron, но это уже совсем отдельная статья.
Рекомендуемые комментарии
Комментариев нет