Thứ năm, 12/12/2013 | 00:00 GMT+7

Cách triển khai ứng dụng WSGI Python bằng server Gunicorn HTTP đằng sau Nginx

Có lẽ đó là bài viết về So sánh Server Web Python đã hấp dẫn bạn chuyển đổi hoặc thực tế là bạn đã phát triển nhanh hơn ngăn xếp triển khai ứng dụng hiện tại của bạn . Bạn muốn tìm hiểu thêm về Server Web Gunicorn và muốn tìm hiểu cách triển khai ứng dụng Python một cách triệt để ngay từ đầu.


Trong bài viết DigitalOcean này, mục đích của ta là giúp bạn với tất cả những điều trên và sau đó là một số điều. Ta sẽ bắt đầu với việc mở rộng kiến thức của bạn về Server HTTP Gunicorn WSGI xuất sắc và tiếp tục triển khai các ứng dụng web Python WSGI được xây dựng trên các khuôn khổ phổ biến khác nhau.

Bảng chú giải


1. Giới thiệu về Gunicorn và Nginx


  1. Gunicorn
  2. Triển khai ứng dụng web bằng Nginx

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 Gunicorn
  5. Download và cài đặt Nginx

3. Cung cấp các ứng dụng web Python với Gunicorn


  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 và tối ưu hóa Gunicorn
  5. Cấu hình Nginx
  6. Các mẹo và đề xuất khác

Giới thiệu về Gunicorn và Nginx


Gunicorn


Gunicorn là một server ứng dụng web WSGI độc lập cung cấp rất nhiều chức năng. Nó hỗ trợ nguyên bản các khung công tác khác nhau với bộ điều hợp của nó, làm cho nó trở thành một trình thay thế thả vào cực kỳ dễ sử dụng cho nhiều server phát triển được sử dụng trong quá trình phát triển.

Về mặt kỹ thuật, cách thức hoạt động của Gunicorn rất giống với web server Unicorn thành công cho các ứng dụng Ruby. Cả hai đều sử dụng những gì được gọi là mô hình pre-fork. Về bản chất, điều này giao nhiệm vụ cho quy trình tổng thể [Gunicorn] trung tâm để xử lý việc quản lý công nhân, tạo các socket và ràng buộc, v.v.

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

  • Chạy bất kỳ ứng dụng web WSGI Python nào (và khuôn khổ)

  • được dùng để thay thế cho Paster (Kim tự tháp), Server phát triển của Django, web2py, v.v.

  • Đi kèm với nhiều loại công nhân và cấu hình

  • Tự động quản lý các quy trình của nhân viên

  • Hỗ trợ HTTP / 1.0 và HTTP / 1.1 (Keep-Alive) thông qua các worker đồng bộ và không đồng bộ

  • Hỗ trợ SSL

  • Có thể mở rộng với móc

  • Hỗ trợ Python 2.6+ và 3.x

Triển khai ứng dụng web bằng 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 hiện nay 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 client * không phải là thông báo lỗi.

Tại sao sử dụng Nginx làm Reverse Proxy trước server ứng dụng?

Nhiều khuôn khổ và server ứng dụng (bao gồm cả Gunicorn) có thể phục vụ các file tĩnh (ví dụ: javascript, css, hình ảnh, v.v.) cùng với các phản hồi. 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ó 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 ý: Vui lòng xem phần Định cấu hình và Tối ưu hóa Gunicorn để tìm hiểu về số lượng server / công nhân sẽ sử dụng.

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


Trong phần này, ta sẽ chuẩn bị ảo của ta để 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 có các phụ thuộc của nó như Gunicorn)

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ề pip và virtualenv: 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 quá trình cài đặt và chuẩn bị sau trên một server 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 VPS của bạn . Tuy nhiên, nếu bạn đã tích cực sử dụng nó, ta khuyên bạn nên chuyển sang hệ thống mới.

Để đả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, ta có thể tạo 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 ảo và module ứ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 Gunicorn


Đó 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. Do đó, ta sẽ download và cài đặt Gunicorn ở đó.

Nếu bạn không làm việc trong một môi trường, Gunicorn 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 Gunicorn bằng pip, hãy chạy như sau:

pip install gunicorn 

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 web Python với Gunicorn


Trong phần này, ta sẽ xem cách một ứng dụng WSGI hoạt động với Gunicorn. Quá trình này bao gồm việc cung cấp cho server một ứng dụng WSGI có thể gọi được (ví dụ: application = (..) ) làm điểm vào.

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) để server sử dụng.

