Cài đặt Django/Python lên máy chủ VPS như thế nào?
Bức ảnh sau mô tả cách một website viết bằng Python/Django đưa dữ liệu từ máy chủ đến trình duyệt của người dùng.
Ở đây, máy chủ WSGI sẽ đọc hiểu các đoạn mã Python để chuyển nó thành HTML, CSS, Javascript và các tài nguyên khác. Sau đó, nó sẽ gửi các tài nguyên này đến trình duyệt của người dùng thông qua Web Server.
Trong bài này, tôi sẽ dùng Gunicorn làm máy chủ WSGI, Nginx làm web server và SQLite3 làm cơ sở dữ liệu.
Chuẩn bị cho máy chủ
Tôi sử dụng Debian 10 là hệ điều hành của máy chủ với Python 3.11 được cài đặt riêng. Bạn phải có quyền root để thực hiện các bước cài đặt.
Để tránh các lỗi vặt không cần thiết, hãy cài các gói theo script sau với quyền root:
/bin/bash -c "$(curl -fsSL https://gist.githubusercontent.com/anhtran/07f1c7f45ec0d58d09e1/raw/50bfb5a77e599a39bdabfd6e0c928725030bd49e/deb9.sh)"
Bước 1: Cài đặt Python (virtualenv) và Django
Tôi sẽ cài đặt 1 phần mềm tên là pyenv
vào user hiện hành của máy chủ:
curl https://pyenv.run | bash
Với pyenv, tôi có thể cài đặt phiên bản mới nhất của Python 3.11 như sau:
pyenv install 3.11
Sau đó tôi có thể tạo venv dễ dàng với lệnh:
pyenv virtualenv 3.11 myvenv
Rồi dùng nó để cài đặt Django vào myvenv:
pyenv activate myvenv
pip install -U pip wheel
pip install django
# cài các gói phụ thuộc nếu cần
pip install -r requirements.txt
Lúc này tôi có thể tạo một project Django mới với lệnh:
django-admin startproject myproject
cd myproject
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver
Đương nhiên, bạn có thể dùng git để clone một project Django có sẵn về máy chủ.
Bước 2: Cài đặt và thiết lập Gunicorn cùng với Supervisor
Trước tiên tôi sẽ cài đặt Gunicorn với lệnh:
pip install gunicorn
Supervisor là một công cụ giúp chạy các tiến trình ngầm (daemon) và khởi động lại chúng khi cần thiết.
Tôi sẽ cài đặt nó với lệnh:
sudo apt install supervisor
Lưu ý: Khi nào bạn gõ lệnh supervisorctl
mà không bị lỗi, thì bạn đã cài đặt thành công.
Hãy tạo 1 file supervisor.ini với nội dung như sau và chỉnh lại các đường dẫn cho đúng:
[unix_http_server]
file=/home/myuser/configs/supervisor.sock ; (the path to the socket file)
[supervisord]
logfile=/home/myuser/logs/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=error ; (log level;default info; others: debug,warn,trace)
pidfile=/home/myuser/configs/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=32000 ; (min. avail startup file descriptors;default 1024)
minprocs=32000 ; (min. avail process descriptors;default 200)
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///home/myuser/configs/supervisor.sock
[program:django]
command=/home/myuser/venv/bin/gunicorn myproject.wsgi:application -b 0.0.0.0:8800
directory=/home/myuser/django/myproject
priority=1
autostart=true
Sau đó, hãy khởi động supervisor với lệnh:
supervisord -c /home/myuser/configs/supervisor.ini
Lúc này Supervisor sẽ chạy ngầm với user hiện hành và cũng sẽ chạy Gunicorn lắng nghe trên cổng 8800.
Bạn có thể quản lý Supervisor với lệnh supervisorctl
như sau:
supervisorctl -c /home/myuser/configs/supervisor.ini
supervisorctl -c /home/myuser/configs/supervisor.ini status
supervisorctl -c /home/myuser/configs/supervisor.ini reload
supervisorctl -c /home/myuser/configs/supervisor.ini restart django
Bước 3: Cài đặt và thiết lập Nginx
Tôi sẽ cài đặt Nginx với lệnh:
sudo apt install nginx
Kiểm tra Nginx đã chạy chưa với lệnh:
sudo systemctl status nginx
Hãy tạo 1 file nginx.conf với nội dung như sau và chỉnh lại các đường dẫn cho đúng:
upstream django {
server 127.0.0.1:8800;
}
server {
listen 80;
server_name django-install.vietdev.com;
access_log off;
error_log off;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon application/octet-stream;
gzip on;
root /home/myuser/django;
index index.html index.htm;
location / {
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_read_timeout 60s;
proxy_send_timeout 180s;
proxy_pass http://django;
}
}
Lúc này, Nginx sẽ lắng nghe trên cổng 80 và chuyển các request đến Gunicorn đang chạy ở cổng 8800.
Đồng thời nó sẽ dùng domain django-install.vietdev.com
để phân giải đến máy chủ. Tức là chỉ
cần trỏ tên miền django-install.vietdev.com
về máy chủ, bạn sẽ có thể truy cập vào website.
Bước 4: Trỏ tên miền về máy chủ
Tôi dùng Cloudflare để quản lý tên miền. Bạn có thể dùng bất kỳ dịch vụ nào khác cũng được.
IPv4 là IP của máy chủ có cài đặt Nginx của chúng ta.
Bước 5: Kiểm tra kết quả
Truy cập vào địa chỉ http://django-install.google.com
và bạn sẽ thấy trang chủ của Django.
Lưu ý: Cloudflare có thể sẽ tự động chuyển sang HTTPS, bạn có thể tắt tính năng này trong phần SSL/TLS của Cloudflare
hoặc cấu hình riêng cho Nginx.
Bài viết dừng ở đây, cảm ơn bạn đã theo dõi!