GNU/Linux >> Belajar Linux >  >> Linux

Mengatur Django dengan Postgres, Nginx, dan Gunicorn di Ubuntu 18.04

Django adalah kerangka kerja aplikasi web berbasis python yang serbaguna, kuat, efisien dan terus berkembang yang dapat Anda gunakan untuk membuat aplikasi web Anda aktif dan berjalan. Ini adalah kerangka kerja web yang populer dan biasanya dilengkapi dengan server pengembangan yang digunakan untuk menguji kode Anda secara lokal. Jika Anda ingin mendorong aplikasi Anda ke produksi, maka diperlukan penyiapan server web yang lebih kuat dan aman.

Dalam panduan ini, kami akan membawa Anda melalui seni menyebarkan dan mengonfigurasi Django secara profesional dengan cara yang lebih efisien dan tangguh. Kami akan menginstal dan mengkonfigurasi database PostgreSQL di tempat database SQLite, dan mengintegrasikan server aplikasi Gunicorn yang akan berinteraksi dengan aplikasi. Kemudian, kami akan melanjutkan dengan menyiapkan server web NGINX yang akan menyediakan saluran proxy terbalik ke server Gunicorn, sehingga memberikan kinerja dan komponen keamanan yang diperlukan untuk melayani aplikasi kami.

Prasyarat

Sebelum kita mulai, mari kita lakukan pemeriksaan penerbangan cepat dan pastikan kita memiliki yang berikut

  • Instance server Ubuntu 18.04 baru
  • Pengguna non-root dengan hak istimewa sudo. Dalam panduan ini kita akan menggunakan james
  • Akses SSH ke server

Tujuan

Berikut ini adalah panduan singkat tentang apa yang ingin kami capai. Kita akan menginstal Django dalam lingkungan virtual. Ini memungkinkan proyek ditangani secara terpisah dari lingkungan host. Kami kemudian akan memulai instalasi dan konfigurasi server aplikasi Gunicorn yang akan menghubungkan aplikasi dan menerjemahkan permintaan dalam protokol HTTP ke panggilan Python yang dapat diproses oleh aplikasi kami. Terakhir, kami akan menyiapkan Nginx yang merupakan server web berkinerja tinggi dengan segudang komponen keamanan yang akan meningkatkan keamanan aplikasi kami.

Memulai

Untuk memulai, kami akan mulai dengan memperbarui repositori Ubuntu kami

$ sudo apt-get update

Selanjutnya, kita akan mengunduh dan menginstal paket perangkat lunak yang diperlukan untuk semua aplikasi yang akan kita konfigurasi. Ini akan mencakup manajer paket pip, PostgreSQL, dan Nginx.
Jika Anda menjalankan Django dengan Python3, sintaksnya adalah

$ sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx

Jika sistem Anda menjalankan Python2, perintahnya adalah:

$ sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx

Contoh keluaran

Perintah tersebut akan menginstal pip package manager, semua file pengembangan Python yang diperlukan untuk membangun Gunicorn, server web Nginx, database Postgres, dan perpustakaan penting yang diperlukan untuk berinteraksi dengan mesin database.

Setelah berhasil menginstal semua paket perangkat lunak yang diperlukan, sekarang saatnya membuat database dan pengguna untuk aplikasi web Django

Membuat database PostgreSQL dan pengguna database

Sekarang mari kita langsung masuk dan membuat database dan pengguna untuk aplikasi Django
Masuk ke Postgres dan jalankan perintah

$ sudo -u postgres psql

Anda akan turun ke prompt Postgres seperti yang terlihat pada output

Buat database untuk proyek Anda. Dalam hal ini, nama databasenya adalah “proyek”.

postgres=# CREATE DATABASE project;

Contoh keluaran

CATATAN! Semua perintah di PostgreSQL harus diakhiri dengan titik koma.

Setelah pembuatan database berhasil, buat pengguna untuk proyek Django dan pastikan untuk menetapkan Kata Sandi yang aman. Dalam hal ini, pengguna adalah pengguna proyek

Ganti atribut 'password' dengan Password Anda yang kuat.

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

Contoh keluaran

Untuk mengonfirmasi parameter pengaturan Django untuk konektivitas basis data, kita akan:

  1. Setel penyandian default ke UTF-8
  2. Setel skema isolasi ke nilai 'baca komitmen'
  3. Setel zona waktu ke UTC

Jalankan perintah di bawah ini untuk memenuhi persyaratan penyiapan


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

Sekarang mari berikan akses basis data ke pengguna yang baru dibuat

postgres=# GRANT ALL PRIVILEGES ON DATABASE project TO projectuser;

Contoh keluaran

Sekarang Anda dapat keluar dari lingkungan Postgres.

postgres=# \q

Membuat Lingkungan Virtual Python untuk Proyek Django Anda

