← العودة للمدونة

بناء خادم بروكسي بسيط باستخدام Node.js

أفضل طريقة لفهم أي تقنية هي بناؤها بنفسك. في هذا الدليل، سنبتعد عن الحلول الجاهزة مثل Squid وسنقوم بكتابة كود لبروكسي بسيط باستخدام JavaScript. هذا المشروع سيساعدك على فهم كيفية معالجة طلبات HTTP وكيفية تمرير البيانات بين العميل والخادم.

المتطلبات الأساسية

ستحتاج فقط إلى تثبيت Node.js على جهازك. سنستخدم مكتبة http المدمجة، ولن نحتاج لأي مكتبات خارجية (Dependencies) معقدة، مما يجعل البروكسي خفيفاً وسريعاً.

خطوات بناء البروكسي

فكرة البروكسي بسيطة: استلام الطلب من المتصفح، إرساله إلى الخادم الهدف، ثم إعادة الرد إلى المتصفح. سنقوم بإنشاء خادم يستمع على المنفذ 8080.

الكود الكامل (proxy.js)


const http = require('http');
const net = require('net');
const url = require('url');

// إنشاء خادم HTTP
const server = http.createServer((clientReq, clientRes) => {
    const reqUrl = url.parse(clientReq.url);
    
    const options = {
        hostname: reqUrl.hostname,
        port: reqUrl.port || 80,
        path: reqUrl.path,
        method: clientReq.method,
        headers: clientReq.headers
    };

    // توجيه الطلب للخادم الهدف
    const proxyReq = http.request(options, (proxyRes) => {
        clientRes.writeHead(proxyRes.statusCode, proxyRes.headers);
        proxyRes.pipe(clientRes, { end: true });
    });

    clientReq.pipe(proxyReq, { end: true });

    proxyReq.on('error', (e) => {
        console.log(`Error: ${e.message}`);
        clientRes.end();
    });
});

// دعم HTTPS (CONNECT Method)
server.on('connect', (req, clientSocket, head) => {
    const { port, hostname } = url.parse(`//${req.url}`, false, true);
    
    const serverSocket = net.connect(port || 443, hostname, () => {
        clientSocket.write('HTTP/1.1 200 Connection Established\r\n' +
                        'Proxy-agent: Node.js-Proxy\r\n' +
                        '\r\n');
        serverSocket.write(head);
        serverSocket.pipe(clientSocket);
        clientSocket.pipe(serverSocket);
    });
});

server.listen(8080, () => {
    console.log('Proxy running on port 8080');
});
                    

كيفية الاستخدام

بعد تشغيل الكود بـ node proxy.js، قم بضبط إعدادات المتصفح لاستخدام localhost:8080 كبروكسي. ستلاحظ أن جميع طلباتك تمر عبر هذا السكريبت البسيط. يمكنك الآن إضافة ميزات مثل تسجيل الطلبات (Logging) أو حظر مواقع معينة بسهولة.