سلام به همه کاربران محترم جنگولرن، در قسمت قبل پیشنیازها را آماده کردیم. در این قسمت آموزش را تا استقرار کامل پروژه جنگو روی وب سرور nginx ادامه می دهیم. امیدوارم این آموزش برای شما مفید باشد، کیفیت ویدئو قابل انتخاب است. همچنین توضیحات متنی آموزش استقرار جنگو در nginx – قسمت دوم پایین تر از فیلم قابل مشاهده است.
توضیحات متنی آموزش استقرار جنگو در nginx – قسمت دوم
ابتدا یک پروژه جنگو با دستور django-admin startproject myproject ایجاد می کنیم. myproject نام دلخواه است. دقت کنید که برای deploy باید پروژه واقعی را به سرور منتقل کنیم، اینجا ما یک پروژه تستی ایجاد کرده ایم.
اولین کاری که برای استقرار پروژه جنگو باید انجام دهیم، اضافه کردن IP سرور به لیست ALLOWED_HOSTS در فایل settings.py پروژه است. (هنگام استفاده از دامنه، باید نام دامنه به این لیست اضافه شود)
در همین فایل settings.py و در بخش DATABASES مقادیر مربوط به دیتابیس postgres را وارد می کنیم. بدین منظور مقدار ENGINE را برابر django.db.backends.postgresql_psycopg2 و مقدار NAME را برابر نام دیتابیس (djangodb) و مقدار USER را برابر djangouser ، مقدار PASSWORD را برابر با پسوردی که انتخاب کردیم و HOST را برابر localhost قرار می دهیم. مقدار PORT چون به صورت پیشفرض برابر 5432 می توانیم خالی قرار دهیم.
بعد از اعمال تنظیمات، migrate را با دستور python manage.py migrate و در صورتی که با موفقیت انجام شود، ارتباط با postgres برقرار است. سپس می توانیم با دستور createsuperuser کاربر ادمین هم ایجاد کنیم.
برای فایل های استاتیک نیز تنظیم STATIC_ROOT را با مقدار os.path.join(BASE_DIR, ‘static/’) برابر می کنیم و با استفاده از دستور collectstatic فایل های استاتیک را در مسیر تعیین شده خودمان منتقل می کنیم.
در مرحله بعد پورت 8000 را روی فایروال سرور باز می کنیم با استفاده از دستور sudo ufw allow 8000 . با این کار خارج از سرور به پورت 8000 دسترسی داریم. برای تست با دستور python manage.py runserner 0.0.0.0:8000 پروژه را موقتا با WSGI جنگو اجرا می کنیم و بیرون از سرور آدرس را با آی پی سرور و پورت 8000 چک می کنیم و سایت باید مشاهده شود.
در محیط واقعی (production) نباید از wsgi جنگو و دستور runserver برای اجرای پروژه استفاده کنیم. ما قصد داریم که این وظیفه را به gunicorn محول کنیم. پس ابتدا gunicorn را تست می کنیم (به جای استفاده از runserver) لذا دستور gunicorn –bind 0.0.0.0:8000 myproject.wsgi را اجرا می کنیم و پروژه باید باز هم خارج از سرور اجرا شود.
در قدم بعدی باید gunicorn را به صورتی تنظیم کنیم که بعد از restart شدن سرور اجرا شود و پروژه ما را اجرا کند، پس ابتدا یه فایل socket برای گونیکورن می سازیم، با دستور sudo nano /etc/systemd/system/gunicorn.socket فایل جدید ایجاد می کنیم و محتویات فایل را به صورت زیر وارد می کنیم:
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
در مرحله بعدی فایل سرویس را با دستور sudo nano /etc/systemd/system/gunicorn.service ایجاد کرده و محتویات را به صورت زیر وارد می کنیم:
[Unit]
Description=gunicorn deamon
Requires=gunicorn.sokcet
After=network.target
[Service]
User=deploy
Group=www-data
WorkingDirectory=/home/deploy/myprojectdir/myproject
ExecStart=/home/deploy/myprojectdir/myprojectenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
myproject.wsgi:application
[Install]
WantedBy=multi-user.target
فایل را ذخیره و خارج می کنیم. سپس gunicorn را با استفاده از دستور sudo systemctl start gunicorn.socket اجرا و با دستور sudo systemctl enable gunicorn.socket گونیکورن را فعال می کنیم. و با استفاده از دستور curl –unix-socket /run/gunicorn.sock locahost یک رکوئست برای گونیکورن ارسال می کنیم که فعال شود.
مرحله بعدی اینه که nginx رو طوری کانفیگ کنیم که به عنوان یک Reverse Proxy کار کند. پس دستور sudo nano /etc/nginx/sites-available/myproject را اجرا می کنیم و محتویات فایل را به صورت زیر تکمیل می کنیم:
server {
listen 80;
server_name 192.168.1.3;
location = /favicon.ico {access_log off; log_not_found off;}
location /static/ {
root /home/deploy/myprojectdir/myproject;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
در ادامه جهت افزودن سایت (در اینجا myproject) به سایت های فعال nginx از دستور sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled استفاده می کنیم. برای تست کردن کانفیگ از دستور sudo nginx -t استفاده می کنیم و اگر خطا ندهد، تنظیمات ما صحیح است. سپس با دستور sudo systemctl restart nginx انجینیکس را restart می کنیم.
در ادامه چون به پورت 8000 نیازی نداریم و قصد داریم از پورت 80 استفاده کنیم، پورت 8000 را با دستور sudo ufw delete allow 8000 از پورت های باز فایروال حذف می کنیم. سپس در فایروال با دستور sudo ufw allow ‘Nginx Full’ به nginx دسترسی می دهیم. و در نهایت در فایل settings.py حالت دیباگ را غیرفعال می کنیم و سایت قابل استفاده خواهد بود.
امیدوارم از این آموزش نهایت استفاده را برده باشید. البته روش های آسان تری برای استقرار پروژه ها وجود دارد، که در حال حاضر یکی از بهترین ابزارها Docker است. ان شاالله در آینده آموزش استقرار جنگو با Docker هم آماده خواهیم کرد. لطفا نظرات خودتان را از فرم زیر ثبت کنید.