Thứ năm, 19/05/2016 | 00:00 GMT+7

Cách cung cấp các ứng dụng Flask với Gunicorn và Nginx trên Ubuntu 16.04

Trong hướng dẫn này, ta sẽ cài đặt một ứng dụng Python đơn giản bằng cách sử dụng vi khung Flask trên Ubuntu 16.04. Phần lớn bài viết này sẽ nói về cách cài đặt server ứng dụng Gunicorn để chạy ứng dụng và Nginx hoạt động như một Reverse Proxy phía trước.

Yêu cầu

Trước khi bắt đầu theo hướng dẫn này, bạn nên cấu hình một user không phải root trên server của bạn . User này cần có quyền sudo để có thể thực hiện các chức năng quản trị. Để tìm hiểu cách cài đặt điều này, hãy làm theo hướng dẫn cài đặt server ban đầu của ta .

Để tìm hiểu thêm về đặc tả WSGI mà server ứng dụng của ta sẽ sử dụng để giao tiếp với ứng dụng Flask của ta , bạn có thể đọc phần được liên kết của hướng dẫn này . Hiểu được các khái niệm này sẽ giúp hướng dẫn này dễ thực hiện hơn.

Khi đã sẵn sàng để tiếp tục, hãy đọc tiếp.

Cài đặt các thành phần từ repository Ubuntu

Bước đầu tiên của ta sẽ là cài đặt tất cả các phần mà ta cần từ repository . Ta sẽ cài đặt pip , trình quản lý gói Python, để cài đặt và quản lý các thành phần Python của ta . Ta cũng sẽ nhận được các file phát triển Python cần thiết để xây dựng một số thành phần Gunicorn. Ta cũng sẽ cài đặt Nginx ngay bây giờ.

Cập nhật index gói local của bạn và sau đó cài đặt các gói. Các gói cụ thể bạn cần sẽ phụ thuộc vào version Python bạn đang sử dụng cho dự án của bạn .

Nếu bạn đang sử dụng Python 2 , hãy nhập:

  • sudo apt-get update
  • sudo apt-get install python-pip python-dev nginx

Thay vào đó, nếu bạn đang sử dụng Python 3 , hãy nhập:

  • sudo apt-get update
  • sudo apt-get install python3-pip python3-dev nginx

Tạo môi trường ảo Python

Tiếp theo, ta sẽ cài đặt một môi trường ảo để cô lập ứng dụng Flask của ta với các file Python khác trên hệ thống.

Bắt đầu bằng cách cài đặt gói virtualenv bằng pip .

Nếu bạn đang sử dụng Python 2 , hãy nhập:

  • sudo pip install virtualenv

Nếu bạn đang sử dụng Python 3 , hãy nhập:

  • sudo pip3 install virtualenv

Bây giờ, ta có thể tạo một folder mẹ cho dự án Flask của bạn . Di chuyển vào folder sau khi bạn tạo:

  • mkdir ~/myproject
  • cd ~/myproject

Ta có thể 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 ta bằng lệnh :

  • virtualenv myprojectenv

Điều này sẽ cài đặt một bản sao local của Python và pip vào một folder gọi là myprojectenv trong folder dự án của bạn.

Trước khi cài đặt các ứng dụng trong môi trường ảo, ta cần kích hoạt nó. Bạn có thể thực hiện bằng cách gõ:

  • source myprojectenv/bin/activate

Dấu 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ẽ trông giống như thế này ( myprojectenv ) user @ host :~/ myproject $ .

Cài đặt ứng dụng flask

Đến đây bạn đang ở trong môi trường ảo của bạn , ta có thể cài đặt Flask và Gunicorn và bắt đầu thiết kế ứng dụng của ta :

Cài đặt Flask và Gunicorn

Ta có thể sử dụng version local của pip để cài đặt Flask và Gunicorn. Nhập các lệnh sau để nhận hai thành phần này:

Ghi chú
Dù bạn đang sử dụng version 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 ).

  • pip install gunicorn flask

