Thứ hai, 30/12/2013 | 00:00 GMT+7

Cách triển khai ứng dụng web WSGI Python dựa trên kim tự tháp

Khi bạn lần đầu tiên bắt đầu làm việc với việc phát triển một ứng dụng web Python, đặc biệt nếu bạn đến từ một ngôn ngữ khác hoặc có nền tảng trong các ứng dụng dành cho máy tính để bàn (GUI), bạn có thể hơi mất hứng trong quá trình đưa tác phẩm mới của bạn lên mạng.


Trong bài viết DigitalOcean này, tiếp nối bài viết trước của ta về cách bắt đầu với Pyramid và triển khai các ứng dụng web Python bằng các web server khác nhau, ta sẽ thấy về cách đóng gói ứng dụng web Pyramid WSGI, tạo danh sách các phụ thuộc của nó và triển khai nó (tức là xuất bản trực tuyến ).

Lưu ý: Các ví dụ của bài viết này, mặc dù đưa ra một ví dụ sử dụng, hãy tuân theo các quy ước đặt tên được sử dụng trong bài viết bắt đầu. Nếu bạn có thắc mắc về việc bắt đầu phát triển ứng dụng web bằng Pyramid, hoặc đơn giản là muốn làm quen với các tên đã sử dụng trước đây, bạn có thể xem bài viết tại đây .

Bảng chú giải


<h3> 1. Sơ lược về kim tự tháp </h3> <hr>

  1. Triển khai ứng dụng web
  2. WSGI
  3. Khi sử dụng Nginx làm Reverse Proxy

<h3> 2. Triển khai ứng dụng web WSGI dựa trên kim tự tháp </h3> <hr>

  1. Cập nhật hệ thống
  2. Cài đặt Python, pip và virtualenv
  3. Chuẩn bị một ứng dụng đơn giản với đối tượng “ứng dụng” được phơi bày
  4. Phơi bày một đối tượng ứng dụng được xếp chồng lên nhau bằng cách sử dụng cài đặt .ini
  5. Xử lý phụ thuộc ứng dụng bằng pip
  6. Tạo danh sách phụ thuộc ứng dụng
  7. Download từ danh sách phụ thuộc ứng dụng

<h3> 3. Cài đặt server ứng dụng web Python WSGI </h3> <hr>

  1. Cung cấp các ứng dụng Kim tự tháp bằng CherryPy Web-Server
  2. Chạy và Quản lý Server Ứng dụng

<h3> 4. Cài đặt Nginx </h3> <hr>

  1. Cài đặt Nginx
  2. Cấu hình Nginx

Kim tự tháp trong Tóm tắt


So với một số đối tác nặng hơn của nó, Pyramid là một trong những khung ứng dụng web Python nhẹ. Tuy nhiên, không giống như Flask hoặc những cái “vi mô” khác, Pyramid vẫn đi kèm với rất nhiều tính năng và chức năng.

Là một dự án xuất sắc được bảo trì rất tốt, Pyramid có khá nhiều sự nổi tiếng và có một số cách khác nhau ( web server và phương pháp) để triển khai các ứng dụng web dựa trên nó.

Triển khai ứng dụng web


Liên quan đến tất cả các ứng dụng web Python WSGI, việc triển khai bao gồm việc chuẩn bị một module WSGI có chứa tham chiếu đến đối tượng ứng dụng của bạn, sau đó được sử dụng như một điểm truy cập bởi web server để chuyển các yêu cầu.

WSGI


Tóm lại, WSGI là một giao diện giữa web server và chính ứng dụng. Nó tồn tại đảm bảo một cách tiêu chuẩn hóa giữa các server và ứng dụng (khuôn khổ) khác nhau hoạt động với nhau, cho phép swap cho nhau khi cần thiết (ví dụ: chuyển từ môi trường phát triển sang môi trường production ), một nhu cầu bắt buộc hiện nay.

Lưu ý: Nếu bạn quan tâm đến việc tìm hiểu thêm về web server WSGI và Python, hãy xem bài viết của ta : So sánh web server cho ứng dụng web dựa trên Python .

