اجرای جنگو با پستگرس، nginx و gunicorn

امیرحسین بیگدلو 12 ماه قبل

 

 #  معرفی

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

 

در این راهنما، نحوه نصب و پیکربندی برخی از مؤلفه‌ها در اوبونتو برای پشتیبانی و ارائه برنامه‌های جنگو را نشان خواهیم داد. ما یک پایگاه داده PostgreSQL را به جای استفاده از پایگاه داده پیش فرض SQLite راه اندازی خواهیم کرد. ما Gunicorn را برای ارتباط با برنامه هایمان پیکربندی می کنیم. سپس Nginx را برای معکوس کردن پروکسی به Gunicorn راه‌اندازی می‌کنیم و به ما امکان دسترسی به ویژگی‌های امنیتی و عملکرد آن را برای ارائه برنامه‌هایمان می‌دهد.

 

ما جنگو را در یک محیط مجازی نصب خواهیم کرد. نصب جنگو در محیطی خاص، به پروژه های شما و نیازهای آنها اجازه می دهد تا به طور جداگانه کار کنند.

 

هنگامی که پایگاه داده و برنامه خود را راه اندازی کردیم، سرور برنامه Gunicorn را نصب و پیکربندی می کنیم. این به عنوان یک رابط برای برنامه ما عمل می کند و درخواست های مشتری را از HTTP به درخواست‌های پایتون ترجمه می کند که برنامه ما می تواند آنها را پردازش کند. سپس Nginx را در مقابل Gunicorn راه‌اندازی می‌کنیم تا از مکانیسم‌های مدیریت اتصال با کارایی بالا و ویژگی‌های امنیتی آسان آن بهره ببریم.

 

دوره مرتبط: دوره اول آموزش جنگو(django)

 

 #  نصب پکیج‌های مورد نیاز در ubuntu

برای شروع فرآیند، همه موارد مورد نیاز خود را از مخازن اوبونتو دانلود و نصب می کنیم. ما از pip مدیریت بسته پایتون برای نصب اجزای اضافی کمی بعد استفاده خواهیم کرد.

 

ما باید فهرست بسته محلی apt را به روز کنیم و سپس بسته ها را دانلود و نصب کنیم. بسته هایی که ما نصب می کنیم به این بستگی دارد که پروژه شما از کدام نسخه پایتون استفاده می کند.

 

در این مقاله ما جنگو را به همراه پایتون3 استفاده میکنیم:

sudo apt update
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl

 

با این کار pip، فایل‌های پایتون مورد نیاز برای ساخت Gunicorn، سیستم پایگاه داده Postgres و کتابخانه‌های مورد نیاز برای تعامل با آن و وب سرور Nginx نصب می‌شود.

 

دوره مرتبط: دوره آموزش Nginx

 

 #  آماده کردن دیتابیس پستگرس

ما یک پایگاه داده و کاربر پایگاه داده برای برنامه جنگو خود ایجاد می کنیم.

 

به طور پیش فرض، Postgres از یک طرح احراز هویت به نام "تأیید هویت همتا" برای اتصالات محلی استفاده می کند. اساساً، این بدان معنی است که اگر نام کاربری سیستم عامل کاربر با نام کاربری معتبر Postgres مطابقت داشته باشد، آن کاربر می تواند بدون احراز هویت بیشتر وارد شود.

 

در طول نصب Postgres، یک کاربر سیستم عامل به نام postgres ایجاد شد تا با کاربر مدیریت PostgreSQL مطابقت داشته باشد. ما باید از این کاربر برای انجام کارهای اداری استفاده کنیم. می توانیم از sudo و pass در نام کاربری با گزینه -u استفاده کنیم.

 

با تایپ کردن، وارد یک سشن تعاملی Postgres شوید:

sudo -u postgres psql

 

به شما یک اعلان PostgreSQL داده می شود که در آن می توانیم نیازهای خود را تنظیم کنیم.

 

ابتدا یک پایگاه داده برای پروژه خود ایجاد کنید(دقت کنید دستورات پستگرس باید با سمیکالن ; تمام شوند):

postgres=# CREATE DATABASE myproject;

 

بعد، یک کاربر پایگاه داده برای پروژه خود ایجاد کنید. مطمئن شوید که یک رمز عبور امن انتخاب کرده اید:

