uWSGI
Lưu ý quan trọng: Tài liệu này chỉ dành cho cài đặt bare metal (không dùng Docker).
Nếu bạn dùng Docker (khuyến nghị), xem Cài đặt với Docker.
uWSGI là application server chạy Django, thay thế cho runserver trong production.
Cài đặt
uWSGI đã được cài trong quá trình cài đặt website.
Nếu chưa có:
source lcojsite/bin/activate
pip3 install uwsgiCấu hình
File uwsgi.ini
Tạo file uwsgi.ini trong thư mục site:
[uwsgi]
# Django project
chdir = /home/lcoj/site
module = dmoj.wsgi:application
# Virtual environment
home = /home/lcoj/lcojsite
# Process
master = true
processes = 4
threads = 2
# Socket
socket = /tmp/lcoj-site.sock
chmod-socket = 666
vacuum = true
# Logging
logto = /var/log/uwsgi/lcoj-site.log
# Performance
max-requests = 5000
harakiri = 60Giải thích:
chdir: Thư mục projectmodule: Module WSGIhome: Virtual environmentprocesses: Số worker processesthreads: Số threads mỗi processsocket: Unix socket để nginx kết nốimax-requests: Restart worker sau N requestsharakiri: Timeout (giây)
Tạo thư mục log
mkdir -p /var/log/uwsgi
chown lcoj:lcoj /var/log/uwsgiChạy với Supervisor
File /etc/supervisor/conf.d/site.conf:
[program:site]
command=/home/lcoj/lcojsite/bin/uwsgi --ini /home/lcoj/site/uwsgi.ini
directory=/home/lcoj/site
user=lcoj
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/uwsgi/site-supervisor.logKhởi động:
supervisorctl update
supervisorctl start siteCấu hình Nginx
File nginx config:
upstream lcoj {
server unix:///tmp/lcoj-site.sock;
}
server {
listen 80;
server_name luyencode.net;
location / {
uwsgi_pass lcoj;
include uwsgi_params;
}
location /static/ {
alias /home/lcoj/site/staticfiles/;
}
location /media/ {
alias /home/lcoj/site/media/;
}
}Khởi động lại nginx:
service nginx reloadTối ưu
Số processes
Công thức: processes = (CPU cores × 2) + 1
Ví dụ: 4 cores → 9 processes
processes = 9Threads
Tăng threads nếu có nhiều I/O:
threads = 4Buffer size
Tăng nếu có request lớn:
buffer-size = 32768Lazy apps
Load app sau khi fork (tiết kiệm RAM):
lazy-apps = trueOffload
Offload static files:
offload-threads = 4Monitoring
Stats server
Thêm vào uwsgi.ini:
stats = 127.0.0.1:9191Xem stats:
uwsgitop 127.0.0.1:9191Cài đặt uwsgitop:
pip3 install uwsgitopLog
Xem log realtime:
tail -f /var/log/uwsgi/lcoj-site.logHoặc qua supervisor:
supervisorctl tail -f siteXử lý lỗi
uWSGI không start:
- Kiểm tra
uwsgi.inisyntax - Kiểm tra đường dẫn
- Xem log:
supervisorctl tail -f site
502 Bad Gateway:
- Kiểm tra uWSGI đang chạy
- Kiểm tra socket file tồn tại:
ls -la /tmp/lcoj-site.sock - Kiểm tra quyền socket
Slow response:
- Tăng
processesvàthreads - Kiểm tra database performance
- Kiểm tra
harakiritimeout
Memory leak:
- Giảm
max-requests - Kiểm tra code có leak không
- Restart định kỳ
Reload
Graceful reload
Không downtime:
supervisorctl restart siteHoặc:
touch /home/lcoj/site/uwsgi.iniForce reload
killall -9 uwsgi
supervisorctl start siteLưu ý
- Không dùng
runservertrong production - Monitor RAM và CPU usage
- Backup config trước khi thay đổi
- Test trên staging trước khi deploy production
