Деплой C++ приложения на VPS: пошаговая инструкция от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Зачем деплоить 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

Блоги

Рекомендаций по книгам