postgres=# CREATE USER myprojectuser WITH PASSWORD 'password';

 

پس از آن، ما تعدادی از پارامترهای اتصال را برای کاربری که به تازگی ایجاد کرده‌ایم تغییر می‌دهیم. این کار باعث سرعت بخشیدن به عملیات پایگاه داده می شود به طوری که هر بار که یک اتصال برقرار می شود نیازی به جستجو و تنظیم مقادیر صحیح نباشد.

 

ما کدگذاری پیش‌فرض را روی UTF-8 تنظیم می‌کنیم که جنگو انتظار دارد. ما همچنین طرح پیش‌فرض جداسازی تراکنش را روی «خواندن تعهد(read committed)» تنظیم می‌کنیم که خواندن تراکنش‌های غیرمتعهد(uncommitted transactions) را مسدود می‌کند. در نهایت، ما در حال تنظیم منطقه زمانی هستیم. به طور پیش فرض، پروژه های جنگو ما برای استفاده از UTC تنظیم می شوند. اینها همه توصیه هایی از خود پروژه جنگو هستند:

postgres=# ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
postgres=# ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
postgres=# ALTER ROLE myprojectuser SET timezone TO 'UTC';

 

اکنون، می‌توانیم به کاربر جدید خود دسترسی دهیم تا پایگاه داده جدید خود را مدیریت کند:

postgres=# GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

 

وقتی کارتان تمام شد، با تایپ کردن، از دستور PostgreSQL خارج شوید:

postgres=# \q

 

Postgres اکنون راه اندازی شده است تا جنگو بتواند به اطلاعات پایگاه داده خود متصل شده و آن را مدیریت کند.

 

ویدیو مرتبط: ویدیو آموزش محیط های مجازی virtualenv در پایتون

 

 #  ایجاد یک محیط مجازی پایتون

اکنون که پایگاه داده خود را داریم، می‌توانیم آماده سازی بقیه نیازهای پروژه خود را آغاز کنیم. ما نیازمندی های پایتون خود را در یک محیط مجازی برای مدیریت آسان تر نصب خواهیم کرد.

 

برای این کار ابتدا نیاز به دسترسی به دستور virtualenv داریم. ما می توانیم این را با pip نصب کنیم:

sudo -H pip3 install --upgrade pip
sudo -H pip3 install virtualenv

 

با نصب virtualenv، می توانیم پروژه خود را تشکیل دهیم. یک دایرکتوری ایجاد کرده و به آن وارد شوید که در آن بتوانیم فایل های پروژه خود را نگه داریم:

mkdir ~/myprojectdir
cd ~/myprojectdir

 

در فهرست پروژه، یک محیط مجازی پایتون را با تایپ کردن زیر ایجاد کنید:

virtualenv myprojectenv

 

این یک دایرکتوری به نام myprojectenv در پوشه myprojectdir شما ایجاد می کند. در داخل، یک نسخه محلی پایتون و یک نسخه محلی از پیپ را نصب می کند. ما می توانیم از این برای نصب و پیکربندی یک محیط Python ایزوله برای پروژه خود استفاده کنیم.

 

قبل از نصب الزامات پایتون پروژه خود، باید محیط مجازی را فعال کنیم. می توانید این کار را با تایپ کردن انجام دهید:

source myprojectenv/bin/activate

 

اعلان شما باید تغییر کند تا نشان دهد که اکنون در یک محیط مجازی پایتون کار می کنید. چیزی شبیه این خواهد بود:

(myprojectenv)user@host:~/myprojectdir$

 

با فعال بودن محیط مجازی خود، Django، Gunicorn و آداپتور psycopg2 پستگرس را با نمونه محلی pip نصب کنید:

(myprojectenv)$ pip install django gunicorn psycopg2-binary

 

توجه: هنگامی که محیط مجازی فعال می شود، به جای pip3 از pip استفاده کنید، حتی اگر از پایتون 3 استفاده می کنید.

 

اکنون باید تمام نرم افزارهای مورد نیاز برای شروع پروژه جنگو را داشته باشید.

 

ویدیو مرتبط: ویدیو آموزش دیپلوی کردن پروژه جنگو

 

 #  ایجاد و پیکربندی پروژه جدید جنگو

با نصب اجزای پایتون، می‌توانیم فایل‌های واقعی پروژه جنگو را ایجاد کنیم.

 

 +  ساخت پروژه جنگو

