Cách cài đặt Django với Nginx, Gunicorn, Supervisor và MariaDB

Django là một framework hiệu quả và rất linh động. Khi Django bắt đầu trở lên phổ biến, ngoài cách cấu hình dựa trên Apache với mod_wsgi như khuyến cáo thì ngày càng nhiều cách cấu hình phức tạp hơn để đáp ứng sự linh hoạt và ổn định của hệ thống. Trong những đó có cách cấu hình bao gồm Nginx, Gunicorn, Supervisor và MariaDB.

Mô hình Nginx, Gunicorn, Django, MariaDB

Vậy tại sao phải cần những thứ này. Mình sẽ có bài giải thích chi tiết, còn bây giờ mình giải thích ngắn gọn như sau:

  • Gunicorn là máy chủ ứng dụng WSGI giúp phân phối ứng dụng
  • Supervisor giúp chạy ứng dụng như một tiến trình nền, giúp khởi động lại ứng dụng hoặc tự động khởi động ứng dụng khi restart server
  • Nginx sẽ hứng request từ bên ngoài, cache, gzip, phân phối file tĩnh…

Đầu tiên để cài Ubuntu các bạn xem bài viết dưới đây

  • Cài đặt Ubuntu 20.4

Cài đặt MariaDB các bạn xem ở bài viết bên dưới

Sau khi cài MariaDB các bạn cần cấu hình để user trong MariaDB có quyền truy cập database từ localhost. Các bạn làm theo bài bên dưới

Quảng cáo

Ủng hộ website

Sau khi cấu hình như link trên thì chạy lệnh sau để kiểm tra

user@server:~$ sudo mysql -u root -p -e "SELECT user, host from mysql.user"
Kết quả
+--------+-----------------+
| user   | host            |
+--------+-----------------+
| jessy  | 61.38.140.3     |
| jessy  | localhost       |
| root   | localhost       |
+--------+-----------------+

Kết quả cho thấy user jessy được phép truy cập localhost, thế là bạn đã cấu hình thành công, bạn có thể sử dụng tài khoản này để kết nối project Django của mình đến database MariaDB.

Kiểm tra tường lửa

user@server:~$ sudo ufw status
Kết quả:
Status: inactive

Tường lửa đang không hoạt động. Nếu tường lửa hoạt động thì bạn cần cấu hình tường lửa để nó cho phép cổng chạy dịch vụ (ví dụ cổng 8080) bằng lệnh:

user@server:~$ sudo ufw allow 8080

Trong một số trường hợp, tường lửa sẽ cần phải chạy lệnh sau để kích hoạt cấu hình đó

user@server:~$ sudo ufw default allow outgoing
user@server:~$ sudo ufw default allow incoming

Cài đặt Django, môi trường ảo env và tạo dự án (project) mới

Tiếp theo chúng ta sẽ tiến hành cài đặt môi trường ảo python. Đầu tiên chạy lệnh cập nhật chỉ mục

user@server:~$ sudo apt update

Kiểm tra phiên bản Python mà Ubuntu 20.4 đang sử dụng

user@server:~$ python3 -V
Kết quả:
Python 3.8.10

Kết quả cho thấy Ubuntu đang sử dụng python 3.8.10. Tùy theo phiên bản mà có các lệnh khác nhau, ở đây mình sử dụng Ubuntu 20.4 và python 3.8.10 mình sẽ dùng lệnh sau để cài đặt pip và gói django từ kho lưu trữ django và cài đặt gói môi trường ảo evn

user@server:~$ sudo apt-get install python3-pip
user@server:~$ sudo apt-get install python3-venv

Sau khi quá trình cài đặt hoàn tất thì bạn có thể bắt đầu một dự án mới của Django. Hãy nhớ rằng bất cứ khi nào bạn bắt đầu một dự án mới thì bạn nên tạo một thư mục và tất cả mọi thứ hãy để trong thư mục đó, như vậy bạn sẽ không bị nhầm lẫn và khi chạy các dự án không bị nhầm lẫn môi trường.

