Thứ tư, 16/11/2016 | 00:00 GMT+7

Cách triển khai ứng dụng web Falcon với Gunicorn và Nginx trên Ubuntu 16.04

Falcon là một khung Python tối thiểu để xây dựng các ứng dụng web. Nó rất phù hợp để xây dựng các API tuân theo phong cách kiến trúc REST . Đó là một khung hiệu suất cao, cấp thấp cố gắng làm ít nhất có thể mà không làm giảm tốc độ phát triển.

Trong hướng dẫn này, bạn sẽ xây dựng và triển khai một ứng dụng web Falcon. Falcon là một khuôn khổ WSGI , vì vậy bạn sẽ cài đặt và sử dụng Gunicorn , một server ứng dụng WSGI, để phục vụ ứng dụng. Sau đó, bạn sẽ tạo một môi trường sẵn sàng production bằng cách sử dụng Nginx làm server Reverse Proxy để xử lý các yêu cầu đến trước khi chúng đến được Gunicorn.

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần :

Bước 1 - Tạo môi trường ảo Python

Trước khi đi sâu vào viết mã hoặc cài đặt dịch vụ, ta sẽ tạo một môi trường ảo Python cho ứng dụng của bạn trên server .

Kết nối với server của bạn với quyền là user không phải root của bạn:

  • ssh sammy@your_server_ip

Falcon hoạt động với cả Python 2.x và Python 3.x nhưng ta sẽ sử dụng version Python mới nhất có sẵn trong Ubuntu 16.04 là Python 3.5.

Ta sẽ sử dụng pipvirtualenv để cài đặt ứng dụng Falcon của bạn . Để tìm hiểu thêm về các công cụ này, hãy đọc hướng dẫn của ta về các công cụ Python phổ biến .

Đầu tiên, cài đặt virtualenv:

  • sudo apt-get install virtualenv

Tiếp theo, tạo một folder sẽ chứa mã nguồn của ứng dụng và môi trường ảo, sau đó thay đổi thành folder đó:

  • mkdir falcon_app
  • cd falcon_app

Sau đó, tạo môi trường ảo:

  • virtualenv venv -p /usr/bin/python3

Lệnh này tạo ra một môi trường ảo bên trong folder venv . Cờ -p chỉ định version Python nào được sử dụng trong môi trường ảo.

Bạn sẽ thấy kết quả này:

Output
Already using interpreter /usr/bin/python3 Using base prefix '/usr' New python executable in /home/sammy/falcon_app/venv/bin/python3 Also creating executable in /home/sammy/falcon_app/venv/bin/python Installing setuptools, pkg_resources, pip, wheel...done.

Bây giờ hãy kích hoạt môi trường ảo:

  • . venv/bin/activate

Để chuyển trở lại trình thông dịch Python toàn hệ thống, hãy hủy kích hoạt môi trường ảo bằng cách ra lệnh:

  • deactivate

Đến đây bạn đã cài đặt môi trường ảo Python của bạn , hãy cài đặt các gói Python cần thiết.

Bước 2 - Cài đặt Falcon và Gunicorn bằng pip

Ta cần cài đặt gói falcon và vì ta đang sử dụng Gunicorn để phục vụ ứng dụng của bạn , ta cũng cần cài đặt gói đó. Cả hai điều này đều có sẵn thông qua pip ,

Bạn có thể cài đặt Falcon một trong hai cách. Falcon có một file binary mà bạn có thể cài đặt bằng pip install falcon , nhưng Falcon có thể được tăng tốc độ bổ sung khi biên dịch với Cython . Đưa ra các lệnh sau để cài đặt Cython và sau đó thông báo cho Falcon phát hiện nó và tự biên dịch bằng trình biên dịch C của hệ thống:

  • sudo apt-get install build-essential python3-dev
  • pip install cython
  • pip install --no-binary :all: falcon

Tiếp theo, cài đặt Gunicorn:

  • pip install gunicorn

Hãy chuyển sang viết ứng dụng Falcon đơn giản của ta .

Bước 3 - Viết một ứng dụng web đơn giản bằng Falcon

Hãy tạo một ứng dụng Falcon một file đơn giản. Tạo file main.py trong falcon_app folder :

  • nano main.py

