Содержание статьи полностью соответствует заголовку: данный материал написан с целью помочь тем, кто никогда еще не устанавливал и не тюнинговал веб-сервер для своего корпоративного сайта или личного блога, передоверяя эту работу техническому специалисту либо используя шаред-хостинг. Автор step-by-step проведет вас через все перипетии данного действа, в результате чего, даже если подобное в новинку, вы без особых проблем (ну, я надеюсь) получите в итоге готовое и безопасное решение.

Будьте внимательны, с самого начала оговорю следующее:

Все манипуляции описаны на основе работы с инстансом AWS, который по-прежнему без особых проблем доступен для граждан России, при условии наличия счета в иностранном банке, увы. В принципе, проблема несложно решается путем взаимодействия с друзьями-знакомыми, живущими в дальних странах.

Для тех, кто почему-либо не в курсе: AWS по прежнему предоставляет год работы практически бесплатно. Вернее сказать, за копейки: парочка раскрученных блогов в облаке Амазона обходятся мне на первом году работы около $2/month.

EC2 Free Tier

The EC2 Free Tier lets you explore and experiment with EC2 at no cost. You get a limited amount of free access to EC2 for 12 months, starting when you sign up for an AWS account.

Once your usage exceeds the Free Tier limits, or you’ve been an AWS customer for more than 12 months, we start charging you for usage. Therefore, it’s crucial that you keep track of your usage to avoid billing surprises.

When we calculate your Free Tier usage, we count all the resources you’re using in all the AWS Regions. To easily locate and manage your EC2 resources across all the different AWS Regions, you can use the EC2 Global View.

Заметьте, ничто не мешает вам реализовать описанный алгоритм настройки сервера в любом другом, помимо AWS, облаке.

На момент публикации данного материала - AWS при регистрации легко и непринужденно проглатывает номер мобильного телефона российских операторов. Вам лишь нужно указать Казахстан в качестве своей страны, у казахов (пока что) тоже префикс +7. Контрольная эсэмэска от AWS единожды придет на ваш смартфон без малейших проблем.

Обратите внимание, когда речь об Amazon Web Service - нет нужды настраивать на сервере firewall. Он уже настроен логическим уровнем выше вашего сервера, по умолчанию открыт ssh, вы можете дополнительно открыть другие порты в веб-консоли AWS.

На этом романтическая прелюдия закончена, приступаем к работе.

Работу в веб-консоли подробно описывать не стану, интерфейс AWS интуитивно понятен и нарочито прост. Мастер проведет вас через все этапы запуска инстанса: вам предстоит выбрать дистрибутив (описанный далее процесс установки подразумевает Centos Stream 9 или RHEL 9), определить тип инстанса (совет: выбирайте instance type t3.micro), сформировать и скачать на свой ПК ssh-сертификат, с которым далее будете заходить на сервер, внести изменения в правила фильтрации трафика, открыв порты HTTPS и/или HTTP и, наконец, привязав Elastic IP address на вкладке Network & Security к своему инстансу (Allocate Elastic IP address, затем Associate Elastic IP address). Именно этот эластичный IP, разработанный спецом для облачных решений, по окончании работы вы укажете в записи DNS вашего домена.

Убедившись, что инстанс запущен, прошел тесты и нормально работает (не бином Ньютона, попросту смотрим в веб-консоли EC2 Dashboard вкладку Instances), заходим (в линуксе так, а вот как в Windows - разберетесь, я правда не в курсе):

ssh -i <path_to_dir>/<your_new_sert.pem> ec2-user@<your_new_elastic_ip>

Первые две команды, которые вам необходимо поочередно выполнить в консоли:

sudo dnf update --refresh
sudo reboot

Напомню, первый год работы на AWS бесплатен при условии крайне ограниченных ресурсов. Например, instance type t3.micro, единственно доступный сегодня на Free Tier, предусматривает лишь 1GB RAM, зато нам позволен объем физической памяти до 30 GB. Отсюда следует, что нужен файл подкачки.

Снова заходим (после ребута) по ssh, и:

sudo dd if=/dev/zero of=/swapfile bs=1024 count=5242880
sudo chmod 600 /swapfile
sudo mkswap /swapfile

Добавляем в /etc/fstab :

/swapfile    swap    swap   defaults 0 0

Снова ребут, ну и смотрим, что получилось: cat /proc/swaps или free.

Кстати, насчет "добавляем". Если вы, как и я, любитель Midnight Commander, чтобы "добавить" - предварительно установите mc:

sudo dnf install mc

ОК, вероятнее всего, вам понадобится PHP. Настоятельно рекомендую нагуглить по ключу "remi repo" репозиторий мэтра Remi, найти на страничке его блога отличный wizard, который, в зависимости от требуемой версии PHP и дистрибутива, предлагает простую последовательность команд установки. Например, чтобы установить PHP 8.3 на Centos, от меня потребовалось следующее:

sudo dnf config-manager --set-enabled crb
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf module install php:remi-8.3
sudo dnf install php-opcache

