تكوين دبيان و Nginx و Gunicorn لمشروع Django



يوم جيد للجميع.

كانت هناك مهمة رفع خادم دبيان على Nginx لمشاريع Django 3.x. كسر مجموعة من المعلومات على الإنترنت ، تمكنت من القيام بذلك عن طريق الجمع بين التوصيات من عدة مواقع مختلفة. إذا كنت مهتمًا بقراءة كيفية إعداد خادمك الأول لمشروع Django ، فمرحباً بك.

سأخبرك قليلاً عن نفسك حتى تفهم من أنا. أنا لست مطورًا ، لست مبرمجًا ، لست مسؤولًا عن النظام ، أو حتى لدي تعليم تكنولوجيا المعلومات. أنا مدرس علوم كمبيوتر. ولكن في العمل ، يجب أن أشرح للطلاب بعض النقاط البعيدة جدًا عن الدورة الدراسية في علوم الكمبيوتر ، وأحدها هو تطوير المشاريع في Django.

الإعدادات الأساسية


بادئ ذي بدء ، لدينا بالفعل خادم مثبت عليه دبيان 10 ، لن تكون هناك مشاكل في تثبيت دبيان. كان لدي تثبيت نظيف ، بدون أي إعدادات إضافية ، لذلك ذهبت إلى الخادم الخاص بي عبر الجذر وبدأت في تثبيت بعض المكونات الرئيسية بالنسبة لي.

apt-get update
apt-get install -y sudo htop git curl wget unzip zip gcc build-essential make
apt-get install -y tree redis-server nginx  libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python3-dev python-pil ython3-pil 
apt-get install -y python3-lxml libxslt-dev python-libxml2 python-libxslt1 python-dev gnumeric libpq-dev libxml2-dev libxslt1-dev libjpeg-dev libfreetype6-dev libcurl4-openssl-dev supervisor libgdbm-dev libnss3-dev ufw

يمكنك وضع كل هذا في تثبيت واحد ، لكني حصلت على خطأ ، وبهذا الترتيب سار كل شيء على ما يرام.

بعد ذلك ، أنشئ مستخدمًا جديدًا وأضفه إلى مجموعة sudo حتى يتمكن من بدء العمليات نيابة عن المستخدم الخارق.

adduser username 
usermod -aG sudo username

حيث username هو اسم المستخدم الذي ستستخدمه في المستقبل.
قم بتثبيت أحدث إصدار من Python من المصدر. في وقت كتابة هذا التقرير كان 3.8.2 .

cd /home/username
curl -O https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz
tar -xf Python-3.8.2.tar.xz
cd Python-3.8.2

شرح الإجراءات
cd — , change directory;
curl — URL. ;
tar — .

بعد تنزيل أحدث إصدار من Python والانتقال إلى دليل المصدر ، نقوم بتشغيل:

./configure --enable-optimizations
make -j 2

سيسمح لنا هذا بإعداد كل ما هو ضروري لتثبيت Python. هنا ، الرقم 2 ، هذا هو عدد نوى المعالج. يمكنك معرفة ذلك باستخدام الأمر nproc .
نبدأ التثبيت.
make altinstall

يمكنك التحقق من تثبيت Python باستخدام الأمر:

python3.8 -V

ستخرج نسخة من Python .
بعد ذلك ، نقوم بتحديث النقاط وتثبيت الحزم الأكثر استخدامًا لـ Python .
python3.8 -m pip install -U pip
python3.8 -m pip install -U setuptools
python3.8 -m pip install pillow
python3.8 -m pip install virtualenv

إعداد جانغو


نعيد تشغيل النظام ونذهب تحت المستخدم الذي أنشأته. دعنا نذهب إلى دليل / var / www ونقوم بتنزيل مشروعنا فيه ، والذي يتم تحميله إلى GitHub .

cd /var/www
sudo git clone LINK_TO_PROJECT

قم بتكوين حقوق التشغيل العادي مع الدليل / var / www
sudo chown -R www-data:www-data /var/www
sudo usermod -aG www-data username
sudo chmod go-rwx /var/www
sudo chmod go+x /var/www
sudo chgrp -R www-data /var/www
sudo chmod -R go-rwx /var/www
sudo chmod -R g+rwx /var/www

