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了!

相关推荐
HPC_fac130520678161 小时前
科研深度学习:如何精选GPU以优化服务器性能
服务器·人工智能·深度学习·神经网络·机器学习·数据挖掘·gpu算力
sun0077007 小时前
ubuntu dpkg 删除安装包
运维·服务器·ubuntu
oi778 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
学Linux的语莫9 小时前
Ansible使用简介和基础使用
linux·运维·服务器·nginx·云计算·ansible
Onlooker1299 小时前
云服务器部署WebSocket项目
服务器
学Linux的语莫10 小时前
搭建服务器VPN,Linux客户端连接WireGuard,Windows客户端连接WireGuard
linux·运维·服务器
legend_jz10 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
黑牛先生10 小时前
【Linux】进程-PCB
linux·运维·服务器
Karoku06610 小时前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch