Pada tulisan ini saya akan mencoba berbagi untuk melakukan deploy aplikasi django dengan menggunakan EC2 di AWS. Langkah yang dilakukan adalah sebagai berikut:
- Buka website AWS dan masuk ke halaman untuk membuat instance dengan EC2 dihalaman ini dan lakukan login, sampai tampil halaman seperti di bawah kemudian klik Launch instance.
- Pilih Amazon Machine Image (AMI). misal dalam contoh ini saya akan menggunakan Ubuntu Server 18.04 LTS (HVM), SSD Volume Type. kemudian klik button select.
- Pilih Instance Type, saya pilih t2.micro, lalu klik Review and Launch
- Tampil halaman Review Instance Launc, pada tahap ini kita selesai melakukan setting secara default untuk instance EC2, langkash selanjutnya klik Launch.
- Kemudian tampil halaman untuk memilih atau membuat key pair. Pilih Create a new key pair, isi Key pair name, lalu klik Download Key Pair dan simpan di komputer kita dan klik Launch instances.
- Setelah itu maka akan menampilkan instance yang sudah dibuat barusan. Saat pertama kali dibuat maka instance state pending, tunggu sampai status menjadi active. Pada halaman ini kita bisa melihat type instance, Public DNS, IP Public dsb. Lalu kita bisa merubah nama instance kita dengan cara klik dibawah kolom name sesuaikan dengan nama instance aplikasi kita. Misal key-django-ec2-1.
Konek ke ec2 dengan menggunakan SSH
Selanjutnya kita akan lakukan konek ke ec2 dengan menggunakan SSH. Langkahnya adalah:
- Pada halaman seperti gambar diatas pili/chek instance kita lalu klik button Connect yang akan menampilkan alamat keneksi melalui SSH dengan menggunakan PuTTy atau menggunakan Git bash.
- Misal dalam contoh kali ini saya menggunakan Git Bash, setelah kita install Git, kemudian kita buka Git masuk ke folder tempat dimana file key pair berada. dan ketikan perintah:
chmod 400 key-django-ec2-1.pem
- Kemudian konek ke DNS Public kita dengan perintah:
ssh -i key-django-ec2-1 ubuntu@<DNS Public>.compute.amazonaws.com
- Jika koneksi berhasil maka kita bisa masuk ke server ec2 kita dan melakukan konfigurasi seperti ditampilkan pada gambar dibawah ini.
- Selanjtnya kita lakukan update terhdapat ubuntu server kita dengan perintah
sudo apt-get update
- sudo apt-get upgrade -y
- Selanjutnya cek apakah sudah ada python, jika belum maka install python3 dengan perintah
ubuntu@ip-172-31-5-17:~$ python3 --version
ubuntu@ip-172-31-5-17:~$ python --version
ubuntu@ip-172-31-5-17:~$ sudo apt-get install python3
- Install pip
ubuntu@ip-172-31-5-17:~$ sudo apt-get install python3-pip
- Install Virtual environment
ubuntu@ip-172-31-5-17:~$ sudo apt-get install python3-venv
- Buat folder django1
ubuntu@ip-172-31-5-17:~$ mkdir django1
- Masuk ke folder django1
ubuntu@ip-172-31-5-17:~$ cd django1
- Buat virtualenv dengan nama venv misalnya
ubuntu@ip-172-31-5-17:~$ python3 -m venv venv
- Jalankan virtualenv
ubuntu@ip-172-31-5-17:~$ source venv/bin/activate
(venv) ubuntu@ip-172-31-5-17:~/django1$
- Install python
(venv) ubuntu@ip-172-31-5-17:~/django1$ pip3 install django
- Selajutnya kita siapkan project django yang disimpan di Github, dan kita akan melakukan clone project kita yang ada di Github
(venv) ubuntu@ip-172-31-5-17:~/django1$ git clone <alamat github>
- Install psycopg2, untuk koneksi ke database PostgreSQL
(venv) ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ sudo apt-get install libpq-dev python-dev
(venv) ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ sudo apt-get install python3-psycopg2
coba cek masuk ke python console, dan ketikan perintah import psycopg2, untuk mengeceka apakah library terseut sudah berhasil diinstal, jika belum ketikan perintah
(venv) ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ sudo apt-get install psycopg2
- Install Django-leaflet, untuk menampikan WebGIS
(venv) ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ pip3 install django-leaflet
- Install GDAL dan OGR
Keluar dari virtualenv
ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ sudo add-apt-repository ppa:ubuntugis/ppa
ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ sudo apt-get update
ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ sudo apt-get install gdal-bin
ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ ogrinfo --version
GDAL 2.4.2, released 2019/06/28
ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ sudo apt-get install libgdal-dev
ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ export CPLUS_INCLUDE_PATH=/usr/include/gdal
ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ export C_INCLUDE_PATH=/usr/include/gdal
ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ ogrinfo --version
GDAL 2.4.2, released 2019/06/28
ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ pip3 install GDAL==2.4.2
Cek hasil installan library tersebut
ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ python
Python 2.7.17 (default, Jul 20 2020, 15:37:01)
[GCC 7.5.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gdal
>>> exit()
- Install pillow, untuk pengelola image
(venv) ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ pip3 install pillow
- Install gunicorn
(venv) ubuntu@ip-172-31-5-17:~/django1$ pip3 install gunicorn
- Install nginx
(venv) ubuntu@ip-172-31-5-17:~/django1$ sudo apt-get install -y nginx
- Jalankan nginx
(venv) ubuntu@ip-172-31-5-17:~/django1$ sudo nginx
- Dalam gambar di atas terdapat error, untuk memperbaiki hal tersebut maka, kembali lihat halaman instance kita, dan klik kanan di instance tersebut dan pilih Networking - > Change Security Groups
- Maka tampil halaman yang manampilkan security group instance kita seperti terlihat dalam gambar dibawah dan perhatikan nama security group tersebut
- Selanjutnya kembali ke halaman instance sebelumnya, pilih menu Security Group. Pilih atau check security group lalu pilih button Actions dan pilih Edit inbound rules
- Selanjutnya tambahkan rules dengan memilih Add rule, pilih Type dengan HTTP lalu pilih Source dan pilih Anywhere, lalu klik Save rules. Dan yang jangan lupa tambahkan satu lagi Type isi dengan Custom HTTP, masukan port 8000 (bisa dirubah sesuai dengan nomor port yang kan digunakan oleh django).
- Selanjutnya kembali ke halaman instance, dan copy alamat Public DNS (IPv4), lalu buka di browser sehingga menampilkan halaman seperti gambar di bawah
Masuk ke folder dimana terdapat file wsgi.py
(venv) ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ ls
db.sqlite3 django1 djangoapp1 manage.py
(venv) ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ cd django1
(venv) ubuntu@ip-172-31-7-166:~/django1/geodjango1-okus$ ls
README.md app.sock django1 manage.py staticfiles wsgi.py
__init__.py db.sqlite3 djangoapp1 static templates
(venv) ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ gunicorn --bind 0.0.0.0:8000 django1.wsgi:application
[2020-07-22 18:22:30 +0000] [27551] [INFO] Starting gunicorn 20.0.4
[2020-07-22 18:22:30 +0000] [27551] [INFO] Listening at: http://0.0.0.0:8000 (27551)
[2020-07-22 18:22:30 +0000] [27551] [INFO] Using worker: sync
[2020-07-22 18:22:30 +0000] [27554] [INFO] Booting worker with pid: 27554
- Silahkan cek ke alamat PUBLIC DNS kita dan lihat hasilnya, dan jika berhasil maka akan menampilkan halaman django seperti di bawah ini
Selamat kita telah bisa menjalankan django dengan menggunakan AWS ec2. Kalau masih belum tampil seperti di atas coba cek mungkin ada langkah atau konfigurasi yang keliru.
Install supervisor
- Install supervisor
- Buat file konfigurasi
(venv) ubuntu@ip-172-31-5-17:~/django1/geodjango1-okus$ cd /etc/supervisor/conf.d/
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ ls
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ sudo touch gunicorn.conf
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ ls
gunicorn.conf
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ mkdir /var/log/gunicorn
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ sudo touch gunicorn.conf
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ ls
gunicorn.conf
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ mkdir /var/log/gunicorn
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ sudo nano gunicorn.conf
- Cek lokasi gunicorn, untuk menentukan lokasi command pada file gunicorn.conf
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ whereis gunicorn
gunicorn: /home/ubuntu/django1/venv/bin/gunicorn
- Masukan kedalam file gunicorn.conf
[program:gunicorn]
directory=/home/ubuntu/django1/geodjango1-okus
command=/home/ubuntu/django1/venv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/django1/geodjango1-okus/app.sock django1.wsgi:application
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn/gunicorn.err.log
stdout_logfile=/var/log/gunicorn/gunicorn.out.log
[group:guni]
programs:gunicorn
directory=/home/ubuntu/django1/geodjango1-okus
command=/home/ubuntu/django1/venv/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/django1/geodjango1-okus/app.sock django1.wsgi:application
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn/gunicorn.err.log
stdout_logfile=/var/log/gunicorn/gunicorn.out.log
[group:guni]
programs:gunicorn
- Set supervisor
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ sudo supervisorctl reread
guni: available
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ sudo supervisorctl update
guni: added process group
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ sudo supervisorctl status
guni:gunicorn RUNNING pid 29381, uptime 0:00:29
(venv) ubuntu@ip-172-31-5-17:/etc/supervisor/conf.d$ cd
(venv) ubuntu@ip-172-31-5-17:~$ cd /etc/nginx/sites-available/
((venv) ubuntu@ip-172-31-5-17:/etc/nginx/sites-available$ ls
default
((venv) ubuntu@ip-172-31-5-17:/etc/nginx/sites-available$ cat default
(venv) ubuntu@ip-172-31-5-17:/etc/nginx/sites-available$ sudo touch django.conf
(venv) ubuntu@ip-172-31-5-17:/etc/nginx/sites-available$ sudo nano django.conf
(venv) ubuntu@ip-172-31-5-17:/etc/nginx/sites-available$ sudo nano django.conf
- Masukan kode program ke file django.conf
server {
listen 80;
server_name <ALAMAT PUBLIC DNS/IP>;
location / {
include proxy_params;
proxy_pass http://unix:/home/ubuntu/django1/geodjango1-okus/app.sock;
}
}
- Test nginx, setelah dilakukan konfigurasi tadi
(venv) ubuntu@ip-172-31-5-17:/etc/nginx/sites-available$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
(venv) ubuntu@ip-172-31-5-17:/etc/nginx/sites-available$ sudo ln django.conf /etc/nginx/sites-enabled/
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
(venv) ubuntu@ip-172-31-5-17:/etc/nginx/sites-available$ sudo ln django.conf /etc/nginx/sites-enabled/
(venv) ubuntu@ip-172-31-5-17:/etc/nginx/sites-available$ sudo nginx -t
nginx: [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 64
- Pada saat saya coba sudo nginx -t, terdapat error nginx: [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 64, hal ini karena nama dns public kita terlalu panjang mak harus dirubah menjadi server_names_hash_bucket_size: 64.Makan perbaikan yang saya lakukan adalah rubah file nginx.conf. langkahnya adalah
(venv) ubuntu@ip-172-31-5-17:/etc/nginx/sites-available$ cd ..
(venv) ubuntu@ip-172-31-5-17:/etc/nginx$ ls
conf.d fastcgi_params koi-win modules-available nginx.conf scgi_params sites-enabled uwsgi_params
fastcgi.conf koi-utf mime.types modules-enabled proxy_params sites-available snippets win-utf
(venv) ubuntu@ip-172-31-5-17:/etc/nginx$ sudo nano nginx.conf
- Kemudian pada bahian http, hapus komentar untuk perintah server_names_hash_bucket_size 64 menjadi 128;
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
server_names_hash_bucket_size 128;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
- Cek kembali nginx
(venv) ubuntu@ip-172-31-5-17:/etc/nginx$ cd sites-available/
(venv) ubuntu@ip-172-31-5-17:/etc/nginx/sites-available$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
- Restart service nginx, samapi tidak ada error
(venv) ubuntu@ip-172-31-5-17:/etc/nginx/sites-available$ sudo service nginx restart
- Terakhir cek halam web kita dengan alamat PUBLLIC DNS tanpa nomor Port, jika berhasil maka tampil halaman web django kita
Jika ingin mendownload tulisan ini silahkan download disini.
Referensi:
https://www.youtube.com/watch?v=u0oEIqQV_-E&list=PLY6ypwZ5LGmKvbBBzu7h3NBVE726unxYF&index=1
https://aws.amazon.com/id/ec2/
https://mothergeo-py.readthedocs.io/en/latest/development/how-to/gdal-ubuntu-pkg.html
https://www.youtube.com/watch?v=GQkP48X3nUM
https://subscription.packtpub.com/book/big_data_and_business_intelligence/9781783555079/1/ch01lvl1sec15/installing-gdal-and-ogr
https://django.readthedocs.io/en/1.4.X/ref/contrib/gis/install.html
https://medium.com/saarthi-ai/ec2apachedjango-838e3f6014ab
https://dev.to/hasanul_islam/geodjango-installation-postgis-and-gdal-36h1
https://stackoverflow.com/questions/14604653/how-to-stop-gunicorn-properly
https://stackoverflow.com/questions/13895933/nginx-emerg-could-not-build-the-server-names-hash-you-should-increase-server
https://aws.amazon.com/id/ec2/
https://mothergeo-py.readthedocs.io/en/latest/development/how-to/gdal-ubuntu-pkg.html
https://www.youtube.com/watch?v=GQkP48X3nUM
https://subscription.packtpub.com/book/big_data_and_business_intelligence/9781783555079/1/ch01lvl1sec15/installing-gdal-and-ogr
https://django.readthedocs.io/en/1.4.X/ref/contrib/gis/install.html
https://medium.com/saarthi-ai/ec2apachedjango-838e3f6014ab
https://dev.to/hasanul_islam/geodjango-installation-postgis-and-gdal-36h1
https://stackoverflow.com/questions/14604653/how-to-stop-gunicorn-properly
https://stackoverflow.com/questions/13895933/nginx-emerg-could-not-build-the-server-names-hash-you-should-increase-server
0 comments:
Post a Comment