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.
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
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
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.