一、安装Flask
二、安装Gunicorn
- 
如果要用python虚拟环境,先启用 . .venv/bin/activate 
- 
安装gunicorn pip install gunicorn 
- 
运行gunicorn - 
        pythonfrom 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 -csnginx"| 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 -csnginx"| 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了!