Introdução: Por que implantar uma aplicação C++ em VPS?
\nC++ continua sendo uma das linguagens de programação mais performáticas. Se você criou um servidor de alta carga, um parser, um motor de jogo ou um microsserviço em C++, mais cedo ou mais tarde surgirá a questão de publicá-lo na internet. Alugar um VPS (Virtual Private Server) é a escolha ideal para essas tarefas: você obtém controle total sobre o ambiente, o que é crítico para linguagens compiladas.
\nNeste artigo, abordaremos o ciclo completo: desde a configuração de um servidor vazio até a execução do binário C++ sob o systemd e a publicação via Nginx. Todos os exemplos de código são funcionais e testados no Ubuntu 22.04.
\n\n1. Preparação do VPS e instalação das ferramentas
\n\n1.1. Conexão ao servidor
\nApós adquirir o VPS, você receberá um endereço IP, um login (geralmente root) e uma senha. Conecte-se via SSH:
\nssh root@seu_IP_do_servidor\nRecomendamos atualizar imediatamente a base de pacotes e instalar utilitários básicos:
\napt update && apt upgrade -y\napt install git curl wget build-essential -y\n\n1.2. Instalação do compilador e CMake
\nPara compilar o projeto C++, você precisará de g++ e cmake:
apt install g++ cmake -y\ng++ --version # Verificar a versão\nSe precisar de uma versão mais recente do GCC (por exemplo, para C++20), adicione o PPA:
\nadd-apt-repository ppa:ubuntu-toolchain-r/test -y\napt install g++-13 -y\nupdate-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100\n\n2. Criação de uma aplicação C++ de teste (servidor HTTP)
\nPara demonstração, criaremos um servidor HTTP simples em C++ usando sockets. Ele escutará na porta 8080 e responderá com "Hello from C++ VPS!".
\n\n2.1. Estrutura do projeto
\nmkdir ~/cpp-server && cd ~/cpp-server\nnano main.cpp\n\n2.2. Código-fonte (main.cpp)
\n#include <iostream>\n#include <string>\n#include <sstream>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <unistd.h>\n\nint main() {\n int server_fd, new_socket;\n struct sockaddr_in address;\n int opt = 1;\n int addrlen = sizeof(address);\n char buffer[1024] = {0};\n\n // Criar socket\n if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {\n perror("socket failed");\n exit(EXIT_FAILURE);\n }\n\n // Vincular porta\n if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {\n perror("setsockopt");\n exit(EXIT_FAILURE);\n }\n address.sin_family = AF_INET;\n address.sin_addr.s_addr = INADDR_ANY;\n address.sin_port = htons(8080);\n\n if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {\n perror("bind failed");\n exit(EXIT_FAILURE);\n }\n\n if (listen(server_fd, 3) < 0) {\n perror("listen");\n exit(EXIT_FAILURE);\n }\n\n std::cout << "Server listening on port 8080..." << std::endl;\n\n while (true) {\n if ((new_socket = accept(server_fd, (struct sockaddr *)&address,\n (socklen_t*)&addrlen)) < 0) {\n perror("accept");\n continue;\n }\n\n read(new_socket, buffer, 1024);\n std::string response = "HTTP/1.1 200 OK\\r\\nContent-Type: text/plain\\r\\n\\r\\nHello from C++ VPS!";\n send(new_socket, response.c_str(), response.length(), 0);\n close(new_socket);\n }\n return 0;\n}\n\n2.3. Compilação do projeto
\nCompile com otimização e linkagem estática (se necessário):
\ng++ -O2 -std=c++17 main.cpp -o server\nls -la server # Verificar o binário\n\n3. Implantação: systemd + Nginx reverse proxy
\n\n3.1. Criação do serviço systemd
\nPara que a aplicação seja iniciada automaticamente na inicialização do servidor e não pare, crie uma unit do systemd:
\nnano /etc/systemd/system/cpp-server.se