محمد در نظر دارد پیکربندی مربوط به HAProxy را برای وبسایتی که جدیدا در دست طراحی است انجام دهد. در معماری انجام شده، HAProxy به عنوان لودبالانسر/پراکسی، جلوی سرورهایی که برای وب سایت ایجاد شدهاند قرار گرفته است در این پیادهسازی از چندین سرور (api application و nginx webserver) استفاده شده است و برای پاسخ به درخواستهای وبسایت از این سرورها استفاده میشود.
در وبسایت مورد نظر یک اپلیکیشن با نام api که یک flask api است وظیفه جواب دادن به درخواستها روی مسیرهای /games
، /auth
و /mobile
را دارد.
همچنین دو وب سرور Nginx وجود دارد که وظیفه جواب دادن به درخواستها روی مسیر روت یا /
را دارند که به صورت Fail Over یکدیگر کار میکنند.
برای دانلود پروژه اولیه روی این لینک کلیک کنید.
حال از محمد خواسته شده تا کارهای زیر را انجام دهد:
/
) ابتدا فقط ترافیک به وبسرور با نام app_primary
ارسال شود و در صورت از دسترس خارج شدن سرور اول ترافیک، به سمت وبسرور دوم با نام app_secondary
ارسال گردد و زمانیکه مشکل وبسرور اول حل شد ترافیک مجدد فقط به وب سرور app_primary
ارسال شود.توجه داشته باشید:
80
کار میکنند.درخواستهای به /games
، /mobile
و /auth
باید حتما توسط اپلیکیشن api جواب داده شود.
درخواستها به مسیر روت باید توسط وبسرور Nginx جواب داده شود.
/mobile
هدایت شوند. و در صورتیکه درخواست مورد نظر از این پلتفرمها نباشد بایستی به مسیر درخواستی خود هدایت شود.توجه داشته باشید:
5000
کار میکند.در صورتیکه درخواستی دارای کوئری باشد (به عنوان مثال /digikala?test=foo
) بایستی به مسیر روت (یا همان nginx) هدایت شود.
پیکربندی HAproxy باید به گونهای باشد وقتی درخواستی با هدر X-Secret: key BASE64DECODED base64
به HAProxy رسید قسمت BASE64DECODED از هدر درخواستی به صورت base64 در هدری با نام auth-hash
به اپلیکیشن api داده شود.
توجه داشته باشید:
auth-hash
روی مسیر /auth
برسد هدر مورد نظر را در خروجی چاپ میکند. در نظر داشته باشید که خروجی چاپ شده حتما بایستی مقدار base64 کلید مورد نظر در هدر X-Secret باشد.به عنوان مثال برای کلید BASE64DECODED باید مقدار زیر چاپ شود:
هیچ تغییری روی کد اپلیکیشن api نباید داده شود.
عبارت بعد از BASE64DECODED یک رشته تصادفی میباشد.
سرویس HAProxy در هیچ حالتی نباید خطای 5XX
بدهد و برای هر مسیری (موجود و یا ناموجود) باید ریسپانس کد 200
داشته باشد.
در تنظیمات HAProxy برای اپلیکیشن api که یک Flask api میباشد backend با نام api تعریف شده است. در ادامه جزئیات api را مشاهده میکنید.
تعداد بکندهای تعریف شده در تنظیمات HAProxy نباید بیشتر از دو مورد موجود (api و app) باشد.
برای ایجاد پروژه اولیه از یک فایل docker-compose
استفاده شده است که پورت 8080
برای HAProxy پابلیش شده است که درخواست های به پورت 8080
هاست (یا همان سیستم شما)، به HAProxy frontend روی پورت 80
ارسال میشوند. در ادامه جزئیات frontend را مشاهده میکنید:
تنظیمات HAProxy به شرح زیر میباشد:
نکته: در تعریف backendها در HAProxy در نظر داشته باشید که اپلیکیشن api روی پورت 5000
کار میکند و وبسرورهای nginx روی پورت 80
کار میکنند.
برای اجرای از دستور زیر استفاده کنید:
برای از دسترس خارج کردن app وبسرور nginx میتوانید از دستور زیر استفاده نمایید:
برای انجام تست دسترسی به مسیرهای مورد نظر از مرورگر خود آدرس 127.0.0.1:8080
را باز نمایید به عنوان مثال:
برای تست مسیر /auth
میتوانید از دستور زیر استفاده کنید:
شما فقط میتوانید محتوای فایل haproxy.cfg
را تغییر دهید. تغییرات خودتان را بر روی haproxy.cfg
اعمال کنید و این فایل را Zip کرده و ارسال کنید. توجه کنید که پس از extract نمودن فایل زیپ، باید فایل haproxy.cfg
مشاهده شود.