Чтобы опубликовать свой веб-сайт в сети интернет необходимо арендовать VPS — виртуальный выделенный сервер, на котором помимо самого сайта можно разместить веб-сервер, базу данных и прочее программное обеспечение, необходимое для запуска и функционирования сайта. В сегодняшней статье мы подробно разберем как создавать свой VPS-сервер, а также развернем тестовый сайт в качестве примера.
VPS (расшифровывается как Virtual Private Server — Виртуальный частный сервер) — это виртуальный выделенный сервер, который создается с помощью технологии виртуализации на физическом сервере. По сути, VPS представляет собой изолированную среду с собственными ресурсами, такими как процессор, оперативная память и дисковое пространство, которая функционирует как самостоятельный сервер. VPS предоставляет пользователю root-доступ (полный контроль) и позволяет устанавливать любое программное обеспечение и настраивать сервер под свои нужды.
VPS нужен, если вам требуется больше контроля, мощности и гибкости, чем на обычном хостинге. Он подходит для таких задач как:
Использование собственного VPS-сервера имеет ряд преимуществ включая следующие:
При аренде VPS пользователь получает root-доступ, что позволяет настраивать сервер под свои нужды, устанавливать любое программное обеспечение и изменять его конфигурацию.
Ресурсы VPS, включая CPU, RAM и дисковое пространство, выделены исключительно для вас, что обеспечивает стабильную производительность даже при высоких нагрузках. Это отличает VPS от shared-хостингов, у которых из собственных ресурсов есть только место на диске, в то время как все остальные ресурсы распределяются между сторонними пользователями.
Для VPS можно легко увеличивать ресурсы (память, процессор, дисковое пространство) по мере роста потребностей. Также присутствует возможность выбора готовых конфигураций для сервера.
VPS-сервер можно изолировать путем создания его в частной сети без доступа в сеть интернет.
Обычно для VPS дополнительно можно арендовать публичный выделенный IP-адрес, что позволяет развернуть свой веб-сайт, почтовый сервер и т.д.
В качестве дополнительных возможностей большинство провайдеров предлагают настроить автоматическое резервное копирование данных, благодаря чему появляется возможность легко восстановить данные в случае сбоев.
На VPS-сервере вы можете переустанавливать ОС, менять конфигурацию и управлять сервером через панель управления или командную строку. Доступ к серверу возможен в любой момент времени из любой точки мира.
Выбор хостинг-провайдера для VPS-сервера зависит от многих факторов, включая задачи, бюджет, а также необходимость в дополнительном функционале. При выборе хостинг-провайдера стоит обращать внимание на следующие требования:
Рассмотрим создание своего собственного VPS-сервера на примере Timeweb Cloud.
1) Переходим на страницу авторизации и входим в аккаунт при помощи логина или адреса электронной почты и пароля или при помощи Passkey, ВКонтакте, GitHub, Google.
2) После успешной авторизации отобразится панель управления текущего проекта. Переходим в раздел «Облачные серверы» и нажимаем «Создать» или «Добавить».
3) Выбираем операционную систему, которая будет установлена на сервер. Помимо дистрибутивов Linux, также доступна ОС Windows Server в нескольких редакциях:
4) Выбираем регион, в котором будет находиться наш сервер. Выбирать рекомендуется тот регион, который ближе всего находится к вам физически. У каждого доступного региона справа вверху отображается ping, т.е. время, необходимое для передачи данных с вашего компьютера на сервер. Чем меньше указанное время, тем быстрее будет осуществляться передача данных.
5) Далее выбираем конфигурацию для сервера, которая будет удовлетворять вашим потребностям при выполнении задач. Можно выбрать готовую конфигурацию, которая включает линейки Premium NVMe, Standard и High CPU, или произвольную, где вы можете самостоятельно указать нужное количество ресурсов. Выбираем соответствующий тариф:
6) Далее необходимо решить, будет ли сервер доступен из внешний сети или же только из приватной (частной) сети. Если не уверены в настройках, оставьте эти параметры без изменений.
7) По желанию можно оформить дополнительные услуги, включая резервные копии и защиту от DDoS-атак (последняя доступна только в Санкт-Петербурге и в Москве).
8) На следующем шаге можно загрузить SSH-ключ, чтобы не входить на север при помощи пароля. В этом случае доступ по паролю можно запретить:
9) При необходимости можно воспользоваться инструментом cloud-init, который автоматизирует процесс настройки сервера (например, можно установить нужные пакеты, создать пользователей и т.д.). Подробнее о cloud-init — в документации.
10) Можно задать необходимое имя для сервера которое будет отображаться в панели управления, а также выбрать проект.
11) Для создания сервера необходимо нажать на кнопку «Заказать»:
Если на вашем аккаунте недостаточно средств, то будет выведено предупреждение о необходимости пополнить баланс. После оплаты и создания сервера откроется Дашборд сервера, где можно будет найти IP-адрес, логин и пароль для подключения.
vds
Рассмотрим настройку параметров сервера через панель управления Timeweb Cloud.
В разделе «Доступ» можно изменить root-пароль, причем его можно как сгенерировать автоматически, так и задать самому.
При помощи параметра «Режим загрузки ОС» можно поменять режим загрузки, например, загрузившись с диска восстановления. Данная функция будет полезна при устранении различных проблем, связанных с системой:
Также можно управлять SSH-ключами (например, можно добавить новый ключ) и открыть доступ для технической поддержки при необходимости.
В разделе «Сеть» можно добавить сервер в приватную (частную) сеть:
А также настроить правила маршрутизации трафика (NAT):
Раздел «Бэкапы» позволяет создавать резервные копии и управлять ими, а также создавать снапшоты — мгновенные снимки текущего состояния сервера:
Чтобы изменить конфигурацию сервера необходимо, перейти во вкладку «Конфигурация» и нажать на кнопку «Выбрать конфигурацию»:
В открывшемся меню можно выбрать как фиксированную (уже готовую) конфигурацию, так и настроить свою собственную (вкладка «Произвольная»):
После того как VPS-сервер был запущен, необходимо произвести его базовую настройку. Все примеры, рассматриваемые ниже, применимы для дистрибутива Ubuntu.
apt update && apt -y upgrade
Это обеспечит актуальность программного обеспечения и исправление известных уязвимостей.
Использование root-аккаунта на Linux-сервере считается небезопасным, так как root — это суперпользователь с полным доступом ко всем файлам, процессам и настройкам системы. Для минимизации рисков, связанных с использованием root, создадим нового пользователя с именем usr1
:
adduser usr1
Задаем пароль и вводим его повторно. При необходимости заполняем дополнительные поля или оставляем их пустыми.
sudo
:usermod -aG sudo usr1
usr1
:su - usr1
tree
и net-tools
, используя sudo
:sudo apt -y install tree net-tools
В процессе вводим пароль пользователя:
Пакеты были успешно установлены.
Как правило, по умолчанию доступ до VPS-сервера осуществляется при помощи пароля. Данный способ не является безопасным. Предпочтительный вариант — аутентификация по SSH-ключам. Если вы не добавили ключ и не отключили доступ по паролю на этапе создания сервера, это можно сделать сейчас вручную.
Генерируем пару ключей на локальном компьютере, с которого будет осуществляться подключение по SSH к VPS-серверу.
ssh-keygen
По умолчанию система предлагает сохранить ключи в домашней директории пользователя в скрытой папке .ssh
(в нашем примере используется macOS и директория /Users/admin/.ssh
). У вас также есть опция задать собственный путь. Также утилита предложит задать парольную фразу для ключа, однако ее придется вводить каждый раз при подключении. При желании парольную фразу можно оставить пустой.
Мы сохраним ключи в стандартной директории и не будем использовать парольную фразу.
ssh-copy-id
. Необходимо указать имя пользователя, а также адрес сервера:ssh-copy-id usr1@212.193.24.152
Вводим пароль пользователя. Если ключ был успешно скопирован на сервер, то отобразится фраза «Number of key(s) added». Попробуем подключиться к серверу без ввода пароля:
Если при подключении не отобразилось приглашение для ввода пароля, то ключи были успешно добавлены.
/etc/ssh/sshd_config
при помощи любого текстового редактора:sudo nano /etc/ssh/sshd_config
Необходимо отредактировать следующие параметры и задать им обоим значение No
:
PermitRootLogin
— запрещает или разрешает вход под root.PasswordAuthentication
— отключает или включает вход по паролю (используется после настройки входа по ключам).Сохраняем изменения и выходим из файла.
sshd
:sudo systemctl restart sshd
После перезапуска пробуем войти еще раз. При нормальном функционировании доступ по паролю будет запрещен – вместо него будут использоваться только ключи.
sudo ufw status
Добавим правило для протокола SSH, а именно разрешим подключение по 22 порту. Можно как указать номер порта, так и указать протокол:
sudo ufw allow 22
Или:
sudo ufw allow openssh
По такому же принципу добавляются правила для всех остальных портов и протоколов. Например, далее в статье мы будем разворачивать веб-приложение, для которого заранее откроем порты 80 и 5000:
sudo ufw allow 80
sudo ufw allow 5000
sudo ufw enable
При появлении фразы «Command may disrupt existing ssh connections. Proceed with operation (y|n)?» вводим y
.
Для проверки всех активных правил можно использовать команду:
sudo ufw status
После того как VPS-сервер был настроен, можно перейти к практическому использованию. Для примера мы развернем тестовое веб-приложение, созданное при помощи фреймворка Flask на Python, которое будет использовать базу данных PostgreSQL.
Для установки СУБД PostgreSQL и пакета libpq-dev
(содержит заголовочные файлы и библиотеки для работы с PostgreSQL) достаточно выполнить команду:
sudo apt -y install postgresql libpq-dev
Далее перейдем к процессу настройки.
postgres
:sudo -i -u postgres
psql
:psql
myapp1
:CREATE DATABASE myapp1;
newusr1
с зашифрованным паролем:CREATE USER newusr1 WITH ENCRYPTED PASSWORD 'StrongPassword46464473';
newusr1
все права на базу данных myapp1
:GRANT ALL PRIVILEGES ON DATABASE myapp1 TO newusr1;
Для выхода из оболочки psql
необходимо ввести exit
:
exit
Далее вводим exit
еще раз, чтобы выйти из-под пользователя postgres
:
exit
Переходим к созданию тестового веб-приложения.
sudo apt update && sudo apt -y install python3-pip python3-venv
mkdir flask-app && cd flask-app
python3 -m venv venv
И активируем его:
source venv/bin/activate
Перед приглашением к вводу будет отображаться (venv)
, что говорит о том, что виртуальное окружение было успешно активировано.
pip
устанавливаем необходимые пакеты:pip3 install flask flask-sqlalchemy psycopg2 gunicorn
app.py
:nano app.py
Используем следующее содержимое, где вместо имени пользователя newusr1
, пароля StrongPassword46464473
и базы данных myapp1
вам необходимо подставить свои данные для подключения к базе данных:
from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://newusr1:StrongPassword46464473@localhost:5432/myapp1'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class Item(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
with app.app_context():
db.create_all()
@app.route('/')
def index():
items = Item.query.all()
return render_template('index.html', items=items)
@app.route('/add', methods=['POST'])
def add_item():
name = request.form.get('name')
if name:
new_item = Item(name=name)
db.session.add(new_item)
db.session.commit()
return redirect('/')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
templates
и в ней файл index.html
:mkdir templates && nano ./templates/index.html
Файл index.html
наполняем следующим содержимым:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask PostgreSQL App</title>
</head>
<body>
<h1>Item List</h1>
<ul>
{% for item in items %}
<li>{{ item.name }}</li>
{% endfor %}
</ul>
<form action="/add" method="post">
<input type="text" name="name" required>
<button type="submit">Add Item</button>
</form>
</body>
</html>
Сохраняем изменения и выходим из файла.
python3 app.py
Далее в браузере переходим по IP-адресу сервера и порту приложения (5000):
Проверим работоспособность базы данных. Для этого добавим значение «TestItem» и нажимаем на кнопку «Add Item»:
Значение было успешно добавлено.
Также можно подключиться к базе данных и выполнить SQL- запрос, чтобы убедиться, что запись была успешно сохранена:
systemd
-файл для запуска приложения в фоновом режиме:sudo nano /etc/systemd/system/flask-app.service
Содержимое файла будет следующим:
[Unit]
Description=Flask App
After=network.target
[Service]
User=root
WorkingDirectory=/home/usr1/flask-app
ExecStart=/home/usr1/flask-app/venv/bin/gunicorn --workers 1 --bind 0.0.0.0:5000 app:app
Restart=always
[Install]
WantedBy=multi-user.target
В параметре WorkingDirectory
необходимо указать полный путь до директории с файлами веб-проекта, в параметре ExecStart
— полный путь до исполняемого (бинарного) файла Gunicorn. Так как мы установили Gunicorn внутри виртуального окружения, для определения пути необходимо выполнить команду which gunicorn
, находясь в виртуальном окружении:
which gunicorn
В данном примере полный путь до gunicorn
— /home/usr1/flask-app/venv/bin/gunicorn
.
Сохраняем изменения и выходим из файла.
systemd
:sudo systemctl daemon-reload
sudo systemctl restart flask-app.service
И проверяем его статус:
systemctl status flask-app.service
Веб-приложение успешно запущено.
nginx
из стандартного репозитория дистрибутива:sudo apt -y install nginx
default
:sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup
default
: sudo nano /etc/nginx/sites-available/default
Приводим файл к следующей конфигурации, где вместо IP-адреса 212.193.24.152 вам необходимо указать публичный IP-адрес вашего сервера:
server {
listen 80;
server_name 212.193.24.152;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
sudo nginx -t
Если команда вернет строки, содержащие «syntax is ok» и «test is successful», то ошибок в синтаксисе конфигурационных файлах нет.
nginx
:sudo systemctl restart nginx
Проверяем, что веб-приложение открывается:
Пробуем добавлять записи:
На этом развертывание тестового веб-приложения на VPS завершено.
VPS (Virtual Private Server) и shared-хостинг (общий хостинг) — это два разных подхода к размещению сайтов, и их отличия заключаются в уровне контроля, ресурсов и изоляции. VPS отличается от shared-хостинга тем, что предоставляет выделенные ресурсы, полный контроль, изоляцию и лучшую производительность. Shared-хостинг — это общие ресурсы, простота и низкая цена, но с ограничениями и зависимостью от «соседей».
Выбор тарифа для VPS зависит от потребностей, а также от необходимых ресурсов, которые потребуются для проекта.
Основные критерии выбора тарифа для VPS заключаются в используемом трафике и нагрузке. Так, при низком трафике (до 1 000 посетителей в день) достаточно выбрать небольшие конфигурации, включающие в себя 1-2 ГБ RAM и 1-2 CPU. Для средней и высокой нагрузки (начиная от 10 000 посетителей и выше) необходимо выбирать конфигурации с минимум 4-8 ГБ RAM и 2-4 CPU. Также необходимо обращать внимание на стоимость конфигурации для VPS-сервера, его уровень доступности (должен быть не ниже 99%) и наличие технической поддержки.
VPS-сервером можно управлять разными способами. Как правило, они сводятся к следующим методам:
Разверните свой VPS в Timeweb Cloud
Заключение
VPS-серверы представляют собой гибкие и бюджетные решения для широкого спектра задач, начиная от развертывания веб-сайтов и заканчивая настройкой почтового сервера. В данной статье мы подробно рассмотрели, как создать свой VPS-сервер и использовать его для развертывания веб-приложения на Python с использованием базы данных.