Điền vào file với nội dung sau để tạo ứng dụng Falcon hiển thị thông báo kiểm tra đơn giản khi mọi người truy cập /test tuyến đường /test :

main.py
import falcon  class TestResource(object):     def on_get(self, req, res):         """Handles all GET requests."""         res.status = falcon.HTTP_200  # This is the default status         res.body = ('This is me, Falcon, serving a resource!')  # Create the Falcon application object app = falcon.API()  # Instantiate the TestResource class test_resource = TestResource()  # Add a route to serve the resource app.add_route('/test', test_resource) 

Trong file này, ta tạo một lớp có tên là TestResource . Lớp này chứa một phương thức on_get xác định phản hồi mà ta muốn gửi. Sau đó, ta tạo các version của API Falcon và TestResource . Sau đó, ta thêm tuyến /test vào API và đính kèm đối tượng tài nguyên test_resource vào đó.

Khi nào một yêu cầu GET được gửi đến URL /test , phương thức on_get() của TestResource sẽ được gọi. Trạng thái phản hồi và nội dung được đặt bằng cách sử dụng các biến res.statusres.body tương ứng.

Lưu file và đóng editor . Hãy thử nghiệm ứng dụng.

Bước 4 - Cung cấp ứng dụng Falcon với Gunicorn

Trước khi hoàn thành công việc chuẩn bị production ứng dụng bằng cách sử dụng Nginx, hãy đảm bảo ứng dụng của ta hoạt động bằng cách cung cấp ứng dụng đó với Gunicorn.

Đảm bảo rằng bạn đang ở trong folder falcon_app . Khởi động Gunicorn bằng lệnh sau:

  • gunicorn -b 0.0.0.0:5000 main:app --reload

Điều này khởi động Gunicorn và phục vụ ứng dụng web của ta ở mức 0.0.0.0 trên cổng 5000 , như bạn thấy từ kết quả của nó:

Output
[2016-11-14 16:33:41 +0000] [9428] [INFO] Starting gunicorn 19.6.0 [2016-11-14 16:33:41 +0000] [9428] [INFO] Listening at: http://0.0.0.0:5000 (9428) [2016-11-14 16:33:41 +0000] [9428] [INFO] Using worker: sync [2016-11-14 16:33:41 +0000] [9431] [INFO] Booting worker with pid: 9431

Bạn có thể sử dụng bất kỳ số cổng nào bạn thích, nhưng hãy đảm bảo số đó trên 1024 và nó không được sử dụng bởi bất kỳ chương trình nào khác.

Tùy chọn main:app yêu cầu Gunicorn gọi ứng dụng đối tượng app có sẵn trong file main.py

Gunicorn cung cấp một lựa chọn - --reload tùy chọn cho Gunicorn biết để phát hiện bất kỳ thay đổi mã nào khi đang di chuyển. Bằng cách này, bạn có thể thay đổi mã của bạn mà không cần phải khởi động lại Gunicorn.

Kiểm tra ứng dụng của bạn bằng cách mở trình duyệt web trên máy tính local và truy cập http:// your_server_ip :5000/test trong trình duyệt của bạn. Bạn sẽ thấy kết quả sau từ ứng dụng web của bạn :

Phản hồi của Falcon

Dừng Gunicorn bằng cách nhấn CTRL+C Hãy cài đặt điều này theo cách sẵn sàng production hơn.

Bước 5 - Sử dụng Nginx để gửi yêu cầu proxy tới Gunicorn

Ta sẽ cài đặt và cấu hình Nginx để ủy quyền tất cả các yêu cầu web tới Gunicorn thay vì để Gunicorn trực tiếp phân phát các yêu cầu từ thế giới bên ngoài. Bằng cách đó, tất cả các yêu cầu của ứng dụng web của bạn sẽ được Nginx xử lý trước và sau đó được chuyển đến server ứng dụng.

Đầu tiên, cài đặt Nginx bằng cách chạy lệnh sau:

  • sudo apt-get install nginx

Tiếp theo, tạo một file cấu hình mới có tên là falcon_app.conf trong folder /etc/nginx/sites-available . Tệp này sẽ cấu hình Nginx để ủy quyền cho tất cả các yêu cầu đến địa chỉ IP server của bạn tới server Gunicorn của ứng dụng Falcon của ta .

  • sudo nano /etc/nginx/sites-available/falcon_app.conf

