1. 程式人生 > >linux3——flask+ubuntu+nginx+uwsgi

linux3——flask+ubuntu+nginx+uwsgi

方便 適合 portal 文檔 run request gil groov roc

1.uwsgi配置

1.1配置文件

方式一:

[uwsgi]

# uwsgi 啟動時所使用的地址與端口

socket = 127.0.0.1:8001

# 指向網站目錄

chdir = /home/www/

# python 啟動程序文件

wsgi-file = manage.py

# python 程序內用以啟動的 application 變量名

callable = app

# 處理器數

processes = 4

# 線程數

threads = 2

#狀態檢測地址

stats = 127.0.0.1:9191

註意:callable=app 這個 app 是 manage.py 程序文件內的一個變量,這個變量的類型是 Flask的 application 類 。

方式二:

目錄規劃
(.env) zhangshuaipeng@orange:~/web/flask/mysite$ tree .
.
├── hello.py
├── hello.pyc
├── uwsgi
│ ├── uwsgi.log # 日誌文件,通過該文件查看uwsgi的日誌
│ ├── uwsgi.pid # pid文件,通過該文件可以控制uwsgi的重啟和停止
│ ├── uwsgi.sock # socket文件,配置nginx時候使用
│ └── uwsgi.status # status文件,可以查看uwsgi的運行狀態
└── uwsgi.ini
配置使用
(.env) zhangshuaipeng@orange:~/web/flask/mysite$ vi uwsgi.ini

[uwsgi]
chdir=/home/zhangshuaipeng/web/flask/mysite/
home=/home/zhangshuaipeng/web/flask/mysite/.env
module=hello # python文件的名稱
callable=app
master=true
processes=2 # worker進程個數
chmod-socket=666
logfile-chmod=644
uid=zhangshuaipeng_web
gid=zhangshuaipeng_web
procname-prefix-spaced=mysite # uwsgi的進程名稱前綴
py-autoreload=1 # py文件修改,自動加載
#http=0.0.0.0:8080 # 監聽端口,測試時候使用

vacuum=true # 退出uwsgi是否清理中間文件,包含pid、sock和status文件
socket=%(chdir)/uwsgi/uwsgi.sock # socket文件,配置nginx時候使用stats=%(chdir)/uwsgi/uwsgi.status # status文件,可以查看uwsgi的運行狀態
pidfile=%(chdir)/uwsgi/uwsgi.pid # pid文件,通過該文件可以控制uwsgi的重啟和停止
daemonize=%(chdir)/uwsgi/uwsgi.log # 日誌文件,通過該文件查看uwsgi的日誌


常用命令
uwsgi --ini uwsgi.ini # 啟動
uwsgi --reload uwsgi.pid # 重啟
uwsgi --stop uwsgi.pid # 關閉

uwsgi的啟動可以把參數加載命令行中,也可以是配置文件 .ini, .xml, .yaml 配置文件中,個人用的比較多得是 .ini 文件。
通過uwsgi --help可以查看得到:

-x|--xmlconfig load config from xml file
-x|--xml load config from xml file
--ini load config from ini file
-y|--yaml load config from yaml file
-y|--yml load config from yaml file

1.2安裝

pip3 install uwsgi

2.nginx

2.1安裝

sudo apt-get install nginx

2.2配置

註意三個文件的不同:這三個文件都在ext/nginx下

ext/nginx/sites-available/default

nginx.conf

/etc/nginx/conf.d

應用文件應該放在 /var/www/ 下,log 文件應該放到系統的 log 文件夾下等等,這個只是簡單示例,更多配置內容,我們應該通過 uWSGI、Nginx 的文檔學習。

方式一:Ubuntu 上配置 Nginx 也是很簡單,不要去改動默認的 nginx.conf 只需要將/ext/nginx/sites-available/default文件替換掉就可以了。

新建一個 default 文件:

server {
listen 80;
server_name XXX.XXX.XXX; #公網地址
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8001; # 指向uwsgi 所應用的內部地址,所有請求將轉發給uwsgi 處理
uwsgi_param UWSGI_PYHOME /home/www/my_flask/venv; # 指向虛擬環境目錄
uwsgi_param UWSGI_CHDIR /home/www/my_flask; # 指向網站根目錄
uwsgi_param UWSGI_SCRIPT manage:app; # 指定啟動程序

}
}

更改配置還需要記得重啟一下nginx:sudo service nginx restart

