Trong quá trình triển khai ứng dụng Django vào môi trường thực tế, việc cấu hình máy chủ web và cài đặt SSL là hai yếu tố không thể thiếu. Máy chủ web đảm bảo việc truy cập nhanh chóng và ổn định, trong khi SSL giúp bảo vệ dữ liệu bằng cách mã hóa thông tin giữa người dùng và máy chủ. Việc thực hiện đúng cách sẽ giúp website của bạn hoạt động mượt mà và an toàn hơn, mang lại sự tin cậy cho người dùng. Trong bài viết này, chúng ta sẽ đi qua quy trình chi tiết cấu hình máy chủ Nginx và Gunicorn cho Django, cũng như cách cài đặt chứng chỉ SSL từ Let’s Encrypt.

Cấu hình Web Server cho Django

Tại sao cần sử dụng Gunicorn và Nginx?

Mặc định, Django đi kèm với một web server phát triển được gọi là Django Development Server. Tuy nhiên, server này chỉ được thiết kế cho mục đích phát triển và kiểm thử, không phù hợp để triển khai sản xuất. Để vận hành một ứng dụng Django trong môi trường thực tế, chúng ta cần kết hợp Gunicorn, một WSGI server hiệu quả, với Nginx, một máy chủ web hoạt động như reverse proxy, để tối ưu hóa tốc độ và bảo mật.

Bước 1: Cài đặt Gunicorn

Gunicorn (Green Unicorn) là một server WSGI, giúp giao tiếp giữa ứng dụng Django và máy chủ web.

Cài đặt Gunicorn qua pip:

pip install gunicorn

Sau khi cài đặt thành công, bạn có thể thử chạy ứng dụng Django bằng lệnh sau:

gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application

Trong lệnh này:

  • 0.0.0.0:8000: Gunicorn sẽ chạy ứng dụng trên tất cả các địa chỉ IP của máy chủ ở cổng 8000.
  • myproject.wsgi:application: Đây là đường dẫn tới file WSGI của dự án Django. Thông thường, bạn sẽ tìm thấy file này trong thư mục myproject.

Lưu ý, đây chỉ là bước thử nghiệm để kiểm tra xem Gunicorn đã hoạt động chưa. Để tắt server, nhấn tổ hợp phím CTRL + C.

Bước 2: Cấu hình Nginx làm reverse proxy

Nginx là một máy chủ web nổi tiếng với khả năng phục vụ các ứng dụng nhanh chóng và an toàn. Chúng ta sẽ cấu hình Nginx để chuyển tiếp (proxy) các yêu cầu từ người dùng tới Gunicorn.

Cài đặt Nginx

Trước hết, bạn cần cài đặt Nginx trên hệ thống của mình. Trên Ubuntu, lệnh cài đặt như sau:

sudo apt update
sudo apt install nginx

Sau khi cài đặt, Nginx sẽ tự động khởi chạy. Bạn có thể kiểm tra trạng thái của Nginx bằng lệnh:

sudo systemctl status nginx

Cấu hình Nginx cho Django

Nginx cần biết cách chuyển tiếp yêu cầu đến ứng dụng Django của bạn. Chúng ta sẽ tạo một file cấu hình trong /etc/nginx/sites-available/.

Tạo file cấu hình mới với tên myproject:

sudo nano /etc/nginx/sites-available/myproject

Nội dung file cấu hình có thể như sau:

server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
    }

    location /static/ {
        alias /path/to/staticfiles/;
    }

    location /media/ {
        alias /path/to/mediafiles/;
    }
}

Giải thích:

  • listen 80: Lắng nghe các kết nối HTTP trên cổng 80.
  • server_name: Tên miền mà Nginx sẽ xử lý (thay example.com bằng tên miền của bạn).
  • proxy_pass: Chuyển tiếp các yêu cầu HTTP đến Gunicorn đang chạy trên 127.0.0.1:8000.
  • location /static/location /media/: Trỏ đến thư mục chứa file tĩnh (static) và file media (nếu có).

Kích hoạt cấu hình

Sau khi tạo file cấu hình, bạn cần kích hoạt nó bằng cách tạo symbolic link từ thư mục sites-available sang sites-enabled:

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

Tiếp theo, kiểm tra cấu hình của Nginx xem có lỗi không:

sudo nginx -t

Nếu không có lỗi, khởi động lại Nginx để áp dụng cấu hình:

sudo systemctl restart nginx

Lúc này, Nginx đã được cấu hình để xử lý các yêu cầu HTTP và chuyển tiếp chúng đến Gunicorn.

Cài đặt SSL cho Django

Bảo mật kết nối giữa máy chủ và người dùng bằng cách sử dụng SSL là bước quan trọng trong việc triển khai ứng dụng web. SSL sẽ mã hóa dữ liệu giữa trình duyệt và server, giúp ngăn chặn các cuộc tấn công đánh cắp dữ liệu. Chúng ta sẽ sử dụng Let’s Encrypt, một dịch vụ cung cấp chứng chỉ SSL miễn phí.

Bước 1: Cài đặt Certbot

Certbot là công cụ giúp tự động hóa việc yêu cầu và cài đặt chứng chỉ SSL từ Let’s Encrypt. Để cài đặt Certbot và plugin Nginx, sử dụng lệnh:

sudo apt install certbot python3-certbot-nginx

Bước 2: Yêu cầu chứng chỉ SSL

Để yêu cầu chứng chỉ SSL cho tên miền của bạn, hãy sử dụng Certbot với lệnh sau:

sudo certbot --nginx -d example.com -d www.example.com

Lệnh này yêu cầu chứng chỉ SSL cho hai tên miền: example.comwww.example.com. Certbot sẽ tự động cấu hình lại Nginx để sử dụng SSL. Khi quá trình hoàn tất, bạn sẽ nhận được thông báo rằng chứng chỉ đã được cài đặt thành công.

Bước 3: Cấu hình Nginx cho HTTPS

Trong một số trường hợp, bạn có thể muốn tự cấu hình file Nginx để thêm hỗ trợ SSL. File cấu hình mẫu của Nginx sau khi thêm SSL sẽ trông như sau:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
    }

    location /static/ {
        alias /path/to/staticfiles/;
    }

    location /media/ {
        alias /path/to/mediafiles/;
    }
}

File này đã được cấu hình để chuyển hướng tất cả các yêu cầu HTTP sang HTTPS và sử dụng chứng chỉ SSL.

Bước 4: Gia hạn chứng chỉ SSL

Chứng chỉ SSL từ Let’s Encrypt có thời hạn 90 ngày. Certbot có khả năng tự động gia hạn chứng chỉ, nhưng bạn nên kiểm tra quá trình gia hạn bằng lệnh:

sudo certbot renew --dry-run

Việc kiểm tra này sẽ đảm bảo rằng chứng chỉ của bạn được gia hạn đúng cách mà không gặp vấn đề gì.

Triển khai ứng dụng Django với Gunicorn, Nginx và SSL giúp tối ưu hóa hiệu suất và đảm bảo tính bảo mật của trang web. Hãy đảm bảo rằng bạn luôn cập nhật các thành phần máy chủ và kiểm tra quá trình gia hạn SSL để bảo vệ người dùng của mình.