Thêm các nội dung sau vào file :

/etc/nginx/sites-available/falcon_app.conf
server {     listen 80;     server_name your_server_ip_or_domain;      location / {         include proxy_params;         proxy_pass http://localhost:5000;     } } 

Cấu hình này yêu cầu Nginx lắng nghe trên cổng 80 và ủy quyền tất cả các yêu cầu HTTP tới http://localhost:5000 , đây là nơi Gunicorn sẽ lắng nghe.

Kích hoạt cấu hình này bằng cách tạo một softlink đến file này trong folder /etc/nginx/sites-enabled :

  • sudo ln -s /etc/nginx/sites-available/falcon_app.conf /etc/nginx/sites-enabled/falcon_app.conf

Sau đó, vô hiệu hóa file cấu hình Nginx mặc định bằng cách xóa softlink của nó khỏi folder /etc/nginx/sites-enabled :

  • sudo rm /etc/nginx/sites-enabled/default

Đảm bảo rằng không có lỗi cú pháp nào trong các file Nginx nào của bạn:

  • sudo nginx -t

Bạn sẽ thấy thông báo này nếu bạn có cấu hình đang hoạt động:

Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

Nếu bạn thấy bất kỳ lỗi nào, hãy sửa chúng và kiểm tra lại.

Khởi động lại Nginx để cấu hình mới có hiệu lực.

  • sudo systemctl restart nginx

Bây giờ khởi động lại Gunicorn, nhưng thay đổi địa chỉ nghe từ 0.0.0.0 thành localhost để ngăn truy cập vào Gunicorn:

  • gunicorn -b localhost:5000 main:app --reload

Cho phép truy cập vào cổng 80 thông qua firewall của server nếu bạn đã bật nó:

  • sudo ufw allow 80

Lưu ý : Nếu bạn đang sử dụng https để phân phát ứng dụng web của bạn , hãy đảm bảo cho phép cổng 443 sử dụng ufw . Ngoài ra, hãy nhớ đọc bài viết của ta về Cách bảo mật Nginx bằng Let's Encrypt .

Cuối cùng, hãy thử nghiệm ứng dụng bằng cách truy cập http:// your_server_ip /test và bạn sẽ thấy kết quả giống như bạn đã thấy trước đây.

Lưu ý bạn không cần số cổng trong URL vì các yêu cầu của bạn hiện đang được chuyển qua Nginx, chạy trên cổng 80 , cổng HTTP mặc định. Bạn sẽ thấy kết quả sau trong trình duyệt của bạn :

Falcon hiện đã được hỗ trợ thông qua Nginx

Dừng server ứng dụng bằng cách nhấn CTRL+C Hãy cấu hình ứng dụng Falcon của ta để khởi động tự động trong nền giống như các dịch vụ khác của ta .

Bước 7 - Quản lý Gunicorn với Systemd

Ta nên đảm bảo ứng dụng của ta tự động khởi động mỗi khi server của ta khởi động, giống như Nginx. Nếu server của ta vô tình bị khởi động lại hoặc phải khởi động lại vì bất kỳ lý do gì, ta không cần phải khởi động Gunicorn theo cách thủ công.

Để cấu hình điều này, ta sẽ tạo tệp đơn vị Systemd cho ứng dụng Gunicorn của bạn để ta có thể quản lý nó.

Để bắt đầu, ta tạo một file cho ứng dụng của bạn bên trong folder /etc/systemd/system với phần mở rộng .service :

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

Một file đơn vị được tạo thành từ các phần. Phần [Unit] được sử dụng để chỉ định metadata và các yếu tố phụ thuộc vào dịch vụ của ta , bao gồm mô tả về dịch vụ của ta và thời điểm bắt đầu dịch vụ của ta .

Thêm cấu hình này vào file :

/etc/systemd/system/falcon_app.service
[Unit] Description=Gunicorn instance to serve the falcon application After=network.target 

Ta chỉ định rằng dịch vụ sẽ bắt đầu sau khi đã đạt được mục tiêu mạng. Nói cách khác, ta chỉ bắt đầu dịch vụ này sau khi các dịch vụ mạng đã sẵn sàng.

Sau phần [Unit] , ta xác định phần [Service] nơi ta chỉ định cách bắt đầu dịch vụ. Thêm cái này vào file cấu hình:

/etc/systemd/system/falcon_app.service
[Service] User=sammy Group=www-data PIDFile=/tmp/gunicorn.pid Environment="PATH=/home/sammy/falcon_app/venv/bin" WorkingDirectory=/home/sammy/falcon_app ExecStart=/home/sammy/falcon_app/venv/bin/gunicorn --workers 3 -b localhost:5000 main:app ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID 

Đầu tiên ta xác định user và group mà dịch vụ đang chạy. Sau đó, ta xác định một file để lưu trữ PID (ID quy trình) của dịch vụ; PID này được sử dụng để dừng hoặc reload dịch vụ.

Ngoài ra, ta chỉ định môi trường ảo Python, folder làm việc của ứng dụng. và lệnh thực thi để khởi động ứng dụng. Ta gán lệnh khởi động Gunicorn cho biến ExecStart . Cờ --workers được sử dụng để xác định số lượng công nhân mà Gunicorn nên bắt đầu. Tài liệu Gunicorn khuyên bạn nên đặt số lượng nhân công thành 2n+1 trong đó n là số lõi CPU. Giả sử rằng server của bạn có một lõi CPU duy nhất, ta đi đến số 3 .

Các ExecReloadExecStop xác định cách khởi động và dừng dịch vụ.

Cuối cùng, ta thêm phần [Install] , trông giống như sau:

/etc/systemd/system/falcon_app.service
[Install] WantedBy=multi-user.target 

Phần Install cho phép bạn bật và tắt dịch vụ. Lệnh WantedBy tạo một folder có tên multi-user.target bên trong /etc/systemd/system và một softlink của file này sẽ được tạo ở đó. Tắt dịch vụ này sẽ xóa file này khỏi folder .

Lưu file , đóng editor và bắt đầu dịch vụ mới:

  • sudo systemctl start falcon_app

Sau đó, kích hoạt dịch vụ này để mỗi khi server khởi động, Gunicorn sẽ bắt đầu cung cấp ứng dụng web:

  • sudo systemctl enable falcon_app

, hãy trỏ trình duyệt của bạn vào http:// your_server_ip /test để xem ứng dụng của bạn. Cả Nginx và Gunicorn đều đang chạy trong nền. Nếu bạn cần cập nhật ứng dụng Falcon của bạn , hãy khởi động lại dịch vụ falcon_app :

  • sudo systemctl restart falcon_app

Để tìm hiểu thêm về file đơn vị, hãy đọc hướng dẫn Hiểu Đơn vị Systemd và file Đơn vị .

Kết luận

Trong hướng dẫn này, bạn đã cấu hình và triển khai ứng dụng web Falcon đầu tiên của bạn . Bạn cài đặt môi trường Python và viết mã ứng dụng của bạn trên server , sau đó cung cấp ứng dụng web với Gunicorn. Sau đó, bạn đã cấu hình Nginx để nó chuyển các yêu cầu web đến ứng dụng Gunicorn của ta . Cuối cùng, bạn đã viết một file Systemd Unit và kích hoạt dịch vụ để ứng dụng web của bạn khởi động khi server khởi động.

Khi đưa các ứng dụng của riêng mình vào production , bạn cần truy cập chúng bằng tên server thay vì địa chỉ IP. Hãy xem Cách cài đặt tên server với DigitalOcean để trỏ domain của bạn đến server của bạn.


Tags:

Các tin liên quan

Giới thiệu về Ứng dụng web tiến bộ (PWA): Service Worker & Manifest
2016-11-10
Cách cài đặt Django Web Framework trên Ubuntu 16.04
2016-05-16
Cách triển khai ứng dụng web Clojure trên FreeBSD 10.2
2015-12-22
Cách triển khai ứng dụng web Clojure trên Ubuntu 14.04
2015-11-20
Cách thiết lập web server khả dụng cao với IP giữ và nổi trên Ubuntu 14.04
2015-10-20
Xây dựng cho Sản xuất: Ứng dụng Web - Tổng quan
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - Giám sát
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - backup
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - Triển khai
2015-06-01
Xây dựng cho sản xuất: Ứng dụng web - Ghi log tập trung
2015-06-01