Khi sử dụng Nginx làm Reverse Proxy


Nginx là một web server / (ngược) -proxy có hiệu suất rất cao. Nó đã trở nên phổ biến do trọng lượng nhẹ, tương đối dễ làm việc và dễ mở rộng (với các tiện ích bổ sung / trình cắm thêm). Nhờ kiến trúc của nó, nó có khả năng xử lý rất nhiều yêu cầu (hầu như không giới hạn), điều này - tùy thuộc vào tải ứng dụng hoặc trang web - có thể thực sự khó giải quyết bằng một số lựa chọn thay thế cũ hơn khác.

Hãy nhớ: "Xử lý" các kết nối về mặt kỹ thuật nghĩa là không làm rơi chúng và có thể phục vụ chúng bằng một thứ gì đó .Bạn vẫn cần ứng dụng và database của bạn hoạt động tốt để Nginx phục vụ phản hồi của khách hàng mà không phải là thông báo lỗi.

Server ứng dụng web Python WSGI


Server ứng dụng web Python [thường] là các giải pháp dựa trên C độc lập hoặc hoàn toàn (hoặc một phần) dựa trên Python (tức là Python thuần túy).

Chúng hoạt động bằng cách chấp nhận một module Python chứa - như đã giải thích trước đây - một ứng dụng có thể gọi để chứa ứng dụng web và phân phát nó trên mạng.

Mặc dù một số trong số chúng là những server có khả năng cao được dùng trực tiếp, nhưng bạn nên sử dụng Nginx phía trước vì những lý do đã đề cập ở trên (ví dụ: hiệu suất cao hơn). Tương tự như vậy, các server phát triển thường được vận chuyển với các khuôn khổ ứng dụng web không được khuyến khích sử dụng trong production do thiếu chức năng của chúng - tất nhiên là có một vài ngoại lệ !

Một số web server Python WSGI phổ biến là:

  • CherryPy

  • Gunicorn

  • uWSGI

  • nữ phục vụ

Triển khai ứng dụng web WSGI dựa trên kim tự tháp


Nhờ đặc điểm kỹ thuật phần mềm trung gian WSGI của Python, đối với tất cả các ứng dụng được cài đặt để chạy trên giao thức, có nhiều sự lựa chọn về server ứng dụng web.

Tóm tắt: Cập nhật hệ thống


Để có một server triển khai ổn định, điều quan trọng là phải cập nhật mọi thứ và duy trì tốt.

Để đảm bảo ta có version mới nhất của các ứng dụng mặc định, ta cần cập nhật hệ thống của bạn .

Đối với Hệ thống dựa trên Debian (tức là Ubuntu, Debian), hãy chạy như sau:

aptitude    update aptitude -y upgrade 

Đối với Hệ thống dựa trên RHEL (tức là CentOS), hãy chạy như sau:

yum -y update 

Mẹo: Với CentOS, upgrade nghĩa là nâng cấp hệ điều hành. update , tuy nhiên, cập nhật các ứng dụng. Với Debian / Ubuntu, update nhật danh sách nguồn ứng dụngupgrade cấp chúng lên version mới hơn.

Tóm tắt: Cài đặt Python, pip và virtualenv


Lưu ý cho user CentOS / RHEL:

CentOS / RHEL , theo mặc định, là một server rất gọn nhẹ. Bộ công cụ của nó, có thể đã được cập nhật theo yêu cầu của bạn, không phải ở đó để chạy các ứng dụng của bạn mà để cung cấp năng lượng cho các công cụ hệ thống của server (ví dụ: YUM).

Để chuẩn bị hệ thống CentOS của bạn, Python cần được cài đặt (tức là được biên dịch từ nguồn) và pip / virtualenv cần cài đặt bằng trình thông dịch đó.

Để tìm hiểu về Cách cài đặt Python 2.7.6 và 3.3.3 trên CentOS 6.4 và 5.8 , với pip và virtualenv, vui lòng tham khảo: Cách cài đặt Python 2.7.6 và 3.3.3 trên CentOS .

