Перейти к содержанию
  • ArcheRAWG
    ArcheRAWG

    LAMP на Centos8 Stream

    У меня было несколько сайтов/проектов которые крутились где попало. Например сайт крутился на 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 есть фишка. Если не уделить внимания разметке жесткого диска, он сделает разметку примерно следующего вида: 

    image.png.19592bcc2076806556eb59d9b0ea3a6f.png

    т.е. раздел /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. Теперь он должен выглядеть примерно так: 

    image.thumb.png.1aeab2c122cc595949da662d1a72763c.png

    Так же для работы некоторых 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, но это уже совсем отдельная статья. 




    Обратная связь

    Рекомендуемые комментарии

    Комментариев нет


×
×
  • Создать...