Nginx + uWSGI + Flask + Vhost

1.準備工做
先裝好nginx virtualenv flask uwsgi等。
nginx配置路徑/etc/nginx
virtualenv路徑 /opt/pyenv/
裝有flask的一個env /opt/pyenv/flask0.8/
兩個虛擬主機目錄 /var/pywww/app1 /var/pywww/app2html

2.配置
/etc/nginx/conf.d/virtual.confpython

server {
    listen       80;
    server_name  app1.mydomain.com;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:9090; #uwsgi運行的主機和ip,後面咱們會在本機的9090端口上運行uwsgi進程
        uwsgi_param UWSGI_PYHOME /opt/pyenv/flask_0.8; #運行python腳本的virtualenv路徑
        uwsgi_param UWSGI_CHDIR /var/pywww/app1; #網站根目錄
        uwsgi_param UWSGI_SCRIPT main:app; # 本例以根目錄下的main.py中的app對象做爲一個callble讓uwsgi調用
    }
}

server {
    listen       80;
    server_name  app2.mydomain.com;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:9090;
        uwsgi_param UWSGI_PYHOME /opt/pyenv/flask_0.8;
        uwsgi_param UWSGI_CHDIR /var/pywww/app2;
        uwsgi_param UWSGI_SCRIPT test:apppp; #同理,本例以根目錄下的test.py中的apppp對象做爲一個callble讓uwsgi調用
    }
}

3.創建測試用的flask入口
/var/pywww/app1/下創建main.pynginx

from flask import Flask 


app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello app1!"

/var/pywww/app2/下創建test.pyflask

from flask import Flask  

apppp = Flask(__name__)

@apppp.route("/")
def sadfa():
    return "Hello app2!"

4.運行並訪問併發

運行uwsgi:
uwsgi -s :9090 -M -p 4 --vhost --no-site
啓動nginx:
service nginx start

-s 後爲ip:port
併發4個線程:uwsgi -s :9090 -p 4
主控制線程+4個線程:uwsgi -s :9090 -M -p 4
執行超過30秒的client直接放棄:uwsgi -s :9090 -M -p 4 -t 30
限制內存空間128M:uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 
#--limit-as 這個參數好像有點問題,若是啓動不了,日誌顯示「/operator.so: failed to map segment from shared object: Cannot allocate memory unable to load app 0」 的話,就把這個參數去掉
服務超過10000個req自動respawn:uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000
後臺運行:uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log
--no-site: do not import site.py on startup
爲了讓多個站點共享一個uwsgi服務,必須把uwsgi運行成虛擬站點:uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log --vhost
還有 --uid 和 --chroot 兩個參數本身參考其餘資料使用app

這樣只用開一套uwsgi進程,就能夠運行app1.mydomain.com和app2.mydomain.com兩個域名下的兩套程序。nginx根 據域名不一樣,發送不一樣的uwsgi參數給監聽在9090端口上的uwsgi進程,uwsgi指定路徑找到對應的程序,用指定的virtualenv,執行 指定的入口callble,將請求參數傳入。dom

在uwsgi啓動參數加上--pidfile=/tmp/project-master.pid
用kill發送重啓信號,這樣更新過的程序就能生效了:kill -TERM `cat /tmp/project-master.pid`
更多的信號參見:http://projects.unbit.it/uwsgi/wiki/uWSGISignals測試

欲瞭解詳情,請參考uWSGI Example以及Nginx+uWSGI配置詳解Nginx+uWSGI 部署 Django 應用 網站

相關文章
相關標籤/搜索