项目说明
项目用 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