نشر تطبيق C++ على VPS: دليل خطوة بخطوة من الألف إلى الياء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا نشر تطبيق C++ على VPS؟

\n

لا تزال لغة C++ واحدة من أكثر لغات البرمجة أداءً. إذا قمت بإنشاء خادم عالي التحميل، أو محلل، أو محرك ألعاب، أو خدمة مصغرة بلغة C++، فسيأتي الوقت الذي تحتاج فيه إلى نشرها على الإنترنت. استئجار VPS (خادم خاص افتراضي) هو الخيار الأمثل لمثل هذه المهام: تحصل على تحكم كامل في البيئة، وهو أمر بالغ الأهمية للغات المترجمة.

\n

في هذه المقالة، سنستعرض الدورة الكاملة: من إعداد خادم فارغ إلى تشغيل ملف C++ الثنائي تحت systemd ونشره عبر Nginx. جميع أمثلة الكود عملية وتم اختبارها على Ubuntu 22.04.

\n\n

1. إعداد VPS وتثبيت الأدوات

\n\n

1.1. الاتصال بالخادم

\n

بعد شراء VPS، ستحصل على عنوان IP واسم مستخدم (عادةً root) وكلمة مرور. نتصل عبر SSH:

\n
ssh root@عنوان_IP_الخادم_الخاص_بك
\n

نوصي بتحديث قاعدة الحزم فوراً وتثبيت الأدوات الأساسية:

\n
apt update && apt upgrade -y\napt install git curl wget build-essential -y
\n\n

1.2. تثبيت المترجم و CMake

\n

لبناء مشروع C++، ستحتاج إلى g++ و cmake:

\n
apt install g++ cmake -y\ng++ --version  # التحقق من الإصدار
\n

إذا كنت بحاجة إلى إصدار أحدث من GCC (مثل C++20)، أضف PPA:

\n
add-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\n

2. كتابة تطبيق C++ اختباري (خادم HTTP)

\n

للتجربة، سننشئ خادم HTTP بسيط بلغة C++ باستخدام المقابس (sockets). سوف يستمع على المنفذ 8080 ويرد بـ "Hello from C++ VPS!".

\n\n

2.1. هيكل المشروع

\n
mkdir ~/cpp-server && cd ~/cpp-server\nnano main.cpp
\n\n

2.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\n

2.3. بناء المشروع

\n

سنقوم بترجمته مع التحسين والربط الثابت (إذا لزم الأمر):

\n
g++ -O2 -std=c++17 main.cpp -o server\nls -la server  # التحقق من الملف الثنائي
\n\n

3. النشر: systemd + Nginx reverse proxy

\n\n

3.1. إنشاء خدمة systemd

\n

لكي يعمل التطبيق تلقائياً عند بدء تشغيل الخادم ولا يتعطل، سننشئ وحدة systemd:

\n
nano /etc/systemd/system/cpp-server.se                

المدونات

توصيات الكتب