برنامه نویسی | آموزش نصب جنگو با Nginx Postgres و Gunicorn در لینوکس
آموزش نصب جنگو با Nginx Postgres و Gunicorn در لینوکس
  • Hamidreza
  • ۱۳۹۸-۰۳-۰۱
  • ۶۵۶

آموزش نصب جنگو با Nginx Postgres و Gunicorn در لینوکس


مقدمه

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

آموزش نصب پایتون روی nginx , PostgresSQL , Gunicorn به صورت کامل در پای سافت

توی این آموزش ما به شما نشان خواهیم داد که چگونه برخی برنامه های مورد نیاز در اوبونتو 18.04 را نصب و پیکربندی کنیم تا برنامه های جنگو را پشتیبانی و استفاده کنیم. ما به جای استفاده از دیتابیس SQLite که به صورت پیش فرض در جنگو نصب است از دیتابیس یا پایگاه داده PostgreSQL استفاده میکنیم. و سرور برنامه را برای ارتباط با برنامه های ما با Gunicorn تنظیم خواهیم کرد.

سپس Nginx را برای معکوس کردن پروکسی به Gunicorn تنظیم خواهیم کرد.و به ویژگی های امنیتی و عملکرد آن برای دسترسی به برنامه های ما دسترسی خواهیم داشت

پیش نیاز ها

برای تکمیل این قسمت باید یک نسخه ی جدید از سرور ابونتو 18.04 با یک کاربر غیر ریشه ( غیر از روت )  با قابلیت های Sudo داشته باشیم

   اگر اطلاعاتی در این مورد ندارید میتوانید ایـنـجا کلیک کنید   

زمانی که پایگاه داده ها و برنامه ها رو ما اجرا میکنیم، سرور برنامه ی Gunicorn رو اجرا میکنه و با اون درخواستی مبتنی بر اجرای سایت به NGINX میده که میتونه سایت رو به کاربر نشون بده که این مکانیزم های مدیریت ارتباط با کارایی بالا و ویژگی های امنیتی آن به راحتی استفاده کنیم

بیایید شروع کنیم.

قدم اول نصب پکیج های مورد نیاز از مخازن ابونتو

برای شروع این قسمت ما مواردی را که از مخازن ابونتو نیازداریم رو نصب میکنیم، ما از Pipetron Manager Python برای نصب اجزای اضافی کمی بعد استفاده میکنیم (pip)

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

اگر از Django با Python3 استفاده میکنید از کد زیر استفاده کنید

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

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

اگر شما نیاز به استفاده از Python 2 دارید کد زیر را وارد کنید

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

pip  که ما در قبل تر در اون رو نصب کردیم برای نصب Gunicorn، Postgres و کتاب خانه های تعامل با آن و وب سرور Nginx را نصب خواهد کرد

ایجاد کاربر و دیتابیس PostgreSQL

برای وارد شدن به محیط Postgres از کد زیر استفاده میکنیم.

sudo -u postgres psql

حال ما وارد محیط Postgres شدیم

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

postgres=# CREATE DATABASE Database_Name; 

قدم بعدی ساخت کاربر با رمزی مشخص برای دیتابیس

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

در این قسمت تعداد پارامتر های اتصال برای کاربر را ایجاد میکنیم، این کار کار دیتابیس را سریع تر میکند تا هر زمان که یک اتصال برقرار شود، مقادیر صحیح را نباید مورد سوال قرار داد.

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

postgres=# ALTER ROLE databaseUserName SET client_encoding TO 'utf8';
postgres=# ALTER ROLE databaseUserName SET default_transaction_isolation TO 'read committed';
postgres=# ALTER ROLE databaseUserName SET timezone TO 'UTC';
اکنون می توانیم دسترسی کاربر جدید خود را به مدیریت پایگاه داده جدیدمان ارائه دهیم:
postgres=# GRANT ALL PRIVILEGES ON DATABASE Database_Name TO databaseUserName;

برای خروج از Postgres از کد زیر استفاده میکنیم

\q

Postgres در حال حاضر راه اندازی شده است به طوری که جنگو میتواند به اتصال و مدیریت دیتابیس شما تمرکز داشته باشد.

ساخت محیط مجازی پایتون برای پروژه (Python Virtual Environment)