База данных Mariadb:

sudo curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
sudo dnf install MariaDB-server MariaDB-client
sudo systemctl enable mariadb
sudo systemctl start mariadb
sudo systemctl status mariadb
sudo mariadb-secure-installation

Запуск последней команды проведет вас через весьма полезную процедуру обеспечения секьюрности, в результате чего вы, в том числе, сумеете назначить рутовый пароль доступа своему серверу баз данных. Запишите где-нибудь, пригодится. Хотя, даже если и забудете, он легко сбрасывается (многажды описано, так что останавливаться на этом сейчас не будем).

Как-то так. Впрочем, всегда можно уточнить актуальную процедуру инсталляции на сайте разработчиков.

Редактируем конфигурационный файл MariaDB:

sudo mcedit -b /etc/my.cnf

Оттолкнемся от простого, учитывая, опять-таки, что сервер у нас явно не космический:

[mysqld]
innodb_buffer_pool_size = 128M
innodb_log_buffer_size = 32M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci
[client]
default-character-set = utf8
[mysqld_safe]
# log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
sudo service mariadb restart

Ставим апач:

sudo dnf in httpd
sudo systemctl enable httpd.service
sudo systemctl start httpd.service
sudo service httpd restart

Слегка тюнингуем, при желании, префорк апача. Возможно, поможет сохранить сервер на плаву, если на ваш сайт накинется ботосетка. Впрочем, сахар, соль и фломастеры сугубо по вкусу:

sudo mcedit -b /etc/httpd/conf.modules.d/00-mpm.conf

Сохраните оригинал конфига на всякий случай, отредактировав следующим, например, образом:

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 5
MaxClients 50
MaxRequestsPerChild 0
</IfModule>

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

<IfModule mpm_worker_module>
ServerLimit 16
StartServers 1
MaxRequestWorkers 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
</IfModule>

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so

При необходимости значения можно и еще уменьшить. Несмотря на это, тысячу уников в день наш с вами сервачок выдержит без особых проблем, а дальше хоть камни с неба будем посмотреть.

phpMyAdmin, если нужен:

sudo dnf in phpmyadmin
sudo mcedit -b/etc/phpMyAdmin/config.inc.php

и в строке

$cfg['blowfish_secret'] = 'вводим свою комбинацию знаков';

, здесь же

$cfg['Servers'][$i]['auth_type'] = ‘cookies‘;

меняем на

$cfg['Servers'][$i]['auth_type'] = ‘http‘;

, далее

sudo mcedit -b /etc/httpd/conf.d/phpmyadmin.conf

где у нас теперь будет как-то так (иначе не войдете):

<Directory /usr/share/phpMyAdmin/>
AddDefaultCharset UTF-8
DirectoryIndex index.php
AllowOverride All
Options FollowSymlinks
Require all granted
Require local
</Directory>

Теперь, если залогиниться в phpMyAdmin все же не удается, вам придется заменить

$cfg['Servers'][$i]['host'] = 'localhost';

на

$cfg['Servers'][$i]['host'] = '127.0.0.1';

в

/etc/phpMyAdmin/config.inc.php

И на этом все. Заходим через веб, создаем юзера и базу данных. Логин - root, пароль - тот самый, который вы назначили ранее при запуске mariadb-secure-installation. Не забыли?

Теперь следующее. Ваш веб-сайт, разумеется, умеет отправлять письма? В зависимости от того, используется ли внешний SMTP-сервер, или же вы намерены поднять свой (sendmail конфигурируем элементарно, но не советую) - первое или второе (все сразу тоже можно):

sudo setsebool -P httpd_can_network_connect 1
sudo setsebool -P httpd_can_sendmail 1

Да, чтоб не забыть:

sudo dnf in openssl mod_ssl

Один у вас сайт или несколько, нужен ли вам virtualhost, я не знаю. Но, если нужен:

sudo mcedit -b /etc/httpd/conf.d/vhosts.conf

Как вариант, для начала:

<VirtualHost *:443>
ServerName vash_site
DocumentRoot /var/www/vash_site
ErrorLog /var/www/logs/vash_site_ssl.error.log
CustomLog /var/www/logs/vash_site_ssl.access.log common
SSLEngine on
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder on
SSLCompression off
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

<Directory /var/www/vash_site>
Options FollowSymlinks
AllowOverride All
Require all granted
</Directory>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/vash_site/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vash_site/privkey.pem
</VirtualHost>

Как видите, в данном случае Virtual Host Configuration File создан с учетом того, что вы используете бесплатный трехмесячный сертификат LetsEncrypt, автоматически обновляемый посредством certbot.

Следующим образом:

sudo dnf install epel-release
sudo dnf in snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
sudo reboot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --apache

Рекомендую слегка подредактировать ssl:

sudo mcedit -b /etc/httpd/conf.d/ssl.conf

, добавив

SSLUseStapling On
SSLStaplingCache shmcb:/run/httpd/ssl_stapling(32768)

непосредственно перед

