Einleitung: Warum eine C++-Anwendung auf einem VPS bereitstellen?
\nC++ bleibt eine der leistungsfähigsten Programmiersprachen. Wenn Sie einen hochbelasteten Server, Parser, eine Spiel-Engine oder einen Mikroservice in C++ erstellt haben, stellt sich früher oder später die Frage der Veröffentlichung im Internet. Die Anmietung eines VPS (Virtual Private Server) ist die optimale Wahl für solche Aufgaben: Sie erhalten die volle Kontrolle über die Umgebung, was für kompilierte Sprachen entscheidend ist.
\nIn diesem Artikel behandeln wir den gesamten Zyklus: von der Einrichtung eines leeren Servers bis zum Start des C++-Binärprogramms unter systemd und der Veröffentlichung über Nginx. Alle Codebeispiele sind funktionsfähig und wurden unter Ubuntu 22.04 getestet.
\n\n1. Vorbereitung des VPS und Installation der Werkzeuge
\n\n1.1. Verbindung zum Server herstellen
\nNach dem Kauf des VPS erhalten Sie eine IP-Adresse, einen Benutzernamen (normalerweise root) und ein Passwort. Wir verbinden uns über SSH:
\nssh root@Ihre_Server_IP\nWir empfehlen, sofort die Paketdatenbank zu aktualisieren und die grundlegenden Dienstprogramme zu installieren:
\napt update && apt upgrade -y\napt install git curl wget build-essential -y\n\n1.2. Installation des Compilers und CMake
\nFür den Build eines C++-Projekts werden g++ und cmake benötigt:
apt install g++ cmake -y\ng++ --version # Überprüfung der Version\nWenn Sie eine neuere Version von GCC benötigen (z.B. für C++20), fügen Sie das PPA hinzu:
\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. Schreiben einer Test-C++-Anwendung (HTTP-Server)
\nZur Demonstration erstellen wir einen einfachen HTTP-Server in C++ unter Verwendung von Sockets. Er wird auf Port 8080 lauschen und mit "Hello from C++ VPS!" antworten.
\n\n2.1. Projektstruktur
\nmkdir ~/cpp-server && cd ~/cpp-server\nnano main.cpp\n\n2.2. Quellcode (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 // Socket erstellen\n if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {\n perror("socket failed");\n exit(EXIT_FAILURE);\n }\n\n // Port binden\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. Build des Projekts
\nKompilieren wir mit Optimierung und statischem Linken (falls erforderlich):
\ng++ -O2 -std=c++17 main.cpp -o server\nls -la server # Binärdatei überprüfen\n\n3. Deployment: systemd + Nginx Reverse Proxy
\n\n3.1. Erstellen eines systemd-Dienstes
\nDamit die Anwendung automatisch beim Serverstart startet und nicht abstürzt, erstellen wir eine systemd-Unit:
\nnano /etc/systemd/system/cpp-server.se