Как поднять на VDS свой веб-сервер. Пошаговое руководство для новичков

от автора

Содержание статьи полностью соответствует заголовку: данный материал написан с целью помочь тем, кто никогда еще не устанавливал и не тюнинговал веб-сервер для своего корпоративного сайта или личного блога, передоверяя эту работу техническому специалисту либо используя шаред-хостинг. Автор 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 {} \;

Получилось?


ссылка на оригинал статьи https://habr.com/ru/articles/843430/