تخطَّ إلى المحتوى

الخادم#

يتضمن Vapor خادم HTTP عالي الأداء وغير متزامن مبنيًا على SwiftNIO. يدعم هذا الخادم HTTP/1 وHTTP/2 وترقيات البروتوكول مثل WebSockets. كما يدعم الخادم تفعيل TLS (SSL).

الإعداد#

يمكن إعداد خادم HTTP الافتراضي في Vapor عبر app.http.server.

// Only support HTTP/2
app.http.server.configuration.supportVersions = [.two]

يدعم خادم HTTP عدة خيارات إعداد.

اسم المضيف (Hostname)#

يتحكم اسم المضيف في العنوان الذي سيقبل الخادم عليه اتصالات جديدة. القيمة الافتراضية هي 127.0.0.1.

// Configure custom hostname.
app.http.server.configuration.hostname = "dev.local"

يمكن تجاوز اسم المضيف في إعداد الخادم عبر تمرير الراية --hostname (-H) إلى الأمر serve أو عبر تمرير المعامل hostname إلى app.server.start(...).

# Override configured hostname.
swift run App serve --hostname dev.local

المنفذ (Port)#

يتحكم خيار المنفذ في المنفذ الذي سيقبل الخادم عليه اتصالات جديدة عند العنوان المحدد. القيمة الافتراضية هي 8080.

// Configure custom port.
app.http.server.configuration.port = 1337

معلومة

قد يكون sudo مطلوبًا للربط بالمنافذ الأقل من 1024. المنافذ الأكبر من 65535 غير مدعومة.

يمكن تجاوز المنفذ في إعداد الخادم عبر تمرير الراية --port (-p) إلى الأمر serve أو عبر تمرير المعامل port إلى app.server.start(...).

# Override configured port.
swift run App serve --port 1337

قائمة الانتظار المُعلَّقة (Backlog)#

يُعرّف المعامل backlog الطول الأقصى لقائمة انتظار الاتصالات المُعلَّقة. القيمة الافتراضية هي 256.

// Configure custom backlog.
app.http.server.configuration.backlog = 128

إعادة استخدام العنوان (Reuse Address)#

يتيح المعامل reuseAddress إعادة استخدام العناوين المحلية. القيمة الافتراضية هي true.

// Disable address reuse.
app.http.server.configuration.reuseAddress = false

TCP بلا تأخير (TCP No Delay)#

يؤدي تفعيل المعامل tcpNoDelay إلى محاولة تقليل تأخير حزم TCP إلى الحد الأدنى. القيمة الافتراضية هي true.

// Minimize packet delay.
app.http.server.configuration.tcpNoDelay = true

ضغط الاستجابة (Response Compression)#

يتحكم المعامل responseCompression في ضغط استجابة HTTP باستخدام gzip. القيمة الافتراضية هي .disabled.

// Enable HTTP response compression.
app.http.server.configuration.responseCompression = .enabled

لتحديد سعة مخزن مؤقت (buffer) أولية، استخدم المعامل initialByteBufferCapacity.

.enabled(initialByteBufferCapacity: 1024)

فك ضغط الطلب (Request Decompression)#

يتحكم المعامل requestDecompression في فك ضغط طلب HTTP باستخدام gzip. القيمة الافتراضية هي .disabled.

// Enable HTTP request decompression.
app.http.server.configuration.requestDecompression = .enabled

لتحديد حد لفك الضغط، استخدم المعامل limit. القيمة الافتراضية هي .ratio(10).

// No decompression size limit
.enabled(limit: .none)

الخيارات المتاحة هي:

  • size: الحجم الأقصى بعد فك الضغط بالبايتات.

  • ratio: الحجم الأقصى بعد فك الضغط كنسبة من البايتات المضغوطة.

  • none: بلا حدود للحجم.