Tạo thư mục dự án của bạn và chuyển đến thư mục đó

user@server:~$ mkdir django_project
user@server:~$ cd django_project

Tạo một môi trường ảo trong thư mục dự án bằng cách sử dụng lệnh python tương thích với phiên bản Python của bạn, ở đây mình tạo môi trường ảo có tên là project1_env

user@server:~/django_project$ python3 -m venv project1_env

Kích hoạt môi trường ảo bằng lệnh

user@server:~/django_project$ source project1_env/bin/activate

Khi môi trường ảo được kích hoạt, mọi thứ pip cài đặt nó sẽ vào hết thư mục project1_env cách ly hoàn toàn với các thứ khác trong hệ thống, vì thế nó khá là an toàn, không sợ bị lỗi hệ thống.

Khi bạn chạy môi trường ảo, các bạn để ý mỗi dòng lệnh sẽ bắt đầu bằng tên của môi trường đó

(project1_env)user@server~$

Cài đặt Django bằng pip trong môi trường ảo project1_env và kiểm tra phiên bản đã cài đặt

(project1_env)user@server:~/django_project$ pip install django
(project1_env)user@server:~/django_project$ django-admin --version
Kết quả
4.0.6

Để hủy kích hoạt môi trường ảo bạn chỉ cần chạy deactivate. Mỗi khi bạn muốn làm việc với dự án Django đừng quên kích hoạt lại môi trường ảo.

Tiếp theo các bạn tạo một dự án Django theo bài bên dưới

Ở đây mình đã tạo dự án project1 ở trong folder django_project, sau khi tạo dự án Django rồi thì mình sẽ test project này trên Máy chủ ứng dụng Django (Django Development Server)

(project1_env)user@server:~/django_project$ cd project1
(project1_env)user@server:~/django_project/project1$ python manage.py runserver 8080

Vào trình duyệt và truy cập theo địa chỉ: http://dia_chi_ip_may_chu:8080 nếu kết quả trả về ứng dụng web của bạn là thành công. Ấn Ctrl + C để thoát

Kiểm tra vào website bằng trình duyệt thành công

Cài đặt Gunicorn và Supervisor

Cài dặt Gunicorn, lưu ý chạy ở môi trường ảo nhé

(project1_env)user@server:~/django_project/project1$ pip install gunicorn

Cài xong rồi ta sẽ kiểm tra xem Gunicorn có phân phối app hay chưa bằng lệnh bên dưới

(project1_env)user@server:~/django_project/project1$ gunicorn --bind 0.0.0.0:8080 project1.wsgi

Câu lệnh trên đã chỉ định đường dẫn tương đối đến file wsgi.py của project. Trong file đó có một hàm tên là application giúp Gurnicon có thể kết nối đến ứng dụng. Để kiểm tra ta lại vào trình duyệt và truy cập theo địa chỉ: http://dia_chi_ip_may_chu:8080 nếu kết quả trả về ứng dụng web của bạn là thành công. Ấn Ctrl + C để thoát.

Tiếp theo chúng ta cần ngừng kích hoạt môi trường ảo, sau đó cài đặt Supervisor

(project1_env)user@server:~/django_project/project1$ deactivate
user@server:~/django_project/project1$ cd ~
user@server:~$ sudo apt-get install supervisor

Tạo file log và cấu hình cho Gunicorn

user@server:~$ nano django_project/logs/access.log
user@server:~$ nano django_project/logs/error.log
user@server:~$ sudo nano /etc/supervisor/conf.d/gunicorn.conf

Thêm vào file cấu hình thông tin khai báo ứng dụng, địa chỉ IP phân phối và cổng 8080, nơi lưu file log…

