# bkdnOJ.v2 - Cấu hình uWSGI (production) * Hiện tại hệ thống backend đang được chạy bằng lệnh `runserver`, lệnh này không thích hợp với môi trường nhiều người sử dụng, vì mỗi request đến nó sẽ **tạo ra một Thread mới**, nếu đột xuất có 1000 yêu cầu đến thì sẽ có nguy cơ tiêu hao tất cả tài nguyên, cạn kiệt đối tượng Connection đến DB, v.v.. * Thực tế, chúng ta nên cấu hình cho nó luôn có một pool các thread để tái sử dụng, nhằm giảm hiện tượng "bùng nổ số lượng thread" cũng như giảm chi phí tạo lại Thread/Connection. * Việc này, ta có thể sử dụng uWSGI, đã được cấu hình sẵn. ## 0. Dừng lệnh `python manage.py runserver` ## 1. Edit file `uwsgi.ini` - Tại folder root của project, tồn tại một file tên `uswgi.ini`, trong đó sẽ có thông tin cấu hình của server. - Cấu hình hiện tại: ```uwsgi= [uwsgi] # Socket and pid file location/permission. socket = localhost:8001 # localhost only, let nginx deal with the outside ; http = 0.0.0.0:8001 pidfile = /tmp/bkdnoj-site.pid chmod-pidfile = 666 # Paths. chdir = . # Details regarding bkdnoj application. protocol = uwsgi master = true plugins = python env = DJANGO_SETTINGS_MODULE=bkdnoj.settings module = bkdnoj.wsgi:application optimize = 2 # Static files/images static-map = /media=/home/ubuntu/backend/media # Scaling settings. Tune as you like. memory-report = true cheaper-algo = backlog cheaper = 3 cheaper-initial = 5 cheaper-step = 1 cheaper-rss-limit-soft = 201326592 cheaper-rss-limit-hard = 234881024 workers = 8 ``` * Dòng 2, 3 đang quy định giao tiếp mà uWSGI tiếp nhận. Ta sử dụng `uWSGI` đế trực tiếp ra Internet, nên **comment dòng 2 lại và sử dụng dòng 3**, chỉnh lại **PORT**. * Dòng 20 mô tả map yêu cầu file tĩnh tới vị trí của nó trên ổ đĩa. `/home/ubuntu/backend` chính là đường dẫn đến thư mục project backend. * Dòng 23-30 mô tả thuật toán tạo và sử dụng worker (Thread). Cụ thể có thể đọc: [uwsgi cheaper](https://uwsgi-docs.readthedocs.io/en/latest/Cheaper.html). Tổng quát: * `cheaper = 3`: số worker (thread) tối thiểu luôn tồn tại * `cheaper-initial = 5`: số worker ban đầu sẽ tạo lúc khởi động server * `workers = 8`: số worker tối đa tạo ra, mỗi worker đảm nhiệm một request. Trên lý thuyết, số này **tương đương với số yêu cầu có thể xử lý đồng thời**. * `cheaper-step = 1`: bước nhảy, nếu tạo ra sẽ tạo `cheaper-step` worker cùng một lúc * `cheaper-algo = backlog`: một thuật toán tạo worker, Tóm tắt: số request tới nhiều hơn số worker hiện tại thì tạo worker và không tạo quá số max. Ít hơn thì giết worker đi. * `cheaper-rss-limit-soft`, `cheaper-rss-limit-hard` là giới hạn memory cho phép của một worker. ## 2. Chạy server `uwsgi` * Log vào môi trường ảo ``` source venv/bin/activate ``` * Tại `~/backend`, chạy vĩnh viễn câu lệnh sau: ``` uwsgi --ini uwsgi.ini ``` * OK. Lúc này có thể test kết nối, test lấy file PDF,...