يمكن أن يساعد ضبط حدود حجم فك الضغط في منع طلبات HTTP المضغوطة بشكل خبيث من استخدام كميات كبيرة من الذاكرة.

المعالجة الأنبوبية (Pipelining)#

يُفعّل المعامل supportPipelining دعم المعالجة الأنبوبية لطلبات واستجابات HTTP. القيمة الافتراضية هي false.

// Support HTTP pipelining.
app.http.server.configuration.supportPipelining = true

الإصدارات (Versions)#

يتحكم المعامل supportVersions في إصدارات HTTP التي سيستخدمها الخادم. افتراضيًا، سيدعم Vapor كلًا من HTTP/1 وHTTP/2 عند تفعيل TLS. لا يُدعم سوى HTTP/1 عند تعطيل TLS.

// Disable HTTP/1 support.
app.http.server.configuration.supportVersions = [.two]

TLS#

يتحكم المعامل tlsConfiguration في ما إذا كان TLS (SSL) مُفعّلًا على الخادم. القيمة الافتراضية هي nil.

// Enable TLS.
app.http.server.configuration.tlsConfiguration = .makeServerConfiguration(
    certificateChain: try NIOSSLCertificate.fromPEMFile("/path/to/cert.pem").map { .certificate($0) },
    privateKey: .privateKey(try NIOSSLPrivateKey(file: "/path/to/key.pem", format: .pem))
)

لكي يُترجَم هذا الإعداد، تحتاج إلى إضافة import NIOSSL في أعلى ملف الإعداد لديك. قد تحتاج أيضًا إلى إضافة NIOSSL كاعتمادية (dependency) في ملف Package.swift لديك.

الاسم (Name)#

يتحكم المعامل serverName في ترويسة Server على استجابات HTTP الصادرة. القيمة الافتراضية هي nil.

// Add 'Server: vapor' header to responses.
app.http.server.configuration.serverName = "vapor"

الأمر serve#

لبدء تشغيل خادم Vapor، استخدم الأمر serve. سيُشغَّل هذا الأمر افتراضيًا إذا لم تُحدَّد أوامر أخرى.

swift run App serve

يقبل الأمر serve المعاملات التالية:

  • hostname (-H): يتجاوز اسم المضيف المُعدّ.

  • port (-p): يتجاوز المنفذ المُعدّ.

  • bind (-b): يتجاوز اسم المضيف والمنفذ المُعدّين مجموعين بـ :.

مثال باستخدام الراية --bind (-b):

swift run App serve -b 0.0.0.0:80

استخدم swift run App serve --help لمزيد من المعلومات.

سيستمع الأمر serve إلى SIGTERM وSIGINT لإيقاف تشغيل الخادم بسلاسة. استخدم ctrl+c (^c) لإرسال إشارة SIGINT. عند ضبط مستوى السجل (log level) على debug أو أقل، ستُسجَّل معلومات حول حالة الإيقاف السلس.

البدء اليدوي#

يمكن بدء خادم Vapor يدويًا باستخدام app.server.

// Start Vapor's server.
try app.server.start()
// Request server shutdown.
app.server.shutdown()
// Wait for the server to shutdown.
try app.server.onShutdown.wait()

الخوادم#

الخادم الذي يستخدمه Vapor قابل للإعداد. افتراضيًا، يُستخدم خادم HTTP المدمج.

app.servers.use(.http)

خادم مخصص#

يمكن استبدال خادم HTTP الافتراضي في Vapor بأي نوع يتوافق مع Server.

import Vapor

final class MyServer: Server {
    ...
}

app.servers.use { app in
    MyServer()
}

يمكن للخوادم المخصصة أن تُوسِّع Application.Servers.Provider لصياغة النقطة البادئة (leading-dot syntax).

extension Application.Servers.Provider {
    static var myServer: Self {
        .init {
            $0.servers.use { app in
                MyServer()
            }
        }
    }
}

app.servers.use(.myServer)
تحرير هذه الصفحة