Ta sẽ bắt đầu với việc tạo một wsgi.py mẫu để sử dụng với Gunicorn.

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 

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 (ví dụ: 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 của 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.

Sau 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


Để bắt đầu cung cấp ứng dụng của bạn, bạn chỉ cần thực hiện:

gunicorn [option] [option] .. [wsgi file] 

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

gunicorn -b 0.0.0.0:8080 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:

gunicorn -b 0.0.0.0:8080 wsgi & 

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ấu hình và tối ưu hóa Gunicorn


Lưu ý: Dưới đây là một số cài đặt cấu hình và tối ưu hóa được sử dụng phổ biến nhất. Để xem về tất cả các tùy chọn có sẵn, hãy xem tài liệu chính thức để biết tổng quan về cấu hình Gunicorn .

Như đã đề cập trước đó, Gunicorn có khả năng cấu hình cao và rất dễ dàng sửa đổi tất cả các thông số cần thiết để có nó theo cách của bạn.

[!] Quan trọng: Tất cả các tùy chọn cài đặt và cấu hình liệt kê bên dưới phải được xâu chuỗi (đặt lần lượt) để chạy gunicorn và phục vụ ứng dụng của bạn. Bạn không thể sửa đổi bất kỳ tùy chọn nào sau khi chạy server . Cho dù bạn sử dụng tùy chọn hoặc (các) tùy chọn nào, chúng phải được theo sau bởi file wsgi chứa điểm truy cập vào ứng dụng của bạn.

Thí dụ:

# Simply running the server (as shown above): gunicorn -b 0.0.0.0:8080 wsgi  # Running the server with five workers: gunicorn -b 0.0.0.0:8080 --workers=5 wsgi 

Số lượng công nhân

Nói chung, người ta coi (và được chấp nhận) rằng các ứng dụng có ràng buộc I / O hơn là ràng buộc CPU. Điều này nghĩa là , nút cổ chai không phải do sức mạnh xử lý mà server ảo của bạn có mà là do các đĩa. Ý tưởng là: khi một nhân viên bận rộn với các hoạt động của đĩa, một nhân viên khác vẫn sử dụng CPU để xử lý các yêu cầu.

Do đó, lượng công nhân đề xuất cần có thường được đặt xung quanh theo công thức đơn giản sau:

# (2 Workers * CPU Cores) + 1 # --------------------------- # For 1 core  -> (2*1)+1 = 3 # For 2 cores -> (2*2)+1 = 5 # For 4 cores -> (2*4)+1 = 9 

Bạn có thể chỉ định số lượng công nhân bằng cách chuyển đối số --workers=[n] .

Sử dụng:

# Example: gunicorn --workers=[number of workers] gunicorn --workers=5 

Lưu ý: Trường hợp trên không hoàn toàn áp dụng cho công nhân không chặn.

Cài đặt socket

Cách hoạt động của các liên kết socket như sau:

# Example: gunicorn -b [address:port] gunicorn -b 127.0.0.1:8080 

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 .

Chọn Loại Công nhân

Gunicorn, như ta đã thảo luận, đưa ra khả năng làm việc với nhiều loại công nhân khác nhau.

Đối với phần lớn các triển khai, loại công nhân tiêu chuẩn - đồng bộ hóa - sẽ là đủ và đi kèm theo mặc định, do đó không yêu cầu cài đặt rõ ràng nào.

Đối với các công nhân khác, xin lưu ý bạn cần cài đặt chúng dưới dạng phụ thuộc.

Sử dụng:

# Example: gunicorn -k [worker] gunicorn -k sync    # or; gunicorn -k gevent  # .. 

Các loại có sẵn:

  • đồng bộ hóa
  • eventlet
  • gevent
  • lốc xoáy

Số lượng kết nối đồng thời cho Eventlet / Gevent

Để sửa đổi số lượng kết nối đồng thời cho Eventlet và Gevent worker:

# Example: gunicorn -k [worker] --worker-connections [number] gunicorn -k gevent --worker-connections 1001 

Truy cập Nhật ký

Nếu bạn muốn cài đặt rõ ràng file để ghi log truy cập:

# Example: gunicorn --access-logfile [file] gunicorn --access-logfile acclogs 

Theo mặc định, tùy chọn này được đặt thành Không có .

Nhật ký lỗi

Để chỉ định một file để ghi log lỗi, hãy sử dụng cài đặt này.

# Example: gunicorn --log-file [file] gunicorn --log-file error_logs.log 

Mức đăng nhập

Điều này được sử dụng để đặt mức độ chi tiết của kết quả log lỗi. Các tùy chọn có thể là:

  • gỡ lỗi
  • thông tin
  • cảnh báo
  • lỗi
  • bạo kích

Sử dụng:

 # Example: gunicorn --log-level [level]  gunicorn --log-level error 

Đặt tên quy trình

Nếu bạn đang sử dụng các tiện ích như top để theo dõi các quy trình của bạn , bạn có thể sử dụng cài đặt này để đặt cho chúng một cái tên có ý nghĩa hơn giúp bạn thực hiện công việc.

# Example: gunicorn --name [name] gunicorn --name my_application 

Cấu hình Nginx


Sau khi tìm hiểu về cấu hình và chạy Gunicorn, bây giờ ta cần thực hiện tương tự với Nginx để nói chuyện với server Gunicorn đang chạy ứng dụng. Đố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 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 

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á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 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