Trên Ubuntu và Debian , version trình thông dịch Python gần đây mà bạn có thể sử dụng được đưa ra theo mặc định. Nó khiến ta chỉ có một số gói bổ sung hạn chế để cài đặt:

  • python-dev - công cụ phát triển

  • pip - để quản lý các gói

  • virtualenv - để tạo môi trường ảo, cô lập

python-dev:


python-dev là một gói cấp hệ điều hành chứa các công cụ phát triển mở rộng để xây dựng các module Python.

Chạy lệnh sau để cài đặt python-dev bằng aptitude:

aptitude install python-dev 

pip:


pip là một trình quản lý gói sẽ giúp ta cài đặt các gói ứng dụng mà ta cần.

Chạy các lệnh sau để cài đặt pip:

curl https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py | python - curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python - export PATH="/usr/local/bin:$PATH" 

Bạn có thể cần các quyền của sudo.

virtualenv:


Tốt nhất là chứa một ứng dụng Python trong môi trường riêng của nó cùng với tất cả các phụ thuộc của nó. Một môi trường có thể được mô tả tốt nhất (theo thuật ngữ đơn giản) như một vị trí biệt lập (một folder ), nơi mọi thứ cư trú. Với mục đích này, một công cụ gọi là virtualenv được sử dụng.

Chạy phần sau để cài đặt virtualenv bằng pip:

sudo pip install virtualenv 

Chuẩn bị một ứng dụng đơn giản với đối tượng “ứng dụng” được phơi bày


Lưu ý: Phần này tập trung vào việc tải đơn đăng ký một trang mẫu của ta trực tuyến từ hướng dẫn trước.

Hiện tại, ta có một ứng dụng trang duy nhất (tức là application.py ) được tạo để phục vụ “Hello world!” trên cổng 8080 bằng server phát triển của Pyramid.

Thư mục làm việc hiện tại của ta được đặt tại ~ /ramid sites / hello world

Ví dụ về ứng dụng Kim tự tháp hiện tại của ta ( application.py ) trông giống như sau:

from wsgiref.simple_server import make_server from pyramid.config import Configurator from pyramid.response import Response  def hello_world(request):     return Response('<h1>Hello world!</h1>')  if __name__ == '__main__':     config = Configurator()     config.add_view(hello_world)     app = config.make_wsgi_app()     server = make_server('0.0.0.0', 8080, app)     server.serve_forever() 

Để chuyển ví dụ này thành module có chứa WSGI có thể gọi, ta có thể thực hiện các sửa đổi sau:

from wsgiref.simple_server import make_server from pyramid.config import Configurator from pyramid.response import Response  def hello_world(request):     return Response('<h1>Hello world!</h1>')  # Move the application object here. # Create a configurator to make *wsgi app(lication)* config = Configurator() config.add_view(hello_world)  # The "app" object to be exposed app = config.make_wsgi_app()  # If run directly, still construct a [development] # server process and start serving on port #8080.  if __name__ == '__main__':     server = make_server('0.0.0.0', 8080, app)     server.serve_forever() 

Sau khi sửa đổi, nhấn CTRL + X và xác nhận với Y để lưu và thoát.

Từ bây giờ, ta có thể chuyển file này dưới dạng module với ứng dụng có thể gọi đến bất kỳ web server Python WSGI nào.

Phơi bày một đối tượng ứng dụng được xếp chồng lên nhau bằng cách sử dụng cài đặt .ini


Ngoài ra, nếu bạn đã tạo một ứng dụng phức tạp hơn bằng cách sử dụng giàn giáo của Pyramid, bạn có thể xây dựng một wsgi.py để chứa một ứng dụng sử dụng các file “.ini” của Pyramid để tải các cấu hình triển khai (hoặc phát triển).

Lưu ý: File này cần cư trú bên trong folder ứng dụng root của bạn, cùng với requirements.txt hoặc các file .ini của bạn. Nó hoạt động bằng cách bao gồm ứng dụng của bạn như một đối tượng.