اگه شما از پایتون 3 استفاده میکنید از کد زیر استفاده کنید

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

برای نصب محیط مجازی با پایتون 2 از کد زیر استفاده کنید

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

پوشه ی اصلی پروژه ی خودتون رو بسازید و واردش بشید تا ساخت پروژه رو شروع کنیم

mkdir ~/Projectdir
sudo -H pip install virtualenv

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

mkdir ~/Projectdir

سپس با کد زیر وارد پوشه پروژه شید

cd ~/Projectdir

اینجا ما اسم محیط مجازیمون رو VENV گذاشتیم

virtualenv venv

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

source venv/bin/activate

زمانی که شما محیط مجازیتون رو فعال میکنید باید فرم قسمت ترمینال یا bash شما به این شکل در بیاد

(venv)user@host:~/Projectdir$

با فعال کردن محیط مجازی خود میتوانید Gunicorn, Django, PostgreSQL, psycopg2 adaptor را با pip نصب کنید.

 

(venv) $ pip install django gunicorn psycopg2-binary

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

ساخت و کانفیگ یک پروژه ی جدید جنگو

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

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

از اونجایی که ما در حال حاضر یک دایرکتوری پروژه داریم، ما در این قسمت پروژه ی خودمون رو میسازیم.

 

django-admin.py startproject pysoft ~/projectdir
نام پروژه ی ما اینجا pysoft و دایرکتوری پروژه ی ما projectdir است این دستوری به این معناست که پروژه ی ما در دایرکتوری ساخته شود

تکمیل تنظیمات پروژه

sudo nano ~/projectdir/pysoft/settings.py

در فایل مورد نظر در قسمت Alowed Hosts آدرس آی پی یا آدرس دامنتون رو وارد کنید

سپس با وارد کردن این اطلاعات تنظیمات دیتابیس رو ثبت کنید

قسمت های مشخص شد رو فقط تغییر بدید

~/projectdir/pysoft/settings.py

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

~/projectdir/pysoft/settings.py

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

تکمیل ساخت پروژه

برای تکمیل و ثبت تغییرات کد های زیر را وارد کنید

python manage.py makemigrations
python manage.py migrate

ساخت یوزر با تایپ کد زیر

python manage.py createsuperuser

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

python manage.py collectstatic

چون ما الان توی سرور داریم کارامون رو انجام میدیم نیاز داریم تا پورت 8000 رو باز کنیم

sudo ufw allow 8000

اگر با ارروی در رابطه با ufw مواجه شدید کد زیر را نصب کنید تا آن را نصب کنید

sudo aptitude install ufw

یا

sudo apt-get install ufw

با این گزینه ها میتونین وضعیت فایروالتونو ببینید

sudo ufw status

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

