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.pswp.cn/diannao/76419.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76419.shtml
英文地址,請注明出處:http://en.pswp.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;告別文件查找…