از آنجایی که ما از قبل یک دایرکتوری پروژه داریم، به جنگو می‌گوییم که فایل‌ها را اینجا نصب کند. یک دایرکتوری سطح دوم با کد واقعی ایجاد می کند که طبیعی است و یک اسکریپت مدیریتی(manage.py) را در این دایرکتوری قرار می دهد. نکته کلیدی در این است که ما به جای اینکه به جنگو اجازه دهیم در رابطه با دایرکتوری فعلی ما تصمیم گیری کند، دایرکتوری را به صراحت تعریف می کنیم:

(myprojectenv)$ django-admin startproject myproject ~/myprojectdir

 

در این مرحله، دایرکتوری پروژه شما (~/myprojectdir) باید دارای محتوای زیر باشد:

  • ~/myprojectdir/manage.py: یک اسکریپت مدیریت پروژه جنگو.
  • ~/myprojectdir/myproject/: بسته پروژه جنگو که باید حاوی فایل های __init__.py، settings.py، urls.py، asgi.py و wsgi.py باشد.
  • ~/myprojectdir/myprojectenv/: دایرکتوری محیط مجازی که قبلا ایجاد کردیم.

 

 

 +  آماده سازی تنظیمات پروژه

اولین کاری که باید با فایل های پروژه جدید خود انجام دهیم، آماده کردن تنظیمات است. فایل تنظیمات را در ویرایشگر متن خود باز کنید:

(myprojectenv)$ nano ~/myprojectdir/myproject/settings.py

 

با پیدا کردن دستورالعمل ALLOWED_HOSTS شروع کنید. این لیستی از آدرس‌های سرور یا نام‌های دامنه را مشخص می‌کند که ممکن است برای اتصال به نمونه جنگو استفاده شود. هر درخواست دریافتی با هدر Host که در این لیست نیست یک استثنا ایجاد می کند. جنگو نیاز دارد که این را تنظیم کنید تا از یک کلاس آسیب‌پذیری امنیتی جلوگیری کنید.

 

در براکت‌ها، آدرس‌های IP یا نام‌های دامنه مرتبط با سرور جنگو را فهرست کنید. هر مورد باید در نقل قول با ورودی های جدا شده با کاما ذکر شود. اگر می‌خواهید برای کل دامنه و هر زیر دامنه‌ای درخواست کنید، یک نقطه به ابتدای ورودی اضافه کنید. در قطعه زیر، چند نمونه در کامنت برای نشان دادن وجود دارد:

. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . ., 'localhost']

 

توجه: حتماً localhost را به عنوان یکی از گزینه ها قرار دهید زیرا ما از طریق یک نمونه محلی Nginx اتصالات را پروکسی خواهیم کرد.

 

بعد، بخشی را پیدا کنید که دسترسی به پایگاه داده را پیکربندی می کند. با DATABASES شروع خواهد شد. پیکربندی موجود در فایل برای پایگاه داده SQLite است. ما قبلاً یک پایگاه داده PostgreSQL برای پروژه خود ایجاد کرده ایم، بنابراین باید تنظیمات را انجام دهیم.

 

تنظیمات را با اطلاعات پایگاه داده PostgreSQL خود تغییر دهید. ما به جنگو می‌گوییم که از آداپتور psycopg2 که با pip نصب کرده‌ایم استفاده کند. ما باید نام پایگاه داده، نام کاربری پایگاه داده، رمز عبور کاربر پایگاه داده را بدهیم و سپس مشخص کنیم که پایگاه داده در رایانه محلی قرار دارد. می توانید تنظیمات PORT را به عنوان یک رشته خالی رها کنید:

. . .

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

. . .

 

سپس به پایین فایل بروید و تنظیماتی را اضافه کنید که نشان می‌دهد فایل‌های استاتیک باید در کجا قرار گیرند. این امر ضروری است تا Nginx بتواند درخواست های این موارد را انجام دهد. خط زیر به جنگو می گوید که آنها را در دایرکتوری به نام static در دایرکتوری پروژه پایه قرار دهد:

. . .

STATIC_URL = '/static/'
import os
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

 

پس از اتمام کار فایل را ذخیره کرده و ببندید.

 

دوره پیشنهادی: دوره آموزش زبان SQL

 

 +  تکمیل راه اندازی اولیه پروژه

