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:
- Setel penyandian default ke UTF-8
- Setel skema isolasi ke nilai 'baca komitmen'
- 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
- File proyek dimiliki oleh pengguna root, bukan pengguna sudo
- Direktori kerja dalam
/etc/systemd/system/gunicorn.service
tidak menunjuk ke direktori proyek. - 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.