Lưu ý: Về mặt kỹ thuật, bạn có thể chọn bất kỳ tên nào (“bao gồm application.py”) cho file này. Tuy nhiên, wsgi.py có thể - và thông thường - dễ chấp nhận hơn một wsgi.py

Để tạo file wsgi.py bằng editor nano, hãy chạy như sau:

nano wsgi.py 

Copy paste các nội dung dưới đây:

from pyramid.config import Configurator from pyramid.response import Response from pyramid.paster import get_app  def hello(request):     return Response('Hello!')  config = Configurator() config.add_route('hello', '/') config.add_view(home, route_name='hello')  app = config.make_wsgi_app()  # Or from an .ini file: # app = get_app('config.ini', 'application_name') 

Xử lý phụ thuộc ứng dụng bằng pip


Vì rất có thể bạn đã bắt đầu quá trình phát triển trên một máy local , khi triển khai ứng dụng của bạn , bạn cần đảm bảo tất cả các phần phụ thuộc của nó đã được cài đặt (bên trong môi trường ảo của bạn).

Tạo danh sách phụ thuộc ứng dụng


Cách đơn giản nhất để lấy các phụ thuộc vào môi trường production là sử dụng pip. Với một lệnh duy nhất, nó có khả năng tạo tất cả các gói (hoặc các gói phụ thuộc) mà bạn đã cài đặt (trong môi trường đã kích hoạt của bạn, nếu không, trên phạm vi global trên hệ thống của bạn) và với một lệnh duy nhất, nó cho phép bạn download tất cả chúng và Cài đặt.

Lưu ý: Phần này chứa thông tin sẽ được thực thi trên máy phát triển local của bạn hoặc từ bất cứ đâu bạn muốn tạo danh sách các phụ thuộc ứng dụng. Tệp này phải được đặt bên trong folder ứng dụng của bạn và được tải lên server của bạn.

Sử dụng “pip” để tạo danh sách các gói đã cài đặt:

pip freeze > requirements.txt 

Lệnh này sẽ tạo một file có tên là “tests.txt” chứa danh sách tất cả các gói đã cài đặt. Nếu bạn chạy nó trong vòng một virtualenv, danh sách sẽ bao gồm các gói cài đặt bên trong chỉ môi trường. Nếu không, tất cả các gói, được cài đặt trên phạm vi global sẽ được liệt kê.

Download từ danh sách phụ thuộc ứng dụng


Sử dụng pip để cài đặt các gói từ danh sách:

Lưu ý: Phần này chứa thông tin sẽ được thực thi trên máy / môi trường production (tức là triển khai) của bạn.

pip install -r requirements.txt 

Lệnh này sẽ download và cài đặt tất cả các gói được liệt kê. Nếu bạn đang làm việc trong một môi trường được kích hoạt, các file sẽ được download ở đó. Nếu không, chúng sẽ được cài đặt trên phạm vi global - đây không phải là cách được khuyến khích vì những lý do đã giải thích trong các phần trước.

Cài đặt server ứng dụng web Python WSGI


Sau khi cài đặt ứng dụng Kim tự tháp của ta để hiển thị đối tượng ứng dụng của nó, ta có thể bắt đầu quá trình triển khai thực tế với việc download và cài đặt server ứng dụng web mà ta chọn.

Trong bài viết này, ta sẽ tập trung vào việc sử dụng CherryPy do khả năng của nó và sự đơn giản kết hợp.

Lưu ý: Hướng dẫn được đưa ra ở đây là ngắn gọn. Để tìm hiểu thêm, hãy xem bài viết hướng dẫn của ta về pip và virtualenv Các công cụ Python phổ biến: virtualenv và pip . Nếu bạn đang làm việc với server dựa trên CentOS, bạn có thể cần xem Cách cài đặt Python 2.7.6 và 3.3.3 trên bài viết CentOS .

Cung cấp các ứng dụng Kim tự tháp bằng CherryPy Web-Server


