Flask+Gunicorn+Nginx在Linux(Debian/Ubuntu)搭建记录(极简教程)

一、安装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’
  • 给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

三、安装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
      )
      
    • 完整代码如下在这里插入图片描述
  • 用Gunicorn启动该Flask应用,浏览器访问你的IP:8000,就可以看到Hello World了!
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值