Deploy website Django cùng Gunicorn và NGINX

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 folder static 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ệnh sudo 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