Introduction : Pourquoi déployer une application C++ sur un VPS ?
\nC++ reste l'un des langages de programmation les plus performants. Si vous avez créé un serveur à forte charge, un analyseur, un moteur de jeu ou un microservice en C++, la question de sa publication sur Internet se posera tôt ou tard. La location d'un VPS (Virtual Private Server) est le choix optimal pour de telles tâches : vous obtenez un contrôle total sur l'environnement, ce qui est crucial pour les langages compilés.
\nDans cet article, nous allons parcourir le cycle complet : de la configuration d'un serveur vierge au lancement d'un binaire C++ sous systemd et à sa publication via Nginx. Tous les exemples de code sont fonctionnels et ont été testés sur Ubuntu 22.04.
\n\n1. Préparation du VPS et installation des outils
\n\n1.1. Connexion au serveur
\nAprès avoir acheté un VPS, vous recevrez une adresse IP, un identifiant (généralement root) et un mot de passe. Connectez-vous via SSH :
\nssh root@votre_adresse_IP_serveur\nNous vous recommandons de mettre à jour immédiatement la base de paquets et d'installer les utilitaires de base :
\napt update && apt upgrade -y\napt install git curl wget build-essential -y\n\n1.2. Installation du compilateur et de CMake
\nPour compiler un projet C++, vous aurez besoin de g++ et cmake :
apt install g++ cmake -y\ng++ --version # Vérification de la version\nSi vous avez besoin d'une version plus récente de GCC (par exemple, pour C++20), ajoutez le 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. Écriture d'une application C++ de test (serveur HTTP)
\nPour la démonstration, nous allons créer un serveur HTTP simple en C++ utilisant des sockets. Il écoutera sur le port 8080 et répondra "Hello from C++ VPS!".
\n\n2.1. Structure du projet
\nmkdir ~/cpp-server && cd ~/cpp-server\nnano main.cpp\n\n2.2. Code source (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 // Création du socket\n if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {\n perror("socket failed");\n exit(EXIT_FAILURE);\n }\n\n // Liaison du port\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. Compilation du projet
\nCompilons avec optimisation et liaison statique (si nécessaire) :
\ng++ -O2 -std=c++17 main.cpp -o server\nls -la server # Vérification du binaire\n\n3. Déploiement : systemd + proxy inverse Nginx
\n\n3.1. Création du service systemd
\nPour que l'application démarre automatiquement au lancement du serveur et ne plante pas, créons une unité systemd :
\nnano /etc/systemd/system/cpp-server.se