Posts for: #UWSGI

uWSGI –vhost



用 uWSGI 來啟動 wsgi 的服務,除了傳統的方式,還可以一次管理多個 wsgi 的服務

還有另外一種作法 Emperor 可以對特定資料夾裡所有的設定檔,個別管理,更適合作 PASS 服務的人, http://projects.unbit.it/uwsgi/wiki/Emperor

我的需求沒有這麼大,只是一起跑多個 wsgi ,省一些記憶體,就可以了


用 daemontools 來啟動,這裡面的 buffer-size 有要吃外部的 post back 要加大,不然,預設的實在是太小,最重要的是預設值 PayPal
IPN callback 吃不下,收到錢還不知道,夠重要了吧

#!/bin/bash
# default buffer-size is 4k 4096
exec setuidgid yourname uwsgi –buffer-size 32768 -s 127.0.0.1:3031 -p 3 -M –vhost

以在 Debian 上面的 nginx 裡面的設定範例


server {
listen 80;
server_name yourcoolsite.com;
location /static {
alias /yourstatic/folder/;
}
location / {
include uwsgi_params;
#uwsgi_pass unix:/tmp/digez.sock;
uwsgi_param UWSGI_PYTHONPATH /home/yourname;
uwsgi_param UWSGI_CHDIR /home/yourname/yourcoolsite;
uwsgi_param UWSGI_ENV DJANGO_SETTINGS_MODULE=yourcoolsite.settings;
uwsgi_param UWSGI_MODULE application;
uwsgi_pass 127.0.0.1:3031;
}


放在 /home/yourname/yourcoolsite/ 的 wsgi application.py script 範例
sys.path.append 那兩行,在 Django 1.4 以下,也就是 1.3.1 (含) 以下,都要加,比較不會有路徑的問題

Django 目前的 Dev(或是 trunk 或是 github 上面 master) 開發版,已經改變 project 的路徑,所以不用再加了

# coding: utf-8
import sys
import os
sys.path.append(os.path.abspath(os.path.dirname(file)))
sys.path.append(’..’)
os.environ[‘DJANGO_SETTINGS_MODULE’] = ‘settings’

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

又當小白了

上一篇,才說,uWSGI 見鬼了

追根究底,就是程式裡沒有鬼,只有 bug

自己的系統裡,有很白目的區塊,用到 from xxx import *

這一行造成了兩的檔案互相參照,複寫了部份模組

所以還一下 uWSGI 清白,黑鍋和小白,就是自己

見鬼了 uWSGI


非常誇張,裝 uWSGI 遇到鬼打牆的情形,native Debian 可以, XEN VM 下面也可以,就其中一個 OpenVZ 的 Debian 裝不起來,老是跟我說 sys.path 有問題 Desktop Debian testing 和 XEN 裡面的 VM,都沒有問題 啟動的指令用 daemontools 來控制

#!/bin/bash
cd /home/terry/webapp

exec setuidgid terry uwsgi -s 127.0.0.1:3031 -p 2 –pp .. –env DJANGO_SETTINGS_MODULE=webapp.settings -w “django.core.handlers.wsgi:WSGIHandler()"
PS: 只好先用獨角馬 gunicorn

Tornado Gunicorn uWSGI 大亂鬥

最近因為有個屬於幫忙性質的案子,這一個專案的主角,有一些堅持,所以也算讓我可以多用一些東西 XD

在這一專案,我是屬於打工的角色,所以一般,主角決定了什麼,打工的做就對了,原本原型,是 Django 搭 MySQL 的專案,要改成 TornadoMongoDB , 但是,好歹多年前,也看過

Nicholas Piël 的 WSGI Server 大亂鬥 http://nichol.as/benchmark-of-python-web-servers

知道其實 Tornado 也沒有多佔便宜,但是口說無憑,當然秉持科學的精神(當然這樣也沒什麼科學),利用一下,小寶寶午休時間,中年老爸,趕快來作一下, benchmark 來驗證一下,就不 post 詳細的數據啦,我只是給自己驗證的結果,所有的軟體,都是安裝最新穩定版,用 pip install 的方式,在 debian 上面測試,官方的文件是說 nginx 只要是大於等於 0.7.63 版,都有將 uWSGI 包含進去,所以不需要重新編譯安裝 nginx , 想用新一點的人要自己再編譯 nginx ,測試用的工具是 Apache 的工具 ab -c 500 -n 2000

uWSGI 效能第一 (100%),穩定,但是,設定的選項很多,對 Linux 沒有概念的,可能比較不會發揮,適合 Linux 熟的

Tornado 效能第二 (93%),回應時間,落差比較大,適合,喜歡自己打造東西的人

Gunicorn 效能第三 (84%),穩定,設定非常的簡單,回應時間穩定


百分比,只是,回應速度,在加權一點回應時間,測試的程式,就只是基本的 Hello World or Ping Pong 的方式,以上三個,都足以應付 production 的需求環境


測試條件

uWSGI 基本上都是參考 Nicholas Piël 方式,不過有些系統的對應參數,必須先用 sysctl 調好,也要懂 -l 的數字一定要大於等於你的 concurrency 數,都是透過 nginx

sysctl -w net.ipv4.tcp_keepalive_time=300
sysctl -w net.core.somaxconn=250000
sysctl -w net.ipv4.tcp_max_syn_backlog=2500
sysctl -w net.core.netdev_max_backlog=2500


uwsgi –gid www-data –uid www-data -z 30 -l 500 -L -M -s 127.0.0.1:3031 -p 4 –env DJANGO_SETTINGS_MODULE=bench.settings -w “django.core.handlers.wsgi:WSGIHandler()” # django app

uwsgi –gid www-data –uid www-data -z 30 -l 500 -L -M -s 127.0.0.1:3031 -p 4 -pythonpath pwd -w myapp # 單純 wsgi app


Tornado 參考 Nicholas Piël 直接打,還有就是用 https://github.com/bdarnell/django-tornado-demo 的 testsite 測試


Gunicorn 直接用 gunicorn_django –worker=2 ,其實這樣對他有一點不公平,也應該直接接 wsgi app 才對,不過,他的設定最簡單,可以直接上,這就是他的好處


PS1: 專案的架構,一般都是見仁見智,很難有一定的評斷,但是連正式上線,都還沒有上線,就將原型完全換掉,也是一種神人級的豪賭,一種情形是,這些東西神人都可以自己生出來,所以不在乎原型,一種是,神人不喜歡,別人寫得東西,喜歡自己來,一般決定一個專案的架構的時候,第一點,一定是,時間,人力,還有成員的熟悉度,絕不是,盲目的追求效能,或是熱門的話提,要跨入 nosql 之前,先看看自己作過幾個大型的 SQL 專案,能發揮到什麼程度,可以先由一些小型的專案,驗證熟悉

PS2: 這個原型,是我看過非常乾淨的 Django project 不管是自身的架構或是重用別人的部份,都算是非常的漂亮 ( 原作者還呼隴我說寫的很丑很髒 )


PS3: 其實用 Django 外,Python 不像 Ruby 那樣,選擇不多,相反地,我的媽壓,還真不好選, http://wiki.python.org/moin/WebFrameworks ,不同專案有不同需求,找自己愛用的吧,玩得開心最重要,喜歡套件 AP 多,可以直接上,就 Django ,喜歡自己打造,選擇有一大票

uWSGI

uWSGI

http://projects.unbit.it/uwsgi/wiki 是完全用 C 來實做的 wsgi server ,wsgi 就是目前 Python web 配置方式中最為通用的方式

現在 nignx 預設已經有支援了

我覺得最棒的是,哈哈看看安裝方式 http://projects.unbit.it/uwsgi/wiki/Install, 喔耶

pip install uwsgi

# OR

pip install http://projects.unbit.it/downloads/uwsgi-lts.tar.gz


你說,有沒有想按個讚壓,以後就不能說, uWSGI deploy 麻煩,綠角馬 ( gunicorn) 比較方便了

試試看才知道真實力, session 搬到,記憶體,或是 cache 後, C10K 應該可以輕鬆一些

PS 給新手,老手可跳過: 鄉親壓,當然還是要設定檔地,請參考 http://projects.unbit.it/uwsgi/wiki/Exampl ,記得可以搭配 daemontools ,或是 Upstart 一起服用喔 ,千萬不要天真又善良的由 source 安裝喔,各大 Linux distribution 都有販售