Web server Python thuần túy của CherryPy là một giải pháp nhỏ gọn đi kèm với khuôn khổ trùng tên. Được dự án xác định là “ server HTTP chung tốc độ cao, sẵn sàng production , gộp stream ,”, nó là một thành phần được module hóa được dùng để phục vụ bất kỳ ứng dụng web Python WSGI nào.

Sau hướng dẫn Pyramid đầu tiên của ta , ta có thể tiếp tục làm việc bên trong môi trường ảo (~ /ramid_sites / env) và cài đặt CherryPy ở đó. Nếu bạn đã tạo một cái khác ở một vị trí khác, bạn cũng có thể làm ở đó.

# Install CherryPy Framework and HTTP Web-Server pip install cherrypy 

Khi cài đặt gói ứng dụng, để phục vụ ứng dụng Pyramid, bạn cần tạo file “server.py” để trình thông dịch Phython của bạn chạy. Đó là file này bao gồm gói ứng dụng của bạn và phục vụ nó bằng web server của CherryPy.

Để tạo tệp server.py , hãy chạy như sau:

nano server.py 

Copy paste nội dung bên dưới để tạo ứng dụng server mẫu bằng Server HTTP của CherryPy:

# Import your application as: # from wsgi import application # Example:  # If you are using the wsgi.py (standard Pyramid) # from wsgi import app  # If using application.py (single page example): from application import app  # Import CherryPy import cherrypy  if __name__ == '__main__':      # Mount the application (or *app*)     cherrypy.tree.graft(app, "/")       # Unsubscribe the default server     cherrypy.server.unsubscribe()      # Instantiate a new server object     server = cherrypy._cpserver.Server()      # Configure the server object     server.socket_host = "0.0.0.0"     server.socket_port = 8080     server.thread_pool = 30      # For SSL Support     # server.ssl_module            = 'pyopenssl'     # server.ssl_certificate       = 'ssl/certificate.crt'     # server.ssl_private_key       = 'ssl/private.key'     # server.ssl_certificate_chain = 'ssl/bundle.crt'      # Subscribe this server     server.subscribe()      # Example for a 2nd server (same steps as above):     # Remember to use a different port      # server2             = cherrypy._cpserver.Server()      # server2.socket_host = "0.0.0.0"     # server2.socket_port = 8080     # server2.thread_pool = 30     # server2.subscribe()      # Start the server engine (Option 1 *and* 2)      cherrypy.engine.start()     cherrypy.engine.block() 

Lưu và thoát lại bằng cách nhấn CTRL + X và xác nhận với Y.

Chạy và Quản lý Server Ứng dụng


Để bắt đầu cung cấp ứng dụng của bạn, bạn chỉ cần thực thi server.py bằng cách sử dụng cài đặt Python của bạn .

Chạy phần sau để khởi động server như đã cấu hình :

python server.py 

Thao tác này sẽ chạy server trên nền trước. Nếu bạn muốn dừng nó, hãy nhấn CTRL + C.

Để chạy server trong nền, hãy sử dụng cách sau:

python server.py & 

Khi bạn chạy một ứng dụng trong nền, bạn cần sử dụng trình quản lý tiến trình (ví dụ: htop) để giết (hoặc dừng) ứng dụng đó.

Cài đặt Nginx


Cài đặt Nginx


Lưu ý cho user CentOS / RHEL:

Các hướng dẫn dưới đây sẽ không hoạt động trên hệ thống CentOS. Vui lòng xem hướng dẫntại đây cho CentOS.

Chạy lệnh sau để cài đặt Nginx bằng aptitude:

sudo aptitude install nginx 

Để chạy Nginx, hãy sử dụng như sau:

sudo service nginx start 

Để dừng Nginx, hãy sử dụng cách sau:

sudo service nginx stop 

Để khởi động lại Nginx, hãy sử dụng như sau:

# After each time you reconfigure Nginx, a restart # or reload is needed for the new settings to come # into effect.   sudo service nginx restart 

