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
- uWSGI trong Tóm tắt
- Triển khai ứng dụng web với Nginx
- Sử dụng Nginx làm Reverse-Proxy với uWSGI
2. Chuẩn bị server của bạn để production
- Cập nhật hệ điều hành mặc định
- Cài đặt Python, pip và virtualenv
- Tạo môi trường ảo (Python)
- Download và cài đặt uWSGI
- Download và cài đặt Nginx
3. Cung cấp các ứng dụng Python WSGI với uWSGI
- WSGI
- Đối tượng ứng dụng WSGI (Có thể gọi):
wsgi.py
- Chạy server
- Cấu hình uWSGI
- Các cấu hình phổ biến cho uWSGI
- 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ề 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 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 ảo và mô-đ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 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 .
Đố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ángSIGTERM
-TERM
reload "tàn bạo"SIGINT
-INT
và SIGQUIT-QUIT
giết tất cả công nhân ngay lập tứcSIGUSR1
-USR1
in số liệu thống kê (stdout)SIGUSR2
-USR2
in trạng thái công nhânSIGURG
-URG
khôi phục ảnh chụp nhanhSIGTSTP
-TSTP
tạm dừng, tạm dừng hoặc tiếp tục một versionSIGWINCH
-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ìnhSử 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ư stdin và HTTP .
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>
Các tin liên quan
Cách triển khai ứng dụng WSGI Python bằng web server CherryPy đằng sau Nginx2013-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