實(shí)驗(yàn)環(huán)境:
1底洗、在Gunicorn上運(yùn)行Flask
1.1 安裝運(yùn)行環(huán)境
# 1.創(chuàng)建虛擬環(huán)境
shell> python3 -m venv FlaskEnv
# 2.激活虛擬環(huán)境
shell> source FlaskEnv/bin/activate
# 3.安裝Flask運(yùn)行庫
(FlaskEnv)shell> pip install -r requirements
# 4.安裝Gunicorn
(FlaskEnv)shell> pip install gunicorn
1.2 編寫應(yīng)用啟動(dòng)腳本
??我把啟動(dòng)腳本命名為server.py.
"""
服務(wù)啟動(dòng)入口
該腳本只用于啟動(dòng)搬俊,不涉及任何flask邏輯
"""
from app import app
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=8080)
??這里說明一下,import的app就是創(chuàng)建出來的flask.Flask對(duì)象馅闽。
1.3 啟動(dòng)服務(wù)
(FlaskEnv)shell> gunicorn server:app
??Gunicorn啟動(dòng)服務(wù)真的非常方便蚊丐,一個(gè)命令搞定熙参。這里的server就是上面的server.py腳本,app就是import的app麦备。
??這一步后孽椰,就可以在本地通過127.0.0.1:8000訪問網(wǎng)站了,目前的綁定IP和端口都是Gunicorn默認(rèn)的凛篙,可以通過啟動(dòng)參數(shù)指定黍匾。
2018-10-05 補(bǔ)充
上面的啟動(dòng)命令是“臨時(shí)”的,控制臺(tái)退出后服務(wù)也就停止了呛梆。為了讓服務(wù)一直運(yùn)行锐涯,需要將其設(shè)為守護(hù)進(jìn)程:
(FlaskEnv)shell> gunicorn -D server:app
2、引入Nginx
2.1 安裝
??強(qiáng)烈推薦使用yum的方式安裝填物,因?yàn)檫@樣可以直接使用service的方式管理nginx纹腌。
shell> wget https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
shell> sudo yum install nginx-release-centos-7-0.el7.ngx.noarch.rpm
shell> sudo yum install nginx
2.2 配置
??下面是一個(gè)完整的配置霎终,但它只保證運(yùn)行成功。用下面內(nèi)容替換nginx的默認(rèn)配置文件:/etc/nginx/nginx.conf
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name _;
location / {
# 轉(zhuǎn)發(fā)給本地Flask應(yīng)用
proxy_pass http://127.0.0.1:8000;
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;
}
}
}
2018-10-05 補(bǔ)充
用上面的配置會(huì)遇到一個(gè)問題升薯,代碼里用redirect(url_for('XXX'))
重定向后莱褒,會(huì)把瀏覽器的訪問地址改成127.0.0.1,導(dǎo)致訪問出錯(cuò)覆劈。有兩個(gè)解決方法,推薦后者:
- url_for指定額外參數(shù):_external=True
- nginx添加配置:
proxy_set_header X-Forwarded-Proto $scheme;
2.3 啟動(dòng)
shell> service nginx start
??我直接使用了service的方式其他沛励,它會(huì)讀取默認(rèn)的配置文件责语。如果想自己指定一個(gè)配置文件,可以使用這個(gè)命令:
shell> sudo nginx -c /etc/nginx/flask.conf
??啟動(dòng)成功后目派,就可以通過本地IP的80端口坤候,訪問8000端口的Flask應(yīng)用了。
2.4 錯(cuò)誤處理
??通過Nginx訪問Flask應(yīng)用時(shí)會(huì)報(bào)下面這個(gè)錯(cuò)誤
connect() to 127.0.0.1:8000 failed (13: Permission denied) while connecting to upstream
解決:shell> sudo setsebool -P httpd_can_network_connect 1
3企蹭、后記說明
??這一篇快餐式的文章白筹,它的作用只是讓Flask應(yīng)用在一個(gè)正式的環(huán)境下跑起來。而它涉及的很多東西谅摄,都需要后面慢慢的學(xué)習(xí)徒河、了解。比如:各項(xiàng)參數(shù)送漠、配置的含義顽照;Gunicorn服務(wù)注冊(cè);Nginx負(fù)載闽寡、性能調(diào)優(yōu)代兵,等