---
title: "Hướng dẫn xây dựng ứng dụng Python với Flask trên Ubuntu 22.04"
description: "Trong hướng dẫn này, bạn sẽ xây dựng một ứng dụng Python sử dụng microframework Flask trên Ubuntu 22.04. Phần lớn tutorial sẽ trình bày cách thiết lập máy chủ ứng dụng Gunicorn và cách khởi chạy ứng dụng cũng như cấu hình Nginx để làm reverse proxy phía trước."
url: https://cloudfly.vn/huong-dan-xay-dung-ung-dung-python-voi-flask-tren-ubuntu-2204
image: https://media.cloudfly.vn/posts/xay-dung-ung-dung-python-voi-flask.png
---

# Hướng dẫn xây dựng ứng dụng Python với Flask trên Ubuntu 22.04

![description image](https://media.cloudfly.vn/posts/xay-dung-ung-dung-python-voi-flask.png)
## Prerequisites

Trước khi bắt đầu hướng dẫn này, bạn nên có:

- Một máy chủ đã cài đặt Ubuntu 22.04 và một người dùng không phải root với quyền sudo.
- Đã cài đặt Nginx, theo bước 1 và 2 của [How To Install Nginx on Ubuntu 22.04]
- Một tên miền đã được cấu hình trỏ đến máy chủ của bạn. 
- Đảm bảo tạo các bản ghi DNS sau:
  - Bản ghi A với `your_domain` trỏ tới địa chỉ IP công khai của máy chủ.
  - Bản ghi A với `www.your_domain` trỏ tới địa chỉ IP công khai của máy chủ.
- Hiểu biết về chuẩn WSGI mà Gunicorn server sẽ dùng để giao tiếp với ứng dụng Flask của bạn. [Thảo luận chi tiết về WSGI]

### Step 1 — Cài đặt các thành phần từ kho Ubuntu

Bước đầu tiên là cài đặt tất cả các thành phần cần thiết từ kho Ubuntu. Bao gồm `pip`, trình quản lý gói Python, sẽ quản lý các thành phần Python. Bạn cũng sẽ lấy các file phát triển Python cần thiết để xây dựng một số thành phần Gunicorn.

Đầu tiên, cập nhật chỉ mục gói cục bộ và cài các gói cần thiết để xây dựng môi trường Python. Bao gồm `python3-pip` và một số gói cùng công cụ phát triển khác:

```bash
sudo apt update
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools
```

Với các gói đã có, bước tiếp theo là tạo môi trường ảo cho dự án của bạn.

### Step 2 — Tạo môi trường ảo Python

Tiếp theo, bạn sẽ tạo môi trường ảo để cách ly ứng dụng Flask với các file Python khác trên hệ thống của bạn.

Bắt đầu bằng cách cài đặt gói `python3-venv`, sẽ cài module `venv`:

```bash
sudo apt install python3-venv
```

Tạo một thư mục cha cho dự án Flask của bạn. Di chuyển vào thư mục sau khi tạo:

```bash
mkdir ~/myproject
cd ~/myproject
```

Tạo môi trường ảo để chứa các gói Python của dự án Flask:

```bash
python3 -m venv myprojectenv
```

Lệnh này sẽ cài một bản Python và `pip` cục bộ vào thư mục `myprojectenv` trong thư mục dự án của bạn.

Trước khi cài ứng dụng trong môi trường ảo, bạn cần kích hoạt nó:

```bash
source myprojectenv/bin/activate
```

Dấu nhắc lệnh của bạn sẽ thay đổi để báo hiệu bạn đang hoạt động trong môi trường ảo. Ví dụ: `(myprojectenv)user@host:~/myproject$`.

### Step 3 — Thiết lập ứng dụng Flask

Khi đã ở trong môi trường ảo, bạn có thể cài Flask và Gunicorn và bắt đầu thiết kế ứng dụng.

Đầu tiên, cài `wheel` bằng pip để đảm bảo gói cài đặt kể cả khi không có wheel:

```bash
pip install wheel
```

> **Lưu ý**: Dù bạn dùng phiên bản Python nào, khi kích hoạt môi trường ảo, nên dùng lệnh `pip` thay vì `pip3`.

Tiếp theo, cài Flask và Gunicorn:

```bash
pip install gunicorn flask
```

#### Tạo một ứng dụng mẫu

Bây giờ bạn có Flask, tạo ứng dụng đơn giản. Flask là microframework, không bao gồm nhiều công cụ như các framework khác, nó tồn tại chủ yếu như module để import trong dự án giúp khởi tạo web app.

Tạo file `myproject.py` trong thư mục dự án:

```bash
nano ~/myproject/myproject.py
```

Code ứng dụng sẽ nằm trong file này, import Flask và khởi tạo một Flask object. Bạn có thể định nghĩa các hàm xử lý theo đường dẫn:

```python
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1 style='color:blue'>Hello There!</h1>"

if __name__ == "__main__":
    app.run(host='0.0.0.0')
```

Nội dung này định nghĩa nội dung hiển thị khi truy cập root domain. Lưu và đóng file lại.

Nếu bạn đã bật firewall UFW, mở cổng 5000:

```bash
sudo ufw allow 5000
```

Chạy thử app Flask:

```bash
python myproject.py
```

Bạn sẽ thấy thông báo dạng:

```
* Serving Flask app "myproject" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
```

Truy cập `http://your_server_ip:5000` trên trình duyệt sẽ thấy trang với chữ Hello There! màu xanh.

Dùng `CTRL-C` để dừng server phát triển Flask.

### Tạo điểm vào WSGI

Tạo file làm điểm vào cho ứng dụng, sẽ nói Gunicorn cách tương tác với app.

```bash
nano ~/myproject/wsgi.py
```

Nội dung file:

```python
from myproject import app

if __name__ == "__main__":
    app.run()
```

Lưu và đóng file.

### Step 4 — Cấu hình Gunicorn

Kiểm tra Gunicorn chạy app chính xác:

```bash
cd ~/myproject
gunicorn --bind 0.0.0.0:5000 wsgi:app
```

Sẽ thấy thông báo Gunicorn khởi động và lắng nghe ở port 5000.

Truy cập `http://your_server_ip:5000` sẽ thấy app Flask.

Nhấn `CTRL-C` để dừng Gunicorn.

Deactive môi trường ảo:

```bash
deactivate
```

Tiếp theo, tạo service systemd để Gunicorn tự động chạy lúc khởi động:

```bash
sudo nano /etc/systemd/system/myproject.service
```

Nội dung:

```
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target
```

Thay `sammy` và đường dẫn theo người dùng và dự án của bạn.

Lưu và đóng file.

Khởi động và kích hoạt service:

```bash
sudo systemctl start myproject
sudo systemctl enable myproject
```

Kiểm tra trạng thái:

```bash
sudo systemctl status myproject
```

Nếu thấy đang chạy, không lỗi, ta tiến hành bước tiếp.

### Step 5 — Cấu hình Nginx làm proxy

Tạo file config server block cho Nginx:

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

Nội dung:

```
server {
    listen 80;
    server_name your_domain www.your_domain;

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/sammy/myproject/myproject.sock;
    }
}
```

Lưu và đóng.

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

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

Kiểm tra cú pháp Nginx:

```bash
sudo nginx -t
```

Nếu không lỗi, khởi động lại Nginx:

```bash
sudo systemctl restart nginx
```

Thay đổi firewall:

```bash
sudo ufw delete allow 5000
sudo ufw allow 'Nginx Full'
```

Truy cập `http://your_domain` sẽ thấy ứng dụng Flask.

> **Lưu ý**: Nếu Nginx báo lỗi 502 gateway, kiểm tra quyền thư mục home người dùng có tối thiểu `0755`.

### Step 6 — Bảo mật ứng dụng

Để đảm bảo lưu lượng đến máy chủ an toàn, cài đặt SSL cho domain. Có thể lấy miễn phí từ Let's Encrypt.

Cài Certbot plugin cho Nginx:

```bash
sudo apt install python3-certbot-nginx
```

Chạy Certbot với plugin Nginx:

```bash
sudo certbot --nginx -d your_domain -d www.your_domain
```

Thiết lập thông tin email và chấp nhận điều khoản khi được yêu cầu.

Chọn cấu hình chuyển hướng HTTP sang HTTPS khi được hỏi.

Sau khi thành công, chứng chỉ SSL sẽ được lưu và Nginx được cấu hình lại tự động.

Xóa bỏ cấu hình firewall HTTP nếu đã cho phép:

```bash
sudo ufw delete allow 'Nginx HTTP'
```

Truy cập `https://your_domain` để kiểm tra trang được bảo mật.

### Conclusion

Trong hướng dẫn này, bạn đã tạo và bảo mật ứng dụng Flask đơn giản trong môi trường ảo Python. Bạn tạo điểm vào WSGI để các máy chủ hỗ trợ WSGI có thể giao tiếp với ứng dụng, rồi cấu hình Gunicorn làm máy chủ ứng dụng. Sau đó tạo tệp dịch vụ systemd để tự động chạy ứng dụng khi máy chủ khởi động. Cuối cùng, tạo block server Nginx để Nginx chuyển tiếp lưu lượng tới Gunicorn và bảo mật truy cập với Let’s Encrypt.

Flask là framework rất đơn giản và linh hoạt, giúp bạn phát triển ứng dụng với tính năng cần thiết mà không quá ràng buộc cấu trúc.  Bạn có thể dùng stack mô tả trong hướng dẫn để phục vụ các ứng dụng Flask do bạn thiết kế.