Untuk pengelolaan aplikasi yang lebih mudah, kita akan menginstal prasyarat Python yang diperlukan di lingkungan virtual.
Tapi pertama-tama, mari kita instal lingkungan virtual
Jika sistem Anda menjalankan Python3, tingkatkan pip dengan mengeksekusi

$ sudo -H pip3  install --upgrade pip

Untuk sistem yang berjalan di Python2, jalankan

$ sudo -H pip install --upgrade pip

Contoh Keluaran

Setelah itu, instal lingkungan virtual menggunakan pip

$ sudo -H pip install virtualenv

Contoh Keluaran

Dengan lingkungan virtual kami di tempat, kami sekarang akan membuat dan pindah ke dalamnya


$ mkdir ~/project
$ cd ~/project

Sekarang buat lingkungan virtual Python

virtualenv projectenv

Contoh keluaran

Ini membuat direktori bernama projectenv dalam direktori proyek.

Sebelum menginstal persyaratan Python, aktifkan lingkungan virtual

$ source projectenv/bin/activate

Contoh keluaran

Perhatikan bagaimana prompt berubah menjadi (projectenv)james@ubuntu: ~/project$

Dengan lingkungan virtual aktif, mari instal adaptor Gunicorn, Django, dan Psycopg2 Postgres menggunakan pip.

$ pip install django gunicorn psycopg2-binary

Contoh Keluaran

Membuat dan mengonfigurasi proyek Django baru

Pada titik ini, kita akan menginstruksikan Django untuk menginstal file proyek di direktori proyek yang telah kita buat. Direktori tingkat kedua akan dibuat bersama skrip manajemen.
Untuk mencapainya, jalankan perintah di bawah ini.

$ django-admin.py startproject project ~/project 

Direktori proyek kami, dalam hal ini, ~/project harus memiliki konten berikut


manage.py      -  Django’s Python management script
project             - directory containing Django’s project package
projectenv      - Virtual environment directory that was earlier created

 

Contoh keluaran

Menyesuaikan konfigurasi file Proyek

Kami akan membuka file pengaturan

vim ~/project/settings.py

Gulir ke bawah dan perhatikan atribut 'ALLOWED HOSTS'. Di dalam tanda kurung siku, tentukan alamat IP server dan tambahkan atribut 'localhost'.

Contoh keluaran

Selanjutnya, cari bagian 'DATABASES'. Sesuaikan pengaturan agar sesuai dengan informasi database PostgreSQL. Ini termasuk nama database, pengguna dan kata sandi pengguna.

Contoh keluaran

Selanjutnya, gulir ke bawah dan tentukan lokasi file statis. Ini penting agar Nginx dapat menangani permintaan untuk item ini dengan lancar. Dari cuplikan di bawah ini, file statis akan ditempatkan di direktori bernama 'statis'

Simpan dan Keluar.

Menyelesaikan penyiapan proyek awal

Sekarang mari kita migrasikan skema database ke database PostgreSQL


~/project/manage.py makemigrations

Contoh keluaran


~/project/manage.py migrate
 

Contoh keluaran


Selanjutnya, kita akan membuat pengguna super untuk proyek Django dengan menjalankan perintah berikut

~/project/manage.py createsuperuser 

Anda akan diminta memasukkan nama pengguna, email, kata sandi seperti yang ditunjukkan di bawah ini

Contoh keluaran

Setelah pembuatan superuser berhasil, kami sekarang dapat mengumpulkan konten statis ke dalam lokasi direktori

~/project/manage.py collectstatic

Contoh keluaran

File statis ini akan ditempatkan di ‘static’ direktori dalam folder proyek.

Untuk menguji server pengembangan, kami akan mengizinkan port, dalam hal ini, port 8000 yang akan digunakan untuk mengakses aplikasi melalui browser web.

Untuk membuka port, kita akan mengeksekusi

sudo ufw allow 8000

Terakhir, mulai server pengembangan Django di lingkungan virtual dengan menjalankan

~/project/manage.py runserver 0.0.0.0:8000

Buka browser web Anda dan kunjungi alamat server Anda

Dalam hal ini, alamat server kami adalah

https://38.76.11.180/

Anda seharusnya dapat melihat halaman indeks Django berikut

Contoh keluaran

Sekarang tambahkan /admin di akhir URL untuk masuk ke halaman login

https://38.76.11.180/admin

Contoh keluaran

Berikan kredensial yang Anda berikan saat membuat akun pengguna super dan tekan 'Login'

Ini akan membawa kita ke panel Admin Django

Contoh keluaran

Besar! Sekarang kita telah mengkonfirmasi bahwa Django aktif dan berjalan, mari kita tekan CTRL + C di terminal untuk keluar dari aplikasi

