
پلتفرم Django
(Django Platform)🎯 توضیحات و نکات تکمیلی
فهرست عناوین:
- انتخاب نسخهی Python
- استفاده از Supervisord
- دستور collectstatic
- دستور compilemessages
- جلوگیری از اعمال تغییرات در فایل settings.py
- تنظیمات Nginx
- تنظیم هدرهای امنیتی HTTP
- افزایش محدودیت حجم آپلود فایل
- تنظیم منطقهی زمانی (TimeZone)
- رفع خطای CORS فایلهای Media
- افزایش زمان تایماوت Gunicorn
- تنظیم مقدار Gunicorn max_request
- رفع خطای CORS
- استقرار برنامههای ASGI
- غیرفعال کردن Mirror
انتخاب نسخهی Python
بهصورت پیشفرض برنامهی شما روی Python 3.8 اجرا میشود. در صورتی که قصد دارید نسخه دیگری را برای اجرای برنامهیتان استفاده کنید میتوانید داخل فایل liara.json بخش زیر را اضافه کنید. توجه داشته باشید که فایل liara.json را باید در کنار فایل requirements.txt بسازید:
{
"django": {
"pythonVersion": "3.7"
}
}
- 3.7
- 3.8
- 3.9
- 3.10
- 3.11
استفاده از Supervisord
در صورتی که نیاز به Worker برای اجرای Background Jobها برای مثال با Celery را دارید، میتوانید یک فایل بهنامsupervisor.confدر کنار requirements.txtبسازید و سپس دیپلوی کنید. در اینصورت Supervisor اجرا شده و دستور شما را در Background اجرا خواهد کرد. در ادامه، یک نمونه فایل supervisor.confرا مشاهده میکنید:
[program:celery-worker]
process_name=%(program_name)s_%(process_num)02d
command=celery -A proj worker -l INFO
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
numprocs=1
startsecs=10
stopwaitsecs=600
redirect_stderr=true
stdout_logfile=/tmp/worker.log
دستور collectstatic
در هر استقراری که انجام میدهید، لیارا بهصورت خودکار دستورpython manage.py collectstaticرا اجرا میکند. برای جلوگیری از اجرای خودکار این دستور، باید تنظیمات زیر را در فایل liara.json قرار بدهید:
{
"django": {
"collectStatic": false
}
}
دستور compilemessages
اگر برنامهی شما چند زبانه است و نیازمند اجرای دستورpython manage.py compilemessagesبعد از هر بار استقرار هستید، باید تنظیمات زیر را در فایل liara.json قرار بدهید:
{
"django": {
"compileMessages": true
}
}
جلوگیری از اعمال تغییرات در فایل settings.py
لیارا بهصورت خودکار فایلsettings.pyبرنامهی شما را پیدا کرده و در انتهای آن تنظیماتی را اضافه میکند تا برای اجرا آماده شود. چنانچه قصد غیر فعال کردن آن را دارید، باید فایل liara.json زیر را بهریشهی برنامهیتان اضافه کنید:
{
"django": {
"modifySettings": false
}
}
تنظیمات Nginx
در برنامههای Django لیارا از وبسرور Nginx استفاده میشود و پیکربندی پیشفرض این وبسرور بهشکل زیر است:
client_max_body_size 100M;
location /media {
alias /usr/src/app/media;
}
location /static {
alias /usr/src/app/staticfiles;
}
location / {
try_files /dev/null @django_app;
}
location ~\.sqlite3$ {
deny all;
error_page 403 =404 /;
}
location ~ /\.well-known {
allow all;
}
حال شما میتوانید یک فایل با نام liara_nginx.confدر مسیر اصلی پروژهی خود ایجاد کرده و پیکربندی وبسرور Nginx را متناسب با نیاز خود تغییر دهید. برای مثال، برای فعالکردن فشردهسازیgzipمیتوانید بهشکل زیر عمل کنید:
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
client_max_body_size 100M;
location /media {
alias /usr/src/app/media;
}
location /static {
alias /usr/src/app/staticfiles;
}
location / {
try_files /dev/null @django_app;
}
location ~\.sqlite3$ {
deny all;
error_page 403 =404 /;
}
location ~ /\.well-known {
allow all;
}
تنظیم هدرهای امنیتی HTTP
برای جلوگیری از حملاتی مانند Clickjacking، XSS، SSL Striping میتوانید هدرهای امنیتی را مانند مثال زیر در تنظیمات Nginx برنامهی خود تنظیم کرده و نحوهی برقراری ارتباط با سایت را برای مرورگرها تعیین کنید:
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options: nosniff;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
client_max_body_size 100M;
location /media {
alias /usr/src/app/media;
}
location /static {
alias /usr/src/app/staticfiles;
}
location / {
try_files /dev/null @django_app;
}
location ~\.sqlite3$ {
deny all;
error_page 403 =404 /;
}
location ~ /\.well-known {
allow all;
}
افزایش محدودیت حجم آپلود فایل
همانطور که در بخش قبلی گفته شد، پلتفرم Django در لیارا با استفاده از وبسرور Nginx مستقر و اجرا میگردد. در این وبسرور، بهصورت پیشفرض حداکثر حجم مجاز آپلود فایل 1MB در نظر گرفته شدهاست. شما میتوانید یک فایل با نامliara_nginx.confدر کنارrequirements.txtبسازید و محتویات زیر را داخل آن قرار دهید و سپس دستورliara deployرا وارد کنید:
client_max_body_size 250M;
location /media {
alias /usr/src/app/media;
}
location /static {
alias /usr/src/app/staticfiles;
}
location / {
try_files /dev/null @django_app;
}
location ~\.sqlite3$ {
deny all;
error_page 403 =404 /;
}
location ~ /\.well-known {
allow all;
}
با قرار دادن فایل بالا در ریشهی برنامهیتان حداکثر حجم مجاز آپلود فایل به 250MB افزایش مییابد. شما میتوانید مقدار دلخواه خودتان را تنظیم کنید.
تنظیم منطقهی زمانی (TimeZone)
به صورت پیشفرض، منطقهی زمانی بر روی Asia/Tehran تنظیم شده است. برای تغییر مقدار پیشفرض، میتوانید از پارامترtimezoneدر فایل liara.json استفاده کنید. برای نمونه:
{
"platform": "django",
"app": "django-starter",
"django": {
"timezone": "America/Los_Angeles"
}
}
رفع خطای CORS فایلهای Media
مسئولیت ارائه فایلهای رسانه (Media) به کاربران در پلتفرم Django برعهدهی وبسرور (Nginx) است، حال اگر کاربران شما برای دسترسی به فایلهای رسانه با خطای CORS مواجه شدند باید تنظیمات Nginx پروژهی خود را شخصیسازی کنید. برای رفع این خطا، یک فایل با نام liara_nginx.conf در مسیر اصلی پروژهی خود ایجاد کرده و قطعهکد زیر را در این فایل قرار دهید:
client_max_body_size 100M;
location /media {
add_header Access-Control-Allow-Origin *;
alias /usr/src/app/media;
}
location /static {
alias /usr/src/app/staticfiles;
}
location / {
try_files /dev/null @django_app;
}
location ~\.sqlite3$ {
deny all;
error_page 403 =404 /;
}
location ~ /\.well-known {
allow all;
}
سپس برای اعمال این تغییرات، دستور liara deploy را در مسیر اصلی پروژهی خود اجرا کنید.
با اعمال این پیکربندی، فایلهای قرار گرفته در پوشهی mediaبا HeaderAccess-Control-Allow-Originو مقدار*Serve میشوند. همچنین شما میتوانید مقدار دلخواه خودتان را تنظیم کنید.
افزایش زمان تایماوت Gunicorn
درصورتی که در برنامهی Django خود با خطای [CRITICAL] WORKER TIMEOUT مواجه شدهاید و به WORKER TIMEOUT بیشتر از ۳۰ ثانیه نیاز دارید میتوانید وارد تنظیمات برنامهی Django خود شده و در بخش متغیرها، متغیر GUNICORN_TIMEOUT=60 را بهشکل زیر اضافه کرده و درنهایت با کلیک بر روی دکمه ثبت تغییرات، WORKER TIMEOUT برنامه را افزایش دهید.

