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

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

15cd64c6e7bea06ff500592daf1ed97e.jpg

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

Все манипуляции описаны на основе работы с инстансом 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 / ec2-user@

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

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


StartServers 1
MinSpareServers 1
MaxSpareServers 5
MaxClients 50
MaxRequestsPerChild 0


# 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


ServerLimit 16
StartServers 1
MaxRequestWorkers 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25


# 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

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


AddDefaultCharset UTF-8
DirectoryIndex index.php
AllowOverride All
Options FollowSymlinks
Require all granted
Require local

Теперь, если залогиниться в 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

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


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"


Options FollowSymlinks
AllowOverride All
Require all granted

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/vash_site/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/vash_site/privkey.pem

Как видите, в данном случае 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
##

Ну и последний, пожалуй, штрих, после того, как файлы вашего сайта окажутся в директории 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 {} \;

Получилось?

© Habrahabr.ru