##
## SSL Virtual Host Context
##
<VirtualHost _default_:443>

Ну и последний, пожалуй, штрих, после того, как файлы вашего сайта окажутся в директории www и все уже должно, наконец, заработать:

sudo chown -R apache:apache /var/www
sudo chcon -R -t httpd_sys_rw_content_t /var/www
sudo find /var/www -type d -exec chmod 0755 {} \;
sudo find /var/www -type f -exec chmod 0644 {} \;

Получилось?

Комментарии (11)


  1. Volkodlak
    15.09.2024 08:24
    +2

    Centos (тащемта с репами epel), apache, snap..в проде..я ничего не забыл?!


    1. VenbergV
      15.09.2024 08:24

      Забыли что это все должно свободно ужиться на 1ГБ памяти.


      1. degistration
        15.09.2024 08:24

        а с vpn в 512мб


        1. chicotus Автор
          15.09.2024 08:24

          Никто, к слову, не мешает выбрать иной тип инстанса с большим количеством оперативки. Но вижу в веб-консоли AWS, что только один указанный тип инстанса доступен на Free Tier; соответственно, будет дороже. Опционально, таким образом.


          1. degistration
            15.09.2024 08:24

            или другого хостера тк free он не для всех


    1. chicotus Автор
      15.09.2024 08:24

      Вы забыли упомянуть о том, что единственная проблема, с которой способен столкнуться администратор веб-сервера, сконфигурированного таким образом, в контексте целей и задач и под той нагрузкой, что указаны в статье - это т.н. деградация оборудования, т.е. техническая проблематика сугубо в зоне ответственности AWS, но никоим образом не админа. Подобное описано, в том числе и здесь, на Хабре. Почитайте, вдруг пригодится.

      Вторая альтернатива неприятностей - ботосетка, что равносильно небольшому DDOS. Впрочем, статья упоминает эту возможность.

      Любые иные технические инциденты в контексте данного прода, поднятом будь то на центосе или RHEL - практически исключены. Мне жаль, что отсутствие реального технического опыта у людей, именующих себя техническими специалистами, в очень немалом ряду случаев подменено психологически непреодолимым желанием выплеснуть аффект, что является столь же профессиональной болезнью айтишников, как для артистов балета... не буду говорить что, в свете ряда нормативных актов законов Российской Федерации. :)

      Впрочем, продолжайте. Пользуясь случаем, хотел бы порекламировать второй свой материал, который в ближайшее время должен появиться (по крайней мере, надеюсь) на страницах Хабра под данной учетной записью. Он, в частности, призван рассказать и о механизмах подобной аффектации, вследствие чего вызовет, я уверен, еще более восхищенные комментарии. Искреннее спасибо за внимание к моему контенту и до новых встреч.


  1. androidmedia
    15.09.2024 08:24

    Жидинько, я себе составил инструкцию как создать сервер,почтовый сервер с запретом подмены почты - не одну неделю гуглил, делал, проверял и снова по кругу, оказалось нужно писать фильтр для проверки адреса отправителя и тут инструкций ноль,супервизор,ротация логов,сборка phpmyadmin из исходников, настройка mysql, репликация бд, автоматический бэкап бд и сайта по крону и т.п. А инструкций на подобие ваших полно.


    1. chicotus Автор
      15.09.2024 08:24

      С таковым все просто. Коль скоро вы "в течение не одной недели", по вашим же словам, гуглите инструкции, "как поднять почтовый сервер" - поверьте, вам не нужно поднимать почтовый сервер. Разве что в целях самообразования, иного практического смысла ваши действия не имеют, о чем кратко и упомянул в статье. Нет ни времени, ни, опять же, смысла объяснять подробнее.


    1. Newcss
      15.09.2024 08:24

      Проверять DKIM и SPF не?


  1. kest70
    15.09.2024 08:24

    А почему бы в контейнеры все это не завернуть? По-современному так сказать


  1. Akiyamov
    15.09.2024 08:24
    +1

    Статья точно не должна называться "Пошаговым руководством". В ней больше описан личный опыт автора установки LAMP-стэка без каких-либо внятных объяснений для самого новичка. Возможно, автор решил сделать памятку как все это поставить на будущее и решил поделиться ею на хабре. Еще вопрос по хабам, зачем стоит девопс, когда в статье нет ничего, что могло, хотя бы, автоматизировать это все?
    Да и сама статья написана наспех, где-то огромные куски текста, которые должны быть под спойлером, практически везде не показан результат команд, хотя статья для новичков. Автор даже не следует сам за собой, где-то используется комбинация enable и start, а где-то enable --now , где-то dnf install, а где-то dnf in . Также при установке httpd автор сразу же его перезапустил после запуска, а после этого приступает к изменению конфига не говоря далее о перезапуске, он же точно не нужен. Под конец статьи автор сам не знает "нужен ли virtual host", так мы для новичков пишем или для заканчивающих, которые сами поймут? То, что там сначала идет речь о конфиге и только потом ставится certbot через snap отдельный разговор.