https:/alinaseri.dev
چجوری روی یک سرور، چند سرویس مختلف رو با استفاده از Nginx و Docker، مستقر کنیم؟
توی این مقاله باهم قراره یه کار جالب بکنیم. فرض کنید دامین abc.com رو دارید. حالا براش قراره یه سرویس API روی Sub Domain عه api.abc.com بیارید بالا و خود abc.com هم وبسایت ما باشه.
ما فرض میکنیم که یک پروژه Backend داریم برای API هامون و یکی هم Front و هر دو Dockerize شدن. اگه Dockerize کردن پروژه رو کار نکردید حتما این مقاله رو مشاهده کنید.
خب اولین کارمون اینه که یه Sub Domain تعریف کنیم توی پنلی که ازش دامین رو خریدیم. من چون توی Cloudflare دامنه هامو تعریف کردم یه عکس میزارم که ببینید چجوری Sub Domain تعریف میکنیم.
همونطور که توی عکس بالا میبینید سه تا رکورد A داریم که هر سه اشاره به IP سرور شما داره. یعنی بعد از تعریف api وقتی شما بزنی api.abc.com تا پشت سرور شما میاد. حالا باید هدایتش کنیم به پروژه Backend مون.
فرض کنید پروژه Backend تون رو با دستور زیر آوردید بالا:
docker run --name Backend -p 5000:5000 -d Backend
قبلا شما به این شکل به سرویس api تون دسترسی داشتید: https://YOUR_SERVER_IP:5000
حالا میخوام یه Image عه داکر بهتون معرفی کنم که کارمون رو خیلی راحت میکنه.
به لطف این Image هدایت کردن دامینهای مختلف به سرویسهای مختلفمون خیلی راحت میشه. اولین کار اینه که خود این Image رو روی یه Container بالا بیاریم با استفاده از دستور زیر:
docker run --name mynginx-proxy -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro -d jwilder/nginx-proxy
فقط حواستون باشه نباید روی پورت ۸۰ سرویسی داشته باشید چون قراره مدیریت درخواستهای پورت ۸۰ سرورمون رو به عهده این Container بزاریم.
بعد از این کار میریم سراغ سرویسهای خودمون. مثالی که بالا زدم برای اجرا کردن سرویس Backend تون به شکل زیر تغییر میکنه:
docker run --name Backend -p 5000:5000 -e VIRTUAL_HOST=api.abc.com -e VIRTUAL_PORT=5000 -d Backend
دو تا Environment ای که موقع Run کردن Container اضافه میکنیم برای اینه که به Container عه mynginx-proxy ای که چند لحظه پیش اجرا کردیم بگیم که اگر درخواستی به دامنه api.abc.com اومد هدایتش کن به این Container
اگه بخوام مثال پروژه Front رو بزنم هم اینجوری میشه:
docker run --name Frontend -e VIRTUAL_HOST=abc.com -d Frontend
اینجا دیگه VIRTUAL_PORT رو ست نمیکنیم چون به صورت پیشفرض پروژه ما روی پورت ۸۰ داره اجرا میشه.
حالا بیای مثال Docker compose رو هم باهم ببینیم که بحث رو تکمیل کرده باشیم.
version: '3'
service:
Backend:
container_name: Backend
image: Backend
ports:
- '5000:5000'
environment:
- VIRTUAL_PORT=5000
- VIRTUAL_HOST=api.abc.com
Frontend:
container_name: Frontend
image: Frontend
environment:
- VIRTUAL_HOST=abc.com
پس اگه چندین دامنه با چندین Sub Domain داشته باشید به راحتی میتونید هر کدوم رو هدایت کنید به سمت Container های خودش.
خیلی خوشحالم که تا انتهای این مقاله منو همراهی کردید. امیدوارم براتون مفید بوده باشه. خیلی خوشحال میشم اگه نظری یا انتقادی داشتید باهام درمیون بزارید. برقرار باشید
مطلبی دیگر از این انتشارات
چرا نباید در لوپ await وجود داشته باشد
مطلبی دیگر از این انتشارات
ترفند های کاربردی زبان برنامه نویسی php
مطلبی دیگر از این انتشارات
مفاهیم پایه برنامه نویسی وب