Trước khi bắt đầu hướng dẫn này, bạn nên có:
your_domain
trỏ tới địa chỉ IP công khai của máy chủ.www.your_domain
trỏ tới địa chỉ IP công khai của máy chủ.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:
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.
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
:
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:
mkdir ~/myproject
cd ~/myproject
Tạo môi trường ảo để chứa các gói Python của dự án Flask:
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ó:
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$
.
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:
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:
pip install gunicorn flask
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:
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:
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:
sudo ufw allow 5000
Chạy thử app Flask:
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 file làm điểm vào cho ứng dụng, sẽ nói Gunicorn cách tương tác với app.
nano ~/myproject/wsgi.py
Nội dung file:
from myproject import app
if __name__ == "__main__":
app.run()
Lưu và đóng file.
Kiểm tra Gunicorn chạy app chính xác:
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:
deactivate
Tiếp theo, tạo service systemd để Gunicorn tự động chạy lúc khởi động:
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:
sudo systemctl start myproject
sudo systemctl enable myproject
Kiểm tra trạng thái:
sudo systemctl status myproject
Nếu thấy đang chạy, không lỗi, ta tiến hành bước tiếp.
Tạo file config server block cho Nginx:
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:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
Kiểm tra cú pháp Nginx:
sudo nginx -t
Nếu không lỗi, khởi động lại Nginx:
sudo systemctl restart nginx
Thay đổi firewall:
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
.
Để đả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:
sudo apt install python3-certbot-nginx
Chạy Certbot với plugin Nginx:
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:
sudo ufw delete allow 'Nginx HTTP'
Truy cập https://your_domain
để kiểm tra trang được bảo mật.
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ế.