Введение: Зачем деплоить C++ приложение на VPS?
C++ остаётся одним из самых производительных языков программирования. Если вы создали высоконагруженный сервер, парсер, игровой движок или микросервис на C++, рано или поздно встанет вопрос его публикации в интернете. Аренда VPS (Virtual Private Server) — оптимальный выбор для таких задач: вы получаете полный контроль над окружением, что критично для компилируемых языков.
В этой статье мы разберём полный цикл: от настройки пустого сервера до запуска C++ бинарника под systemd и публикации через Nginx. Все примеры кода рабочие и проверены на Ubuntu 22.04.
1. Подготовка VPS и установка инструментов
1.1. Подключение к серверу
После покупки VPS вы получите IP-адрес, логин (обычно root) и пароль. Подключаемся через SSH:
ssh root@ваш_IP_сервера
Рекомендуем сразу обновить пакетную базу и установить базовые утилиты:
apt update && apt upgrade -y
apt install git curl wget build-essential -y
1.2. Установка компилятора и CMake
Для сборки C++ проекта понадобятся g++ и cmake:
apt install g++ cmake -y
g++ --version # Проверка версии
Если вам нужна более свежая версия GCC (например, для C++20), добавьте PPA:
add-apt-repository ppa:ubuntu-toolchain-r/test -y
apt install g++-13 -y
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100
2. Написание тестового C++ приложения (HTTP-сервер)
Для демонстрации создадим простой HTTP-сервер на C++ с использованием сокетов. Он будет слушать порт 8080 и отвечать "Hello from C++ VPS!".
2.1. Структура проекта
mkdir ~/cpp-server && cd ~/cpp-server
nano main.cpp
2.2. Исходный код (main.cpp)
#include <iostream>
#include <string>
#include <sstream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
// Создаём сокет
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// Привязываем порт
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
std::cout << "Server listening on port 8080..." << std::endl;
while (true) {
if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
(socklen_t*)&addrlen)) < 0) {
perror("accept");
continue;
}
read(new_socket, buffer, 1024);
std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello from C++ VPS!";
send(new_socket, response.c_str(), response.length(), 0);
close(new_socket);
}
return 0;
}
2.3. Сборка проекта
Скомпилируем с оптимизацией и статической линковкой (если нужно):
g++ -O2 -std=c++17 main.cpp -o server
ls -la server # Проверяем бинарник
3. Деплой: systemd + Nginx reverse proxy
3.1. Создание systemd-сервиса
Чтобы приложение запускалось автоматически при старте сервера и не падало, создадим юнит systemd:
nano /etc/systemd/system/cpp-server.service
Содержимое файла:
[Unit]
Description=C++ HTTP Server
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root/cpp-server
ExecStart=/root/cpp-server/server
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Применяем конфигурацию:
systemctl daemon-reload
systemctl enable cpp-server
systemctl start cpp-server
systemctl status cpp-server # Проверка
3.2. Настройка Nginx как обратного прокси
Установим Nginx и настроим проброс с 80 порта на наш C++ сервер (8080):
apt install nginx -y
nano /etc/nginx/sites-available/cpp-server
Конфигурация:
server {
listen 80;
server_name ваш_домен_или_IP;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Активируем сайт и перезагружаем Nginx:
ln -s /etc/nginx/sites-available/cpp-server /etc/nginx/sites-enabled/
nginx -t # Проверка синтаксиса
systemctl restart nginx
4. Проверка и мониторинг
4.1. Тестирование
Откройте браузер и перейдите по адресу http://ваш_IP. Вы должны увидеть: Hello from C++ VPS!
Можно проверить через curl на самом сервере:
curl http://127.0.0.1:8080