Chuẩn bị project Django
- Project Django cần đảm bảo đã chạy ổn định, có thể chạy ổn định bằng lệnh
python manage.py runserver
- Chắc chắn project Django, file
settings.py
thì field DEBUG đã đặt làFalse
. Trong trường hợp đặt làTrue
, ngoài việc Django sẽ chủ động phục vụ file tĩnh, đồng thời expose Error message với user --> Điều này có thể tạo ra lỗ hổng đối với system. - Thực hiện export toàn bộ các tệp tin tĩnh (staticfiles) của project Django ra bằng lệnh:
-
python manage.py collectstatic
- Mục đích của việc export toàn bộ các tệp tin tĩnh là vì chúng ta sẽ giao cho
NGINX
điều khiển và phục vụ những tệp tin tĩnh này. Django sẽ không phục vụ nhiệm vụ này, từ đó dành tài nguyên cho các tác vụ khác. Sau khi export xong, ta sẽ thấy có một folderstatic
mới được tạo ra: bên trong sẽ bao gồm toàn bộ file tĩnh của ứng dụng: img, css, js,… Lưu đường dẫn đến folder static này lại.
Setup NGINX webserver
- Cài đặt NGINX bằng Terminal như sau:
sudo apt update
sudo apt install nginx
- Kiểm tra xem NGINX đã chạy hay chưa bằng cách truy cập
localhost
:
- Hoặc kiểm tra bằng lệnh
systemctl status nginx
:
Sử dụng NGINX để phục vụ file tĩnh (static file)
- Để NGINX phục vụ được file tĩnh (staticfiles), chúng ta cần cấu hình NGINX như sau. Chỉnh sửa file cnf của NGINX (thường sẽ là file
/etc/nginx/nginx.cnf
). Tại dòng alias ta sẽ dùng path của folder static đã export ra ở bước trên. Cụ thể file nginx.cnf sẽ như sau:
http {
server {
listen 80;
location /static/ {
alias/home/web/django-project/static/;
autoindex on;
allow all;
}
}
...
}
- Restart lại NGINX để xác nhận cấu hình mới bằng lệnh:
-
sudo systemctl restart nginx
- Nếu cấu hình chính xác thì NGINX đã có khả năng phục vụ file tĩnh, ta có thể dùng url dạng
localhost
để truy vấn thử một tệp tin trong folder static, nếu NGINX có thể trả về file thì đã cấu hình xong Cache staticfiles bằng NGINX.
Ví dụ về NGINX cấu hình phục vụ file tĩnh thành công, bao gồm cả cây thư mục:
Setup Gunicorn as daemon process
- Việc setup Gunicorn như một tiến trình (service) chạy ngầm của Linux là không bắt buộc. Tuy nhiên, đây là cơ chế giúp Quản trị viên (QTV) bật / tắt web service một cách thuận lợi hơn. QTV lúc này sẽ không cần nhờ CMD phức tạp của Gunicorn nữa mà chỉ cần cấu hình một lần.
- Tạo service mang tên tùy chọn, ví dụ muốn service tên
gunicorn_webservice
thì ta tạo bằng lệnhsudo vi /etc/systemd/system/gunicorn_webservice.service
. Cấu hình service như sau:
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=<Tên user thực thi service>
Group=www-data # Lưu ý cần add user trên vào group 'www-data' để tránh lỗi server 503
WorkingDirectory=<Path folder của project Django (folder có tệp tin manage.py)> (VD: /home/web/django-project/)
ExecStart=<Path của lib gunicorn của môi trường ảo> --access-logfile - --workers 3 --bind unix:<Path của tệp tin gunicorn.sock của project> <Tên project Django>.wsgi:application
(Ví dụ: ExecStart=/home/web/miniconda3/web-env/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/web/django-project/django-project.sock django-project.wsgi:application)
[Install]
WantedBy=multi-user.target
- Chạy service đã tạo bằng lệnh:
-
sudo systemctl start gunicorn sudo systemctl enable gunicorn
- Kiểm tra tình trạng service bằng lệnh:
-
sudo systemctl status gunicorn
- Kiểm tra xem tệp tin
django-project.sock
đã tồn tại hay chưa: -
ls /home/web/django-project/
- Nếu về sau có chỉnh sửa cấu hình của service
gunicorn_webservice
thì thử reset daemon bằng lệnh sau:
-
sudo systemctl daemon-reload sudo systemctl restart gunicorn
Config NGINX để kết nối với gunicorn
- Với Gunicorn đã được setup, việc chúng ta cần là kết nối NGINX với Gunicorn. Kiến trúc mô hình dự kiến lúc này như sau:
- Chỉnh sửa file cnf của NGINX (thường sẽ là file
/etc/nginx/nginx.cnf
).
http {
server {
listen 80;
location /static/ {
alias /home/web/django-project/;
autoindex on;
allow all;
}
location / {
include proxy_params;
proxy_pass http://unix://home/web/django-project/django-project.sock;
}
}
}
- Sau khi cấu hình xong, ta restart để NGINX apply cấu hình mới:
sudo systemctl restart nginx