Mengonfirmasi kemampuan Gunicorn untuk menguji Proyek

Sebelum keluar dari lingkungan virtual, mari kita verifikasi bahwa server aplikasi Gunicorn kita dapat melayani Django.
Sementara masih dalam direktori proyek, mari memuat modul WSGI

gunicorn --bind 0.0.0.0:8000 project.wsgi

Ini menjalankan Gunicorn pada antarmuka dan port yang sama yang dijalankan oleh server Django. Anda dapat kembali dan memverifikasi bahwa aplikasi Django berjalan pada browser web.

Setelah selesai tekan CTRL + C untuk menghentikan aplikasi dan jalankan perintah deactivate untuk keluar dari lingkungan virtual.

Setelah menguji bahwa server aplikasi Gunicorn dapat melayani aplikasi Django kita, saatnya untuk menerapkan cara yang lebih kuat untuk memulai dan menghentikan server aplikasi.
Kita akan membuat file layanan systemd dengan Gunicorn menggunakan perintah berikut

 $ sudo vim /etc/systemd/system/gunicorn.service

Dimulai dengan bagian [Unit], rekatkan konten berikut


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

Bagian ini menentukan dependensi dan metadata

Selanjutnya, buat [service] bagian.

Di bagian ini, kami akan menentukan pengguna dan grup tempat proses harus dijalankan. Dalam hal ini, pengguna adalah root dan grupnya adalah www-data. Grup ditetapkan sebagai www-data sehingga Nginx dapat berkomunikasi dengan Gunicorn dengan lancar.

Jalur lengkap ke Gunicorn yang dapat dieksekusi kemudian akan ditunjukkan. Karena Nginx diinstal dalam server yang sama, kami akan mengikatnya ke soket Unix.

Tempel konten berikut


[Service]
User=james
Group=www-data
WorkingDirectory=/home/james/project
ExecStart=/home/james/project/projectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/james/project/project.sock project.wsgi:application

Terakhir, buat bagian [Instal] dan tambahkan baris berikut


[Install]
WantedBy=multi-user.target

Besar! Sekarang file layanan systemd kami selesai.

Simpan dan tutup editor teks. Mulai ulang layanan Gunicorn dan aktifkan untuk memulai saat boot


$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn

Untuk memeriksa status gunicorn run

$ systemctl status gunicorn

Contoh keluaran

Verifikasi keberadaan file Gunicorn Socket

Sekarang setelah kita memverifikasi bahwa Nginx aktif dan berjalan, mari kita verifikasi keberadaan file project.sock di direktori proyek kita

$ ls -l /home/james/project

Contoh keluaran

CATATAN:

Jika file project.sock hilang, ini merupakan indikator bahwa gunicorn tidak dapat memulai dengan benar.
Selain itu, Anda dapat memeriksa log gunicorn dengan menjalankan perintah di bawah

$ sudo journalctl -u gunicorn

Ada beberapa alasan mengapa Nginx tidak dapat membuat file project.sock. Beberapa termasuk

  1. File proyek dimiliki oleh pengguna root, bukan pengguna sudo
  2. Direktori kerja dalam /etc/systemd/system/gunicorn.service tidak menunjuk ke direktori proyek.
  3. Konfigurasi salah dalam direktif ExecStart

Jika semua konfigurasi baik-baik saja, maka Anda seharusnya tidak mendapatkan kesalahan apa pun setelah menjalankan

$ sudo journalctl -u gunicorn

Setelah Anda membuat perubahan pada /etc/systemd/system/gunicorn.service file, pastikan Anda memuat ulang layanan daemon agar perubahan diterapkan


$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn

Mengonfigurasi Nginx untuk mengarahkan lalu lintas ke Gunicorn

Tahap terakhir dalam panduan ini adalah mengonfigurasi server web Nginx untuk menyalurkan lalu lintas web ke layanan Gunicorn

Kami akan membuat dan membuka blok server baru di sites-available direktori

$ sudo vim /etc/nginx/sites-available/project

Mulailah dengan menentukan bahwa blok ini harus mendengarkan port 80 dan harus merespons alamat IP server.


server {
    listen 80;
    server_name server_domain_or_IP;
}

 

Selanjutnya, kami akan menginstruksikan Nginx untuk mengabaikan masalah apa pun dengan menemukan favicon. Selain itu, kami akan memberi tahu lokasi aset statis yang dikumpulkan di ~/project/static direktori


location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/james/project;
    }

Terakhir, kita akan membuat lokasi blok / { } yang akan cocok dengan permintaan lainnya.
Dalam lokasi ini, kita akan mendefinisikan file proxy_params dan kemudian mengarahkan lalu lintas ke soket yang dibuat oleh proses Gunicorn


location / {
        include proxy_params;
        proxy_pass https://unix:/home/james/project/project.sock;
    }
 

