مهران رهباردار
مهران رهباردار
خواندن ۴ دقیقه·۶ سال پیش

استفرار پروژه نوشته شده با جنگو با استفاده از PM2

مقدمه

استقرار پروژه نوشته شده با جنگو برای توسعه دهنده‌ها به نظر کار سختی می‌یاد چندین روش برای این کار وجود داره اما ما در بینالودوب معمولا از ابزارهای gunicorn و nginx روی لینوکس استفاده می‌کردیم رفرنسی هم که برای دستورالعمل ها استفاده میکردیم مقاله‌ای بود از سایت دیجیتال اوشن بود. مقاله رو نگاه کنید در ظاهر کار ساده‌ای به نظر می‌رسه ولی وقتی پای systemd میاد وسط و نوشتن فایل‌های تنظیمات برای سرویس gunicorn همیشه خطاهای مختلفی رخ میده و نوشتن تنظیمات زمانبر میشد.

از طرفی سابقه استقرار برنامه های node.js ی رو هم داشتیم و از ابزار pm2 استفاده کردیم که همیشه راحتی کار باهاش برامون ملموس بود. برای یکی از پروژه های اخیر تصمیم گرفتیم pm2 رو جایگزین gunicorn کنیم ببینیم چی میشه که از تصمیمون راضی بودیم و در ادامه نحوه استفاده از pm2 رو با شما به اشتراک میزاریم

شروع استقرار

مرحله اول تفاوتی با روش قبل نداره ابتدا باید ابزارهای مورد نیاز برای اجرای خود جنگو رو نصب کنیم ما چون از دبیان و اوبونتو برای سرور استفاده میکنیم دستورهایی که در ادامه اومدن مربوط به توزیع‌های برپایه دبیان هستند.

نصب پایتون با دستور زیر

sudo apt-get install python3-pip python3-dev

بعد هم نصب پکیج ایجاد محیط مجازی برای پایتون:

sudo pip3 install virtualenv

یک دایرکتوری برای پروژه با دستور زیر ایجاد کردیم:

mkdir ~/myproject cd ~/myproject

خوب طبیعتا محیط مجازی رو هم با دستور زیر ساختیم

virtualenv venv

بعد محیط رو اعمال کردیم:

source venv/bin/activate

بعد به مسیر پروژه رفتیم و پکیج های مورد نیاز پایتونی که توی فایل requirements.txt قرار داده بودیم با دستور زیر نصب کردیم:

pip install -r requirements.txt

خوب همونطور که می دونین جنگو یه سرور تو خودش داره که با دستور زیر اجرا میشه:

Python manage.py runserver

ما از این سرور کمک میگیریم و اون رو با pm2 اجرا میکنیم

مرحله دوم نصب pm2 هستش، به طور خلاصه pm2 یک ابزار مدیریت فرآیند در محیط production هستش که با node.js نوشته شده ولی محدود به اجرای فرآیندهای node.js ی نیستش اگه میخایین در موردش بیشتر بدونین سری به وبسایتش بزنین: http://pm2.keymetrics.io

Pm2 از طریق ابزار مدیریت پکیج های node.js یعنی npm نصب میشه خوب پس اول باید node.js و npm رو نصب کنیم که این کار از طریق دستورات زیر انجام شد:

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs

خب هنگام نصب node.js ابزار npm همراهش نصب میشه و با دستور زیر میتونیم pm2 رو نصب کنیم

npm i -g pm2

برای اجرای برنامه های node.js ی خیلی راحت با دستور pm2 start index.js میشه انجام داد ولی حال اینجا ما میخاییم pm2 دستور python manage.py runserver رو اجرا کنه تا پروژه جنگویی ما اجرا بشه

نوشتن این دستور مستقیم تو خط فرمان نیاز به دقت داره چون که pm2 start بعدش فقط اسم فایل رو میگیره که ما ازین روش صرف نظر کردیم و در قالب json ی که pm2 میفهمه یک فایل ایجاد کردیم که اون رو به عنوان ورودی به دستور pm2 start بدیم محتوی این فایل json که با اسم pm2django.json ایجاد شد در باکس پایین اومده:

{ "apps": [
{
"name": "myproject",
"cwd": "/home/binl/myproject/src",
"args": "runserver",
"script": "manage.py",
"exec_mode": "fork",
"exec_interpreter": "python"
}]}

خب بعد هم با دستور pm2 start pm2django.json پروژه رو اجرا کردیم چون تنظیم بود که پروژه روی پورت 8000 به درخواست ها گوش بده با دستور curl http://localhost:8000 تست کردیم که این پروژه درست اجرا شده باشه

مرحله سوم نصب nginx بود که به عنوان reverse proxy برای ما عمل میکرد و درخواست ها رو به سرور جنگویی ما پروکسی میکرد.

برای نصب nginx از دستور زیر استفاده شد.

sudo apt install nginx

بعد هم تنظمیات سایت به عنوان مثال به آدرس myproject.ir که با ادیت فایل /etc/nginx/sites-available/myproject.ir در قالب زیر انجام شد:

server {
listen 80;
server_name myproject.ir;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/binl/myproject;
}
location / {
include proxy_params;
proxy_pass http://localhost:8000;
}
}

بعد هم با دستور زیر یک لینک سمبولیک از فایل تنظمات در مسیر sites-enabled ساختیم که وبسایتمون فعال بشه:

sudo ln -s /etc/nginx/sites-available/myproject.ir /etc/nginx/sites-enabled

خب صحت تنظیمات nginx رو هم میشه با دستور sudo nginx -t بررسی کرد که برای ما خروجی زیر رو داشت یعنی تنظیماتمون درست بوده:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

خوب بعد با دستور

sudo systemctl restart nginx

سرور nginx رو باید ریستارت میکردیم تا تنظیمات اعمال بشه

سرور آماده است و پروژه جنگویی ما روی اون استقرار پیدا کرده

فقط چندتا نکته:

اول اینکه برای بالا اومدن دوباره سرور جنگویی بعد از ریستارت سیستم عامل با pm2 باید با دستور زیر تظنیمات system مورد نیاز این کار رو درست کنین وگرنه که بعد ریستارت مجبورید دستورات pm2 رو به صورت دستی وارد کنید.

pm2 startup

که البته در خروجی این دستور یک دستور دیگه پرینت میشه که اون رو باید کپی و اجرا کنید.

نکته دوم اینکه جنگو تو مستنداتش گفته که این سرور داخلی که همراهش عرضه شده به تنهایی کافی نیست و باید از یک وبسرور دیگه استفاده کنیم اما برای کار ما کم نیاورد و مشکلی نداشتیم تا الان اگر شما با اعمال این تنظیمات در عملیات مشکلی براتون پیش اومد خوشحال میشیم ما رو هم در جریان بزارید.

نکته سوم

حتما یه نگاهی به سایت pm2 بندازین و نحوه ریستارت کردن پروژه و دیدن لاگ‌های پروژه رو دستوراتش رو مطالعه کنین

pythonnginxpm2djangodeployment
یک عدد دوآپس ساده
شاید از این پست‌ها خوشتان بیاید