使用Flask,Nginx,Gunicorn,Supervisor完成网站部署

Posted 脚本之家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Flask,Nginx,Gunicorn,Supervisor完成网站部署相关的知识,希望对你有一定的参考价值。

脚本之家

你与百万开发者在一起

使用Flask,Nginx,Gunicorn,Supervisor完成网站部署

使用Flask,Nginx,Gunicorn,Supervisor完成网站部署

使用Flask,Nginx,Gunicorn,Supervisor完成网站部署

作者 | 简讯

出品 | 脚本之家(ID:jb51net)

当我们使用 flask 开发完成 web 应用后,关键是部署到云服务器上,这样才能真正在网络上让用户读者访问。

部署过程看似复杂,但只要安装好这几个工具,一步一步来就没有问题。

服务器使用的版本是 Ubuntu 16.04.6 LTS。

安装Flask,Gunicorn,Supervisor

因为使用的是 python3,避免 pip 安装错位置,终端输入命令:

python3 -m pip install flask gunicorn supervisor

等待安装完成。

Flask

写一个简单的 flask demo。

 
   
   
 
  1. # app.py


  2. from flask import Flask

  3. app = Flask(__name__)



  4. @app.route('/')

  5. def hello_world():

  6. return 'Hello, World!'

终端输入:

flask run -h 0.0.0.0 -p 8000

如果你的云服务器安全组规则开启了 8000 端口,那么你在浏览器访问服务器的公网 IP,8000 端口下会显示 Hello,World!

怎么配置安全组规则还请查看各自服务商的文档。

阿里云如下配置:

使用Flask,Nginx,Gunicorn,Supervisor完成网站部署

使用gunicorn启动程序

当我们部署到服务器上时,需要一个性能更优的 WSGI服务器。

终端输入:

gunicorn --workers=4 --bind=0.0.0.0:8000 app:app

如果正常启动,没有报错,在浏览器应该会看到 flask 返回的 Hello,World!

workers 用来定义工作线程的数量,一般 worker 的数量为 (2×$num_cores)+1。官方文档中介绍到虽然这个公式并不十分科学,但它基于这样一个假设: 对于给定的核心数,一个工作线程将从套接字读取或写入数据,而另一个工作线程处理请求。

如果设置了SSL证书,命令为:

gunicorn --keyfile=<私钥文件> --certfile=<SSL证书文件> --ca-certs=<CA证书文件> --bind=0.0.0.0:443app:app

更多参数还请自行查看 gunicorn 文档[1]

安装并配置 nginx

我们需要 Nginx 作为反向代理使用。

输入以下命令安装 nginx:

apt-get install nginx -y

安装完成后进入:

cd /etc/nginx/sites-enabled

删除 default 文件:

rm default

编辑新的配置文件,命名为 app

 
   
   
 
  1. server {

  2. listen 80;


  3. server_name _; # 如果有域名可以写到这里


  4. access_log /var/log/nginx/access.log;

  5. error_log /var/log/nginx/error.log;


  6. location / {

  7. proxy_pass http://127.0.0.1:8000/;

  8. proxy_redirect off;


  9. proxy_set_header Host $host;

  10. proxy_set_header X-Real-IP $remote_addr;

  11. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  12. proxy_set_header X-Forwarded-Proto $scheme;

  13. }

  14. }

配置文件来自 flask 文档[2]

输入:

nginx -t

测试一下 nginx 配置有无问题。

没有问题的话重启服务:

service nginx restart

有关 nginx 的配置完成。

使用 supervisor 管理进程

Supervisor 是一个 客户端/服务器系统,允许其用户在类 UNIX操作系统上控制进程。当进程被意外杀死,Supervisor 可以主动将其拉起。

使用如下命令构建配置文件:

echo_supervisord_conf > /etc/supervisord.conf

编辑配置文件,加入以下内容:

 
   
   
 
  1. [program:gunicorn]

  2. user = root ; root 用户启动

  3. directory = /root ; flask 文件所在目录

  4. command = /usr/local/bin/gunicorn --workers=4 --bind=0.0.0.0:8000 app:app ; 程序启动命令(第一个 app 是 flask 的文件名,第二个是 application 的缩写)

  5. startsecs = 5 ; 启动 5 秒后没有异常退出,视作正常启动

  6. autostart = true ; 在 supervisord 启动时自动启动

  7. autorestart = true ; 程序异常退出后重启

  8. redirect_stderr = true ; stderr 也重定向至 stdout

  9. stdout_logfile = /root/logs/gunicorn.log ; stdout 日志文件,需要手动创建日志存放目录

gunicorn 路径可以这样找到:

 
   
   
 
  1. bash ➜ ~ which gunicorn

  2. /usr/local/bin/gunicorn

输入:

supervisord -c /etc/supervisord.conf

启动服务。

supervisor 常用命令如下:(具体可查看官方文档[3]

 
   
   
 
  1. supervisorctl status # Get all process status info.

  2. supervisorctl stop gunicorn # Stop a process.

  3. supervisorctl start gunicorn # Start a process.

  4. supervisorctl restart gunicorn # Restart a process Note: restart does not reread config files.

  5. supervisorctl reread # Reload the daemon’s configuration files, without add/remove (no restarts).

  6. supervisorctl update # Reload config and add/remove as necessary, and will restart affected programs.

全部配置完成就实现了 flask 的部署。

参考文档:

【1】:https://docs.gunicorn.org/en/stable/

【2】:http://flask.pocoo.org/docs/1.0/deploying/wsgi-standalone/#proxy-setups

【3】:http://supervisord.org/running.html#supervisorctl-actions

个人博客:https://lijianxun.top/

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。

写的不错?赞赏一下

使用Flask,Nginx,Gunicorn,Supervisor完成网站部署

长按扫码赞赏我

使用Flask,Nginx,Gunicorn,Supervisor完成网站部署

● 使用Flask,Nginx,Gunicorn,Supervisor完成网站部署 

● 使用Flask,Nginx,Gunicorn,Supervisor完成网站部署 

●  

● 

● 

以上是关于使用Flask,Nginx,Gunicorn,Supervisor完成网站部署的主要内容,如果未能解决你的问题,请参考以下文章

使用 flask_socketio + flask + gunicorn + nginx 获得 502 bad gateway 和 400 bad request

部署flask+gunicorn+nginx 项目

杂谈_浅谈nginx,gunicorn,flask差异比对

AWS上带有nginx和gunicorn的Flask应用程序[重复]

一周掌握Flask框架学习笔记Flask项目部署(使用gunicorn和nginxuWSGI和nginx两种部署方式)

python nginx+gunicorn+flask+supervisor