1. Virtualenv
這個其實不是必須的,但是每個項目都應該擁有專屬的依賴而不受其他項目的影響,建議還是用一下比較好,具體可以看這裏。需要注意的是,在ubuntu下的python2.7的執行文件是/usr/bin/python
。
創建一個項目文件名爲
myflask
的文件夾,並在此目錄下創建名爲venv
的虛擬環境,然後激活虛擬環境www@ubuntu:~/myflask$ source venv/bin/activate (venv) www@ubuntu:~/myflask$
在虛擬環境中安裝flask
(venv) www@ubuntu:~/myflask$ pip install flask
2. 編寫Flask的demo
在虛擬環境中編寫flask的demo,命名爲
main.py
# main.py from flask import Flask app = Flask(__name__) app.debug = True @app.route('/') def index(): return "<h1 style='color:red'>hello world!</h1>" if __name__ == '__manin__': app.run(host='0.0.0.0') # app.run() # 表示默認使用localhost:5000,這樣是在公網訪問不到的
- 測試運行demo:
python main.py
,此時在瀏覽器中訪問ip:5000
即可看到頁面
3. uwsgi
在虛擬環境中安裝uwsgi
(venv) www@ubuntu:~/myflask$ pip install uwsgi
注意:這裏需要先安裝兩個依賴,我已經提前裝好了,不再重複。安裝指令:
apt-get install build-essential python-dev
編寫uwsgi的配置文件,命名爲
config.ini
(venv) www@ubuntu:~/myflask$ vi config.ini [uwsgi] master = true wsgi-file = main.py callable = app http = :8001 processes = 4 threads = 2 buffer-size = 32768
注意:
http = :8001
只是爲了該階段測試用,後面如果使用到nginx代理,則需要改爲socket = 127.0.0.1:8001
。另外callable = app
中的app
要和flask的demo中的application變量名
一致。測試:應用config.ini啓動uwsgi
(venv) www@ubuntu:~/myflask$ uwsgi config.ini ...(省略日誌) *** Operational MODE: preforking+threaded *** WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x7934d0 pid: 30968 (default app) *** uWSGI is running in multiple interpreter mode *** spawned uWSGI master process (pid: 30968) spawned uWSGI worker 1 (pid: 30971, cores: 2) spawned uWSGI worker 2 (pid: 30972, cores: 2) spawned uWSGI worker 3 (pid: 30973, cores: 2) spawned uWSGI worker 4 (pid: 30974, cores: 2)
看到這樣,基本是成功了,此時在瀏覽器中輸入
ip:8001
即可看到頁面。
4. Nginx
上面已經介紹到使用uwsgi接管flask應用,現在我們需要使用nginx來代理,因此我們需要對uwsgi的配置做一些小修改,先crtl+C
關閉uwsgi服務。
修改config.ini
(venv) www@ubuntu:~/myflask$ vi config.ini [uwsgi] master = true wsgi-file = main.py callable = app socket = 127.0.0.1:8001 processes = 4 threads = 2 buffer-size = 32768
這樣,運行起來的uwsgi服務只能通過本地內部的8001端口來訪問,而不能像上面介紹的在瀏覽器使用http來訪問了。因爲我們需要nginx來做http代理,也就是說,我們需要nginx接收到的符合要求的http請求都轉發到本地的8001端口的uwsgi服務,以便讓uwsgi服務做後續處理。
安裝nginx
root@ubuntu:~# apt-get install nginx
啓動nginx
root@ubuntu:~# /etc/init.d/nginx start
在瀏覽器輸入
ip:80
或ip
即可訪問到nginx的默認頁面:修改nginx的配置文件
/etc/nginx/sites-available/default
root@ubuntu:~# vi /etc/nginx/sites-available/default ... server { # listen 80 default_server; # listen [::]:80 default_server ipv6only=on; listen 80; # 監聽端口,http默認80 # root /usr/share/nginx/html; root /home/www/myflask; # flask項目根路徑 # index index.html index.htm; # Make site accessible from http://localhost/ # server_name localhost; server_name XX.XX.XX.XX; # 公網ip或已解析ip的域名 location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; # Uncomment to enable naxsi on this location # include /etc/nginx/naxsi.rules include uwsgi_params; # 使用nginx內置的uwsgi配置參數文件 uwsgi_pass 127.0.0.1:8001; # 轉發請求到該地址端口 uwsgi_param UWSGI_SCRIPT main:app; # 調用的腳本名稱和application變量名 } ... }
稍微解釋一下
location
的意思:我理解爲當接收到http請求時,看http請求中的鏈接內容是什麼,根據location
後面的參數進行匹配,/
的意思是全部,也就是說所有http請求都轉發到127.0.0.1:8001
這個內部端口。檢查nginx配置文件是否有錯誤:
root@ubuntu:~# nginx -t
- 重啓nginx服務:
root@ubuntu:~# service nginx restart
重新啓動uwsgi服務:
(venv) www@ubuntu:~/myflask$ uwsgi config.ini
此時,在瀏覽器輸入
ip:80
或ip
即可訪問到flask頁面:
5. supervisor
上面的方法最後是要使用命令執行uwsgi服務,並要一直運行它纔可以訪問到的,只要該服務崩潰了或關閉了就訪問不到了。所以有小夥伴會使用到supervisor來做uwsgi的引導。
安裝supervisor
root@ubuntu:~# apt-get install supervisor
新增配置文件
root@ubuntu:~# vi /etc/supervisor/conf.d/myflask_supervisor.conf [program:myflask] # 啓動命令入口 command = /home/www/myflask/venv/bin/uwsgi /home/www/myflask/config.ini # 命令程序所在目錄 directory = /home/www/myflask # 運行命令的用戶名,親測www不行 user = root autostart = true autorestart = true #日誌地址 stdout_logfile = /home/www/myflask/log/uwsgi_supervisor.log
supervisor的全局配置配置文件:
/etc/supervisor/supervisor.conf
,一般不改啓動supervisor服務:
service supervisor start
- 關閉supervisor服務:
service supervisor stop