إنشاء خدمة https

السؤال:

كيف يمكن لـ Workerman إنشاء خدمة https بحيث يمكن للعميل الاتصال عبر https للتواصل.

الإجابة:

البروتوكول https هو في الواقع http + SSL، وهو إضافة طبقة SSL فوق بروتوكول http. يدعم Workerman بروتوكول http وكذلك يدعم SSL (يتطلب إصدار Workerman >= 3.3.7)، لذا يكفي تفعيل SSL على أساس بروتوكول http لدعم بروتوكول https.

هناك طريقتان شائعتان لجعل Workerman يدعم https: إحداهما هي تفعيل SSL مباشرةً في Workerman، والأخرى هي استخدام nginx كوكيل لـ SSL. يمكنك اختيار إحدى الطريقتين، ولا يمكن الإعدادات في كلا الخيارين معًا.

تفعيل SSL في Workerman

التحضيرات:

  1. إصدار Workerman >= 3.3.7

  2. PHP مثبت به امتداد openssl

  3. قد تم الحصول على الشهادة (ملفات pem/crt وملف key) ووضعها في /etc/nginx/conf.d/ssl

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// من الأفضل أن تكون الشهادة التي تم الحصول عليها
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // يمكن أن تكون أيضًا ملف crt
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // إذا كانت الشهادة ذاتية التوقيع يجب تفعيل هذا الخيار
    )
);
// هنا تم تعيين بروتوكول http
$worker = new Worker('http://0.0.0.0:443', $context);
// تم تعيين transport لتفعيل ssl، لتصبح http+SSL أي https
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

يمكنك من خلال الكود أعلاه إنشاء خدمة https باستخدام Workerman، ويمكن للعميل الاتصال بـ Workerman عبر بروتوكول https لتحقيق اتصالات مشفرة وآمنة.

الاختبار:

قم بإدخال https://domain:443 في شريط عنوان المتصفح للزيارة.

ملحوظة:

  1. يجب الوصول إلى منفذ https عبر بروتوكول https، ولا يمكن الوصول إليه عبر بروتوكول http.

  2. الشهادة عادةً ما تكون مرتبطة بالنطاق، لذا يرجى استخدام النطاق عند الاختبار، وليس العنوان IP.

  3. إذا كنت لا تستطيع الوصول إلى https، يرجى التحقق من جدار حماية الخادم.

استخدام nginx كوكيل لـ ssl

بالإضافة إلى استخدام SSL الخاص بـ Workerman، يمكنك أيضًا استخدام nginx كوكيل SSL لتحقيق https.

ملحوظة
يجب اختيار إما nginx كوكيل SSL أو إعداد SSL في Workerman، ولا يمكن تفعيل كلا الخيارين في آن واحد.

مبدأ الاتصال وإجراءات العمل هي كما يلي:

  1. يقوم العميل ببدء اتصال https مع nginx

  2. يقوم nginx بتحويل بيانات بروتوكول https إلى بروتوكول http وإعادة توجيهها إلى منفذ http في Workerman

  3. يستقبل Workerman البيانات ويقوم بمعالجة منطق العمل، ثم يعيد البيانات إلى nginx بصيغة بروتوكول http

  4. يقوم nginx بتحويل بيانات بروتوكول http مرة أخرى إلى https، ويمررها للعميل

مثال على إعداد nginx

الشروط المسبقة والتحضيرات:

  1. نفترض أن Workerman يستمع على المنفذ 8181 (بروتوكول http)

  2. قد تم الحصول على الشهادة (ملفات pem/crt وملف key) ووضعها في /etc/nginx/conf.d/ssl

  3. يخطط لتفعيل nginx على المنفذ 443 لتوفير خدمة وكيل wss (يمكن تعديل المنفذ حسب الحاجة)

إعداد nginx يشبه التالي:


upstream workerman {
    server 127.0.0.1:8181;
    keepalive 10240;
}

server {
  listen 443;
  server_name domain.com;
  access_log off;

  ssl on;
  ssl_certificate /etc/nginx/conf.d/ssl/server.pem;
  ssl_certificate_key /etc/nginx/conf.d/ssl/server.key;
  ssl_session_timeout 5m;
  ssl_session_cache shared:SSL:50m;
  ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

  location /
  {
    proxy_pass http://workerman;
    proxy_http_version 1.1;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Connection "";
  }
}