方式二:刪掉 Nginx 的默認配置文件,在/etc/nginx/conf.d/中創建配置,實際上是創建軟鏈

直接在當前目錄下創建配置文件,將 Nginx 配置文件用軟鏈接鏈接到 Nginx 配置文件夾中:

$ sudo rm /etc/nginx/sites-enabled/default

sudo ln -s /home/frank/Documents/helloflask/helloflask_nginx.conf /etc/nginx/conf.d/

下面給出一個簡單的配置:

server {
listen 80;
server_name your.website.url
charset utf-8;
client_max_body_size 75M;
location / { try_files $uri @yourapplication; }
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:/home/frank/Documents/helloflask/helloflask_uwsgi.sock;
}
}
我們可以將上述內容保存為 helloflask_nginx.conf,稍作解釋:server_name 可以是域名,也可以寫 ip 地址,uwsgi_pass 是表明 Nginx 與 uwsgi 的交流方式,我這裏用的是 sock 文件,當然你也可以用指定端口號的形式,具體可以看這裏。

重啟 Nginx:sudo /etc/init.d/nginx restart

方式三:在指定目錄創建,編輯配置文件:/etc/nginx/conf.d/flask.conf,nginx 配置 新建文件 /etc/nginx/conf.d/xxx.conf xxx.conf 中xxx你來定

server { listen 81; server_name www.mysite.com; charset utf-8; client_max_body_size 5M; location /app1/ { include uwsgi_params; uwsgi_pass unix:/home/kevin/web/flask/mysite/uwsgi/uwsgi.sock; } location /static { alias /home/kevin/web/flask/mysite/static; } }

解釋:

刪除/etc/nginx/sites-enabled/ 以及 /etc/nginx/sites-available/ 下所有文件
你可以這麽玩,sudo rm -f /etc/nginx/sites-enabled/default
為什麽這麽做呢?
先看nginx.conf裏面有:
include /etc/nginx/conf.d/.conf;
include /etc/nginx/sites-enabled/
;
而sites-enabled裏面也有default這種文件,我這麽做的原因是刪了看著幹凈。以後做擴展找起來也好找,都在conf.d目錄下。



2.3nginx啟動測試

kevin@orange:~/web/flask/mysite$ sudo service nginx start
kevin@orange:~/web/flask/mysite$ ps -ef | grep nginx
root      2324     1  0 16:19 ?        00:00:00 nginx: master process /usr/sbin/nginx
www-data  2325  2324  0 16:19 ?        00:00:00 nginx: worker process
www-data  2326  2324  0 16:19 ?        00:00:00 nginx: worker process
www-data  2327  2324  0 16:19 ?        00:00:00 nginx: worker process
www-data  2328  2324  0 16:19 ?        00:00:00 nginx: worker process
zhangsh+  2330  2171  0 16:20 pts/1    00:00:00 grep --color=auto nginx

3.服務測試

可以選用curl測試

  • Http訪問測試,一切OK
kevin@Blue:~$ curl http://192.168.1.32:81/app1/flask/
Hello World! Hello Flask!
kevin@Blue:~$ curl http://192.168.1.32:81/app1/
Hello World!

4.項目的上傳

git方式

5.概念理解

- WSGI
- uWSGI
- uwsgi
- Nginx

瀏覽器發起請求,都是請求80端口


WSGI 是一種協議,不是任何包不是任何服務器,就和 TCP 協議一樣。它定義了 Web 服務器和 Web 應用程序之前如何通信的規範。

至於為什麽和 Python 扯在一起?因為這個協議是由 Python 在 2003 年提出的。(參考:PEP-333 和 PEP-3333 )

> WSGI is the Web Server Gateway Interface. It is a specification that describes how a web server communicates with web applications, and how web applications can be chained together to process one request.

uWSGI 是一個全功能的 HTTP 服務器,他要做的就是把 HTTP 協議轉化成語言支持的網絡協議。比如把 HTTP 協議轉化成 WSGI 協議,讓 Python 可以直接使用。

> The uWSGI project aims at developing a full stack for building hosting services.
>
> Application servers (for various programming languages and protocols), proxies, process managers and monitors are all implemented using a common api and a common configuration style.

uwsgi 是一種 uWSGI 的內部協議,使用二進制方式和其他應用程序進行通信。

