Introduction: Why C++ on VPS is Modern and Efficient
Many developers mistakenly believe that the era of C++ in web development and backend has passed. In reality, for high-load systems, game servers, financial applications, and IoT solutions, C++ remains the number one language in terms of performance. Deploying a C++ application on a VPS (Virtual Private Server) is a skill that sets an engineer apart from the mass of developers working with interpreted languages.
In this article, we will cover the full cycle: from purchasing a VPS and setting up the environment to compiling your C++ project and running it as a production service. You will learn how to avoid common mistakes and make the deployment process as automated as possible.
Step 1: Preparing the VPS and Installing the Necessary Toolchain
Choosing and Initial Server Setup
For a C++ application, you will need a VPS running Linux (Ubuntu 22.04 LTS is the optimal choice). Minimum specifications: 1 vCPU, 1 GB RAM, and 10 GB SSD. After purchasing the server, connect to it via SSH:
ssh root@your_server_ipUpdate system packages:
apt update && apt upgrade -yInstalling the Compiler and Build Tools
For C++, we will need g++ (or clang) and cmake:
apt install build-essential cmake git -yVerify the installation:
g++ --versioncmake --versionSetting up Git and Preparing the Repository
If your project is hosted on GitHub/GitLab, clone it to the server:
cd /optgit clone https://github.com/your-username/your-repository.gitcd your-repositoryStep 2: Compiling the C++ Application for Production
A Simple C++ Server Example (for Testing)
Let's create a minimal HTTP server in C++ using sockets. This code will listen on port 8080 and respond with "Hello from C++!".
// server.cpp#include <iostream>#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>#include <cstring>
int main() { int server_fd, new_socket; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; const char *hello = "HTTP/1.1 200 OKContent-Length: 20
Hello from C++!";
// Creating socket if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); }
// Binding to port 8080 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &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"); exit(EXIT_FAILURE); } read(new_socket, buffer, 1024); send(new_socket, hello, strlen(hello), 0); close(new_socket); } return 0;}Compiling with Optimizations
For a production build, use optimization flags:
g++ -O3 -march=native -flto -static -o server server.cpp-O3— maximum speed optimization.-march=native— optimization for your processor architecture.-flto<