قد يبدو أننا نقوم بإجراءات معينة ثم نلغيها ، ولكن الفكرة هي أننا أولاً نزيل جميع الأذونات لكل شخص ، ثم نعينها إلى مستخدم أو مجموعة معينة.

نذهب إلى مشروعنا ، وخلق بيئة افتراضية وتشغيلها:

cd djangoprojectname/
virtualenv env
source ./env/bin/activate

إذا تم تنشيط كل شيء ، فسيكون هناك سطر من النموذج: (env) username @ server.

سنقوم بتسليم / تحديث الحزم الرئيسية التي نحتاجها لمشروعنا.

pip install -U pip
pip install -U setuptools
pip install -U pillow

وضعنا Django و Gunicorn ومحول PostgreSQL.

pip install django gunicorn psycopg2-binary

يمكنك أيضًا وضع الحزم اللازمة لمشروعك ، أستخدم ملخص للنص:

pip install django-summernote

قمنا بإعداد جدار حماية ، لذلك نحتاج إلى إنشاء استثناء له على المنفذ 8000 (نستخدمه افتراضيًا ، إذا كنا نخطط لاستخدام آخر ، ثم حدده):

sudo ufw allow 8000

الخطوة المطلوبة هي التحقق من صحة الخادم:

python3.8 manage.py runserver 0.0.0.0:8000

وانتقل إلى موقع الويب الخاص بك ، DOMAIN_NAME: 8000 ، للتأكد من عمل كل شيء! ولكن ، في الوقت الحالي ، لم نقم بتكوين الكثير بعد ، فهذه مجرد إعدادات أساسية ، نحتاج إلى تكوين التشغيل العادي للخادم ، وربط الإحصائيات ، وما إلى ذلك.
إذا لم يبدأ موقعك ، فأنت بحاجة إلى الخوض في الإعدادات (ربما حقوق الوصول) ومعرفة الحزمة التي لم يتم تثبيتها ، كل شيء فردي للغاية.

لإكمال عن طريق الضغط على مفاتيح: وCTRL + C ل .

ثم ننتقل فقط إذا بدأ مشروعك ، أوصي بشدة بعدم الانتقال إذا لم ينجح شيء ما. من الأفضل إصلاح المشكلة في المرحلة الأولية بدلاً من تمزيق الخادم إلى الجذر (لقد هدمت 3 مرات ، ثم بدأت في كتابة هذه التعليمات ، وإصلاح كل إجراء).

التحقق من عمل Gunicorn:

gunicorn --bind 0.0.0.0:8000 MAINAPPNAME.wsgi

MAINAPPNAME هو اسم التطبيق الرئيسي الذي يحتوي على settings.py .

إذا كان الخادم يعمل ، فانتقل.

لإكمال عن طريق الضغط على مفاتيح: وC TRL + C ل .

ضبط settings.py


عند النشر إلى خادم إنتاج ، تحتاج إلى تعطيل التصحيح من المشروع وتغيير العديد من الإعدادات ، لقد فعلت ذلك على النحو التالي في settings.py لمشروعي.

DEBUG = False
if DEBUG:
    ALLOWED_HOSTS = ['*']
else:
    ALLOWED_HOSTS = ['HOST IP', 'DOMAIN NAIM', 'localhost']
...
STATIC_URL = '/static/'
if DEBUG:
    STATIC_DIR = os.path.join(BASE_DIR, 'static')
    STATICFILES_DIRS = [
        STATIC_DIR,
        '/var/www/static/',
    ]
else:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
    STATICFILES_FINDERS = (
        'django.contrib.staticfiles.finders.FileSystemFinder',
        'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    )
MEDIA_URL = '/media/'

في urls.py ، قمت بتغيير إعدادات الإحصائيات والوسائط.

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

لا أدري مدى دقة هذا القرار ، وربما تكون هناك تغييرات أكثر صحة لهذه الملفات. ولكن في هذه الحالة يكفي بالنسبة لي تغيير قيمة DEBUG من أجل التبديل بين التطوير والنشر.

قم بتشغيل الأمر:

python3.8 manage.py collectstatic

لجمع الإحصائيات وإلغاء تنشيط البيئة الافتراضية:

deactivate

تكوين Gunicorn


دعونا نفتح للتخصيص

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

لنكتب بعض الإعدادات في الملف:

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

أنشأنا قسم [الوحدة] لوصف المقبس ، في قسم [المقبس] حددنا موقع المقبس وفي قسم [التثبيت] نحتاج إلى تثبيت المقبس في الوقت المناسب.

افتح ملف الأداة المساعدة systemd لتكوين الخدمة:

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

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

[Service]
User=username
Group=www-data
WorkingDirectory=/var/www/djangoprojectname
ExecStart=/var/www/djangoprojectname/env/bin/gunicorn \
          --access-logfile - \
          --workers 5 \
          --bind unix:/run/gunicorn.sock \
          myproject.wsgi:application

[Install]
WantedBy=multi-user.target

لا تنسى أن تشير إلى المستخدم واسم المشروع والبيئة الافتراضية الخاصة بك.

كما هو موضح لي ، يتم حساب العمال على أساس عدد نوى المعالج * 2 + 1 .
الآن نطلق وننشط مقبس Gunicorn.

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

وتأكد من اختبار أن كل شيء يعمل!

sudo systemctl status gunicorn.socket

يجب أن تعرض معلومات حول الخدمة قيد التشغيل.

اضغط على مفتاح Q للخروج (مطلوب في تخطيط اللغة الإنجليزية).

file /run/gunicorn.sock

يجب أن يعرض الأمر الأخير رسالة حول الملف.

إذا فشل الأمر sudo systemctl status gunicorn.socket الأول ، أو إذا أبلغ الأمر file /run/gunicorn.sock الثاني أن الملف gunicorn.sock غير موجود في الدليل ، فلا يمكن إنشاء مقبس Gunicorn. تحتاج إلى التحقق من سجلات مقبس Gunicorn باستخدام الأمر التالي:

sudo journalctl -u gunicorn.socket

انظر ما هو الخطأ وإصلاحه.

دعنا ننتقل إلى اختبار تنشيط مأخذ التوصيل.

sudo systemctl status gunicorn

على الأرجح سيكون لديك سجل:

Active: inactive (dead)

كل شيء يسير على ما يرام حتى الآن.

إنشاء اتصال بالمقبس من خلال تجعيد الشعر.

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


قد يلقي خطأ طلب غير صالح (400).

حاول بدلاً من localhost لتحديد IP الخاص بخادمك ، إذا كان كل شيء على ما يرام ، فمن المحتمل أن يكون ذلك بسبب إعدادات nginx التي لم نقم بها بعد. فقط تحرك.

ومرة أخرى ، طلب إخراج الحالة:

sudo systemctl status gunicorn

Active: active (running)

إذا كان السجل هو + لا يزال هناك الكثير من المعلومات ، ولكن ليس حول الأخطاء ، فإن كل شيء على ما يرام.

خلاف ذلك ، فإننا ننظر إلى الأخطاء في السجل

sudo journalctl -u gunicorn

واستأنف عمليات البنادق

sudo systemctl daemon-reload
sudo systemctl restart gunicorn

إعداد NGINX


سننشئ كتلة خادم جديدة لموقعنا ونقوم بتكوينها بحيث يتعرف الخادم ، عند الوصول إلى موقعنا في شريط العناوين ، على ما يمكن الحصول عليه منه ومن أين.

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

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        alias /var/www/djangoprojectname/static/;
    }

    location /media/ {
        alias /var/www/djangoprojectname/media/;
    }

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

في قسم اسم المقطع ، يمكنك تحديد عناوين متعددة مفصولة بمسافات.

اختبار الأخطاء اللغوية:

sudo nginx -t

إذا لم تكن هناك أخطاء ، فقم بإعادة تشغيل الخادم ومنح جدار الحماية الحقوق اللازمة:

sudo systemctl restart nginx
sudo ufw allow 'Nginx Full'

يمكنك أيضًا إزالة الوصول إلى المنفذ 8000

sudo ufw delete allow 8000

