مقدمة: لماذا نشر تطبيق C++ على VPS؟
\nلا تزال لغة C++ واحدة من أكثر لغات البرمجة أداءً. إذا قمت بإنشاء خادم عالي التحميل، أو محلل، أو محرك ألعاب، أو خدمة مصغرة بلغة C++، فسيأتي الوقت الذي تحتاج فيه إلى نشرها على الإنترنت. استئجار VPS (خادم خاص افتراضي) هو الخيار الأمثل لمثل هذه المهام: تحصل على تحكم كامل في البيئة، وهو أمر بالغ الأهمية للغات المترجمة.
\nفي هذه المقالة، سنستعرض الدورة الكاملة: من إعداد خادم فارغ إلى تشغيل ملف C++ الثنائي تحت systemd ونشره عبر Nginx. جميع أمثلة الكود عملية وتم اختبارها على Ubuntu 22.04.
\n\n1. إعداد VPS وتثبيت الأدوات
\n\n1.1. الاتصال بالخادم
\nبعد شراء VPS، ستحصل على عنوان IP واسم مستخدم (عادةً root) وكلمة مرور. نتصل عبر SSH:
\nssh root@عنوان_IP_الخادم_الخاص_بك\nنوصي بتحديث قاعدة الحزم فوراً وتثبيت الأدوات الأساسية:
\napt update && apt upgrade -y\napt install git curl wget build-essential -y\n\n1.2. تثبيت المترجم و CMake
\nلبناء مشروع C++، ستحتاج إلى g++ و cmake:
apt install g++ cmake -y\ng++ --version # التحقق من الإصدار\nإذا كنت بحاجة إلى إصدار أحدث من GCC (مثل C++20)، أضف 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. كتابة تطبيق C++ اختباري (خادم HTTP)
\nللتجربة، سننشئ خادم HTTP بسيط بلغة C++ باستخدام المقابس (sockets). سوف يستمع على المنفذ 8080 ويرد بـ "Hello from C++ VPS!".
\n\n2.1. هيكل المشروع
\nmkdir ~/cpp-server && cd ~/cpp-server\nnano main.cpp\n\n2.2. الكود المصدري (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)\n if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {\n perror("socket failed");\n exit(EXIT_FAILURE);\n }\n\n // ربط المنفذ\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. بناء المشروع
\nسنقوم بترجمته مع التحسين والربط الثابت (إذا لزم الأمر):
\ng++ -O2 -std=c++17 main.cpp -o server\nls -la server # التحقق من الملف الثنائي\n\n3. النشر: systemd + Nginx reverse proxy
\n\n3.1. إنشاء خدمة systemd
\nلكي يعمل التطبيق تلقائياً عند بدء تشغيل الخادم ولا يتعطل، سننشئ وحدة systemd:
\nnano /etc/systemd/system/cpp-server.se