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

相关推荐
cui_ruicheng13 小时前
操作系统入门(一):从冯诺依曼到进程概念
linux·运维·服务器·ubuntu
坤坤藤椒牛肉面13 小时前
linux驱动1
linux·运维·服务器
摸鱼仙人~13 小时前
LLM量化技术全景对比:AWQ、GPTQ、GGUF与FP8/INT8/INT4的抉择指南
运维·服务器
这辈子谁会真的心疼你13 小时前
如何修改视频媒体修改时间?两个方法介绍
java·服务器·数据库
wanhengidc14 小时前
服务器 网络信息安全
运维·服务器·网络
MarkHD14 小时前
从“能跑”到“好用”:Python脚本监控与告警实战(邮件/钉钉/企业微信)
python·钉钉·企业微信
wanhengidc14 小时前
裸金属服务器都有什么作用
运维·服务器
CHANG_THE_WORLD14 小时前
演示宽度数组解析
linux·服务器·前端
艾莉丝努力练剑14 小时前
【Linux系统:多线程】线程概念与控制
linux·运维·服务器·c++·后端·学习·操作系统
IMPYLH14 小时前
Linux 的 mkfifo 命令
linux·运维·服务器·bash