هذا الموضوع مكمّل لـ آخر يركّز على إعدادات Discourse. هنا سنقوم بإعداد توزيع Cloudfront كوكيل عكسي (reverse proxy) أمام Discourse.
الحالة الوحيدة التي تحتاج فيها إلى هذا المزيج هي عندما تمتلك بالفعل توزيع Cloudfront للاسم المضيف الرئيسي وتود توجيه مجلد فرعي إلى منتدى Discourse. يفترض هذا الدليل أن القارئ لديه خبرة سابقة في استخدام Cloudfront في بيئات الإنتاج.
تدفق حركة المرور
عندما يقوم المستخدم بتحميل الموقع، هناك اتصالات شبكية اثنتان متضمنتان. لكل منهما اسم مضيف مختلف:
- سيقوم متصفح الويب بإرسال طلب إلى Cloudfront لاستخدام الاسم المضيف العام.
- ثم سيقوم Cloudfront بإرسال طلب إلى خوادم Discourse لاستخدام اسم المضيف الأصلي (origin hostname).
.───────. .───────. .─────────.
( browser )───▶( CF )───▶( discourse )
`───────' `───────' `─────────'
في مثالنا، سنُفترض أن موقع Discourse الخاص بك سيُحمّل من https://www.example.com/forum/، باستخدام:
| الغرض | اسم المضيف |
|---|---|
| الاسم المضيف العام | www.example.com |
| اسم المضيف الأصلي | discourse.example.com |
إعداد Cloudfront
هذا يعني أنه سيكون هناك أصلان (origins) مُعرَّفان على الأقل: واحد افتراضي للموقع الرئيسي، وآخر ثانٍ لخوادم Discourse.
سيكون هناك أيضًا سلوكان (behaviors) على الأقل، كل منهما يشير إلى أصل مختلف.
السلوك والأصل الافتراضيان غير ذوي صلة بأغراضنا هنا؛ يجب أن يكونا مُهيَّئين بالفعل بما يتناسب مع احتياجاتك. يجب إعداد الأصل والسلوك المخصصين لـ Discourse على النحو التالي.
الأصل (Origin)
يجب توجيه الأصل الثاني المخصص لخوادم Discourse إلى اسم المضيف الأصلي.
لا تقم بإعداد مسار للأصل (origin path).
يجب أن تكون سياسة البروتوكول HTTPS، مع TLSv1 كإصدار أدنى.
السلوك (Behavior)
يجب أن يتطابق النمط مع المجلد الفرعي.
يجب ربطه بالأصل المُعدّ كما هو موضح أعلاه.
يجب أن يعيد التوجيه من HTTP إلى HTTPS.
يجب السماح بجميع أفعال HTTP.
يجب تعطيل التخزين المؤقت (caching).
يجب توجيه جميع رؤوس العملاء (client headers).
إعداد Lambda@Edge
تستخدم بيئات الاستضافة المشتركة (بما في ذلك discourse.org) SNI. لجعل هذا يعمل مع Cloudfront، ستحتاج إلى استخدام Lambda@Edge للتأكد من أن Cloudfront يستخدم اسم المضيف الأصلي لـ SNI، بدلاً من رأس Host من طلب المشاهد.
قم بزيارة لوحة تحكم AWS Lambda وأنشئ دالة جديدة. استخدم بيئة تشغيل Node.js، وأنشئ دورًا جديدًا بـ “أذونات Lambda@Edge الأساسية”:
انقر فوق “إنشاء دالة” (Create Function).
بمجرد ظهور محرر الأكواد، استبدل المثال بالكود التالي:
exports.handler = async (event, context) => {
const request = event.Records[0].cf.request;
request.headers['x-forwarded-host'] = [{
key: 'x-forwarded-host',
value: request.headers['host'][0]['value']
}];
request.headers["host"] = [{
key: 'host',
value: request.origin.custom.domainName
}];
return request;
};
انقر فوق “نشر” (Deploy).
في الزاوية العلوية اليسرى، اختر Actions → Deploy to Lambda@Edge
اختر توزيع Cloudfront الخاص بك، وحدد السلوك الصحيح من القائمة:
إذا كنت بحاجة إلى إجراء أي تغييرات لأي سبب من الأسباب، فتأكد من “النشر” (Deploy)، ثم “نسخة جديدة” (Publish new Version) من علامة التبويب Versions، ثم قم بتحديث توزيعك لاستخدام النسخة الجديدة من Lambda.