شما باید اطلاعات زیر را با اطلاعات خودتو مقایرت بدید ( به جای سرور آدرس IP سرورتون و به جای Projectdir آدرس یا اسم پوشه ی برنامه ی جنگوییتونو وارد کنید
~/projectdir/manage.py runserver 0.0.0.0:8000

شما توی مرحله ی قبل پورت 8000 رو باز کردید و برنامتون رو در اون پورت اجرا کردید و برای این که شما وارد اون ادرس بشید نیازه که بعد از ادرس آی پیتون پورت رو هم وارد کنید مانند مثال زیر:

server_domain_or_ip:8000

در نتیجه وقتی که ما وارد آدرس بالا بشید میبایستی با تصویر زیر رو به رو بشید

django admin poster

اگر شما به انتهای آدرستون admin رو اضافه کنید با تصویر زیر مواجه میشید و میتونین با همون نام کاربری و رمز عبورتون که قسمت ساخت createsuperuser ساختید وارد پنل ادمین جنگو بشید

django admin poster pic 2

برای خروج از حالت اجرای سایت میتونین با زدن کلید های ترکیبی Ctrl + C خارج بشید

تست Gunicorn در اجرای پروژه

قبل از این که از محیط مجازی Virtualenv خارج بشین این حالت رو تست میکنیم تا بدون این که شما برنامتونو ران کنید سرورتون انلاین بمونه و افلاین نشه برای این کار وارد دایرکتوری پروژه بشین و کد زیر رو وارد کنید

(venv) cd ~/projectdir
(venv) gunicorn --bind 0.0.0.0:8000 Project.wsgi
نکته: در این حالت صفحه ی ادمین سایت از فایل های استاتیک مانند فایل های CSS پشتیبانی نمیکنه چون نمیدونه اونا کجان در ادامه این مشکل رو هم بررسی و رفع میکنیم.

در ادامه از Gunicorn با کلید های ترکیبی Ctrl + C خارج شده
سپس با نوشتن deactivate محیط مجازی یا Virtualenv رو هم غیر فعال میکنیم

(venv) deactivate
بعد از وارد کردن deactivate نام پوشه ی virtualenv از پشت خط فرمانتون پاک میشه

ساخت سوکت و فایل های سروریس Gunicorn

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

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

در این فایل، ما یک بخش به نام [Unit] میسازم که توضیحاتی برای سوکت شرح خواهیم داد، بخش [Socket] برای تعیین محل نصب فایل است و بخش [instal] برای مطمعن شدن از نصب سوکت در زمان مناسب است.

این توضیحات را در فایل (/etc/systemd/system/gunicorn.socket) که در بخش ساختید بنویسید.

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

سپس فایل را ذخیره و ببندید.

بعد از این قسمت شاید باید یک فایل برای systemd برای gunicorn ایجاد کنید با استفاده از اختیاراتی که به یوزر شما داده شده این فایل را با دستور sudo ایجاد کنید. برای ساخت فایل از دستور زیر استفاده کنید بعد از تایپ این مورد بلافاصله وارد فایل خواهید شد .

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

در بخش [unit] شما برای مشخص کردن متا دیتا و وابستگی ها به همراه توضیحات را در این بخش وارد میکنیم.

بعد در قسمت بعد ما بخش [service] را باز میکنیم در این قسمت کاربر یا گروهی که میخواهیم فرایند را اجرا کند را تعیین میکنیم ( ما مالکیت حساب کاربری خودمون رو به طور منظم به این فایل میدیم) در قسمت بعدی ما گروه مدیریت رو مشخص میکنیم که کدوم یوزر بتونه فرایند ها رو مدیریت کنه در قسمت www-data ما ارتباط بین nginx و gunicorn را کانفیگ میکنیم.

سپس دایرکتوری ذخیره و انجام عملیات رو در فایل gunicorn تایپ میکنیم

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

[Service]
User=admin
Group=www-data
WorkingDirectory=/home/admin/projectdir
ExecStart=/home/admin/projectdir/venv/bin/gunicorn \
         --access-logfile - \
         --workers 3 \
         --bind unix:/run/gunicorn.sock \
         pysoft.wsgi:application

در این قسمت با اضافه کردن بخش [install] ما قادر به بوت کردم سیستم خواهیم بود تا به صورت منظم و چند کاربره بالا بیاوریم

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

[Service]
User=admin
Group=www-data
WorkingDirectory=/home/admin/projectdir
ExecStart=/home/admin/projectdir/venv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          pysoft.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

ما میتونیم با چک کردن فایل sock مطمعن بشیم که سوکت درست کار کرده

بررسی فایل سوکت Gunicorn

برای شروع وضعیت سوکت رو چک کنید ببینین یا همه چیز درست کار میکند

sudo systemctl status gunicorn.socket

بعد از این قسمت با تایپ کد زیر میتونین چک کنین ببینین فایل سوکت ( gunicorn.sock ) ساخته شده

file /run/gunicorn.sock
خروجی :
/run/gunicorn.sock: socket

اگه دستور systemctl status  ارروری رو نشون داد یا اگه فایل gunicon.sock رو توی دایرکتوی پیدا نکرده این نشون میده gunicorn نمیتونه درست کار کنه  برای حل این مشکل کد از کد زیر کمک بگیرید

sudo journalctl -u gunicorn.socket

قبل از ادامه دوباره این ادرس را چک کنید /etc/systemd/system/gunicorn.socket برای رفع هر گونه مشکل

تست فعال سازی سوکت

در حال حاضر اگه شما  gunicorn.sock  رو فعال کرده باشید 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 درست کار میکنه و قادر به خدمت به برنامه ی جنگویی شما بوده میتونین با تایپ کد زیر چک کنین این قضیه رو

sudo systemctl status gunicorn
خروجی :
● gunicorn.service - gunicorn daemon Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled) Active: active (running) since Mon 2018-07-09 20:00:40 UTC; 4s ago Main PID: 1157 (gunicorn) Tasks: 4 (limit: 1153) CGroup: /system.slice/gunicorn.service ├─1157 /home/admin/projectdir/venv/bin/python3 /home/
admin/projectdir/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock pysoft.wsgi:application ├─1178 /home/admin/projectdir/venv/bin/python3 /home/admin/projectdir/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock pysoft.wsgi:application ├─1180 /home/admin/projectdir/venv/bin/python3 /home/admin/projectdir/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock pysoft.wsgi:application └─1181 /home/admin/projectdir/venv/bin/python3 /home/admin/projectdir/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock pysoft.wsgi:application Jul 09 20:00:40 django1 systemd[1]: Started gunicorn daemon. Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1157] [INFO] Starting gunicorn 19.9.0 Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1157] [INFO] Listening at: unix:/run/gunicorn.sock (1157) Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1157] [INFO] Using worker: sync Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1178] [INFO] Booting worker with pid: 1178 Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1180] [INFO] Booting worker with pid: 1180 Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1181] [INFO] Booting worker with pid: 1181 Jul 09 20:00:41 django1 gunicorn[1157]: - - [09/Jul/2018:20:00:41 +0000] "GET / HTTP/1.1" 200 16348 "-" "curl/7.58.0"

