一、安装Flask
二、安装Gunicorn
- 如果要用python虚拟环境,先启用
. .venv/bin/activate
- 安装gunicorn
pip install gunicorn
- 运行gunicorn
- 创建一个基础的flask应用hello.py
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’
- 创建一个基础的flask应用hello.py
- 给gunicorn增加配置文件
- 根据Gunicorn文档,配置文件应该是一个py文件,于是我们新建文件gunicorn.conf.py,常用内容如下
import 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
- 根据Gunicorn文档,配置文件应该是一个py文件,于是我们新建文件gunicorn.conf.py,常用内容如下
三、安装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 https://nginx.org/keys/nginx_signing.key | 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] \ http://nginx.org/packages/debian `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] \ http://nginx.org/packages/mainline/debian `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=https://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [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; location / { 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 app.wsgi_app = ProxyFix( app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_prefix=1 )
- 完整代码如下
- 打开Flask应用py文件,加入以下代码即可,详细解释见官方文档
- 用Gunicorn启动该Flask应用,浏览器访问你的IP:8000,就可以看到Hello World了!