اکنون، می توانیم با استفاده از اسکریپت مدیریت، طرح اولیه پایگاه داده را به پایگاه داده PostgreSQL خود منتقل کنیم:

(myprojectenv)$ ~/myprojectdir/manage.py makemigrations
(myprojectenv)$ ~/myprojectdir/manage.py migrate

 

با تایپ کردن، یک کاربر admin برای پروژه ایجاد کنید:

(myprojectenv)$ ~/myprojectdir/manage.py createsuperuser

 

شما باید یک نام کاربری انتخاب کنید، یک آدرس ایمیل ارائه دهید، و یک رمز عبور را انتخاب و تایید کنید.

 

ما می‌توانیم تمام محتوای ثابت را در محل دایرکتوری که پیکربندی کرده‌ایم با تایپ کردن جمع‌آوری کنیم:

(myprojectenv)$ ~/myprojectdir/manage.py collectstatic

 

شما باید عملیات را تایید کنید. سپس فایل های استاتیک در دایرکتوری به نام static در دایرکتوری پروژه شما قرار می گیرند.

 

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

 

یک استثنا برای پورت 8000 با تایپ کردن زیر ایجاد کنید:

(myprojectenv)$ sudo ufw allow 8000

 

در نهایت، می توانید پروژه خود را با راه اندازی سرور توسعه جنگو با این دستور آزمایش کنید:

(myprojectenv)$ ~/myprojectdir/manage.py runserver 0.0.0.0:8000

 

در مرورگر وب خود، از نام دامنه یا آدرس IP سرور خود و به دنبال آن :8000 دیدن کنید:

http://server_domain_or_IP:8000

 

شما باید صفحه index پیش فرض جنگو را دریافت کنید:

صفحه ایندکس پروژه جنگو

 

اگر /admin را به انتهای URL در نوار آدرس اضافه کنید، نام کاربری و رمز عبور مدیریتی که با دستور createsuperuser ایجاد کرده اید از شما خواسته می شود:

صفحه ادمین پروژه جنگو

 

پس از احراز هویت، می توانید به رابط مدیریت پیش فرض جنگو دسترسی داشته باشید:

صفحه مدیریت پیشفرض جنگو

 

پس از اتمام کاوش، CTRL-C را در پنجره ترمینال بزنید تا سرور توسعه خاموش شود.

 

دوره پیشنهادی: دوره آموزش لینوکس(linux)

 

 +  آزمایش توانایی gunicorn برای ارائه پروژه

آخرین کاری که می خواهیم قبل از خروج از محیط مجازی خود انجام دهیم این است که Gunicorn را آزمایش کنیم تا مطمئن شویم که می تواند برنامه را اجرا کند. ما می توانیم این کار را با وارد کردن دایرکتوری پروژه خود و استفاده از gunicorn برای بارگذاری ماژول WSGI پروژه انجام دهیم:

(myprojectenv)$ cd ~/myprojectdir
(myprojectenv)$ gunicorn --bind 0.0.0.0:8000 myproject.wsgi

 

با این کار، Gunicorn روی همان رابطی که سرور توسعه جنگو روی آن اجرا می شد، راه اندازی می شود. می توانید به عقب برگردید و دوباره برنامه را تست کنید.

 

توجه: صفحه مدیریت جنگو هیچ یک از استایل‌ها را نخواهد داشت، زیرا Gunicorn نمی‌داند چگونه محتوای CSS استاتیک مسئول این امر را پیدا کند.

 

ما یک ماژول Gunicorn را با تعیین مسیر دایرکتوری نسبی به فایل wsgi.py جنگو، که نقطه ورود به برنامه ما است، با استفاده از نحو ماژول پایتون منتقل کردیم. در داخل این فایل تابعی به نام application تعریف شده است که برای ارتباط با اپلیکیشن استفاده می شود.

 

پس از اتمام تست، CTRL-C را در پنجره ترمینال بزنید تا Gunicorn متوقف شود.

 

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

(myprojectenv)$ deactivate

 

نشانگر محیط مجازی در prompt شما حذف خواهد شد.

 

مقاله پیشنهادی: جنگو چیست و چرا برای ساخت وب‌سایت فوق‌العاده است؟

 

 #  ایجاد سوکت systemd و فایل‌های gunicorn