> The uwsgi (lowercase!) protocol is the native protocol used by the uWSGI server.
>
> It is a binary protocol that can carry any type of data. The first 4 bytes of a uwsgi packet describe the type of the data contained by the packet.

Nginx 是一個 Web 服務器其中的 HTTP 服務器功能和 uWSGI 功能很類似,但是 Nginx 還可以用作更多用途,比如最常用的反向代理功能。

所以用一張圖來描述一下這個過程:

uWSGI配合Nginx反向代理

很多框架和應用服務器都可以對靜態文件的請求(如JavaScript、CSS、圖片等)返回來自應用的響應,不過更好的做法是用反向代理服務器(比如Nginx)來處理此類請求,減輕應用服務器的負載,獲得更好的性能。

隨著應用擴大,可能會需要分布到不同的服務器(雲主機)上,此類需求在早期可以用反向代理實現。

此外,Nginx的可擴展性(除了緩存之外,還有failover等其他機制)對於一些比較復雜的Web應用也很有幫助。

一個簡單的服務器架構:

客戶端請求      ----> Nginx (反向代理)
                        |
                       /|\                           
                      | | `-> App. Server I.   127.0.0.1:8081
                      |  `--> App. Server II.  127.0.0.1:8082
                       `----> App. Server III. 127.0.0.1:8083

註:只監聽127.0.0.1的應用只能從本地訪問,而如果設置成0.0.0.0就能夠從外部訪問了。

flask,是一種python開發web的一種框架,類似的還有django,flask比較輕量,django適合大型項目。 flask框架寫的web,通常可以直接運行起來就可以訪問web了。但是這種方式只適合開發調試,前面已經提過。實際是它內部有一個web服務,叫wsgi。這個東西不是很全,只是作為部分被提供在flask框架內。生產環境中,需要另外的web服務來掛起flak寫的網站。通常這個web服務就是uwsgi。稍後我們會講到,怎麽去安裝配置uwsgi;

而對於nginx,它扮演的是反向代理角色。在大型項目裏面常常扮演者反向代理和負載均衡的角色。 什麽意思呢,就是用戶發送的請求,全部通過這個nginx服務,nginx會去請求真正的內容服務器,也就是我們部署好的,uwsgi服務。uwsgi服務將用戶需要的網頁和數據,送到nginx服務那,再由nginx推送給用戶。這個過程,對於用戶來說,只和uwsgi服務發生關系。真正的內容服務器是不可見的。 所以從安全的角度來說,這無疑更安全。 另外一個原因選擇nginx,是由於nginx服務性能很穩定,高並發能力強。

uWSGI
我們知道 Flask 中自帶了 web server,通過 Werkzeug,我們可以搭建 WSGI 服務,運行我們的網站,但 Flask 是 Web 框架,並不是 Web 服務器,盡管 Werkzeug 很強大,但只能用於開發,不能用於生產,對於 Web 服務器,我們有更專業的選擇,那就是 uWSGI, uWSGI 是一個全站式的托管服務,它實現了應用服務器(支持多種編程語言)、代理、進程管理器、監視器。取名為 uWSGI 是因為它最早實現的是 Python 語言的 WSGI。

uWSGI 包括四個部分:

uwsgi協議
web server 內置支持協議模塊
application 服務器協議支持模塊
進程控制程序
uWSGI 是 C 語言寫的,性能比較高。

WSGI, uWSGI, uwsgi 的區別
當我們部署完一個應用程序,瀏覽網頁時具體的過程是怎樣的呢?首先我們得有一個 Web 服務器來處理 HTTP 協議的內容,Web 服務器獲得客戶端的請求,交給應用程序,應用程序處理完,返回給 Web 服務器,這時 Web 服務器再返回給客戶端。Web 服務器與應用程序之間顯然要進行交互,這時就出現了很多 Web 服務器與應用程序之間交互的規範,最早出現的是 CGI,後來又出現了改進 CGI 性能的FasgCGI,Java 專用的 Servlet 規範,Python 專用的 WSGI 規範等等。有了統一標準,程序的可移植性就大大提高了。這裏我們只介紹 WSGI。

WSGI 全稱是 Web Server Gateway Interface,也就是 Web 服務器網關接口,它是 Python 語言定義出來的 Web 服務器和 Web 應用程序之間的簡單而通用的接口,基於現存的 CGI 標準設計,後來在很多其他語言中也出現了類似的接口。 總的來說,WSGI 可以分為服務器和應用程序兩個部分,實際上可以將 WSGI 理解為服務器與應用程序之間的一座橋,橋的一邊是服務器,另一邊是應用程序。

按照 web 組件分類,WSGI 內部可以分為三類,web 應用程序,web 服務器,web 中間件。應用程序端的部分通過Python 語言的各種 Web 框架實現,比如 Flask,Django這些,有了框架,開發者就不需要處理 WSGI,框架會幫忙解決這些,開發者只需處理 HTTP 請求和響應,web 服務器的部分就要復雜一點,可以通過 uWSGI 實現,也可以用最常見的 Web 服務器,比如 Apache、Nginx,但這些 Web 服務器沒有內置 WSGI 的實現,是通過擴展完成的。如 Apache,通過擴展模塊 mod_wsgi 來支持WSGI,Nginx可以通過代理的方式,將請求封裝好,交給應用服務器,比如 uWSGI。uWSGI 可以完成 WSGI 的服務端,進程管理以及對應用的調用。WSGI 中間件的部分可以這樣理解:我們把 WSGI 看做橋,這個橋有兩個橋墩,一個是應用程序端,另一個是服務器端,那麽橋面就是 WSGI 中間件,中間件同時具備服務器、應用程序端兩個角色,當然也需要同時遵守 WSGI 服務器和 WSGI 應用程序兩邊的限制和需要。更詳細的內容可以看PEP-333 中間件的描述

Flask 依賴的 Werkzeug 就是一個 WSGI 工具包,官方文檔的定義是 Werkzeug 是為 Python 設計的 HTTP和 WSGI 實用程序庫。我們需要註意的是,Flask 自帶的 Werkzeug 是用來開發的,並不能用於生產環境,Flask 是 Web 框架,而 Werkzeug 不是 Web框架,不是 Web 服務器,它只是一個 WSGI 工具包,它在 Flask 的作用是作為 Web 框架的底層庫,它方便了我們的開發。

我們將 uwsgi 和 uWSGI 放在一起講解。uWSGI 是一個 Web 服務器程序,WSGI,上面已經談到,是一種協議,uwsgi 也是一種協議,uWSGI 實現了 uwsgi、WSGI、http 等協議。 uwsgi 的介紹可以看這裏,uwsgi 是 uWSGI 使用的一個自有的協議,它用4個字節來定義傳輸數據類型描述。盡管都是協議,uwsgi 和 WSGI 並沒有聯系,我們需要區分這兩個詞。

Nginx
Nginx 是高效的 Web 服務器和反向代理服務器,可以用作負載均衡(當有 n 個用戶訪問服務器時,可以實現分流,分擔服務器的壓力),與 Apache 相比,Nginx 支持高並發,可以支持百萬級的 TCP 連接,十萬級別的並發連接,部署簡單,內存消耗少,成本低,但 Nginx 的模塊沒有 Apache 豐富。Nginx 支持 uWSGI 的 uwsgi 協議,因此我們可以將 Nginx 與 uWSGI 結合起來,Nginx 通過 uwsgi_pass 將動態內容交給 uWSGI 處理。

官方文檔在這

最好的 Nginx 教程在這

uWSGI 和 Nginx 的關系
從上面的講解中,我們知道,uWSGI 可以起到 Web 服務器的作用,那麽為什麽有了 uWSGI 還需要 Nginx 呢?

最普遍的說法是 Nginx 對於處理靜態文件更有優勢,性能更好。其實如果是小網站,沒有靜態文件需要處理,只用 uWSGI 也是可以的,但加上 Nginx 這一層,優勢可以很具體:

對於運維來說比較方便,如果服務器被某個 IP 攻擊,在 Nginx 配置文件黑名單中添加這個 IP 即可,如果只用 uWSGI,那麽就需要在代碼中修改了。另一方面,Nginx 是身經百戰的 Web 服務器了,在表現上 uWSGI 顯得更專業,比如說 uWSGI 在早期版本裏是不支持 https 的,可以說 Nginx 更安全。

nginx本身只能調用靜態文件, 它需要依賴網關協議文件來調用腳本.
uwsgi是nginx的標準模塊, 用於調用其它腳本.
修改nginx的配置文件conf/nginx.conf以指向uwsgi

location / {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:5000;
    root   html;
    index  index.html index.htm;
}

修改uwsgi文件, 配置腳本文件app_config.xml,
即運行的文件名以及應用名(nginx, uwsgi和app間需要通過socket進行交互)

<uwsgi>
     <pythonpath>/home/chenjiebin/web/flaskdemo</pythonpath>
     <module>flask</module>
     <callable>app</callable>
     <socket>127.0.0.1:5000</socket>
     <master/>
     <processes>4</processes>
     <memory-report/>
</uwsgi>

Nginx常用的幾個命令:
sudo service nginx start
sudo service nginx stop
sudo service nginx restart

1. uwsgi是uWSGI這個程序使用的協議。特點是比其他協議都快。
2. 反向代理監聽某個端口,當有客戶端連接該端口,反向代理就會處理客戶端的請求。所以客戶端是主動的,反向代理是被動的。

2,安裝部署

  • 一鍵安裝
pip install uwsgitop
  • 源碼安裝
# 可以去pypi,搜索uwsgi下載:
https://pypi.python.org/pypi/uWSGI/ 
# 安裝命令如下:
tar xvzf uwsgi-2.0.9.tar.gz
cd uwsgi-2.0.9
make

3,服務監控

  • 讀取uwsgi實時狀態
uwsgi --connect-and-read uwsgi/uwsgi.status

讀取的結果是個json串,包括每個總的狀態,每個work是狀態,響應時間等,非常全面,也有一些開源的監控可以使用

  • 實時動態查看狀態 - uwsgitop
    這裏有個uwsgi官方制作的實用工具 uwsgitop, 下面看下效果。
# pip install uwsgitop
# uwsgitop uwsgi/uwsgi.status
uwsgi-2.0.9 - Mon Sep 14 11:20:44 2015 - req: 0 - RPS: 0 - lq: 0 - tx: 0
node: lzz-rmbp - cwd: /Users/liuzhizhi/erya/portal - uid: 501 - gid: 20 - masterpid: 12748
 WID    %       PID     REQ     RPS     EXC     SIG     STATUS  AVG     RSS     VSZ     TX      RunT
 1      0.0     12749   0       0       0       0       idle    0ms     0       0       0       0
 2      0.0     12750   0       0       0       0       idle    0ms     0       0       0       0
 3      0.0     12751   0       0       0       0       idle    0ms     0       0       0       0
 4      0.0     12752   0       0       0       0       idle    0ms     0       0       0       0
 5      0.0     12753   0       0       0       0       idle    0ms     0       0       0       0
 6      0.0     12754   0       0       0       0       idle    0ms     0       0       0       0
 7      0.0     12755   0       0       0       0       idle    0ms     0       0       0       0
 8      0.0     12756   0       0       0       0       idle    0ms     0       0       0       0
 


● 常用選項:

socket : 地址和端口號,例如:socket = 127.0.0.1:50000

processes : 開啟的進程數量

workers : 開啟的進程數量,等同於processes(官網的說法是spawn the specified number of workers / processes)

chdir : 指定運行目錄(chdir to specified directory before apps loading)

wsgi-file : 載入wsgi-file(load .wsgi file)

stats : 在指定的地址上,開啟狀態服務(enable the stats server on the specified address)

threads : 運行線程。由於GIL的存在,我覺得這個真心沒啥用。(run each worker in prethreaded mode with the specified number of threads)

master : 允許主進程存在(enable master process)

daemonize : 使進程在後臺運行,並將日誌打到指定的日誌文件或者udp服務器(daemonize uWSGI)。實際上最常用的,還是把運行記錄輸出到一個本地文件上。

log-maxsize :以固定的文件大小(單位KB),切割日誌文件。 例如:log-maxsize = 50000000 就是50M一個日誌文件。

pidfile : 指定pid文件的位置,記錄主進程的pid號。

vacuum : 當服務器退出的時候自動清理環境,刪除unix socket文件和pid文件(try to remove all of the generated file/sockets)

disable-logging : 不記錄請求信息的日誌。只記錄錯誤以及uWSGI內部消息到日誌中。如果不開啟這項,那麽你的日誌中會大量出現這種記錄:

[pid: 347|app: 0|req: 106/367] 117.116.122.172 () {52 vars in 961 bytes} [Thu Jul 7 19:20:56 2016] POST /post => generated 65 bytes in 6 msecs (HTTP/1.1 200) 2 headers in 88 bytes (1 switches on core 0)

基於python的web項目,常見的部署方法有:
fcgi:用spawn-fcgi或者框架自帶的工具對各個project分別生成監聽進程,然後和http服務互動。
wsgi:利用http服務的mod_wsgi模塊來跑各個project。

不過還有個uwsgi,它既不用wsgi協議也不用fcgi協議,而是自創了一個uwsgi的協議,據作者說該協議大約是fcgi協議的10倍那麽快。uWSGI的主要特點如下:
超快的性能。
低內存占用(實測為apache2的mod_wsgi的一半左右)。
多app管理。
詳盡的日誌功能(可以用來分析app性能和瓶頸)。
高度可定制(內存大小限制,服務一定次數後重啟等)。

環境ubuntu 12.04 IP:10.1.6.79

安裝nginx

apt-get install nginx-full nginx-common

nginx配置/etc/nginx/sites-enabled/example

server {
        listen          80;
        server_name     10.1.6.79;
        access_log      /var/log/nginx/example_access.log;
        error_log       /var/log/nginx/example_error.log;
        root            /var/www/example;
        location / {
            uwsgi_pass      127.0.0.1:9001;
            include         uwsgi_params;
            uwsgi_param     UWSGI_SCHEME $scheme;
            uwsgi_param     SERVER_SOFTWARE    nginx/$nginx_version;
        }
}

安裝uwsgi

apt-get install uwsgi uwsgi-plugin-python

如果你想安裝所有的uwsgi插件,則可以安裝uwsgi-plugin-all軟件包

uwsgi配置/etc/uwsgi/apps-enabled/default.xml

<uwsgi>
    <plugin>python</plugin>
    <socket>127.0.0.1:9001</socket>
    <pythonpath>/var/www/example/app/</pythonpath>
    <app mountpoint="/">
        <script>wsgi_configuration_module</script>
    </app>
    <master/>
    <processes>4</processes>
    <reload-mercy>8</reload-mercy>
    <cpu-affinity>1</cpu-affinity>
    <max-requests>2000</max-requests>
    <limit-as>512</limit-as>
    <reload-on-as>256</reload-on-as>
    <reload-on-rss>192</reload-on-rss>
    <no-orphans/>
    <vacuum/>
</uwsgi>

uwsgi配置文件中的參數也可以在命令行通過uwsgi指定,配置文件除了xml格式外,還可以寫成ini格式的,軟件包安裝完畢後在/usr/share/doc/uwsgi/examples/conffile目錄下會有一些xml和ini格式配置文件的例子。

wsgi_configuration_module.py腳本內容

#!/usr/bin/python
import os
import sys
sys.path.append(‘/var/www/example/app‘)
os.environ[‘PYTHON_EGG_CACHE‘] = ‘/var/www/example/.python-egg‘
def application(environ, start_response):
    status = ‘200 OK‘
    output = ‘Hello World!‘
    response_headers = [(‘Content-type‘, ‘text/plain‘),
                    (‘Content-Length‘, str(len(output)))]
    start_response(status, response_headers)
    return [output]

啟動uwsgi

uwsgi -x /etc/uwsgi/apps-enabled/default.xml --daemonize /var/log/uwsgi/app/default.log

uwsgi 的參數:
-M 開啟Master進程
-p 4 開啟4個進程
-s 使用的端口或者socket地址
-d 使用daemon的方式運行, 註意, 使用-d後, 需要加上log文件地址, 比如-d /var/log/uwsgi.log
-R 10000 開啟10000個進程後, 自動respawn下
-t 30 設置30s的超時時間, 超時後, 自動放棄該鏈接
–limit-as 32 將進程的總內存量控制在32M
-x 使用配置文件模式

並發4個線程
uwsgi -s :9090 -w myapp -p 4
主控制線程+4個線程
uwsgi -s :9090 -w myapp -M -p 4
執行超過30秒的client直接放棄
uwsgi -s :9090 -w myapp -M -p 4 -t 30
限制內存空間128M
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128
服務超過10000個req自動respawn
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000
後臺運行等
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log

除了直接用uwsgi命令啟動外,還可以用init.d下的腳本啟動, 不過需先修 改/etc/default/uwsgi中默認配置文件的路徑,然後通過/etc/init.d/uwsgi start啟動

#INHERITED_CONFIG=/usr/share/uwsgi/conf/default.ini
INHERITED_CONFIG=/etc/uwsgi/apps-enabled/default.xml

啟動nginx

/etc/init.d/nginx start

linux3——flask+ubuntu+nginx+uwsgi