Tạo ứng dụng mẫu

Bây giờ ta đã có sẵn Flask, ta có thể tạo một ứng dụng đơn giản. Bình là một micro-framework . Nó không bao gồm nhiều công cụ mà các khung công tác đầy đủ tính năng hơn có thể có và chủ yếu tồn tại dưới dạng module mà bạn có thể nhập vào các dự án của bạn để 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 ta sẽ tạo ứng dụng Flask của bạn trong một file duy nhất, file này ta sẽ gọi là myproject.py :

  • nano ~/myproject/myproject.py

Trong file này, ta sẽ đặt mã ứng dụng của bạn . Về cơ bản, ta cần nhập bình và khởi tạo đối tượng Flask. Ta có thể sử dụng điều này để xác định các chức năng sẽ được chạy khi một tuyến đường cụ thể được yêu cầu:

~ / myproject / myproject.py
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 sẽ hiển thị khi domain root được truy cập. Lưu file khi bạn hoàn tất.

Nếu bạn đã làm theo hướng dẫn cài đặt server ban đầu, bạn nên bật firewall UFW. Để kiểm tra ứng dụng của bạn , ta cần cho phép truy cập vào cổng 5000.

Mở cổng 5000 bằng lệnh :

  • sudo ufw allow 5000

Bây giờ, bạn có thể kiểm tra ứng dụng Flask của bạn bằng lệnh :

  • python myproject.py

Truy cập domain hoặc địa chỉ IP của server , sau đó là :5000 trong trình duyệt web :

http://server_domain_or_IP:5000 

Bạn sẽ thấy thông tin như thế này:

Ứng dụng mẫu bình

Khi bạn hoàn tất, nhấn CTRL-C trong cửa sổ terminal của bạn một vài lần để dừng server phát triển Flask.

Tạo điểm vào WSGI

Tiếp theo, ta sẽ tạo một file sẽ đóng role là điểm nhập cho ứng dụng của ta . Điều này sẽ cho server Gunicorn của ta biết cách tương tác với ứng dụng.

Ta sẽ gọi file là wsgi.py :

  • nano ~/myproject/wsgi.py

Tệp cực kỳ đơn giản, ta có thể chỉ cần nhập version Flask từ ứng dụng của bạn và sau đó chạy nó:

~ / myproject / wsgi.py
from myproject import app  if __name__ == "__main__":     app.run() 

Lưu file khi bạn hoàn tất.

Kiểm tra khả năng phục vụ dự án của Gunicorn

Trước khi tiếp tục, ta nên kiểm tra xem Gunicorn có thể chính xác không.

Ta có thể làm điều này bằng cách chỉ cần chuyển cho nó tên của điểm vào của ta . Điều này được xây dựng bởi tên của module (trừ phần mở rộng .py , như thường lệ) cộng với tên của phần có thể gọi trong ứng dụng. Trong trường hợp của ta , đây sẽ là wsgi:app .

Ta cũng sẽ chỉ định giao diện và cổng để liên kết để nó sẽ được bắt đầu trên giao diện có sẵn công khai:

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

Truy cập lại vào domain hoặc địa chỉ IP của server với: 5000 được thêm vào cuối trong trình duyệt web :

http://server_domain_or_IP:5000 

Bạn sẽ thấy lại kết quả của ứng dụng:

Ứng dụng mẫu bình

Khi bạn đã xác nhận nó hoạt động bình thường, hãy nhấn CTRL-C trong cửa sổ dòng lệnh của bạn.

Bây giờ ta đã hoàn tất với môi trường ảo của bạn , vì vậy ta có thể hủy kích hoạt nó:

  • deactivate

Mọi lệnh Python bây giờ sẽ sử dụng lại môi trường Python của hệ thống.

Tạo một file đơn vị systemd

Phần tiếp theo ta cần quan tâm là file đơn vị dịch vụ systemd. Tạo một file đơn vị systemd sẽ cho phép hệ thống init của Ubuntu tự động khởi động Gunicorn và phục vụ ứng dụng Flask của ta khi nào server khởi động.

