Thứ tư, 11/12/2013 | 00:00 GMT+7

Cách triển khai ứng dụng WSGI Python bằng web server uWSGI với Nginx

Như đã giới thiệu trong bài viết So sánh web server Python của ta , uWSGI là một dự án rộng lớn, có khả năng làm được nhiều việc hơn là chỉ phục vụ các ứng dụng web. Tuy nhiên, một loạt các chức năng của nó, kết hợp với việc cấu hình tương đối dễ dàng, làm cho nó trở thành một lựa chọn tuyệt vời cho nhiều nhu cầu triển khai - đặc biệt là khi nó được kết hợp với Nginx.


Trong bài viết DigitalOcean này, ta muốn thảo luận sâu hơn về uWSGI và đi qua các bước cần thiết để không chỉ cài đặt server mà còn thực sự triển khai các ứng dụng Python dựa trên các khuôn khổ khác nhau, bao gồm mọi bước quan trọng cho các khuôn khổ nhỏ, vừa và thậm chí tương đối lớn cho production .

Ta cũng sẽ thảo luận về việc sử dụng Nginx (và tại sao) với cài đặt này, vì Nginx và uWSGI được xây dựng nguyên bản để làm việc với nhau, tạo thành một ngăn xếp hoàn hảo cho hầu hết các triển khai.

Bảng chú giải


1. Hiểu uWSGI và sử dụng Nginx


  1. uWSGI trong Tóm tắt
  2. Triển khai ứng dụng web với Nginx
  3. Sử dụng Nginx làm Reverse-Proxy với uWSGI

2. Chuẩn bị server của bạn để production


  1. Cập nhật hệ điều hành mặc định
  2. Cài đặt Python, pip và virtualenv
  3. Tạo môi trường ảo (Python)
  4. Download và cài đặt uWSGI
  5. Download và cài đặt Nginx

3. Cung cấp các ứng dụng Python WSGI với uWSGI


  1. WSGI
  2. Đối tượng ứng dụng WSGI (Có thể gọi): wsgi.py
  3. Chạy server
  4. Cấu hình uWSGI
  5. Các cấu hình phổ biến cho uWSGI
  6. Quản lý server uWSGI và các quy trình bằng tín hiệu

4. Cấu hình Nginx

5. Cấu hình uWSGI

6. Các mẹo, đề xuất và cài đặt khác cho server production

Hiểu uWSGI và sử dụng Nginx


uWSGI là một dự án đầy tham vọng. Bộ công cụ của nó cho phép bạn làm nhiều việc hơn là chỉ lưu trữ các ứng dụng web. Vì nó hoạt động rất tốt và theo một cách hiệu quả như vậy, trong những năm qua, nó đã được chứng minh là một công cụ không thể thiếu đối với nhiều administrator hệ thống và các nhà phát triển khi triển khai các ứng dụng của họ.

Nginx, kể từ version 0.8.40 hỗ trợ giao thức uwsgi (của riêng uWSGI). Điều này cho phép các ứng dụng WSGI chạy trên uWSGI giao tiếp theo cách tốt nhất có thể với Nginx. Điều này nghĩa là đối với bạn là khả năng triển khai rất đơn giản để cấu hình, có tính linh hoạt cao (và chức năng) và hưởng lợi từ nhiều tối ưu hóa ẩn đi kèm. Nhìn chung, điều này làm cho uWSGI cùng với Nginx trở thành lựa chọn tuyệt vời cho nhiều tình huống triển khai.

uWSGI trong Tóm tắt


Sau đây là phần extract từ bài viết So sánh server Python DigitalOcean được đề cập ở trên:

