python实现简单fast-cgi服务,对接到nginx

python代码

import socket
import struct
import threading# FastCGI 头格式(8 字节)
FCGI_HEADER_FORMAT = "!BBHHBx"
FCGI_VERSION = 1
FCGI_TYPE_BEGIN_REQUEST = 1
FCGI_TYPE_PARAMS = 4
FCGI_TYPE_STDIN = 5
FCGI_TYPE_STDOUT = 6
FCGI_TYPE_END_REQUEST = 3
FCGI_RESPONDER = 1def parse_fcgi_header(data):"""解析 FastCGI 头"""version, type_, request_id, content_length, padding_length = struct.unpack(FCGI_HEADER_FORMAT, data)return version, type_, request_id, content_length, padding_lengthdef read_fcgi_record(client_socket):"""读取并解析 FastCGI 记录"""header = client_socket.recv(8)  # 读取 8 字节头部if not header:return None, None, None, None, Noneversion, type_, request_id, content_length, padding_length = parse_fcgi_header(header)content = client_socket.recv(content_length) if content_length > 0 else b""client_socket.recv(padding_length)  # 读取并丢弃填充数据return type_, request_id, content, content_length, padding_lengthdef parse_fcgi_params(data):"""解析 FastCGI PARAMS(key-value 形式)"""params = {}i = 0while i < len(data):name_length = data[i]value_length = data[i + 1]i += 2# 处理长度值大于 127 的情况if name_length >= 128:name_length = ((name_length & 0x7F) << 24) | (data[i] << 16) | (data[i+1] << 8) | data[i+2]i += 3if value_length >= 128:value_length = ((value_length & 0x7F) << 24) | (data[i] << 16) | (data[i+1] << 8) | data[i+2]i += 3name = data[i : i + name_length].decode("utf-8", errors="ignore")value = data[i + name_length : i + name_length + value_length].decode("utf-8", errors="ignore")params[name] = valuei += name_length + value_lengthreturn paramsdef handle_request(client_socket):"""处理 FastCGI 请求"""try:# 读取 BEGIN_REQUEST 记录type_, request_id, content, _, _ = read_fcgi_record(client_socket)if type_ != FCGI_TYPE_BEGIN_REQUEST:client_socket.close()return# 读取所有 PARAMS(FastCGI 请求参数)params_data = b""while True:type_, _, content, content_length, _ = read_fcgi_record(client_socket)if type_ != FCGI_TYPE_PARAMS or content_length == 0:break  # 读取完成params_data += content# **使用修正的解析函数**param_dict = parse_fcgi_params(params_data)print("Received FCGI Params:", param_dict)# 读取 STDIN(HTTP 请求体)stdin_data = b""while True:type_, _, content, content_length, _ = read_fcgi_record(client_socket)if type_ != FCGI_TYPE_STDIN or content_length == 0:breakstdin_data += content# 生成 HTTP 响应response_body = b"Hello, FastCGI over TCP! (Threaded)"response_headers = b"Content-Type: text/plain\r\nContent-Length: %d\r\n\r\n" % len(response_body)stdout_data = response_headers + response_body# 发送 FastCGI 响应stdout_header = struct.pack(FCGI_HEADER_FORMAT, FCGI_VERSION, FCGI_TYPE_STDOUT, request_id, len(stdout_data), 0)end_header = struct.pack(FCGI_HEADER_FORMAT, FCGI_VERSION, FCGI_TYPE_END_REQUEST, request_id, 0, 0)client_socket.sendall(stdout_header + stdout_data)  # 发送正文client_socket.sendall(end_header)  # 发送结束标志except Exception as e:print(f"Error handling request: {e}")finally:client_socket.close()def start_fcgi_server(host="0.0.0.0", port=9000):"""启动 FastCGI 多线程 TCP 服务器"""server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)server_socket.bind((host, port))server_socket.listen(5)print(f"FastCGI Server listening on {host}:{port}")while True:client_socket, _ = server_socket.accept()thread = threading.Thread(target=handle_request, args=(client_socket,))thread.start()  # 启动新线程处理请求if __name__ == "__main__":start_fcgi_server()