ما آزمایش کرده‌ایم که Gunicorn می‌تواند با برنامه جنگو ما تعامل داشته باشد، اما باید راه قوی‌تری برای راه‌اندازی و توقف سرور برنامه اجرا کنیم. برای انجام این کار، ما فایل‌های سرویس و سوکت سیستم را می‌سازیم.

 

سوکت Gunicorn در هنگام بوت ایجاد می شود و به اتصالات گوش می دهد. هنگامی که یک اتصال رخ می دهد، systemd به طور خودکار فرآیند Gunicorn را برای مدیریت اتصال آغاز می کند.

 

با ایجاد و باز کردن یک فایل سوکت systemd برای Gunicorn با امتیازات sudo شروع کنید:

sudo nano /etc/systemd/system/gunicorn.socket

 

در داخل، ما یک بخش [Unit] برای توصیف سوکت، یک بخش [Socket] برای تعیین محل سوکت، و یک بخش [Install] ایجاد خواهیم کرد تا مطمئن شویم سوکت در زمان مناسب ایجاد شده است:

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

 

پس از اتمام کار فایل را ذخیره کرده و ببندید.

 

در مرحله بعد، یک فایل سرویس systemd برای Gunicorn با امتیازات sudo در ویرایشگر متن خود ایجاد و باز کنید. نام فایل سرویس باید با نام فایل سوکت به استثنای پسوند مطابقت داشته باشد:

sudo nano /etc/systemd/system/gunicorn.service

 

با بخش [Unit] شروع کنید، که برای مشخص کردن ابرداده ها و وابستگی ها استفاده می شود. ما شرحی از خدمات خود را در اینجا قرار می دهیم و به سیستم init می گوییم که این کار را فقط پس از رسیدن به هدف شبکه شروع کند. از آنجایی که سرویس ما به بک سوکت از فایل سوکت متکی است، باید دستورالعمل Requires را برای نشان دادن آن رابطه اضافه کنیم:

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

 

بعد، بخش [Service] را باز می کنیم. کاربر و گروهی را که می‌خواهیم پردازش کنیم را مشخص می‌کنیم. ما مالکیت حساب کاربری معمولی خود را بر این فرآیند اعطا خواهیم کرد زیرا مالک تمام فایل های مربوطه است. ما مالکیت گروه را به گروه www-data می دهیم تا Nginx بتواند به راحتی با Gunicorn ارتباط برقرار کند.

 

سپس دایرکتوری کاری را ترسیم می کنیم و دستوری را که برای شروع سرویس استفاده می شود، مشخص می کنیم. در این مورد، ما باید مسیر کامل فایل اجرایی Gunicorn را که در محیط مجازی ما نصب شده است، مشخص کنیم. ما فرآیند را به سوکت یونیکس که در پوشه /run ایجاد کرده‌ایم متصل می‌کنیم تا فرآیند بتواند با Nginx ارتباط برقرار کند. ما همه داده ها را در خروجی استاندارد ثبت می کنیم تا فرآیند journald بتواند لاگ های Gunicorn را جمع آوری کند. ما همچنین می توانیم هر گونه ترفند اختیاری Gunicorn را در اینجا مشخص کنیم. به عنوان مثال، ما 3 فرآیند کارگر را در این مورد مشخص کردیم:

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myprojectdir
ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          myproject.wsgi:application

 

در نهایت، ما یک بخش [Install] اضافه می کنیم. این به systemd می‌گوید که اگر این سرویس را در هنگام راه‌اندازی فعال کنیم، به چه چیزی پیوند دهد. ما می خواهیم این سرویس زمانی شروع شود که سیستم چند کاربره معمولی راه اندازی شود:

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myprojectdir
ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          myproject.wsgi:application

[Install]
WantedBy=multi-user.target

 

با آن، فایل سرویس systemd ما کامل شد. اکنون آن را ذخیره کرده و ببندید.

 

اکنون می توانیم سوکت Gunicorn را راه اندازی و فعال کنیم. با این کار فایل سوکت در /run/gunicorn.sock هم اکنون و در هنگام بوت ایجاد می شود. هنگامی که یک اتصال به آن سوکت برقرار می شود، systemd به طور خودکار gunicorn.service را برای مدیریت آن راه اندازی می کند:

sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket

 

با بررسی فایل سوکت می توانیم تأیید کنیم که عملیات موفقیت آمیز بوده است.

 

