一、安装Flask
二、安装Gunicorn
-
如果要用python虚拟环境,先启用 . .venv/bin/activate
-
安装gunicorn pip install gunicorn
-
运行gunicorn
-
python
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
-
用gunicorn启动flask应用 gunicorn -w 3 -b 0.0.0.0:5000 hello:app
- -w 3 #表示3个工作进程
- -b 0.0.0.0:5000 #支持外网通过5000端口访问
- hello:app #hello为应用的py文件名,app为Flask应用实例名,等同于'from hello import app'
-
-
给gunicorn增加配置文件
-
根据Gunicorn文档,配置文件应该是一个py文件,于是我们新建文件gunicorn.conf.py,常用内容如下
pythonimport multiprocessing bind = '0.0.0.0:5000' #要绑定的socket(配置nginx后,需要把0.0.0.0改为127.0.0.1) workers = multiprocessing.cpu_count() * 2 + 1 #处理请求的工作进程数,官方推荐(2 * cpu核数 + 1) reload = True #代码改变后自动重启工作进程 worker_class = 'gevent' #工作进程的类型,分别是sync, eventlet, gevent, tornado, gthread #threads = 2 #工作类型为gthread时才生效 worker_connections = 1000 #默认1000,每个worker同时处理的最大客户端连接数,gthread\eventlet\gevent模式生效 pidfile = './gunicorn.pid' #进程文件目录,不设置就没有进程文件 accesslog = './gunicorn_acess.log' #访问日志路径 errorlog = './gunicorn_error.log' #错误信息日志路径 loglevel = 'warning' #错误日志级别,'debug'\'info'\'warning'\'error'\'critical' daemon = True #在后台运行
-
对于worker_class的选择,可以参考:
- sync,默认模式,适用于较小的应用或者不需要处理大量并发请求的应用
- gevent和eventlet,基于协程的异步模式,可以处理大量的并发连接,适用于IO密集型应用(
pip install gunicorn[gevent]
或pip install gunicorn[eventlet]
安装) - tornado,适合基于Tornado框架的应用(
pip install gunicorn[sync]
安装) - gthread,基于多线程的工作模式,每个工作进程可以开启多个线程来处理请求。使用线程而不是进程可以减少Gunicorn内存占用(
pip install gunicorn[gthread]
安装)
- 使用配置文件运行
gunicorn -c gunicorn.conf.py hello:app
-
三、安装Nginx
-
所有命令是针对Debian系统,Ubuntu系统把命令里的'debian'换成'ubuntu'即可
-
安装前置依赖(Ubuntu把debian-archive-keyring换成ubuntu-keyring) sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring
-
导入官方 nginx 签名密钥,以便 apt 能够验证软件包的真实性 curl nginx.org/keys/nginx_... | gpg --dearmor
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
-
验证下载的文件包含正确的密钥,输出应该包含完整的指纹573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
-
给apt仓库设置稳定版本的nginx 软件包 echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg]
nginx.org/packages/de...lsb_release -cs
nginx"| sudo tee /etc/apt/sources.list.d/nginx.list
-
如果想要主线的ngnix软件包,用下面的命令 echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg]
nginx.org/packages/ma...lsb_release -cs
nginx"| sudo tee /etc/apt/sources.list.d/nginx.list
-
设置仓库优先级,以优先选择我们的软件包而不是发行版提供的软件包 echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n"
| sudo tee /etc/apt/preferences.d/99nginx
-
安装nginx sudo apt update sudo apt install nginx
-
查看安装的版本,验证安装成功 nginx -v
-
看看/lib/systemd/system/nginx.service文件是否存在,如果不存在,新建并输入以下内容 [Unit] Description=nginx - high performance web server Documentation=nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target
ini[Service] Type=forking PIDFile=/var/run/nginx.pid ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)" ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)" [Install] WantedBy=multi-user.target
-
一些常用命令 systemctl start nginx.service #启动nginx systemctl stop nginx.service #停止nginx systemctl restart nginx.service #重启nginx systemctl enable nginx.service #设置开机自启动 systemctl disable nginx.service #关闭开机自启动
-
日志一般在/var/log/nginx
四、Flask+Gunicorn+Nginx结合使用
-
配置Nginx
-
先使用
nginx -t
查看默认配置文件的位置,一般在/etc/nginx/nginx.conf,也可以新建一个自定义的配置文件 -
移除配置文件里所有的server节点,在http节点下增加一个新server,内容如下 server { listen 8000; server_name localhost;
inilocation / { proxy_pass http://127.0.0.1:5000/; #gunicorn的配置文件中bind的地址 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Prefix /; } }
-
启动或重启nginx,
netstat -anp|grep 8000
查看是否已启动成功
-
-
告诉Flask应用位于代理之后
-
打开Flask应用py文件,加入以下代码即可,详细解释见官方文档 from werkzeug.middleware.proxy_fix import ProxyFix
iniapp.wsgi_app = ProxyFix( app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_prefix=1 )
-
完整代码如下
-
-
用Gunicorn启动该Flask应用,浏览器访问你的IP:8000,就可以看到Hello World了!