nginx添加配置

location /hello {include fastcgi_params;fastcgi_pass 127.0.0.1:9000;# 传递 FastCGI 相关参数fastcgi_param REQUEST_METHOD $request_method;fastcgi_param SCRIPT_FILENAME /dummy;fastcgi_param QUERY_STRING $query_string;fastcgi_param CONTENT_TYPE $content_type;fastcgi_param CONTENT_LENGTH $content_length;fastcgi_param PATH_INFO $fastcgi_script_name;
}

访问结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue开始时间小于等于结束时间,且开始时间小于等于系统时间,时间格式:年月日时分

// 日期配置 export const DATA_CONFIGS [{itemKey: "startDate",startDateKey: "startDate",endDateKey: "endDate",isStart: true,},{itemKey: "endDate",startDateKey: "startDate",endDateKey: "endDate",is…

PyCharm 下载与安装教程:从零开始搭建你的 Python 开发环境

PyCharm 是一款专为 Python 开发设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了强大的代码编辑、调试、版本控制等功能&#xff0c;是 Python 开发者的必备工具之一。如果你是初学者&#xff0c;或者正在寻找一款高效的开发工具&#xff0c;这篇文章将帮助…

Qt线程等待条件QWaitCondition

Qt 线程等待条件 概念 Qt提供了QWaitCondition类实现“等待条件”式的线程控制方法&#xff0c;它让线程阻塞在等待条件的地方&#xff0c;直到条件满足后才继续执行下去。也就是说&#xff0c;QWaitCondition可以使一个线程在满足一定条件时通知其他多个线程&#xff0c;使它…

RAG 和 RAGFlow 学习笔记

一、RAG&#xff08;检索增强生成&#xff09; 1. RAG 的定义与核心思想 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是一种结合 信息检索&#xff08;Retrieval&#xff09; 和 文本生成&#xff08;Generation&#xff09; 的技术…

Windows连接服务器Ubuntu_MobaXterm

通过 SSH 远程连接&#xff08;命令行方式&#xff09; &#x1f527; 所需工具&#xff1a; Windows&#xff1a;MobaXterm&#xff08;强烈推荐&#xff09;或 PuTTY Ubuntu&#xff1a;已开启 SSH 服务 Ubuntu 开启 SSH 服务&#xff08;仅需一次&#xff09; 在 Ubuntu …

Rust 中的高效视频处理:利用硬件加速应对高分辨率视频

引言 在视频处理领域&#xff0c;随着4K、8K甚至更高分辨率内容的普及&#xff0c;传统的CPU计算方式逐渐显得力不从心。无论是视频剪辑、直播流处理还是格式转换&#xff0c;高负载场景下CPU占用过高的问题常常让开发者头疼。硬件加速技术通过利用GPU等专用硬件分担编解码任务…

大模型提示工程中,提示、补全、指令、上下文和样本这几个概念的区别是什么?

提示 (Prompt) 定义&#xff1a;输入给大模型的完整文本刺激&#xff0c;是与模型交互的主要方式。 特点&#xff1a; 是最广义的概念&#xff0c;包含其他几个元素整体输入的总和&#xff0c;包括指令、上下文和样本等内容决定模型如何理解和处理请求 示例&#xff1a; 分…

AI的未来演进

企业数字IP实战&#xff1a;创始人分身如何实现品宣获客双赢&#xff1f; ——从量子化建模到联邦学习的全链路技术拆解 一、行业痛点&#xff1a;品牌信任与获客效率的双重困局 2025年数据显示&#xff0c;73%的企业因传统营销模式效率低下错失市场机遇&#xff08;家居品牌…

软件定义无线电39

13.8 RFSoC上PYNQ的SDR设计流程 本节中详细介绍的设计过程可以分为六个独立的步骤&#xff0c;如图13.16所示&#xff0c;并在接下来的几页中进行讨论。 13.8.1 初始设计过程 。在这里&#xff0c;系统设计人员必须考虑许多因素&#xff0c;例如RFDC接收和/或发送的频率范围…