“Bất chấp các quy ước đặt tên rất khó hiểu, bản thân uWSGI là một dự án rộng lớn với nhiều thành phần, nhằm cung cấp một repository đầy đủ để xây dựng các dịch vụ lưu trữ . Một trong những thành phần này, server uWSGI, chạy các ứng dụng Python WSGI. Nó có khả năng sử dụng nhiều giao thức khác nhau, bao gồm cả giao thức dây uwsgi của riêng nó, gần giống với SCGI. Để đáp ứng nhu cầu dễ hiểu về việc sử dụng các server HTTP độc lập trước server ứng dụng, các web server NGINX và Cherokee được điều chỉnh để hỗ trợ giao thức uwsgi hoạt động tốt nhất [của riêng] uWSGI để có quyền kiểm soát trực tiếp các quy trình của nó. ”

Điểm nổi bật của uWSGI

  • uWSGI đi kèm với bộ điều hợp WSGI và nó hỗ trợ đầy đủ các ứng dụng Python chạy trên WSGI.

  • Nó liên kết với libpython. Nó tải mã ứng dụng khi khởi động và hoạt động giống như một trình thông dịch Python. Nó phân tích cú pháp các yêu cầu đến và gọi Python có thể gọi được.

  • Nó đi kèm với hỗ trợ trực tiếp cho web server NGINX phổ biến (cùng với Cherokee + và lighttpd).

  • Nó được viết bằng C.

  • Các thành phần khác nhau của nó có thể làm được nhiều việc hơn là chạy một ứng dụng, điều này có thể hữu ích cho việc mở rộng.

  • Hiện tại (cuối năm 2013), nó đang được phát triển tích cực và có chu kỳ phát hành nhanh chóng.

  • Nó có nhiều động cơ khác nhau để chạy các ứng dụng (không đồng bộ và đồng bộ).

  • Nó có thể nghĩa là bộ nhớ thấp hơn để chạy.

Triển khai ứng dụng web với Nginx


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ụ các phản hồi của client không phải là thông báo lỗi.

Sử dụng Nginx làm Reverse-Proxy với uWSGI


Nhiều khuôn khổ và server ứng dụng có thể phục vụ các file tĩnh (ví dụ: javascript, css, hình ảnh, v.v.) cùng với phản hồi từ các ứng dụng thực tế. Tuy nhiên, điều tốt hơn nên làm là để một server ( reverse-proxy ) như Nginx xử lý nhiệm vụ cung cấp các file này và quản lý các kết nối ( yêu cầu ). Điều này giúp giảm tải rất nhiều từ các server ứng dụng, mang lại cho bạn hiệu suất tổng thể tốt hơn nhiều.

Khi ứng dụng của bạn phát triển, bạn cần tối ưu hóa nó và khi đến thời điểm, hãy phân phối nó trên các server (VPS) để có thể xử lý nhiều kết nối hơn đồng thời và có một kiến trúc nhìn chung mạnh mẽ hơn. Có một Reverse Proxy trước (các) server ứng dụng của bạn sẽ giúp bạn làm điều này ngay từ đầu.

Khả năng mở rộng của Nginx (ví dụ: bộ nhớ đệm root cùng với chuyển đổi dự phòng và các cơ chế khác) cũng là một thành công lớn mang lại lợi ích cho các ứng dụng web không giống như các server ứng dụng (đơn giản hơn).

Ví dụ về Kiến trúc server cơ bản:

