← 中文资源

简体中文版本

Python 健康检查服务器

标准库 HTTP 服务器,提供健康和 JSON 404 端点,并包含在临时端口启动服务器的 unittest 覆盖。

阅读英文原文

项目说明

项目用 http.server 实现最小健康检查服务,适合容器探针和本地调试。

运行方法

执行 python server.py,访问 /health 获得 200 和 JSON 状态;其他路径返回 JSON 404。端口通过环境变量配置。

验证方式

运行 python -m unittest,测试会在临时端口启动服务器并断言状态码、内容类型和响应体。健康检查应只验证进程本身;依赖检查放在就绪端点。生产环境不要使用开发服务器,应改用生产级 WSGI/ASGI 服务器并配置超时和访问日志。

验收清单

完成「Python 健康检查服务器」后,按节点或操作步骤逐项自查:准备可复现的本地环境,执行文档中的命令,记录输出与失败信息,并确认权限、空数据和失败恢复路径都有对应证据。

代码示例

import json
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer


class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == "/healthz":
            self._json(200, {"status": "ok"})
        elif self.path == "/":
            self._json(200, {"service": "health-server"})
        else:
            self._json(404, {"error": "not found"})

    def _json(self, status, body):
        data = json.dumps(body).encode("utf-8")
        self.send_response(status)
        self.send_header("content-type", "application/json")
        self.send_header("content-length", str(len(data)))
        self.end_headers()
        self.wfile.write(data)

    def log_message(self, *args):
        pass


def create_server(host="127.0.0.1", port=0):
    return ThreadingHTTPServer((host, port), Handler)


if __name__ == "__main__":
    server = create_server(port=8000)
    print("listening on 8000")
    server.serve_forever()
import json
import threading
import unittest
import urllib.request
from health import create_server


class HealthServerTest(unittest.TestCase):
    def setUp(self):
        self.server = create_server()
        threading.Thread(target=self.server.serve_forever, daemon=True).start()
        self.base = f"http://127.0.0.1:{self.server.server_port}"

    def tearDown(self):
        self.server.shutdown()
        self.server.server_close()

    def test_health(self):
        with urllib.request.urlopen(self.base + "/healthz") as response:
            self.assertEqual(response.status, 200)
            self.assertEqual(json.load(response), {"status": "ok"})

    def test_not_found(self):
        with self.assertRaises(urllib.error.HTTPError) as context:
            urllib.request.urlopen(self.base + "/missing")
        self.assertEqual(context.exception.code, 404)


if __name__ == "__main__":
    unittest.main()
python -m unittest -v test_health.py
python health.py
curl -s http://127.0.0.1:8000/healthz