<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مهران رهباردار</title>
        <link>https://virgool.io/feed/@binldevups</link>
        <description>یک عدد دوآپس ساده</description>
        <language>fa</language>
        <pubDate>2026-06-10 15:09:53</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/24129/avatar/XCftnG.png?height=120&amp;width=120</url>
            <title>مهران رهباردار</title>
            <link>https://virgool.io/@binldevups</link>
        </image>

                    <item>
                <title>استفرار پروژه نوشته شده با جنگو با استفاده از PM2</title>
                <link>https://virgool.io/@binldevups/%D8%A7%D8%B3%D8%AA%D9%81%D8%B1%D8%A7%D8%B1-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%86%D9%88%D8%B4%D8%AA%D9%87-%D8%B4%D8%AF%D9%87-%D8%A8%D8%A7-%D8%AC%D9%86%DA%AF%D9%88-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-pm2-acpua7mvng8j</link>
                <description> مقدمه استقرار پروژه نوشته شده با جنگو برای توسعه دهنده‌ها به نظر کار سختی می‌یاد چندین روش برای این کار وجود داره اما ما در بینالودوب معمولا از ابزارهای 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.ioPm2 از طریق ابزار مدیریت پکیج های 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 ایجاد شد در باکس پایین اومده:{
&quot;apps&quot;: [{&quot;name&quot;: &quot;myproject&quot;,&quot;cwd&quot;: &quot;/home/binl/myproject/src&quot;,&quot;args&quot;: &quot;runserver&quot;,&quot;script&quot;: &quot;manage.py&quot;,&quot;exec_mode&quot;: &quot;fork&quot;,&quot;exec_interpreter&quot;: &quot;python&quot;}]}خب بعد هم با دستور 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 oknginx: configuration file /etc/nginx/nginx.conf test is successfulخوب بعد با دستور sudo systemctl restart nginxسرور nginx رو باید ریستارت میکردیم تا تنظیمات اعمال بشهسرور آماده است و پروژه جنگویی ما روی اون استقرار پیدا کردهفقط چندتا نکته:اول اینکه برای بالا اومدن دوباره سرور جنگویی بعد از ریستارت سیستم عامل با pm2  باید با دستور زیر تظنیمات system مورد نیاز این کار رو درست کنین وگرنه که بعد ریستارت مجبورید دستورات pm2  رو به صورت دستی وارد کنید. pm2 startupکه البته در خروجی این دستور یک دستور دیگه پرینت میشه که اون رو باید کپی و اجرا کنید.نکته دوم اینکه جنگو تو مستنداتش گفته که این سرور داخلی که همراهش عرضه شده به تنهایی کافی نیست و باید از یک وبسرور دیگه استفاده کنیم اما برای کار ما کم نیاورد و مشکلی نداشتیم تا الان اگر شما با اعمال این تنظیمات در عملیات مشکلی براتون پیش اومد خوشحال میشیم ما رو هم در جریان بزارید.نکته سومحتما یه نگاهی به سایت pm2 بندازین و نحوه ریستارت کردن پروژه و دیدن لاگ‌های پروژه رو دستوراتش رو مطالعه کنین</description>
                <category>مهران رهباردار</category>
                <author>مهران رهباردار</author>
                <pubDate>Fri, 31 May 2019 16:58:32 +0430</pubDate>
            </item>
            </channel>
</rss>