Hướng dẫn deploy Django trên VPS Ubuntu từ A đến Z
Từng bước đưa ứng dụng Django lên VPS Ubuntu: chuẩn bị máy chủ, cài môi trường Python, chạy Gunicorn, cấu hình Nginx và kiểm tra hoạt động.
- 8 phút đọc
- 2 lượt xem

CÔNG TY TNHH CÔNG NGHỆ INUX
Từng bước đưa ứng dụng Django lên VPS Ubuntu: chuẩn bị máy chủ, cài môi trường Python, chạy Gunicorn, cấu hình Nginx và kiểm tra hoạt động.

Hướng dẫn cài WireGuard trên VPS Ubuntu, cấu hình đường hầm VPN và kết nối máy tính hoặc điện thoại. Có hướng dẫn mở cổng, kiểm tra kết nối và xử lý lỗi thường gặp.
Khởi tạo tự động ngay sau khi thanh toán, chuyển khoản bằng mã QR, bật tắt và cài lại máy chủ trong trang quản lý.
Đưa ứng dụng từ máy tính cá nhân lên máy chủ là bước quan trọng để website Django có thể hoạt động ổn định và truy cập qua Internet. Trong hướng dẫn này, bạn sẽ thực hiện các bước deploy Django trên VPS Ubuntu, từ chuẩn bị môi trường đến cấu hình dịch vụ chạy nền và máy chủ web. Các lệnh minh họa phù hợp với Ubuntu phổ biến hiện nay; hãy thay tên dự án, tên miền và đường dẫn bằng thông tin thực tế của bạn.

