Triển Khai Kiến Trúc LNMP Với Nginx, uWSGI Và Django

Tổng Quan Về Kiến Trúc LNMP

LNMP là viết tắt của cụm công nghệ bao gồm Linux, Nginx, MySQL và Python. Trong mô hình này, Nginx đóng vai trò là máy chủ web frontend, chịu trách nhiệm xử lý các yêu cầu từ client. Tuy nhiên, Nginx không thể trực tiếp thực thi các mã nguồn động như Python. Do đó, cơ chế xử lý请求 được phân chia như sau:

  • Yêu cầu tĩnh: Các file không thay đổi như hình ảnh, CSS, HTML thuần. Nginx sẽ trực tiếp trả về nội dung này cho người dùng.
  • Yêu cầu động: Các nội dung được sinh ra dynamically dựa trên logic nghiệp vụ hoặc dữ liệu từ database. Nginx sẽ chuyển tiếp các yêu cầu này thông qua giao thức uWSGI tới ứng dụng Python phía sau.

Cơ Chế Matching Trong Nginx Location

Khối location trong Nginx dùng để định tuyến yêu cầu dựa trên URI. Khi có nhiều khối location trùng khớp, Nginx sẽ dựa vào độ ưu tiên để quyết định khối nào được thực thi. Thứ tự ưu tiên cụ thể như sau:

Ký hiệu Ý nghĩa Độ ưu tiên
= Khớp chính xác tuyệt đối Cao nhất (1)
^~ Khớp tiền tố chuỗi (không dùng regex) Cao (2)
~ Khớp biểu thức chính quy (có phân biệt hoa thường) Trung bình (3)
~* Khớp biểu thức chính quy (không phân biệt hoa thường) Trung bình (3)
/ Khớp chung (default) Thấp nhất (4)

Ví dụ minh họa cấu hình ưu tiên:

server {
    listen 80;
    server_name app.local;

    # Ưu tiên cao nhất: Khớp chính xác đường dẫn /health
    location = /health {
        return 200 "Status OK";
    }

    # Ưu tiên cao: Khớp tiền tố /static
    location ^~ /static/ {
        alias /var/www/assets/;
    }

    # Ưu tiên trung bình: Khớp regex không phân biệt hoa thường
    location ~* \.(jpg|png)$ {
        expires 30d;
    }

    # Ưu tiên thấp nhất: Catch-all
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8080;
    }
}

Thiết Lập Môi Trường Và uWSGI

Để triển khai ứng dụng Python Django, cần chuẩn bị môi trường Linux, cài đặt các thư viện phụ trợ và cấu hình uWSGI làm trung gian.

1. Tạo người dùng và cài đặt phụ thuộc

Nên tạo một tài khoản riêng để chạy dịch vụ nhằm tăng cường bảo mật.

# Tạo nhóm và người dùng webops
groupadd webops -g 2000
useradd webops -u 2000 -g 2000 -r -M -s /sbin/nologin

# Cài đặt các gói phát triển cần thiết
yum install -y python3 python3-devel gcc libxml2-devel openssl-devel pcre-devel

2. Cài đặt Django và uWSGI

pip3 install django
pip3 install uwsgi

3. Khởi tạo dự án Django

cd /srv/www
django-admin startproject community
cd community
django-admin startapp portal

# Cấu hình cho phép tất cả host truy cập trong quá trình test
vim community/settings.py
# Thay đổi:
ALLOWED_HOSTS = ['*']

4. Cấu hình uWSGI

Tạo file cấu hình /srv/www/community/uwsgi_config.ini:

[uwsgi]
# Sử dụng socket TCP
socket = 127.0.0.1:8080
# Thư mục gốc của dự án
chdir = /srv/www/community
# File wsgi entry point
wsgi-file = community/wsgi.py
module = community.wsgi
# Bật chế độ master
master = true
# Số lượng worker processes
processes = 4
# Dọn dẹp file socket khi tắt
vacuum = true
# Log file
logto = /var/log/uwsgi/app.log

Khởi động uWSGI dưới dạng daemon:

uwsgi --ini /srv/www/community/uwsgi_config.ini --uid 2000

5. Cấu hình Nginx Reverse Proxy

Tạo file cấu hình tại /etc/nginx/conf.d/django_app.conf:

server {
    listen 80;
    server_name app.local;

    location / {
        include uwsgi_params;
        # Trỏ tới socket của uWSGI
        uwsgi_pass 127.0.0.1:8080;
        uwsgi_read_timeout 30;
        
        # Truyền tham số môi trường
        uwsgi_param UWSGI_SCRIPT community.wsgi;
        uwsgi_param UWSGI_CHDIR /srv/www/community;
        
        client_max_body_size 50m;
    }
}

Sau khi chỉnh sửa, reload lại Nginx:

systemctl reload nginx

Triển Khai Hệ Thống Forum Hoàn Chỉnh

Dưới đây là quy trình triển khai một ứng dụng Forum thực tế kết nối với cơ sở dữ liệu MariaDB/MySQL.

1. Cài đặt và cấu hình Database

Trên máy chủ database, cài đặt và cấu hình quyền truy cập từ xa:

yum install -y mariadb-server mariadb
systemctl enable --now mariadb

# Truy cập mysql và cấp quyền
mysql -u root -p
> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY 'SecurePass123' WITH GRANT OPTION;
> FLUSH PRIVILEGES;
> CREATE DATABASE forum_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2. Triển khai mã nguồn ứng dụng

# Giải nén và di chuyển code
unzip forum_source.zip
mv forum_source /srv/www/forum

# Xử lý migration files cũ
cd /srv/www/forum/app/migrations
rm -rf 00*.py __pycache__

# Cài đặt phiên bản Django tương thích và driver MySQL
pip3 uninstall django -y
pip3 install django==3.2
pip3 install pymysql

# Cấu hình kết nối database trong settings.py
vim /srv/www/forum/forum/settings.py

Nội dung cấu hình database:

ALLOWED_HOSTS = ['*']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'forum_db',
        'USER': 'admin',
        'PASSWORD': 'SecurePass123',
        'HOST': '192.168.10.5',
        'PORT': 3306,
        'OPTIONS': {'charset': 'utf8mb4'}
    }
}

Để sử dụng pymysql thay thế MySQLdb, thêm vào file forum/__init__.py:

import pymysql
pymysql.install_as_MySQLdb()

3. Thực hiện Migration

cd /srv/www/forum
python3 manage.py makemigrations
python3 manage.py migrate

4. Cấu hình uWSGI cho Forum

Tạo file /srv/www/forum/uwsgi_forum.ini:

[uwsgi]
socket = 127.0.0.1:8081
chdir = /srv/www/forum
wsgi-file = forum/wsgi.py
module = forum.wsgi
master = true
processes = 6
vacuum = true

Khởi chạy service:

uwsgi --ini /srv/www/forum/uwsgi_forum.ini --uid 2000

5. Cấu hình Nginx cho Forum

Cập nhật file /etc/nginx/conf.d/forum.conf:

server {
    listen 80;
    server_name forum.local;

    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8081;
        uwsgi_param UWSGI_SCRIPT forum.wsgi;
        uwsgi_param UWSGI_CHDIR /srv/www/forum;
        client_max_body_size 50m;
    }
}

Khởi động lại Nginx và kiểm tra truy cập:

systemctl restart nginx

Thẻ: nginx uwsgi Django linux mysql

Đăng vào ngày 30 tháng 6 lúc 14:27