[program:project1]
directory=/home/user/django_project/project1
command=/home/user/django_project/project1_env/bin/gunicorn --bind 127.0.0.1:8080 project1.wsgi
stdout_logfile = /home/user/django_project/logs/access.log
stderr_logfile = /home/user/django_project/logs/error.log
stdout_logfile_maxbytes=5000000
stderr_logfile_maxbytes=5000000
stdout_logfile_backups=100000
stderr_logfile_backups=100000
autostart=true
autorestart=true
startsecs=10
stopasgroup=true
priority=99

Sau đó áp dụng file cấu hình để chạy

user@server:~$ sudo systemctl start supervisor
user@server:~$ sudo systemctl enable supervisor
user@server:~$ sudo supervisorctl reread
user@server:~$ sudo supervisorctl update

Mỗi lần cập nhật View của Django các bạn cần restart lại project bằng lệnh

user@server:~$ sudo supervisorctl restart project1

Kiểm tra trạng thái của project có đang chạy hay không bằng lệnh

user@server:~$ sudo supervisorctl status project1
project1                         STARTING 

Cài đặt và cấu hình Nginx

Phần này mình sẽ hướng dẫn cấu hình nginx cơ bản nhât, để có các cấu hình nâng cao hơn các bạn tham khảo các bài khác nhé.

user@server:~$ sudo apt-get install nginx

Sau khi cài đặt xong kiểm tra bằng lệnh

user@server:~$ systemctl status nginx
Kết quả:
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2022-09-21 6:18:29 UTC; 3 days ago
     Docs: man:nginx(8)
 Main PID: 2461 (nginx)
    Tasks: 2 (limit: 2273)
   Memory: 3.5M
   CGroup: /system.slice/nginx.service
           ├─2461 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           └─2463 nginx: worker process

Tạo cấu hình server ảo Nginx, mỗi server ảo sẽ được cấu hình bởi file nằm trong thư mục /etc/nginx/sites-available . Bạn sẽ chọn những web mà bạn muốn kích hoạt bằng cách tạo liên kết tượng trưng (symbolic links, softlink) đến thư mục /etc/nginx/sites-enabled

Bây giờ chúng ta sẽ tạo file log và file cấu hình nginx cho dự án django bằng câu lệnh

user@server:~$ nano django_project/logs/nginx-access.log
user@server:~$ nano django_project/logs/nginx-error.log
user@server:~$ sudo nano /etc/nginx/sites-available/project1

Sau đó thêm cấu hình sau:

server {
    listen   80;
    server_name test1.com;
    client_max_body_size 4G;

    access_log /home/user/django_project/logs/nginx-access.log;
    error_log /home/user/django_project/logs/nginx-error.log;

    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }
    location /static/ {
        alias /home/user/django_project/project1;
        #chỗ này nếu website không hiển thị các file trong thư mục static thì đổi alias thành root nhé
    }
} 

Ấn Ctril + O và Ctrl + X để lưu. Sau đó tạo liên kết tượng trưng và restart nginx bằng các lệnh

user@server:~$ sudo ln -s /etc/nginx/sites-available/project1 /etc/nginx/sites-enabled
user@server:~$ sudo nginx -t
user@server:~$ sudo systemctl restart nginx

Nếu không xảy ra lỗi gì, các bạn vào trình duyệt bằng đường dẫn http://test1.com là thành công. À với các bạn thử nghiệm bằng VPS trên máy tính của chính mình thì các bạn dùng file hosts để đặt domain nhé. Tức là add dòng này vào file hosts

#ip của máy ảo
192.168.0.15 test1.com

Có thể bạn sẽ gặp lỗi Nginx không phân phối static file như CSS, Image, JS. Lúc này cần dùng đến middleware trên Django tên là WhiteNoise để giúp phân phối các file này. Chi tiết xem ở link bên dưới. Hoặc xem lại cấu hình nginx và STATIC_ROOT trong file project1/setting.py

  • Sử dụng middleware WhiteNoise trên Django

Như vậy mình đã giúp các bạn hoàn thiện cấu hình cài Django kết hợp Gunicorn, Nginx và Supervisor. Mong các bạn đóng góp để website ngày càng phát triển. Cảm ơn các bạn rất nhiều.

Add Comment