Trước khi cài Django Ubuntu, bạn cần có một VPS Ubuntu, quyền truy cập SSH và mã nguồn ứng dụng đã sẵn sàng. Bạn cũng nên trỏ tên miền về địa chỉ IP của VPS nếu muốn truy cập website bằng tên miền. Trong DNS, bản ghi A của tên miền cần trỏ đến IP máy chủ.
Kết nối máy chủ bằng SSH:
ssh ten_nguoi_dung@DIA_CHI_IPCập nhật danh sách gói và cài một số công cụ cần thiết:
sudo apt update
sudo apt upgrade -y
sudo apt install -y python3 python3-venv python3-pip nginx gitNên triển khai ứng dụng bằng một tài khoản thường thay vì chạy tiến trình Django với quyền root. Nếu chưa có tài khoản riêng, bạn có thể tạo tài khoản deploy:
sudo adduser deploySau đó đăng nhập bằng tài khoản này hoặc chuyển sang tài khoản bằng su - deploy. Tạo thư mục chứa ứng dụng, chẳng hạn /srv/myproject, rồi tải mã nguồn bằng Git hoặc chép mã nguồn lên máy chủ. Ví dụ với Git:
sudo mkdir -p /srv/myproject
sudo chown deploy:deploy /srv/myproject
cd /srv/myproject
git clone DIA_CHI_REPOSITORY .Đường dẫn DIA_CHI_REPOSITORY cần được thay bằng địa chỉ kho mã nguồn của bạn. Nếu dự án nằm trong thư mục con sau khi clone, hãy điều chỉnh các lệnh ở những bước tiếp theo cho đúng.
Môi trường ảo giúp các thư viện của ứng dụng được tách biệt với Python hệ thống và các dự án khác trên VPS. Tại thư mục dự án, tạo môi trường ảo và kích hoạt:
cd /srv/myproject
python3 -m venv venv
source venv/bin/activateKhi môi trường đã được kích hoạt, dấu nhắc lệnh thường hiển thị tên venv. Cài các thư viện từ tệp phụ thuộc của dự án:
pip install --upgrade pip
pip install -r requirements.txtNếu dự án chưa có requirements.txt, hãy tạo tệp này trong môi trường phát triển và bổ sung các gói cần thiết, trong đó có Django và Gunicorn. Gunicorn là máy chủ ứng dụng WSGI thường dùng để chạy Django phía sau Nginx. Ví dụ, nếu cần cài trực tiếp:
pip install django gunicornSau đó lưu lại danh sách gói để có thể tái tạo môi trường:
pip freeze > requirements.txt
Trước khi khởi chạy, hãy kiểm tra tệp cấu hình Django, thường là settings.py. Không nên để DEBUG = True trên máy chủ thật. Đặt DEBUG = False và khai báo tên miền cùng địa chỉ cần được phép truy cập trong ALLOWED_HOSTS, ví dụ:
DEBUG = False
ALLOWED_HOSTS = ['example.com', 'www.example.com', 'DIA_CHI_IP']Thay các giá trị ví dụ bằng tên miền và IP thực tế. Không đưa SECRET_KEY, mật khẩu cơ sở dữ liệu hay thông tin nhạy cảm vào kho mã nguồn công khai. Có thể đọc chúng từ biến môi trường để tách cấu hình khỏi mã ứng dụng. Ví dụ trong settings.py:
import os
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']Bạn cần thiết lập biến này trong môi trường chạy ứng dụng ở bước tạo dịch vụ systemd. Hãy dùng một khóa bí mật riêng cho môi trường production và bảo vệ tệp chứa cấu hình.
Tiếp theo, xác định thư mục lưu tệp tĩnh. Trong settings.py, cấu hình STATIC_ROOT, chẳng hạn:
STATIC_URL = 'static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'Nếu ứng dụng nhận tệp tải lên, cấu hình thêm MEDIA_ROOT và MEDIA_URL, đồng thời lên kế hoạch lưu trữ, sao lưu các tệp đó. Từ thư mục dự án, chạy kiểm tra cấu hình và tạo dữ liệu ban đầu:
python manage.py check --deploy
python manage.py migrate
python manage.py collectstaticLệnh kiểm tra có thể đưa ra cảnh báo bảo mật cần xử lý theo cấu hình ứng dụng. Nếu dùng cơ sở dữ liệu ngoài SQLite, hãy đảm bảo thông tin kết nối đã được cấu hình và máy chủ cơ sở dữ liệu sẵn sàng trước khi chạy migrate. Với môi trường production, nên cân nhắc hệ quản trị cơ sở dữ liệu phù hợp với yêu cầu của ứng dụng và thiết lập sao lưu định kỳ.
Không nên để ứng dụng chạy bằng một lệnh thủ công trong phiên SSH vì tiến trình có thể dừng khi phiên kết thúc. Systemd giúp chạy Gunicorn như một dịch vụ, tự khởi động lại khi gặp lỗi và khởi chạy cùng hệ thống.
Trước tiên, kiểm tra tên package chứa wsgi.py. Nếu dự án có cấu trúc /srv/myproject/config/wsgi.py, module WSGI là config.wsgi. Thử chạy Gunicorn thủ công để xác nhận đường dẫn:
cd /srv/myproject
venv/bin/gunicorn --bind 127.0.0.1:8000 config.wsgi:applicationNếu lệnh chạy thành công, mở một phiên SSH khác để kiểm tra nội bộ:
curl -I http://127.0.0.1:8000Dừng tiến trình thử bằng Ctrl+C, rồi tạo dịch vụ systemd:
sudo nano /etc/systemd/system/myproject.serviceThêm cấu hình sau và sửa User, Group, WorkingDirectory, đường dẫn môi trường ảo cùng module WSGI theo dự án:
[Unit]
Description=Gunicorn for Django project
After=network.target
[Service]
User=deploy
Group=www-data
WorkingDirectory=/srv/myproject
EnvironmentFile=/etc/myproject.env
ExecStart=/srv/myproject/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 config.wsgi:application
Restart=on-failure
[Install]
WantedBy=multi-user.targetTạo tệp biến môi trường mà dịch vụ tham chiếu:
sudo nano /etc/myproject.envThêm khóa bí mật, không cần viết export:
DJANGO_SECRET_KEY=thay-bang-khoa-bi-mat-cua-banGiới hạn quyền đọc tệp này, sau đó nạp và khởi động dịch vụ:
sudo chown root:root /etc/myproject.env
sudo chmod 600 /etc/myproject.env
sudo systemctl daemon-reload
sudo systemctl enable --now myproject
sudo systemctl status myprojectNếu dịch vụ không chạy, xem nhật ký để tìm nguyên nhân:
sudo journalctl -u myproject -n 100 --no-pagerCác lỗi thường gặp gồm sai module WSGI, thiếu thư viện, quyền truy cập thư mục hoặc biến môi trường chưa được khai báo.

