Trong hướng dẫn này, bạn sẽ xây dựng một ứng dụng Python sử dụng Flask microframework trên Ubuntu 20.04. Phần lớn bài viết này sẽ nói về cách thiết lập máy chủ ứng dụng uWSGI và cách khởi chạy ứng dụng cũng như thiết lập cấu hình Nginx để hoạt động như một proxy ngược giao diện người dùng.
Trước khi bắt đầu hướng dẫn này, bạn nên có:
your_domain
trỏ đến địa chỉ IP công cộng của máy chủ của bạn.www.your_domain
trỏ đến địa chỉ IP công cộng của máy chủ của bạn.Ngoài ra, có thể hữu ích nếu bạn đã quen thuộc với uWSGI, máy chủ ứng dụng mà bạn sẽ thiết lập trong hướng dẫn này và đặc tả WSGI.
Bước đầu tiên của bạn là cài đặt tất cả các phần bạn cần từ kho Ubuntu. Các gói bạn cần cài đặt bao gồm pip
, trình quản lý gói Python, để quản lý các thành phần Python của bạn. Bạn cũng sẽ nhận được các tệp phát triển Python cần thiết để xây dựng uWSGI.
Đầu tiên, cập nhật chỉ mục gói cục bộ:
- sudo apt update
Sau đó cài đặt các gói cho phép bạn xây dựng môi trường Python của mình. Chúng sẽ bao gồm python3-pip
, cùng với một vài gói và công cụ phát triển cần thiết cho môi trường lập trình mạnh mẽ:
- sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools
Với các gói này, bạn đã sẵn sàng chuyển sang tạo môi trường ảo cho dự án của mình.
Môi trường ảo Python là một thư mục dự án độc lập chứa các phiên bản cụ thể của Python và các mô-đun Python cần thiết cho dự án nhất định. Điều này rất hữu ích để cách ly một ứng dụng khỏi các ứng dụng khác trên cùng một hệ thống bằng cách quản lý riêng các phần phụ thuộc của từng ứng dụng. Trong bước này, bạn sẽ thiết lập một môi trường ảo Python mà từ đó bạn sẽ chạy ứng dụng Flask của mình.
Bắt đầu bằng cách cài đặt gói python3-venv
, gói này sẽ cài đặt mô-đun venv
:
- sudo apt install python3-venv
Tiếp theo, tạo một thư mục mẹ cho dự án Flask của bạn:
- mkdir ~/myproject
Di chuyển vào thư mục sau khi bạn tạo nó:
- cd ~/myproject
Tạo một môi trường ảo để lưu trữ các yêu cầu Python của dự án Flask của bạn bằng cách nhập:
- python3.8 -m venv myprojectenv
Điều này sẽ cài đặt một bản sao cục bộ của Python và pip
vào một thư mục có tên myprojectenv
trong thư mục dự án của bạn.
Trước khi cài đặt các ứng dụng trong môi trường ảo, bạn cần kích hoạt nó. Làm như vậy bằng cách gõ:
- source myprojectenv/bin/activate
Lời nhắc của bạn sẽ thay đổi để cho biết rằng bạn hiện đang hoạt động trong môi trường ảo. Nó sẽ giống như thế này: (myprojectenv)user@host:~/myproject$
.
Bây giờ bạn đang ở trong môi trường ảo của mình, bạn có thể cài đặt Flask và uWSGI rồi bắt đầu thiết kế ứng dụng của mình.
Trước tiên, hãy cài đặt wheel
với phiên bản cục bộ của pip
để đảm bảo rằng các gói của bạn sẽ cài đặt ngay cả khi chúng thiếu kho lưu trữ wheel:
- pip install wheel
Lưu ý: Bất kể bạn đang sử dụng phiên bản Python nào, khi môi trường ảo được kích hoạt, bạn nên sử dụng lệnh pip
(không phải pip3
).
Tiếp theo, cài đặt Flask và uWSGI:
- pip install uwsgi flask
Bây giờ bạn đã có sẵn Flask, bạn có thể tạo một ứng dụng mẫu. Flask là một microframework. Nó không bao gồm nhiều công cụ mà các framework đầy đủ tính năng hơn có thể có, và chủ yếu tồn tại dưới dạng mô-đun mà bạn có thể nhập vào dự án của mình để hỗ trợ bạn khởi tạo ứng dụng web.
Mặc dù ứng dụng của bạn có thể phức tạp hơn nhưng trong ví dụ này, bạn sẽ tạo ứng dụng Flask của mình trong một tệp duy nhất, được gọi là myproject.py
:
- nano ~/myproject/myproject.py
Mã ứng dụng sẽ nằm trong tệp này. Nó sẽ nhập Flask và khởi tạo một đối tượng Flask. Bạn có thể sử dụng điều này để xác định các chức năng mà bạn muốn chạy khi một tuyến đường cụ thể được yêu cầu:
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')
Về cơ bản, điều này xác định nội dung nào sẽ hiển thị cho bất kỳ ai truy cập miền gốc. Lưu và đóng tệp khi bạn hoàn tất. Nếu bạn đã sử dụng nano
để chỉnh sửa tệp, như trong ví dụ trước, hãy làm như vậy bằng cách nhấn CTRL + X
, Y
, rồi ENTER
.
Nếu bạn làm theo hướng dẫn thiết lập máy chủ ban đầu, bạn nên bật tường lửa UFW. Để kiểm tra ứng dụng, bạn cần cho phép truy cập vào cổng 5000
:
- sudo ufw allow 5000
Bây giờ, bạn có thể kiểm tra ứng dụng Flask của mình bằng cách nhập:
- python myproject.py
Bạn sẽ thấy đầu ra như sau, bao gồm một cảnh báo hữu ích nhắc nhở bạn không sử dụng thiết lập máy chủ này trong sản xuất:
Output* 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 địa chỉ IP của máy chủ của bạn theo sau :5000
trong trình duyệt web của bạn:
http://your_server_ip:5000
Bạn sẽ thấy một cái gì đó như thế này:
Khi bạn hoàn tất, hãy nhấn CTRL + C
trong cửa sổ đầu cuối của bạn để dừng máy chủ phát triển Flask.
Tiếp theo, tạo một tệp sẽ đóng vai trò là entry point (điểm vào) cho ứng dụng của bạn. Điều này sẽ cho máy chủ uWSGI của bạn biết cách tương tác với nó.
Gọi tệp wsgi.py
:
- nano ~/myproject/wsgi.py
Trong tệp này, hãy nhập phiên bản Flask từ ứng dụng của bạn rồi chạy nó:
from myproject import app
if __name__ == "__main__":
app.run()
Lưu và đóng tệp khi bạn hoàn tất.
Ứng dụng của bạn hiện đã được viết với một entry point đã được thiết lập. Bạn có thể chuyển sang cấu hình uWSGI.
Bước đầu tiên, hãy kiểm tra để đảm bảo rằng uWSGI có thể phục vụ ứng dụng của bạn một cách chính xác bằng cách chuyển tên entry point của bạn cho ứng dụng đó. Điều này được xây dựng theo tên của mô-đun (trừ phần mở rộng .py) cộng với tên có thể gọi được trong ứng dụng. Trong ngữ cảnh của hướng dẫn này, tên của entry point là wsgi:app
.
Ngoài ra, hãy chỉ định ổ cắm để nó sẽ được khởi động trên giao diện có sẵn công khai, cũng như giao thức để nó sẽ sử dụng HTTP thay vì giao thức nhị phân uwsgi
. Sử dụng cùng một số cổng, 5000
, mà bạn đã mở trước đó:
- uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app
Truy cập địa chỉ IP của máy chủ của bạn với :5000
được thêm vào cuối trong trình duyệt web của bạn một lần nữa:
http://your_server_ip:5000
Bạn sẽ thấy lại đầu ra của ứng dụng:
Khi bạn đã xác nhận rằng nó hoạt động bình thường, hãy nhấn CTRL + C
trong cửa sổ đầu cuối của bạn.
Bây giờ bạn đã hoàn tất với môi trường ảo của mình, vì vậy bạn có thể hủy kích hoạt nó:
- deactivate
Giờ đây, mọi lệnh Python sẽ sử dụng lại môi trường Python của hệ thống.
Bạn đã kiểm tra rằng uWSGI có thể phục vụ ứng dụng của mình, nhưng cuối cùng thì bạn sẽ muốn một thứ gì đó mạnh mẽ hơn để sử dụng lâu dài. Bạn có thể tạo tệp cấu hình uWSGI với các tùy chọn liên quan cho việc này.
Đặt tệp đó vào thư mục dự án của bạn và gọi nó là myproject.ini
:
- nano ~/myproject/myproject.ini
Bên trong, bắt đầu tệp với tiêu đề [uwsgi]
để uWSGI biết áp dụng cài đặt. Bên dưới đó, chỉ định chính mô-đun — bằng cách tham khảo tệp wsgi.py
trừ đi phần mở rộng — và phần có thể gọi được trong tệp, app
:
[uwsgi]
module = wsgi:app
Tiếp theo, yêu cầu uWSGI khởi động ở chế độ chính và sinh ra năm quy trình worker để phục vụ các yêu cầu thực tế:
[uwsgi]
module = wsgi:app
master = true
processes = 5
Khi bạn đang thử nghiệm, bạn đã hiển thị uWSGI trên một cổng mạng. Tuy nhiên, bạn sẽ sử dụng Nginx để xử lý các kết nối máy khách thực tế, sau đó sẽ chuyển các yêu cầu tới uWSGI. Vì các thành phần này đang hoạt động trên cùng một máy tính, ổ cắm Unix được ưu tiên hơn vì nó nhanh hơn và an toàn hơn. Gọi ổ cắm myproject.sock
và đặt nó vào thư mục này.
Tiếp theo, thay đổi quyền trên ổ cắm. Bạn sẽ trao quyền sở hữu nhóm Nginx đối với quy trình uWSGI sau này, vì vậy bạn cần đảm bảo rằng chủ sở hữu nhóm của ổ cắm có thể đọc thông tin từ nhóm đó và ghi vào nhóm đó. Ngoài ra, thêm tùy chọn vacuum
và đặt nó thành true; điều này sẽ dọn sạch ổ cắm khi quá trình dừng lại:
[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = myproject.sock
chmod-socket = 660
vacuum = true
Điều cuối cùng cần làm là đặt tùy chọn die-on-term
. Điều này có thể giúp đảm bảo rằng hệ thống init và uWSGI có cùng giả định về ý nghĩa của từng tín hiệu quy trình. Cài đặt này sẽ căn chỉnh hai thành phần hệ thống, thực hiện hành vi dự kiến:
[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = myproject.sock
chmod-socket = 660
vacuum = true
die-on-term = true
Bạn có thể nhận thấy rằng những dòng này không chỉ định một giao thức như bạn đã làm từ dòng lệnh. Đó là bởi vì theo mặc định, uWSGI sử dụng giao thức uwsgi
, một giao thức nhị phân nhanh được thiết kế để giao tiếp với các máy chủ khác. Nginx có thể nói giao thức này một cách tự nhiên, vì vậy, tốt hơn là sử dụng giao thức này thay vì buộc giao tiếp bằng HTTP.
Khi bạn hoàn tất, hãy lưu và đóng tệp.
Cùng với đó, uWSGI được thiết lập cấu hình trên hệ thống của bạn. Để giúp bạn linh hoạt hơn trong cách quản lý ứng dụng Flask của mình, giờ đây bạn có thể thiết lập cấu hình ứng dụng này để chạy dưới dạng dịch vụ systemd.
Systemd là một bộ công cụ cung cấp mô hình init nhanh và linh hoạt để quản lý các dịch vụ hệ thống. Tạo tệp đơn vị systemd sẽ cho phép hệ thống init của Ubuntu tự động khởi động uWSGI và phục vụ ứng dụng Flask bất cứ khi nào máy chủ khởi động.
Tạo một tệp đơn vị kết thúc bằng .service
trong thư mục /etc/systemd/system
để bắt đầu:
- sudo nano /etc/systemd/system/myproject.service
Bên trong, hãy bắt đầu với phần [Unit]
, được sử dụng để chỉ định siêu dữ liệu và các thành phần phụ thuộc. Sau đó đặt một mô tả về dịch vụ ở đây và yêu cầu hệ thống init chỉ bắt đầu dịch vụ này sau khi đã đạt được mục tiêu mạng:
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
Tiếp theo, mở phần [Service]
. Điều này sẽ chỉ định người dùng và nhóm mà bạn muốn tiến trình chạy bên dưới. Cấp cho tài khoản người dùng thông thường của bạn quyền sở hữu quy trình vì nó sở hữu tất cả các tệp có liên quan. Sau đó cấp quyền sở hữu nhóm cho nhóm www-data để Nginx có thể giao tiếp dễ dàng với các quy trình uWSGI. Hãy nhớ thay thế tên người dùng ở đây bằng tên người dùng của bạn:
[Unit]
Description=uWSGI instance to serve myproject
After=network.target
[Service]
User=sammy
Group=www-data
Tiếp theo, vạch ra thư mục làm việc và đặt biến môi trường PATH
để hệ thống init biết rằng các tệp thực thi của quy trình được đặt trong môi trường ảo của bạn. Ngoài ra, chỉ định lệnh để bắt đầu dịch vụ. Systemd yêu cầu bạn cung cấp đường dẫn đầy đủ tới tệp thực thi uWSGI, được cài đặt trong môi trường ảo của bạn. Ở đây, chúng tôi chuyển tên của tệp cấu hình .ini
mà bạn đã tạo trong thư mục dự án của mình.
Hãy nhớ thay thế tên người dùng và đường dẫn dự án bằng thông tin của riêng bạn:
[Unit]
Description=uWSGI 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/uwsgi --ini myproject.ini
Cuối cùng, thêm phần [Install]
. Điều này sẽ cho systemd biết phải liên kết dịch vụ này với cái gì nếu bạn kích hoạt nó khởi động khi khởi động. Trong trường hợp này, hãy đặt dịch vụ bắt đầu khi hệ thống nhiều người dùng thông thường hoạt động:
[Unit]
Description=uWSGI 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/uwsgi --ini myproject.ini
[Install]
WantedBy=multi-user.target
Như vậy, tệp dịch vụ systemd của bạn đã hoàn tất. Lưu và đóng nó ngay bây giờ.
Bây giờ bạn có thể bắt đầu dịch vụ uWSGI mà bạn đã tạo:
- sudo systemctl start myproject
Sau đó kích hoạt nó để nó khởi động khi khởi động:
- sudo systemctl enable myproject
Kiểm tra trạng thái:
- sudo systemctl status myproject
Bạn sẽ thấy đầu ra như thế này:
Output● myproject.service - uWSGI instance to serve myproject
Loaded: loaded (/etc/systemd/system/myproject.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-05-20 13:21:39 UTC; 8h ago
Main PID: 22146 (uwsgi)
Tasks: 6 (limit: 2345)
Memory: 25.5M
CGroup: /system.slice/myproject.service
├─22146 /home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini
├─22161 /home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini
├─22162 /home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini
├─22163 /home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini
├─22164 /home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini
└─22165 /home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini
Nếu bạn thấy bất kỳ lỗi nào, hãy nhớ giải quyết chúng trước khi tiếp tục với hướng dẫn. Nếu không, bạn có thể chuyển sang cấu hình cài đặt Nginx của mình để chuyển các yêu cầu tới ổ cắm myproject.sock
.
Máy chủ ứng dụng uWSGI của bạn hiện đã được thiết lập và đang chạy, đang chờ các yêu cầu trên tệp ổ cắm trong thư mục dự án. Trong bước này, bạn sẽ thiết lập cấu hình Nginx để chuyển các yêu cầu web tới ổ cắm đó bằng giao thức uwsgi
.
Bắt đầu bằng cách tạo một tệp cấu hình khối máy chủ mới trong thư mục sites-available
của Nginx. Để phù hợp với phần còn lại của hướng dẫn, ví dụ sau gọi đây là myproject
:
- sudo nano /etc/nginx/sites-available/myproject
Mở một khối máy chủ và yêu cầu Nginx lắng nghe trên cổng mặc định 80
. Ngoài ra, hãy yêu cầu nó sử dụng khối này cho các yêu cầu đối với tên miền của máy chủ của bạn:
server {
listen 80;
server_name your_domain www.your_domain;
}
Tiếp theo, thêm một khối vị trí phù hợp với mọi yêu cầu. Trong khối này, bao gồm tệp uwsgi_params
chỉ định một số tham số uWSGI chung cần được đặt. Sau đó, chuyển các yêu cầu tới ổ cắm mà bạn đã xác định bằng lệnh uwsgi_pass
:
server {
listen 80;
server_name your_domain www.your_domain;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/sammy/myproject/myproject.sock;
}
}
Lưu và đóng tệp khi bạn hoàn tất.
Để bật cấu hình khối máy chủ Nginx mà bạn vừa tạo, hãy liên kết tệp với thư mục sites-enabled
:
- sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
Khi bạn cài đặt Nginx, quy trình sẽ tự động thiết lập tệp cấu hình khối máy chủ có tên default
trong thư mục sites-available
, sau đó tạo liên kết tượng trưng giữa tệp đó và thư mục sites-enabled
. Nếu bạn để nguyên liên kết tượng trưng này, cấu hình default
sẽ chặn tải trang web của bạn. Bạn có thể xóa liên kết bằng lệnh sau:
- sudo unlink /etc/nginx/sites-enabled/default
Sau đó, bạn có thể kiểm tra lỗi cú pháp bằng cách gõ:
- sudo nginx -t
Nếu điều này trở lại mà không chỉ ra bất kỳ sự cố nào, hãy khởi động lại quy trình Nginx để đọc cấu hình mới:
- sudo systemctl restart nginx
Cuối cùng, điều chỉnh tường lửa một lần nữa. Bạn không cần truy cập qua cổng 5000
nữa, vì vậy bạn có thể xóa quy tắc đó. Sau đó, bạn có thể cho phép truy cập vào máy chủ Nginx:
- sudo ufw delete allow 5000
- sudo ufw allow 'Nginx Full'
Bây giờ bạn sẽ có thể điều hướng đến tên miền của máy chủ trong trình duyệt web của mình:
http://your_domain3
Bạn sẽ thấy đầu ra ứng dụng của mình:
Nếu bạn gặp bất kỳ lỗi nào, hãy thử kiểm tra như sau:
sudo less /var/log/nginx/error.log
: kiểm tra nhật ký lỗi Nginx.sudo less /var/log/nginx/access.log
: kiểm tra nhật ký truy cập Nginx.sudo journalctl -u nginx
: kiểm tra nhật ký quá trình Nginx.sudo journalctl -u myproject
: kiểm tra nhật ký uWSGI của ứng dụng Flask của bạn.Để đảm bảo rằng lưu lượng truy cập vào máy chủ của bạn vẫn an toàn, hãy lấy chứng chỉ SSL cho miền của bạn. Có nhiều cách để thực hiện việc này, bao gồm nhận chứng chỉ miễn phí từ Let's Encrypt, tạo chứng chỉ tự ký hoặc mua chứng chỉ từ nhà cung cấp thương mại. Để thuận tiện, hướng dẫn này giải thích cách lấy chứng chỉ miễn phí từ Let's Encrypt.
Đầu tiên, cài đặt Certbot và plugin Nginx của nó với apt
:
- sudo apt install certbot python3-certbot-nginx
Certbot cung cấp nhiều cách khác nhau để lấy chứng chỉ SSL thông qua plugin. Plugin Nginx sẽ đảm nhiệm việc thiết lập cấu hình lại Nginx và tải lại cấu hình bất cứ khi nào cần thiết. Để sử dụng plugin này, gõ như sau:
- sudo certbot --nginx -d your_domain -d www.your_domain
Điều này chạy certbot
với plugin --nginx
, sử dụng -d
để chỉ định tên bạn muốn chứng chỉ hợp lệ.
Nếu đây là lần đầu tiên bạn chạy certbot
trên máy chủ này, bạn sẽ được nhắc nhập địa chỉ email và đồng ý với các điều khoản dịch vụ. Sau khi làm như vậy, certbot
sẽ giao tiếp với máy chủ Let's Encrypt, sau đó chạy thử thách để xác minh rằng bạn kiểm soát miền mà bạn đang yêu cầu chứng chỉ.
Nếu thành công, certbot
sẽ hỏi bạn muốn thiết lập cấu hình cài đặt HTTPS của mình như thế nào:
OutputPlease choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
Chọn lựa chọn của bạn rồi nhấn ENTER
. Cấu hình sẽ được cập nhật và Nginx sẽ tải lại để nhận cài đặt mới. certbot
sẽ kết thúc bằng một thông báo cho bạn biết quy trình đã thành công và nơi lưu trữ chứng chỉ của bạn:
OutputIMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/your_domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/your_domain/privkey.pem
Your cert will expire on 2020-08-18. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Nếu bạn đã làm theo hướng dẫn cài đặt Nginx trong phần điều kiện tiên quyết, bạn sẽ không cần hỗ trợ hồ sơ HTTP dự phòng nữa:
- sudo ufw delete allow 'Nginx HTTP'
Để xác minh cấu hình, hãy điều hướng một lần nữa đến miền của bạn, sử dụng https://
:
https://your_domain
Bạn sẽ thấy đầu ra ứng dụng của mình một lần nữa, cùng với chỉ báo bảo mật của trình duyệt, chỉ báo này cho biết rằng trang web được bảo mật.
Trong hướng dẫn này, bạn đã tạo và bảo mật một ứng dụng Flask cơ bản trong môi trường ảo Python. Sau đó, bạn đã tạo một điểm vào WSGI để bất kỳ máy chủ ứng dụng nào hỗ trợ WSGI đều có thể giao tiếp với nó, rồi thiết lập cấu hình máy chủ ứng dụng uWSGI để cung cấp chức năng này. Sau đó, bạn đã tạo một tệp dịch vụ systemd để tự động khởi chạy máy chủ ứng dụng khi khởi động. Bạn cũng đã tạo một khối máy chủ Nginx để chuyển lưu lượng truy cập của máy khách web đến máy chủ ứng dụng, do đó chuyển tiếp các yêu cầu bên ngoài và bảo đảm lưu lượng truy cập đến máy chủ của bạn bằng Let's Encrypt.
Flask là một khung đơn giản nhưng linh hoạt nhằm cung cấp cho các ứng dụng của bạn chức năng mà không quá hạn chế về cấu trúc hoặc thiết kế. Bạn có thể sử dụng ngăn xếp chung được mô tả trong hướng dẫn này để phục vụ các ứng dụng bình mà bạn thiết kế.