Python 云服务器应用,Https,定时重启

Python 云服务器应用,Https,定时重启

环境搭建

  • python 3.6+
  • vscode
  • centos云服务器一台
  • 宝塔Liunx面板已安装
  • SSL证书 nginx版本

Python模块

  • flask
    搭建https服务器
  • gevent.pywsgi
    支持服务器生产环境

pip install flask

pip install gevent

模块导入

python 复制代码
from flask import Flask,request,redirect,jsonify, url_for
from LockIP import IPStatus, check

生成Flask实例

python 复制代码
app = Flask(__name__)

GET处理

python 复制代码
@app.route('/new')
def newHtml():
	return "lpl 加油!"

启动服务器

python 复制代码
def openserver():
    import datetime
    timestr = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f'{timestr} 服务器启动中.....')
    app.run(host="0.0.0.0", port=8000,debug=True)

if __name__ == '__main__':
    openserver()

打开网页验证 GET

网页输入 http://127.0.0.1:8000/new

出现 lpl 加油! 服务器启动成功

接入证书 支持https

申请证书

以西部数据为案例

下载证书

下载支持nginx的版本

保留 xxx.crt 和 xxx.key文件就可以了 copy到python项目目录

  • .crt
  • .key

ssl_context 配置

这里填你自己申请的证书文件名 对应的crt和key文件

python 复制代码
app.run(host="0.0.0.0", port=8002, ssl_context=('www.geek7.top.crt', 'www.geek7.top.key'))

宝塔面板操作

在www目录下新建python工作目录

在python工作目录下新建项目子目录

上传本地的 .py文件到服务器项目目录下

宝塔操作 添加python项目

项目配置 - 具体参数如下截图 - 配置好后 提交

项目添加模块


不需要填版本好 直接填需要依赖的模块名就好了

开放端口 8002 你用到哪个端口就放开哪个端口

协议填tcp 端口8002 备注 python服务器 其他的默认 就可以了

入站配置

打开购买云服务器的平台网站

进入实例

添加入站规则

协议填tcp 端口8002 备注 python服务器 其他的默认 就可以了

测试云端GET

没有域名的 用ip也可以的 前面要用https
https://www.geek7.top:8002/new

测试云端POST

代码保留在案例了 自己去瞅瞅 给你一个发挥的机会 代码可以跑通 自己研究研究

配置服务器 定时器重启

  • 宝塔面板 - 计划任务 - Shell脚本

  • 时间自填

  • 脚本内容

shell 复制代码
ps -ef|grep PYServer|grep -v grep|cut -c 9-15|xargs kill -9
cd /www/python_projs/PYServer/
/www/server/pyporject_evn/444ab1b88bd66070681fb30537aeeb8c_venv/bin/python3 -u /www/python_projs/PYServer/server.py

脚本内容 中的PYServer改成你的项目名

脚本写好了后执行一遍验证一下

怎么验证呢? 方式有很多种 最简单的一种 先关闭python项目 然后执行一次脚本 如果项目跑起来了 就表示shell脚本成功

详细视频教程 - bilibili

Python Https云服务器,定时重启

Python源码

main.py

python 复制代码
from flask import Flask,request,redirect,jsonify, url_for
from LockIP import IPStatus, check

app = Flask(__name__)

@app.route('/new')
def newHtml():
    ip = request.remote_addr
    status = check(ip)
    if status == IPStatus.Lock:
        return "你已在黑名单中"
    elif status == IPStatus.Suspicion:
        return "频繁触发警告"  
    return "lpl 加油!"



@app.route('/form',methods=['POST'])
def form():

    #获取上传的文件
    files = request.files
    for key in files:
        file = files[key]
        file.save(f"imgs/{file.filename}")
    return "upload success"


def openserver():
    import datetime
    timestr = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f'{timestr} 服务器启动中.....')
    
    # 本地测试
    # app.run(host="0.0.0.0", port=8000,debug=True)

    # debug开发模式
    # app.run(host="0.0.0.0", port=8002, ssl_context=(
    #     'www.geek7.top.crt', 'www.geek7.top.key'))

    #生产环境
    from gevent import pywsgi
    server = pywsgi.WSGIServer(('0.0.0.0',8002),app,keyfile='www.geek7.top.key', certfile='www.geek7.top.crt')
    server.serve_forever()


if __name__ == '__main__':
    openserver()
 

LockIP.py

python 复制代码
import time
from enum import Enum

request_history = {}  #请求历史信息 包含ip 最后一次请求时间戳 频繁请求计数 违规次数
blacklist = [] #黑名单 通知一次玩家已经是在黑名单了
locklist = []  #锁定列表 返回空字符串


class IPStatus(Enum):
     General = 1    
     Lock = 2
     Suspicion = 3


def check( ip ):
    # 锁定ip列表
    if ip in locklist:
        return IPStatus.Lock

    # 黑名端 会通知一次客户端
    if ip in blacklist:
        locklist.append(ip)
        return IPStatus.Suspicion

    # 1秒内请求限制5次
    if ip not in request_history.keys():
        request_history[ip] = [time.time(), 1, 0 ]  # 最近call的时间, 短时间内调用的次数, 频繁计数
    else:
        if time.time() - request_history[ip][0] < 1:
            request_history[ip][1] += 1
            # 频繁请求 违规处理
            if request_history[ip][1] >= 5:
                #违规次数统计
                request_history[ip][2] += 1
                if request_history[ip][2] >= 5:
                    blacklist.append(ip) #加入黑名端
                return IPStatus.Suspicion
        else:
            request_history[ip][1] = 1
        request_history[ip][0] = time.time()
    return IPStatus.General

Demo 仓库

github

相关推荐
不爱吃山楂罐头几秒前
第三十三天打卡复习
python·深度学习
IT小饕餮21 分钟前
linux登陆硬件检测脚本
linux·运维·服务器
Dxy123931021634 分钟前
DrissionPage 性能优化实战指南:让网页自动化效率飞升
运维·爬虫·python·性能优化·自动化
蹦蹦跳跳真可爱5891 小时前
Python----目标检测(《SSD: Single Shot MultiBox Detector》论文和SSD的原理与网络结构)
人工智能·python·深度学习·神经网络·目标检测·计算机视觉
LeonDL1681 小时前
HALCON 深度学习训练 3D 图像的几种方式优缺点
人工智能·python·深度学习·3d·halcon·halcon训练3d图像·深度学习训练3d图像
慧都小妮子2 小时前
跨平台浏览器集成库JxBrowser 支持 Chrome 扩展程序,高效赋能 Java 桌面应用
开发语言·python·api·jxbrowser·chrome 扩展程序
程序猿小D3 小时前
第11节 Node.js 模块系统
服务器·前端·node.js·编辑器·vim
tanyyinyu3 小时前
Python函数参数详解:从位置参数到灵活调用的艺术
运维·开发语言·python
qq_214782613 小时前
mac下通过anaconda安装Python
python·macos·jupyter
国际云,接待3 小时前
阿里云无影云桌面深度测评
运维·服务器·阿里云·云原生·云计算