مقاله پیشنهادی: پراکسی سرور چیست؟

 

 #  آزمایش فایل سوکت gunicorn

وضعیت فرآیند را بررسی کنید تا متوجه شوید که آیا قادر به شروع است یا خیر:

sudo systemctl status gunicorn.socket

 

شما باید یک خروجی مانند زیر دریافت کنید:

● gunicorn.socket - gunicorn socket
     Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor prese>
     Active: active (listening) since Fri 2020-06-26 17:53:10 UTC; 14s ago
   Triggers: ● gunicorn.service
     Listen: /run/gunicorn.sock (Stream)
      Tasks: 0 (limit: 1137)
     Memory: 0B
     CGroup: /system.slice/gunicorn.socket

 

در مرحله بعد، وجود فایل gunicorn.sock را در پوشه /run بررسی کنید:

$ file /run/gunicorn.sock

/run/gunicorn.sock: socket

 

اگر دستور systemctl status نشان می‌دهد که خطایی رخ داده است یا اگر فایل gunicorn.sock را در فهرست پیدا نمی‌کنید، نشان‌دهنده آن است که سوکت Gunicorn به درستی ایجاد نشده است. گزارش های سوکت Gunicorn را با تایپ کردن بررسی کنید:

$ sudo journalctl -u gunicorn.socket

 

قبل از ادامه، دوباره به فایل /etc/systemd/system/gunicorn.socket خود نگاهی بیندازید تا مشکلات را برطرف کنید.

 

مقاله پیشنهادی: بازبینی فریمورک جنگو - مزایا و معایب

 

 #  آزمایش فعال بودن سوکت

در حال حاضر، اگر فقط واحد gunicorn.socket را راه اندازی کرده باشید، gunicorn.service هنوز فعال نخواهد بود زیرا سوکت هنوز هیچ اتصالی دریافت نکرده است. می توانید این را با تایپ کردن بررسی کنید:

$ sudo systemctl status gunicorn

● gunicorn.service - gunicorn daemon
   Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

 

برای آزمایش مکانیسم فعال‌سازی سوکت:

$ curl --unix-socket /run/gunicorn.sock localhost

 

شما باید خروجی HTML را از برنامه خود در ترمینال دریافت کنید. این نشان می دهد که Gunicorn راه اندازی شده است و می تواند برنامه جنگو شما را ارائه دهد. با تایپ کردن زیر می توانید تأیید کنید که سرویس Gunicorn در حال اجرا است:

$ sudo systemctl status gunicorn


● gunicorn.service - gunicorn daemon
     Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
     Active: active (running) since Fri 2020-06-26 18:52:21 UTC; 2s ago
TriggeredBy: ● gunicorn.socket
   Main PID: 22914 (gunicorn)
      Tasks: 4 (limit: 1137)
     Memory: 89.1M
     CGroup: /system.slice/gunicorn.service
             ├─22914 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunico>
             ├─22927 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunico>
             ├─22928 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunico>
             └─22929 /home/sammy/myprojectdir/myprojectenv/bin/python /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunico>

Jun 26 18:52:21 django-tutorial systemd[1]: Started gunicorn daemon.
Jun 26 18:52:21 django-tutorial gunicorn[22914]: [2020-06-26 18:52:21 +0000] [22914] [INFO] Starting gunicorn 20.0.4
Jun 26 18:52:21 django-tutorial gunicorn[22914]: [2020-06-26 18:52:21 +0000] [22914] [INFO] Listening at: unix:/run/gunicorn.sock (22914)
Jun 26 18:52:21 django-tutorial gunicorn[22914]: [2020-06-26 18:52:21 +0000] [22914] [INFO] Using worker: sync
Jun 26 18:52:21 django-tutorial gunicorn[22927]: [2020-06-26 18:52:21 +0000] [22927] [INFO] Booting worker with pid: 22927
Jun 26 18:52:21 django-tutorial gunicorn[22928]: [2020-06-26 18:52:21 +0000] [22928] [INFO] Booting worker with pid: 22928
Jun 26 18:52:21 django-tutorial gunicorn[22929]: [2020-06-26 18:52:21 +0000] [22929] [INFO] Booting worker with pid: 22929

 

اگر خروجی از curl یا خروجی وضعیت systemctl نشان می‌دهد که مشکلی رخ داده است، گزارش‌ها را برای جزئیات بیشتر بررسی کنید:

