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

一、安装Flask

二、安装Gunicorn

  • 如果要用python虚拟环境,先启用 . .venv/bin/activate

  • 安装gunicorn pip install gunicorn

  • 运行gunicorn

    • 创建一个基础的flask应用hello.py

      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,常用内容如下

      python 复制代码
      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 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;

      ini 复制代码
      	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

      ini 复制代码
      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了!

相关推荐
焊锡与代码齐飞3 分钟前
嵌入式第三十五课!!Linux下的网络编程
linux·运维·服务器·开发语言·网络·学习·算法
喜欢你,还有大家1 小时前
Linux笔记8——shell编程基础-2
linux·服务器·笔记
泽虞1 小时前
《LINUX系统编程》笔记p3
linux·运维·服务器·c语言·笔记·面试
dingcb1683 小时前
4090服务器无法sudo apt update 问题解决
运维·服务器
头发那是一根不剩了3 小时前
服务器硬盘进行分区和挂载
linux·运维·服务器
stark张宇4 小时前
Linux 零基础入门,看这一篇就够了
linux·服务器
彬彬醤5 小时前
Mac怎么连接VPS?可以参考这几种方法
大数据·运维·服务器·数据库·线性代数·macos·矩阵
Sadsvit7 小时前
网络聚合链路与软件网桥配置指南
linux·运维·服务器·网络·centos
网硕互联的小客服7 小时前
如何配置安全的SFTP服务器?
运维·服务器·安全
sinat_286945197 小时前
AI服务器介绍
服务器·人工智能·算法·chatgpt·transformer