اگه توی خروجی با مشکلی رو به رو شدید کد زیر رو برای بررسی جزئیات چک کنید

sudo journalctl -u gunicorn

فایل /etc/systemd/system/gunicorn.service رو برای حل مشکلات بررسی کنید

اگه توی فایل /etc/systemd/system/gunicorn.service تغییراتی ایجاد کردید از کد های زیر استفاده کنید

    sudo systemctl daemon-reload
    sudo systemctl restart gunicorn

قبل از ادامه توجه داشته باشید که با ارروی مواجه نشده باشید

پیکربندی Nginx برای اتصال از طریق Gunicorn

حال که Gunicorn تنظیم شده ما باید Nginx را برای انتقال ترافیک استفاده کنیم

توی این قسمت ما میباستی سایتمونو به Nginx اضافه کنیم

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

توی این قسمت ما باید به سرورمون دستور بدیم که سایتمونو با پورت 80 به چه دامنه یا آی پی ای اجازه بده که اجرا بشن برای این کار کد زیر رو به فایلی که ساختید اضافه کنید و نام دامنتونو جای گذاری کنید

server {
    listen 80;
    server_name server_domain_or_IP;
}

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

بعلاوه ما همچنین آدرس پیدا کردن ایکون رو هم بهش میدیم که توی پوشه static درون projectdir پروژتون هست که همشون توی آدرس دهی از پیشوند url _ static استفاده کردند

بنابراین ما میتونیم این قسمت رو به این شکل بنویسیم ..

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/admin/projectdir;
    }
}

در نهایت ما یک بلوک / { } برای مطابقت با سایر درخواست ها ایجاد میکنیم در داخل این محل پروکسی استاندارد پارامتر ها همراه با نصب 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/admin/projectdir; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } }

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

sudo ln -s /etc/nginx/sites-available/pysoft /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 سرور خود برید

توجه :

بعد از این که Nginx رو فعال و پیکربندی کردین مرحله ی بعدی اینه که باید ترافیک رو به سرور با استفاده از SSL / TLS تضمین کنید این خیلی مهمه زیرا بدون این تمام اطلاعات از جمله رمز های عبور روی شبکه در متن ساده ارسال میشوند.

اگه نام دامنه دارید ساده ترین راه دریافت یک گواهینامه SSL برای امنیت سایت یا ترافیک شما استفاده از Let/s Encypt است که شما میتوانید برای ثبت گواهینامه از این آموزش استفاده کنید

اگر نام دامنه ندارید میتونین سایت خودتون رو برای تست و یادگیری با یک گواهینامه ی SSL از طریق این آموزش تضمین کنید.

Hamidreza

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

نظر شما در مورد این پست چیه؟!