File konfigurasi akhir akan terlihat seperti ini

Simpan dan Keluar dari file konfigurasi

Mari Aktifkan file dengan menautkannya ke direktori yang mendukung situs

$ sudo ln -s /etc/nginx/sites-available/project /etc/nginx/sites-enabled

Selanjutnya, mari kita uji konfigurasi kita untuk menemukan kesalahan

$ sudo nginx -t

Jika semuanya berjalan dengan baik, outputnya akan seperti yang ditunjukkan di bawah ini

Setelah menguji konfigurasi Nginx

$ sudo systemctl restart nginx

Sekarang kita tidak lagi membutuhkan akses ke server pengembangan pada port 8000, mari kita hapus aturan di firewall.

$ sudo ufw delete allow 8000

Biarkan kami juga mengizinkan port 80

$ sudo ufw allow 'Nginx Full'

Anda seharusnya sekarang dapat pergi ke domain atau alamat IP server Anda untuk melihat aplikasi Anda tanpa menentukan port 8000

Kiat bermasalah

1.Server menampilkan halaman Nginx default

Jika Nginx menampilkan halaman default sebagai ganti proxy ke aplikasi Django, Anda perlu memeriksa /etc/nginx/sites-available/project file dan pastikan IP server atau nama domain Anda ditunjukkan dengan benar. Halaman default menyiratkan bahwa Nginx tidak dapat mencocokkan permintaan Anda dan sebaliknya kembali ke /etc/nginx/sites-available/default

2. 502 Kesalahan gerbang buruk sebagai ganti aplikasi Django

Kesalahan 502 merupakan indikasi bahwa server web Nginx tidak berhasil mem-proxy permintaan. Untuk memecahkan masalah secara akurat, periksa log di file log kesalahan seperti yang ditunjukkan dan ini dapat memberi Anda petunjuk tentang apa yang mungkin salah.

$  sudo tail -F /var/log/nginx/error.log

3. “Tidak dapat terhubung ke server” Koneksi ditolak

Kesalahan yang mungkin Anda temui saat mencoba mengakses beberapa komponen tertentu di browser web Anda adalah

OperationalError at /admin/login/
could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?

Ini menunjukkan bahwa aplikasi Django tidak dapat terhubung ke database Postgres
Pastikan Postgres berjalan dengan mengeksekusi

$ sudo systemctl status postgresql

Jika tidak berjalan, mulai dan aktifkan untuk memulai saat boot


$ sudo systemctl start postgresql
$ sudo systemctl enable postgresql

Jika Anda masih mengalami masalah, pastikan setelan database di
~/myproject/myproject/settings.py benar.

Untuk pemecahan masalah lebih lanjut, periksa log berikut


Nginx process logs                 sudo journalctl -u nginx

Nginx access logs                    sudo tail -f  /var/log/nginx/access.log

Nginx error logs	          sudo less /var/log/nginx/error.log


Gunicorn Application logs     sudo journalctl -u gunicorn

Saat Anda membuat perubahan pada file konfigurasi, pastikan Anda memulai ulang agar perubahan diterapkan.

Jika Anda memutuskan untuk membuat perubahan pada file layanan gunicorn systemd, pastikan Anda memuat ulang daemon dan memulai ulang gunicorn


$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn

Saat Anda membuat perubahan pada konfigurasi blok server Nginx, uji konfigurasinya

$ sudo nginx -t && sudo systemctl restart nginx

Kesimpulan

Terima kasih telah meluangkan waktu di artikel ini. Dalam artikel ini, kami menyiapkan proyek Django di lingkungan virtual dan menyiapkan Gunicorn untuk menerjemahkan permintaan klien dan Nginx ke lalu lintas proxy ke aplikasi Django kami.


Linux
  1. Nginx dengan libmodsecurity dan OWASP ModSecurity Core Rule Ditetapkan di Ubuntu 16.04

  2. Instal Django CMS di Ubuntu 12.04 dengan MariaDB, Gunicorn dan Nginx

  3. Cara Mengatur Apache dengan Acara MPM dan PHP-FPM di Ubuntu 20.04

  1. Instal WordPress dengan Varnish dan Nginx di Ubuntu

  2. Cara Deploy Aplikasi Flask dengan Nginx dan Gunicorn di Ubuntu 20.04

  3. Cara Mengatur Django dengan Postgres, Nginx dan Gunicorn di Ubuntu 20.04

  1. Cara Mengatur Ketersediaan Tinggi Nginx dengan Pacemaker, Corosync, dan Crmsh di Ubuntu 16.04

  2. Filter dan optimalkan permintaan file statis dengan NGINX di Ubuntu 18.04

  3. Cara Menginstal Node.js dengan NVM dan Nginx di Ubuntu 22.04