Gunicorn hiện chỉ lắng nghe trên 127.0.0.1, vì vậy Nginx sẽ nhận yêu cầu từ bên ngoài rồi chuyển tiếp đến ứng dụng. Tạo cấu hình cho website:
sudo nano /etc/nginx/sites-available/myprojectVí dụ cấu hình tối thiểu:
server {
listen 80;
server_name example.com www.example.com;
location /static/ {
alias /srv/myproject/staticfiles/;
}
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;
}
}Thay example.com bằng tên miền của bạn. Tạo liên kết kích hoạt website, kiểm tra cú pháp rồi tải lại Nginx:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxNếu tệp cấu hình mặc định gây xung đột, hãy xem xét vô hiệu hóa liên kết mặc định sau khi xác nhận không còn website nào sử dụng. Đảm bảo Nginx có quyền đọc thư mục tĩnh. Với cấu hình UFW, chỉ mở các cổng cần thiết như SSH, HTTP và HTTPS; không mở cổng Gunicorn ra Internet.
Khi tên miền đã trỏ đúng IP và website truy cập được qua HTTP, hãy cấu hình HTTPS bằng chứng chỉ TLS phù hợp. Sau khi bật HTTPS, kiểm tra lại chuyển hướng, cookie bảo mật và cấu hình proxy của Django; không giả định ứng dụng đã nhận biết kết nối HTTPS nếu các thiết lập proxy chưa phù hợp.
Mở tên miền hoặc IP trên trình duyệt và kiểm tra các chức năng chính: trang chủ, đăng nhập, biểu mẫu, kết nối cơ sở dữ liệu và tệp tĩnh. Nếu truy cập bằng tên miền bị lỗi nhưng Gunicorn phản hồi trên localhost, hãy kiểm tra DNS, server_name, ALLOWED_HOSTS và cấu hình Nginx.
Một số lệnh hữu ích khi kiểm tra Django VPS:
sudo systemctl status myproject: xem trạng thái ứng dụng.sudo journalctl -u myproject -f: theo dõi nhật ký Gunicorn trực tiếp.sudo nginx -t: kiểm tra cú pháp cấu hình Nginx.sudo tail -f /var/log/nginx/error.log: xem lỗi Nginx.curl -I http://127.0.0.1:8000: kiểm tra Gunicorn từ bên trong VPS.Nếu website trả về lỗi 502, hãy xác nhận dịch vụ Gunicorn đang hoạt động và Nginx đang chuyển tiếp đúng địa chỉ, cổng. Nếu gặp lỗi 400 về host, kiểm tra lại ALLOWED_HOSTS. Nếu trang không có CSS hoặc hình ảnh tĩnh, chạy lại collectstatic, xác nhận STATIC_ROOT và đường dẫn alias trong Nginx trùng nhau.
Sau khi cập nhật mã nguồn, quy trình thường gồm cài các gói mới, chạy migrate khi cần, thu thập tệp tĩnh và khởi động lại dịch vụ:
cd /srv/myproject
sudo -u deploy /srv/myproject/venv/bin/pip install -r requirements.txt
sudo -u deploy /srv/myproject/venv/bin/python manage.py migrate
sudo -u deploy /srv/myproject/venv/bin/python manage.py collectstatic --noinput
sudo systemctl restart myprojectTrước khi cập nhật trên website đang phục vụ người dùng, hãy sao lưu dữ liệu và kiểm tra thay đổi trong môi trường thử nghiệm nếu có. Việc lưu bản sao mã nguồn, cơ sở dữ liệu và tệp người dùng giúp bạn chủ động hơn khi cần khôi phục.
Để deploy Django trên VPS Ubuntu, bạn cần chuẩn bị môi trường Python riêng, cấu hình an toàn, chạy ứng dụng bằng Gunicorn và dùng Nginx làm reverse proxy. Sau khi hoàn tất, hãy kiểm tra nhật ký, HTTPS, dữ liệu và tệp tĩnh để xác nhận website hoạt động đúng. Nếu đang chọn hạ tầng cho dự án Django, bạn có thể tham khảo các gói VPS AMD EPYC Gen 3 hoặc VPS Platinum Gen 2 của VibeVPS, hiện có gói từ 81.000đ/tháng, rồi lựa chọn cấu hình phù hợp với nhu cầu thực tế.
Hướng dẫn kết nối VPS Windows bằng Remote Desktop từ máy tính Windows, macOS hoặc Linux. Bài viết cũng chỉ cách kiểm tra và khắc phục các lỗi RDP thường gặp.
Swap có thể hỗ trợ VPS Linux khi RAM gần cạn bằng cách dùng một phần ổ đĩa làm bộ nhớ hoán đổi. Bài viết hướng dẫn kiểm tra, tạo và quản lý Swap an toàn.