$ sudo journalctl -u gunicorn

 

 

فایل /etc/systemd/system/gunicorn.service خود را برای مشکل بررسی کنید. اگر در فایل /etc/systemd/system/gunicorn.service تغییراتی ایجاد کردید، daemon را دوباره بارگیری کنید تا تعریف سرویس را دوباره بخوانید و با تایپ کردن، فرآیند Gunicorn را مجدداً راه اندازی کنید:

sudo systemctl daemon-reload
sudo systemctl restart gunicorn

 

قبل از ادامه، مطمئن شوید که مشکلات فوق را عیب یابی کرده اید.

 

مقاله پیشنهادی: متداول‌ترین ساختارهای داده در پایتون

 

 #  کانفیگ nginx به عنوان پروکسی به gunicorn

اکنون که Gunicorn راه اندازی شده است، باید Nginx را پیکربندی کنیم تا ترافیک را به فرآیند منتقل کند.

 

با ایجاد و باز کردن یک بلوک سرور جدید در فهرست سایت های موجود Nginx شروع کنید:

sudo nano /etc/nginx/sites-available/myproject

 

در داخل، یک بلوک سرور جدید باز کنید. ما با مشخص کردن اینکه این بلوک باید به درگاه معمولی 80 گوش دهد و به نام دامنه یا آدرس IP سرور ما پاسخ دهد، شروع می کنیم:

server {
    listen 80;
    server_name server_domain_or_IP;
}

 

در مرحله بعد، به Nginx می‌گوییم که از هر مشکلی در یافتن favicon چشم پوشی کند. همچنین به آن می گوییم که دارایی های static را که در فهرست ~/myprojectdir/static خود جمع آوری کرده ایم، کجا پیدا کند. همه این فایل‌ها دارای پیشوند استاندارد URI «/static» هستند، بنابراین می‌توانیم یک بلوک مکان برای مطابقت با این درخواست‌ها ایجاد کنیم:

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/sammy/myprojectdir;
    }
}

 

در نهایت، یک بلوک location برای مطابقت با سایر درخواست‌ها ایجاد می‌کنیم. در داخل این location، فایل استاندارد proxy_params همراه با نصب Nginx را اضافه می کنیم و سپس ترافیک را مستقیماً به سوکت Gunicorn منتقل می کنیم:

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/sammy/myprojectdir;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

 

پس از اتمام کار فایل را ذخیره کرده و ببندید. اکنون، می‌توانیم فایل را با پیوند دادن آن به فهرست sites-enabled فعال کنیم:

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

 

پیکربندی Nginx خود را برای خطاهای نحوی آزمایش کنید:

sudo nginx -t

 

اگر خطایی گزارش نشد، ادامه دهید و Nginx را مجدد راه اندازی کنید:

sudo systemctl restart nginx

 

در نهایت، ما باید فایروال خود را روی ترافیک عادی در پورت 80 باز کنیم. از آنجایی که دیگر نیازی به دسترسی به سرور توسعه نداریم، می‌توانیم قانون باز کردن پورت 8000 را نیز حذف کنیم:

sudo ufw delete allow 8000
sudo ufw allow 'Nginx Full'

 

اکنون باید بتوانید برای مشاهده برنامه خود به دامنه یا آدرس IP سرور خود بروید.

 

 

 #  نتیجه گیری

در این راهنما، ما یک پروژه جنگو را در محیط مجازی خودش راه اندازی کرده ایم. ما Gunicorn را برای ترجمه درخواست های مشتری پیکربندی کرده ایم تا جنگو بتواند آنها را مدیریت کند. پس از آن، ما Nginx را راه اندازی کردیم تا به عنوان یک پروکسی معکوس برای مدیریت اتصالات مشتری عمل کند و بسته به درخواست مشتری پروژه صحیح را ارائه دهد.

 

جنگو با ارائه بسیاری از قطعات رایج، ایجاد پروژه ها و برنامه ها را ساده می کند و به شما امکان می دهد بر روی عناصر منحصر به فرد تمرکز کنید. با استفاده از زنجیره ابزار کلی که در این مقاله توضیح داده شده است، می توانید به راحتی برنامه هایی را که از یک سرور ایجاد می کنید، ارائه دهید.

مطالب مشابه



مونگارد