تنظیم مقدار Gunicorn max_request
یکی از راههای جلوگیری از Memory leak و مصرف بالای RAM در Gunicorn، تنظیم پارامتر max_requests است. با تنظیم این پارامتر، با رسیدن تعداد درخواستهای هر یک از Threadهای Gunicorn به این عدد، آن Thread ریاستارت شده و حافظهی RAM آن خالی میشود. در صورتی که در برنامهی Django خود نیاز به ریاستارت WORKER THREAD بعد از تعداد مشخصی Request دارید، میتونید وارد تنظیمات برنامهی Django شده و در بخش متغیرها، متغیر GUNICORN_MAX_REQUESTS=1000 را اضافه کرده و در نهایت روی دکمه ثبت تغییرات کلیک کنید. همچنین توجه داشته باشید که مقدار پیشفرض برابر با GUNICORN_MAX_REQUESTS=10000 است.
رفع خطای CORS
درصورتی که Headerهای مربوط به CORS را با استفاده از پکیج django-cors-headers، در Middleware برنامهی خود تنظیم کردهاید بایدCORS_ALLOWED_ORIGINS و CORS_ALLOW_METHODS را نیز در فایل settings.py تعریف کرده باشید:
CORS_ALLOWED_ORIGINS = [
"https://example.com",
"https://www.example.com",
]
CORS_ALLOW_METHODS = [
"DELETE",
"GET",
"OPTIONS",
"PATCH",
"POST",
"PUT",
]
استقرار برنامههای ASGI
برای استقرار برنامههای ASGI در پلتفرم Django لیارا تنها باید WSGI_APPLICATION را از فایل settings.py برنامه حذف کنید و مسیر فایل پیکربندی برنامهی ASGI خود را در متغیر ASGI_APPLICATION مقداردهی کنید.
غیرفعال کردن Mirror
Mirror اختصاصی لیارا بهمنظور دانلود سریعتر پکیجها در پلتفرم Django بهصورت پیشفرض فعال است اما شما میتوانید با قرار دادن قطعهکد زیر در فایل liara.json، این قابلیت را غیر فعال کنید:
{
"django": {
"mirror": false
}
}