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 :
- Một server Ubuntu 16.04 được cài đặt theo hướng dẫn cài đặt server ban đầu Ubuntu 16.04 , bao gồm user không phải root có quyền sudo và firewall .
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 pip và virtualenv để 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:
OutputAlready 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
:
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.status
và res.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 :
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 :
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:
Outputnginx: 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 :
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 :
[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:
[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 ExecReload
và ExecStop
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:
[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.
Các tin liên quan
Giới thiệu về Ứng dụng web tiến bộ (PWA): Service Worker & Manifest2016-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