​自动化网络架构搜索(Neural Architecture Search,NAS)

NAS是一种旨在自动设计神经网络结构的技术。传统上&#xff0c;神经网络的架构设计依赖于专家的经验和大量的试错过程&#xff0c;而NAS通过算法自动搜索网络架构&#xff0c;以发现最适合特定任务的神经网络设计。 NAS的主要组成部分包括&#xff1a; 搜索空间&#xff1a;定…

Ubuntu 22.04 安装和运行 EDK2 超详细教程

Ubuntu 22.04 安装和运行 EDK2 超详细教程 适合新手小白&#xff0c;从零开始 &#x1f31f; 1. 什么是 EDK2&#xff1f; EDK2&#xff08;EFI Development Kit 2&#xff09;是一个开源的 UEFI&#xff08;统一可扩展固件接口&#xff09;开发环境&#xff0c;主要用于编写和…

什么是STEP认证

**什么是STEP认证** STEP认证&#xff0c;全称为“可持续纺织生产认证”&#xff08;Sustainable Textile Production&#xff09;&#xff0c;是一项由国际环保纺织协会Oeko-Tex提供的权威独立认证体系。这一认证体系犹如纺织和皮革行业的绿色灯塔&#xff0c;为追求可持续发…

odoo-045 ModuleNotFoundError: No module named ‘_sqlite3‘

文章目录 一、问题二、解决思路 一、问题 就是项目启动&#xff0c;本来好好地&#xff0c;忽然有一天报错&#xff0c;不知道什么原因。 背景&#xff1a; 我是在虚拟环境中使用的python3.7。 二、解决思路 虚拟环境和公共环境直接安装 sqlite3 都会报找不到这个库的问题…

[Linux系统编程]进程间通信—system V

进程间通信—system V 1. System V 共享内存(Shared Memory)1.1 共享内存的建立过程1.2 共享内存函数2. System V 消息队列(Message Queues)3. System V 信号量(Semaphores)4. 总结前言: 之前所提的管道通信是基于文件的,OS没有做过多的设计工作。 system V 进程间通信…

R语言——获取数据1

参考资料&#xff1a;学习R 数据的来源可以由很多。R内置有许多数据集&#xff0c;而在其他的附件包中能找到更多的数据。R能从各式各样的来源中读取&#xff0c;且支持大量的文件格式。 1、内置的数据集 R的基本分发包有一个datasets&#xff0c;里面全是示例数据集。很多其他…

HTTP 请求方法

HTTP 请求方法 引言 HTTP(超文本传输协议)是互联网上应用最为广泛的网络协议之一。它定义了客户端与服务器之间通信的规则。HTTP请求方法,也称为HTTP动词,是客户端向服务器发送请求时使用的操作类型。本文将详细介绍HTTP请求方法的概念、分类、常用方法及其在实际应用中的…

python函数装饰器

python函数装饰器 声明&#xff1a;博主并没有系统学习过python语言&#xff0c;在实际项目中遇到关于python不懂的语法&#xff0c;这里仅作为个人学习积累笔记 1.1 python函数相关基础 深入了解python函数装饰器移步&#xff1a;Python 函数装饰器 下面的笔记来源于上述链接…

OpenCV 图形API(7)用于将笛卡尔坐标(x, y)转换为极坐标(magnitude, angle)函数cartToPolar()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算二维向量的大小和角度。 cartToPolar 函数计算每个二维向量 (x(I), y(I)) 的大小、角度&#xff0c;或同时计算两者&#xff1a; magnitude…

什么是向量搜索Vector Search?

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…

搜索工具Everything下载安装使用教程(附安装包)

文章目录 前言一、搜索工具Everything介绍二、搜索工具Everything使用步骤1.软件下载2.版本选取3.启动软件4.文件搜索 前言 本教程将详细为您介绍 Everything 的下载、安装与使用方法&#xff0c;助您快速上手&#xff0c;充分利用这款工具的强大功能&#xff0c;告别文件查找…