python flask 假死情况处理+https证书添加

前言

        当使用flask编写了后台程序跑在服务器端的时候,有时候虽然后台中显示在运行,但是页面无法访问,出现这个情况可以使用如下方法修改代码,进而防止假死,另外记录下flask下证书的添加。经过测试和代码的各种调试,如果出现假死多半是因为如下问题“

  1. 为单线程处理,如果访问中出现中断,会导致服务器收不到响应而陷入阻塞,如果没有设置超时,则会造成假死,无法处理响应
  2. 代码中存在死循环或者sleep等造成阻塞的函数,无法处理前端请求

所以假死是阻塞造成的,根本原因是单进程和单线程问题,需要设置多线程和多进程可解决该问题

假死处理

出现进程存在,无法访问,端口开放的情况是因为flask默认为单线程,如果出现一个请求出现错误,会默认等待进而阻碍了其他访问的处理,因此需要修改为多线程且设置超时。

首先我们需要将flask修改为多线程运行,不需要多进程,启动代码修改如下即可:

app.run(host='0.0.0.0', port=443, ssl_context=ssl_context, threaded=True)

添加 threaded=Tru 即可,默认为False

然后需要添加超时处理:

app = Flask(__name__)
app.config['TEMPLATES_AUTO_RELOAD'] = 30

然后使用nohub启动即可:

nohup python3.11 main.py &

测试后还是会出现假死,可以选择使用uWSGI还是Gunicorn来作为WSGI 服务器,防止假死,我这边因为服务器功能并不复杂使用Gunicorn:

首先安装Gunicorn:

pip3 install gunicorn
pip3 install eventlet
pip3 install gevent

由于我的是https,需要将对于的配置添加到gunicorn中启动:

其中需要注意 时间设置不要太高 不然如果出现阻塞会假死 设置为10即可,另外需要将运行模式改为gevent 不要使用默认的sync,使用异步更加靠谱 然后添加多线程和多进程

nohup gunicorn --certfile=configure/online.pem --keyfile=configure/online.key --bind 0.0.0.0:443 -k gevent main:app -w 4 --threads 2 --timeout 10 &

这里设置成了多线程,可以设置成多进程-w,但是多进程写文件等操作的时候需要注意。 

启动方便可以写成服务:

首先执行命令:

vi /etc/systemd/system/gunicorn.service

写入如下内容:

[Unit]
# 描述
Description=gunicorn for python flask
# 在网络服务启动后再启动
After=network.target
 
[Service]
User=root
# 项目文件目录
WorkingDirectory=/home/BackGround
# gunicorn启动命令
ExecStart=/usr/bin/sudo /usr/local/bin/gunicorn --certfile=configure/online.pem --keyfile=configure/online.key --bind 0.0.0.0:443 -k gevent main:app -w 4 --threads 2 --timeout 10
# 错误重启
Restart=on-failure
StandardOutput=append:/home/BackGround/log/gunicorn.out
StandardError=append:/home/BackGround/log/gunicorn.err
 
[Install]
WantedBy=multi-user.target

 我这里使用了root,但是最好新建个用户,不要使用root用户

 然后执行如下命令启动:

systemctl start gunicorn.service

另外最好写一个检测bash脚本如下,如果访问失败则重启服务:

#!/bin/bash

# 设置要测试的网站地址
website="https://www.test.online/"

# 发送 HTTP 请求并检查状态码
response=$(curl -s -o /dev/null -w "%{http_code}" $website)

# 检查状态码
if [ $response -ne 200 ]; then
  echo "Website ($website) is not accessible. Restarting gunicorn.service..."
  systemctl restart gunicorn.service
else
  echo "Website ($website) is accessible."
fi

 执行crontab -e 写入计划任务:

*/5 * * * * /bin/bash /path/to/script.sh

https证书:

关于证书,首先我们可以去阿里云申请免费的证书,下载其他证书,下载下来为pem和key后缀文件

 

 添加如下代码即可加载证书进行https访问:

ssl_context  = ('configure/online.pem', 'configure/online.key')
app.run(host='0.0.0.0', port=443, ssl_context=ssl_context, threaded=True)

访问网址可以看到证书已经正常加载 

另外如果需要仅允许网址访问,不允许ip访问,可以添加如下代码:

@app.before_request
def limit_domain():
    if request.headers.get('Host') != 'www.myurl.com':
        return 'Forbidden', 403

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python Flask 是一个轻量级的Web应用框架,常被用于构建简单、快速的后端服务。对于后端算法的处理Python Flask 能够提供很好的支持。 首先,Python Flask 提供了路由功能,可以将不同的URL请求映射到不同的处理函数上。这意味着我们可以根据不同的请求类型和路径,调用相应的后端算法处理函数。这样,我们可以轻松地根据具体业务需求将数据传递给后端算法进行处理,并返回处理结果给前端。 其次,Python Flask 还提供了Request和Response对象,用于获取请求的参数和构建响应的数据。我们可以通过这些对象来获取并处理前端传递的数据,将其传递给后端算法进行计算,然后将计算结果返回给前端。 此外,Python Flask 还支持使用数据库,例如SQLAlchemy,用于存储和管理数据。后端算法通常需要使用大量数据进行计算和模型训练,使用数据库可以方便地存储和获取这些数据。 最后,Python Flask 还可以集成其他Python库或框架,例如TensorFlow、PyTorch等,进一步提升后端算法的处理能力。这些库和框架可以用于各种复杂的计算任务,例如机器学习、深度学习等,可以很方便地与Python Flask 进行集成。 总的来说,Python Flask 提供了灵活的路由功能、请求和响应对象、数据库支持以及可以集成其他Python库的能力,使其成为一个强大的工具来处理后端算法。无论是简单的数据处理还是复杂的计算任务,Python Flask 都能提供便捷的解决方案。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值