Tạo một file đơn vị kết thúc bằng .service trong folder / etc / systemd / system để bắt đầu:

  • sudo nano /etc/systemd/system/myproject.service

Bên trong, ta sẽ bắt đầu với phần [Unit] , được sử dụng để chỉ định metadata và phần phụ thuộc. Ta sẽ đặt mô tả về dịch vụ của bạn ở đây và yêu cầu hệ thống init chỉ bắt đầu điều này sau khi đã đạt được mục tiêu mạng:

/etc/systemd/system/myproject.service
[Unit] Description=Gunicorn instance to serve myproject After=network.target 

Tiếp theo, ta sẽ mở phần [Service] . Ta sẽ chỉ định user và group mà ta muốn quá trình chạy. Ta sẽ cấp cho account regular user quyền sở hữu quy trình vì nó sở hữu tất cả các file có liên quan. Ta sẽ cấp quyền sở hữu group cho group www-data để Nginx có thể giao tiếp dễ dàng với các quy trình Gunicorn.

Sau đó, ta sẽ vạch ra folder làm việc và đặt biến môi trường PATH để hệ thống init biết vị trí của các file thực thi cho quá trình của ta (trong môi trường ảo của ta ). Sau đó, ta sẽ chỉ định lệnh để bắt đầu dịch vụ. Systemd yêu cầu ta cung cấp đường dẫn đầy đủ đến file thực thi Gunicorn, file này được cài đặt trong môi trường ảo của ta .

Ta sẽ yêu cầu nó bắt đầu 3 quy trình công nhân (điều chỉnh điều này nếu cần). Ta cũng sẽ yêu cầu nó tạo và liên kết với một file Unix socket trong folder dự án của ta có tên là myproject .sock . Ta sẽ đặt giá trị umask là 007 để file socket được tạo, cấp quyền truy cập cho chủ sở hữu và group , đồng thời hạn chế quyền truy cập khác. Cuối cùng, ta cần chuyển vào tên file điểm nhập WSGI và Python có thể gọi trong:

/etc/systemd/system/myproject.service
[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 

Cuối cùng, ta sẽ thêm phần [Cài đặt]. Điều này sẽ cho systemd biết những gì để liên kết dịch vụ này nếu ta cho phép nó khởi động khi server khởi động . Ta muốn dịch vụ này bắt đầu khi hệ thống nhiều regular user được cài đặt và chạy:

/etc/systemd/system/myproject.service
[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 

Như vậy, file dịch vụ systemd của ta đã hoàn tất. Lưu và đóng nó ngay bây giờ.

Bây giờ ta có thể bắt đầu dịch vụ Gunicorn mà ta đã tạo và kích hoạt nó để nó bắt đầu khi server khởi động :

  • sudo systemctl start myproject
  • sudo systemctl enable myproject

Cấu hình Nginx cho các yêu cầu proxy

Server ứng dụng Gunicorn của ta bây giờ sẽ được cài đặt và đang chạy, đang chờ các yêu cầu trên file socket trong folder dự án. Ta cần cấu hình Nginx để chuyển các yêu cầu web đến socket đó bằng cách thực hiện một số bổ sung nhỏ vào file cấu hình của nó.

Bắt đầu bằng cách tạo file cấu hình khối server mới trong folder sites-available của Nginx. Ta sẽ chỉ cần gọi này myproject để giữ phù hợp với phần còn lại của hướng dẫn:

  • sudo nano /etc/nginx/sites-available/myproject

Mở khối server và yêu cầu Nginx lắng nghe trên cổng mặc định 80. Ta cũng cần yêu cầu nó sử dụng khối này cho các yêu cầu đối với domain hoặc địa chỉ IP của server :

/ etc / nginx / sites-available / myproject
server {     listen 80;     server_name server_domain_or_IP; } 

Điều duy nhất khác mà ta cần thêm là một khối vị trí phù hợp với mọi yêu cầu. Trong khối này, ta sẽ bao gồm file proxy_params chỉ định một số thông số proxy chung cần được đặt. Sau đó, ta sẽ chuyển các yêu cầu đến socket mà ta đã xác định bằng cách sử dụng chỉ thị proxy_pass :

/ etc / nginx / sites-available / myproject
server {     listen 80;     server_name server_domain_or_IP;      location / {         include proxy_params;         proxy_pass http://unix:/home/sammy/myproject/myproject.sock;     } } 

Đó thực sự là tất cả những gì ta cần để phục vụ ứng dụng của bạn . Lưu file khi bạn hoàn tất.

Để kích hoạt cấu hình khối server Nginx mà ta vừa tạo, hãy liên kết file với folder sites-enabled :

  • sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

Với file trong folder đó, ta có thể kiểm tra lỗi cú pháp bằng lệnh :

  • sudo nginx -t

Nếu điều này trả về mà không chỉ ra bất kỳ vấn đề nào, ta có thể khởi động lại tiến trình Nginx để đọc cấu hình mới của ta :

  • sudo systemctl restart nginx

Điều cuối cùng ta cần làm là điều chỉnh lại firewall . Ta không cần truy cập thông qua cổng 5000 nữa, vì vậy ta có thể xóa luật đó. Sau đó, ta có thể cho phép truy cập vào server Nginx:

  • sudo ufw delete allow 5000
  • sudo ufw allow 'Nginx Full'

Bây giờ, bạn có thể truy cập domain hoặc địa chỉ IP của server trong trình duyệt web của bạn :

http://server_domain_or_IP 

Bạn sẽ thấy kết quả ứng dụng của bạn :

Ứng dụng mẫu bình

Ghi chú

Sau khi cấu hình Nginx, bước tiếp theo phải đảm bảo lưu lượng truy cập vào server bằng SSL / TLS. Điều này rất quan trọng vì không có nó, tất cả thông tin, bao gồm cả password được gửi qua mạng ở dạng văn bản thuần túy.

Cách dễ nhất để có được certificate SSL đảm bảo lưu lượng truy cập của bạn là sử dụng Let's Encrypt. Làm theo hướng dẫn này để cài đặt Let's Encrypt with Nginx trên Ubuntu 16.04.

Kết luận

Trong hướng dẫn này, ta đã tạo một ứng dụng Flask đơn giản trong môi trường ảo Python. Ta tạo một điểm nhập WSGI để bất kỳ server ứng dụng nào hỗ trợ WSGI đều có thể giao tiếp với nó, sau đó cấu hình server ứng dụng Gunicorn để cung cấp chức năng này. Sau đó, ta đã tạo một file đơn vị systemd để tự động chạy server ứng dụng khi khởi động. Ta đã tạo một khối server Nginx chuyển lưu lượng client web đến server ứng dụng, chuyển tiếp các yêu cầu bên ngoài.

Flask là một khung công tác rất đơn giản nhưng cực kỳ 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 và 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 flask mà bạn thiết kế.


Tags:

Các tin liên quan

Cách thiết lập server block Nginx (server ảo) trên Ubuntu 16.04
2016-05-19
Cách cung cấp các ứng dụng Flask với uWSGI và Nginx trên Ubuntu 16.04
2016-05-19
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Ubuntu 16.04
2016-05-18
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên Ubuntu 16.04
2016-05-16
Cách cài đặt Nginx trên Ubuntu 16.04
2016-04-21
Cách tạo chứng chỉ SSL tự ký cho Nginx trong Ubuntu 16.04
2016-04-21
Cách cài đặt Discourse Behind Nginx trên Ubuntu 14.04
2016-04-19
Cách thiết lập Nginx với Hỗ trợ HTTP / 2 trên Ubuntu 16.04
2016-04-12
Cách thêm module gzip vào Nginx trên CentOS 7
2016-03-15
Cách thêm module gzip vào Nginx trên Ubuntu 14.04
2016-03-09