في هذه المرحلة ، يجب أن يعمل كل شيء ، لكنه لم يعمل بشكل جيد بالنسبة لي حتى قمت بتكوين https. لسوء الحظ ، لا يمكنني أن أشرح ما يرتبط به ، ولكن لم يتم تحميل الإحصائيات ، على الرغم من تحميل ملفات الوسائط بشكل طبيعي.

إعداد HTTPS


سنستخدم Cerbot لتكوين

sudo apt-get install certbot python-certbot-nginx
sudo certbot –nginx

واتبع التعليمات التي تظهر على الشاشة. إذا كانت هناك أخطاء ، فقم بإزالتها وإعادة المحاولة. على سبيل المثال ، قد يحدث خطأ إذا حددت اسم مجال غير مرتبط بهذا الخادم.
لتجديد الشهادة تلقائيًا ، أدخل الأمر.

sudo certbot renew --dry-run 

الآن نقوم باختبار الموقع ويجب أن يعمل كل شيء!

إذا لم تظهر الإحصائيات حتى الآن ، فحاول فتح ملف css يشير إلى العنوان الكامل قبله ، إذا تلقيت خطأ 403 ، فكل شيء على ما يرام ، ولكن يجب تجربة مشكلة حقوق الوصول معهم ، حاول إعادة تعيين جميع إعدادات الحقوق لـ www-data إلى دليل / فار / www . إذا كان الخطأ 404 ، فأنت بحاجة إلى النظر إلى إعدادات الموقع في إعدادات NGINX .

إعداد PostgreSQL


قم بإعداد PostgreSQL واستيراد البيانات من SQLite. إذا لم تكن بحاجة إليها ، فتخط هذه الخطوة ، أو خذ إعدادات PostgreSQL فقط.

إنشاء قاعدة بيانات ومستخدم.

sudo -u postgres psql

CREATE DATABASE dbforproject;
CREATE USER projectdbuser WITH PASSWORD 'password';

سنتبع التوصيات الخاصة بمشروع Django.

قمنا بتعيين الترميز الافتراضي إلى UTF-8 ، وقمنا بتعيين نظام عزل المعاملات الافتراضي على "قراءة الالتزام" ، لحظر القراءة من المعاملات غير المؤكدة. قم بتعيين المنطقة الزمنية إلى GMT (UTC).

ALTER ROLE projectdbuser SET client_encoding TO 'utf8';
ALTER ROLE projectdbuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE projectdbuser SET timezone TO 'UTC';

بعد ذلك ، تحتاج إلى تزويد المستخدم الذي أنشأناه بحق الوصول لإدارة قاعدة البيانات الجديدة:

GRANT ALL PRIVILEGES ON DATABASE dbforproject TO projectdbuser;

بعد اكتمال جميع الأوامر ، يمكنك إغلاق مربع حوار PostgreSQL باستخدام الأمر:

\q

الآن اكتمل تكوين PostgreSQL ، الآن سنقوم بتكوين Django للعمل بشكل صحيح مع PostreSQL.

أولاً ، انسخ البيانات القديمة من SQLite (إذا لزم الأمر). للقيام بذلك ، انتقل إلى مشروعك وقم بتشغيل البيئة الافتراضية:

cd /var/www/djangoprojectname
source ./env/bin/activate
cd mainappname/
python3.8 manage.py dumpdata > datadump.json

قم بتغيير إعدادات الاتصال بقاعدة البيانات:

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

قم بتشغيل الترحيل لقاعدة البيانات:

python3.8 manage.py migrate --run-syncdb

بعد هذا الغلاف:

python3 manage.py shell

واكتب فيها:

>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.all().delete()
>>> quit()

وتحميل البيانات التي تم تحميلها مسبقًا من SQLite:

python3.8 manage.py loaddata datadump.json

هذا كل شيء ، بدأ كل شيء وعمله بالنسبة لي ، ولكن في حالة حدوث أخطاء ، يكون الأمر فرديًا للغاية ، لذلك أوصي بعدم تخطي الخطوات في اختبار الأداء حتى تتمكن من فهم المرحلة التي حدث فيها الخطأ.

عند الكتابة ، استخدمت:

  1. www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-18-04-ru
  2. vexxhost.com/resources/tutorials/how-to-deploy-django-on-nginx-gunicorn-with-postgres
  3. pythonworld.ru/web/django-ubuntu1604.html

All Articles