Lưu ý: Để tìm hiểu thêm về Nginx trên Ubuntu, vui lòng tham khảo bài viết của ta : Cách cài đặt Nginx trên Ubuntu 12.04 .

Cấu hình Nginx


Lưu ý: Dưới đây là hướng dẫn ngắn về cách sử dụng Nginx làm Reverse Proxy . Để tìm hiểu thêm về Nginx, hãy xem Cách cấu hình web server Nginx trên VPS .

Sau khi chọn và cài đặt web server để chạy ứng dụng của bạn , ta có thể tiếp tục thực hiện tương tự với Nginx và chuẩn bị cho nó để nói chuyện với (các) server back-end [đang chạy ứng dụng WSGI].

Để làm điều này, ta cần sửa đổi file cấu hình của Nginx: nginx.conf

Chạy lệnh sau để mở nginx.conf và chỉnh sửa nó bằng editor nano:

sudo nano /etc/nginx/nginx.conf 

Bạn có thể thay thế file bằng cấu hình ví dụ sau để Nginx hoạt động như một Reverse Proxy , nói chuyện với ứng dụng của bạn.

Copy paste cấu hình ví dụ dưới đây:

worker_processes 1;  events {      worker_connections 1024;  }  http {      sendfile on;      gzip              on;     gzip_http_version 1.0;     gzip_proxied      any;     gzip_min_length   500;     gzip_disable      "MSIE [1-6]\.";     gzip_types        text/plain text/xml text/css                       text/comma-separated-values                       text/javascript                       application/x-javascript                       application/atom+xml;      # Configuration containing list of application servers     upstream app_servers {          server 127.0.0.1:8080;         # server 127.0.0.1:8081;         # ..         # .      }      # Configuration for Nginx     server {          # Running port         listen 80;          # Settings to serve static files          location ^~ /static/  {              # Example:             # root /full/path/to/application/static/file/dir;             root /app/static/;          }          # Serve a static file (ex. favico)         # outside /static directory         location = /favico.ico  {              root /app/favico.ico;          }          # Proxy connections to the application servers         # app_servers         location / {              proxy_pass         http://app_servers;             proxy_redirect     off;             proxy_set_header   Host $host;             proxy_set_header   X-Real-IP $remote_addr;             proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;             proxy_set_header   X-Forwarded-Host $server_name;          }     } } 

Khi bạn hoàn tất việc sửa đổi cấu hình, hãy nhấn CTRL + X và xác nhận với Y để lưu và thoát. Bạn cần khởi động lại Nginx để các thay đổi có hiệu lực.

Chạy phần sau để khởi động lại Nginx:

sudo service nginx stop sudo service nginx start 

Và đó là nó! Sau khi kết nối server ứng dụng của bạn với Nginx, bây giờ bạn có thể truy cập nó bằng cách truy cập địa chỉ IP của server bằng trình duyệt yêu thích của bạn.

http://[your server's IP adde.]/  # Hello world! 

Đọc thêm


Nếu bạn muốn tìm hiểu thêm về triển khai ứng dụng web Python, bạn nên xem các bài viết sau của ta về chủ đề này để hiểu rõ hơn:


Tags:

Các tin liên quan

Cách triển khai ứng dụng WSGI Python bằng server Gunicorn HTTP đằng sau Nginx
2013-12-12
Cách triển khai ứng dụng WSGI Python bằng web server uWSGI với Nginx
2013-12-11
Cách triển khai ứng dụng WSGI Python bằng web server CherryPy đằng sau Nginx
2013-12-10
Cách sử dụng khung kim tự tháp để xây dựng ứng dụng web Python của bạn trên Ubuntu
2013-12-10
Cách thiết lập Python 2.7.6 và 3.3.3 trên CentOS 6.4
2013-12-04
Các công cụ Python phổ biến: Sử dụng virtualenv, Cài đặt bằng Pip và Quản lý Gói
2013-12-03
Cách tạo plugin Nagios bằng Python trên Ubuntu 12.10
2013-04-29
Cách tạo plugin Nagios bằng Python trên CentOS 6
2013-04-29