Client Request ----> Nginx (Reverse-Proxy)                         |                        /|\                                                  | | `-> App. Server I.   127.0.0.1:8081                       |  `--> App. Server II.  127.0.0.1:8082                        `----> App. Server III. 127.0.0.1:8083 

Lưu ý: Khi một ứng dụng được đặt để lắng nghe các kết nối đến trên 127.0.0.1 , nó sẽ chỉ có thể truy cập local . Tuy nhiên, nếu bạn sử dụng 0.0.0.0 , nó cũng sẽ chấp nhận các kết nối từ bên ngoài.

Chuẩn bị server của bạn để production


Trong phần này, ta sẽ chuẩn bị server ảo của bạn cho quá trình production (tức là để triển khai ứng dụng của ta ).

Ta sẽ bắt đầu với:

  • cập nhật hệ điều hành mặc định

  • download và cài đặt các công cụ Python phổ biến (ví dụ: pip, virtualenv)

  • tạo một môi trường ảo để chứa ứng dụng (bên trong chứa các phụ thuộc của nó như uWSGI)

Lưu ý: Hướng dẫn đưa ra ở đây được giữ 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ề pipvirtualenv : Các công cụ Python phổ biến: Sử dụng virtualenv, Cài đặt bằng Pip và Quản lý các gói .

Cập nhật hệ điều hành mặc định


Lưu ý: Ta sẽ thực hiện các bước cài đặt và chuẩn bị sau trên một VPS mới, sử dụng các version hệ điều hành gần đây. Về lý thuyết, bạn sẽ không gặp vấn đề khi thử chúng trên server của bạn . Tuy nhiên, nếu bạn đã chủ động sử dụng nó, ta khuyên bạn nên chuyển sang hệ thống mới trước khi thử.

Để đả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 

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 

Tạo môi trường ảo (Python) độc lập


Có sẵn tất cả các công cụ cần thiết theo ý của ta , ta có thể tạo ra một môi trường triển khai ứng dụng của bạn .

Lưu ý : Nếu bạn chưa có virtualenv trên máy phát triển (cục bộ) cho dự án của bạn , bạn nên cân nhắc tạo một máy và di chuyển ứng dụng của bạn (và các phụ thuộc của nó) vào bên trong.

Hãy bắt đầu với việc tạo một folder chứa cả môi trường ảomô-đun ứng dụng của bạn :

Bạn có thể sử dụng bất kỳ tên nào ở đây để phù hợp với nhu cầu của bạn.

mkdir my_app 

Ta có thể tiếp tục nhập folder này và tạo một môi trường ảo mới bên trong:

Bạn cũng có thể chọn bất kỳ tên nào bạn thích cho môi trường ảo của bạn .

cd my_app virtualenv my_app_venv 

Hãy tạo một folder mới ở đó để chứa cả module ứng dụng Python của bạn:

Đây là folder chứa module ứng dụng của bạn.

mkdir app 

Và kích hoạt trình thông dịch bên trong môi trường ảo để sử dụng nó:

Vui lòng đảm bảo sử dụng tên bạn đã chọn cho môi trường ảo của bạn nếu bạn muốn tìm một thứ gì đó khác ngoài “địa điểm ứng dụng của tôi”.

source my_app_venv/bin/activate 

Cuối cùng, đây là cách folder triển khai ứng dụng chính của bạn sẽ trông như thế nào:

my_app              # Main Folder to Contain Everything Together   |   |=== my_app_venv  # V. Env. folder with the Python Int.   |=== app          # Your application module   |..   |. 

Download và cài đặt uWSGI


Đó luôn là cách được khuyến khích để chứa tất cả các phần tử liên quan đến ứng dụng cùng nhau bên trong môi trường ảo càng nhiều càng tốt. Vì vậy, ta sẽ download và cài đặt uWSGI như vậy.

Nếu bạn không làm việc trong một môi trường, uWSGI sẽ được cài đặt trên phạm vi global (tức là có sẵn trên toàn hệ thống). Điều này không được khuyến khích. Luôn chọn sử dụng virtualenv .

Để cài đặt uWSGI bằng pip, hãy chạy như sau:

pip install uwsgi 

Hãy nhớ: Để tìm hiểu thêm về pip , cách sử dụng và chức năng của nó, hãy tham khảo bài viết sau về Các công cụ Python phổ biến: Sử dụng virtualenv, Cài đặt bằng Pip và Quản lý các gói .

Download và 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 đây để sử dụng mặc định gói hệ thống quản lý aptitude install Nginx:

sudo aptitude install nginx 

Để chạy Nginx, bạn có thể sử dụng như sau:

sudo service nginx start 

Để dừng Nginx, bạn có thể sử dụng các cách sau:

sudo service nginx stop 

Để khởi động lại Nginx, bạn có thể sử dụng như sau:

Sau mỗi lần bạn cấu hình lại Nginx, bạn cần khởi động lại hoặc reload để cài đặt mới có hiệu lực.

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 .

Cung cấp các ứng dụng Python WSGI với uWSGI


Trong phần này, ta sẽ xem cách một ứng dụng Python WSGI hoạt động với web server uWSGI. Làm việc với uWSGI để phục vụ các ứng dụng Python WSGI không khác với các containers ứng dụng khác. Điều mà uWSGI cần, giống như các server khác, là để ứng dụng của bạn cung cấp cho nó một điểm vào ( một điểm có thể gọi ). Trong khi chạy , có thể gọi này, cùng với các biến cấu hình, được chuyển cho uWSGI và nó bắt đầu thực hiện công việc của bạn . Khi một yêu cầu đến, nó sẽ xử lý và chuyển nó đến bộ điều khiển ứng dụng của bạn để xử lý.

Ngành kiến trúc:

........       /|\                                 | | `-> App. Server I.   127.0.0.1:8080  <--> Application      |  `--> App. Server II.  127.0.0.1:8081  <--> Application       ..... 

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 WSGIPython , 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 .

Đối tượng ứng dụng WSGI (Có thể gọi): “wsgi.py”


Như đã đề cập ở trên, các web server chạy trên WSGI cần một đối tượng ứng dụng (tức là ứng dụng của bạn).

Với hầu hết các khuôn khổ và ứng dụng, điều này bao gồm một wsgi.py để chứa và cung cấp một đối tượng ứng dụng (hoặc có thể gọi được) để server sử dụng.

Ta sẽ bắt đầu với việc tạo một wsgi.py mẫu, sau đó sẽ được uWSGI nhập và sử dụng để chạy ứng dụng.

Bạn có thể chọn bất kỳ tên nào thay vì wsgi.py. Tuy nhiên, đây là những cái thường được sử dụng (ví dụ như của Django).

Hãy bắt đầu với việc tạo file wsgi.py để chứa một ứng dụng WSGI cơ bản.

Chạy lệnh sau để tạo wsgi.py bằng editor nano:

nano wsgi.py 

Và hãy tiếp tục di chuyển (sao chép / dán) mã ứng dụng WSGI cơ bản bên trong (mã này sẽ được thay thế bằng ứng dụng của bạn có thể gọi để production ):

def application(env, start_response):     start_response('200 OK', [('Content-Type', 'text/html')])     return ["Hello!"] 

Đây là file được server bao gồm và mỗi khi có yêu cầu, server sử dụng ứng dụng có thể gọi này để chạy trình xử lý yêu cầu của ứng dụng (tức là bộ điều khiển ) khi phân tích cú pháp URL (ví dụ: mysite.tld / controller / method / variable).

Sau khi đặt mã ứng dụng vào, nhấn CTRL + X và sau đó xác nhận với Y để lưu file này bên trong folder “my_app” cùng với môi trường ảo và module ứng dụng chứa ứng dụng thực của bạn.

Lưu ý: Ứng dụng WSGI này là ví dụ cơ bản nhất cho loại ứng dụng này. Bạn cần phải thay thế khối mã này để bao gồm đối tượng ứng dụng của bạn từ module ứng dụng.

Khi ta đã hoàn tất, đây là cách folder triển khai ứng dụng chính của bạn sẽ trông như thế nào:

my_app              # Main Folder to Contain Everything Together   |   |=== my_app_venv  # V. Env. folder with the Python Int.   |=== app          # Your application module   |   |--- wsgi.py      # File containing application callable   |..   |. 

Chạy server


uWSGI có rất nhiều tùy chọn và cấu hình với nhiều cách khả thi để sử dụng chúng nhờ tính linh hoạt của nó. Không làm phức tạp thêm ngay từ đầu, ta sẽ bắt đầu làm việc với nó đơn giản nhất có thể và tiếp tục với những phương pháp tiên tiến hơn.

Ví dụ sử dụng đơn giản:

uwsgi [option] [option 2] .. -w [wsgi file with app. callable] 

Để chỉ cần chạy uWSGI để bắt đầu cung cấp ứng dụng từ wsgi.py, hãy chạy như sau:

uwsgi --socket 127.0.0.1:8080 --protocol=http -w wsgi 

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 chạy như sau:

uwsgi --socket 127.0.0.1:8080 --protocol=http -w wsgi & 

[!] Quan trọng: Khi bạn chạy server để làm việc với Nginx bằng cách sử dụng cấu hình từ phần Định cấu hình Nginx , hãy đảm bảo xóa --protocol=http khỏi chuỗi đối số, nếu không Nginx và uWSGI sẽ không thể nói chuyện với nhau khác.

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 đó. Xem phần bên dưới để biết thêm chi tiết.

Quản lý server uWSGI và các quy trình bằng tín hiệu


Quản lý uWSGI bao gồm các hành động được thực hiện trong thời gian chạy. Có nhiều lệnh khác nhau được đặt cho tác vụ này để thao tác quy trình:

  • SIGHUP -HUP reload các công nhân và ứng dụng một cách duyên dáng

  • SIGTERM -TERM reload "tàn bạo"

  • SIGINT -INTSIGQUIT -QUIT giết tất cả công nhân ngay lập tức

  • SIGUSR1 -USR1 in số liệu thống kê (stdout)

  • SIGUSR2 -USR2 in trạng thái công nhân

  • SIGURG -URG khôi phục ảnh chụp nhanh

  • SIGTSTP -TSTP tạm dừng, tạm dừng hoặc tiếp tục một version

  • SIGWINCH -WINCH tỉnh dậy một nhân viên chặn trong một syscall

Ví dụ về quản lý bằng các tín hiệu:

Khởi động lại server với SIGHUP

Lệnh này khởi động lại server một cách duyên dáng. Điều này nghĩa là , nó đợi công việc của người lao động hiện tại được hoàn thành, và sau đó nó chấm dứt chúng trước khi sinh sản lại, kế thừa các cài đặt của nó.

Cách sử dụng: kill -HUP [PID]

Nếu bạn không muốn chỉ định PID, bạn có thể sử dụng tùy chọn pidfile để yêu cầu uWSGI ghi nó vào một file , sau đó bạn có thể sử dụng tùy chọn này để quản lý các quy trình.

Dừng server với SIGINT

Để dừng server và các quy trình của nó, bạn cần sử dụng tín hiệu -INT . Điều này sẽ chấm dứt mọi thứ trong nền.

Ví dụ: kill -INT [PID]

Cấu hình Nginx


Sau khi cài đặt uWSGI để chạy ứng dụng của ta , bây giờ ta cần thực hiện tương tự với Nginx để nó nói chuyện với (các) server uWSGI. Đối với đ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 

Sau đó, 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.

Lưu ý: Để tìm hiểu về cách kết hợp hỗ trợ SSL, trước tiên hãy đọc bài viết này: Tạo certificate SSL trên Nginx .

Cấu hình ví dụ cho các ứng dụng web:

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 uwsgicluster {          server 127.0.0.1:8080;         # server 127.0.0.1:8081;         # ..         # .      }      # Configuration for Nginx     server {          # Running port         listen 80;          # Settings to by-pass for static files          location ^~ /static/  {              # Example:             # root /full/path/to/application/static/file/dir;             root /app/static/;          }          # Serve a static file (ex. favico) outside static dir.         location = /favico.ico  {              root /app/favico.ico;          }          # Proxying connections to application servers         location / {              include            uwsgi_params;             uwsgi_pass         uwsgicluster;              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 

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

Cấu hình uWSGI


Khi chạy uWSGI để phục vụ các ứng dụng, có một số cách để cung cấp cho nó các cấu hình cần thiết như socket để chạy, số lượng quy trình, cài đặt quy trình chính, v.v. Trong phần này, ta sẽ nói về ba trong số chúng:

  • Truyền cấu hình làm đối số

  • Sử dụng file .ini cho cấu hình

  • Sử dụng file .json cho cấu hình

Lưu ý: uWSGI hỗ trợ nhiều giao thức và cách khác nhau để truy xuất các file cấu hình này như stdinHTTP .

Tùy chọn # 1: Truyền cấu hình làm đối số:

Mặc dù đôi khi dễ gây nhầm lẫn và khó quản lý, cách cơ bản nhất để chạy uWSGI cũng giống như bất kỳ tập lệnh shell nào khác - bằng cách cung cấp cho nó các cấu hình cần thiết làm đối số.

Ví dụ sử dụng:

# uwsgi [option] [option 2] .. -w [wsgi.py with application callable]  # Simple server running *wsgi* uwsgi --socket 127.0.0.1:8080 -w wsgi  # Running Pyramid (Paster) applications uwsgi --ini-paste production.ini  # Running web2py applications uwsgi --pythonpath /path/to/app --module wsgihandler  # Running WSGI application with specific module / callable names uwsgi --module wsgi_module_name --callable application_callable_name uwsgi -w wsgi_module_name:application_callable_name 

Để có thêm ví dụ về cách chạy uWSGI, hãy xem xét việc truy cập tài liệu của nó để biết các cấu hình ví dụ .

Tùy chọn # 2: Sử dụng file .ini cho cấu hình

Một cách khác (và có thể là) tốt hơn để cung cấp cấu hình uWSGI là thông qua các file .ini . Các file này có cấu trúc đơn giản (xem ví dụ bên dưới) và cần được chuyển rõ ràng mỗi khi tập lệnh chạy uWSGI được thực thi.

Cấu trúc .ini ví dụ ( example_config.ini ):

[uwsgi] # ------------- # Settings: # key = value # Comments >> # # -------------  # socket = [addr:port] socket = 127.0.0.1:8080  # Base application directory # chdir = /full/path chdir  = /my_app  # WSGI module and callable # module = [wsgi_module_name]:[application_callable_name] module = app:application  # master = [master process (true of false)] master = true  # processes = [number of processes] processes = 5  .. 

Ví dụ sử dụng:

uwsgi --ini example_config.ini     

Tùy chọn # 3: Sử dụng file .json cho cấu hình

Làm việc với file .json , ngoài cấu trúc, giống như các ví dụ được hiển thị ở trên.

Cấu trúc .json ví dụ ( example_config.json ):

{     "uwsgi": {         "socket": ["127.0.0.1:8080"],         "module": "my_app:app",         "master": true,         "processes": 5,     } } 

Ví dụ sử dụng:

uwsgi --json example_config.json 

Để tìm hiểu thêm về cách cấu hình uWSGI, hãy xem xét đọc tài liệu về cấu hình của nó.

Các cấu hình phổ biến cho uWSGI


Theo mặc định, server này được thiết kế theo mặc định là khuôn khổ / ứng dụng / nền tảng bất khả tri. Mặc dù nó có thể hỗ trợ bất cứ thứ gì và mọi thứ bạn có thể cần, nhưng một số tùy chọn nhất định cần được đặt rõ ràng để tuân theo các yêu cầu của bạn.

Như đã nêu trong tài liệu riêng của bạn , số lượng cách có thể để cấu hình uWSGI là gần như vô hạn. Trong phần này, ta sẽ cố gắng điểm qua những cái thường được sử dụng hoặc quan trọng nhất và giải thích cách triển khai, khi kết hợp với phần trước, ta sẽ cho phép bạn chạy uWSGI chính xác theo cách bạn cần.

Để tối ưu hóa, vui lòng tham khảo phần tiếp theo sau phần này.

Cú pháp được sử dụng trong các ví dụ dưới đây được nhắm đến cho các file .ini . Bạn có thể sửa đổi chúng cho phù hợp với nhu cầu cụ thể của bạn như mong muốn (ví dụ: đối với các cấu hình dựa trên .json , như đã giải thích trong phần trước).

socket

http-socket

Đặt uWSGI được liên kết với một socket HTTP nhất định.

Ví dụ: http-socket = :8080

socket

Đặt uWSGI được liên kết với socket được chỉ định bằng giao thức mặc định.

Ví dụ: socket = 127.0.0.1:8080

quy trình (công nhân)

Một trong hai thuật ngữ được dùng để chỉ cùng một thứ: số lượng quy trình được tạo ra để chấp nhận yêu cầu .

Ví dụ: processes = 5

giao thức

Theo mặc định, uWSGI chạy trên giao thức uwsgi của riêng nó. Thuộc tính này cho phép bạn thay đổi nó.

Ví dụ: protocol = http

Sự quản lý

bậc thầy

Tùy chọn này được sử dụng để bật hoặc tắt quy trình uWSGI chính. Các quy trình này được sử dụng để quản lý công nhân chấp nhận và xử lý các yêu cầu đến. Những lợi thế là rất nhiều, bao gồm cả công nhân khởi động lại một cách duyên dáng mà không cần chạm vào socket , điều này sẽ cho phép bạn nâng cấp mà không cần thời gian chết.

Ví dụ: master = true

yêu cầu tối đa

Nếu bạn lo lắng về việc rò rỉ bộ nhớ và không thể nghĩ ra cách xử lý chắc chắn hơn, tùy chọn này sẽ cho phép bạn tự động khởi động lại quy trình của bạn sau khi xử lý số lượng yêu cầu được chỉ định.

Ví dụ: max-requests = 1001

chủ đề

Cài đặt để chạy từng quy trình với số lượng stream được chỉ định trong chế độ đọc lại. Có thể kết hợp tùy chọn này với các quy trình để có được sự đồng thời ở các mức độ khác nhau.

Ví dụ: threads = 2

Ghi log

vô hiệu hóa ghi log

Được sử dụng để tắt tính năng ghi log .

Ví dụ: disable-logging = true

quy trình uWSGI

procname

Cho phép bạn đặt tên quy trình thành tên mà bạn chọn.

Ví dụ: procname = My Application

uid

Đặt uid user server uWSGI thành uid được chỉ định.

Ví dụ: uid = 1001

gid

Đặt gid server uWSGI thành gid được chỉ định.

Ví dụ: gid = 555

máy hút bụi

Loại bỏ tất cả các pidfiles / socket đã tạo khi thoát.

daemonize

Cài đặt này daemonized uWSGI và ghi thông báo vào đối số được cung cấp (tệp log ).

Ví dụ: daemonize = /tmp/uwsgi_daemonize.log

pidfile

Đặt uWSGI để ghi PID quy trình vào một file được chỉ định bởi tùy chọn. Tùy chọn này rất tiện dụng để quản lý các quy trình uWSGI đang chạy (xem phần Quản lý uWSGI để biết thêm thông tin).

Ví dụ: pidfile = /tmp/proj_pid.pid

Đa dạng

harakiri

Cài đặt này được sử dụng để đặt khoảng thời gian tối đa mà một quá trình được phép hoàn thành nhiệm vụ của nó trước khi nó bị dừng và tái chế cho mục đích quản lý / bộ nhớ.

Ví dụ: harakiri = 30

Để tìm hiểu tất cả về hàng trăm cấu hình có sẵn, bạn nên đọc danh sách đầy đủ có tại tài liệu tùy chọn cấu hình chính thức.

Các mẹo và đề xuất khác


Bức firewall :

Bảo mật SSH:

Tạo cảnh báo:

Theo dõi và theo dõi log truy cập server hàng ngày:

<div class = “author”> Gửi bởi: <a
href = “https://twitter.com/ostezer”> Hệ điều hành Tezer </a> </div>


Tags:

Các tin liên quan

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