Skip to content

Latest commit

 

History

History
183 lines (136 loc) · 4.52 KB

File metadata and controls

183 lines (136 loc) · 4.52 KB

Echo Server

这是一个基于OpenResty的HTTP回显服务器,用于显示HTTP请求的详细信息。

项目背景

在开发和调试网络应用时,了解HTTP请求的详细信息非常重要。Echo Server提供了一个简单的方式来查看请求头、请求体、环境变量等信息,帮助开发人员诊断问题和理解请求流程。

主要功能

  • 显示请求的详细信息,包括:
    • 请求方法(GET、POST等)
    • 请求路径
    • 查询参数
    • 请求头
    • 请求体
    • 客户端IP地址
  • 显示服务器环境信息,包括:
    • 主机名
    • Pod信息(如果在Kubernetes环境中运行)
    • Nginx和Lua版本
  • 提供静默响应超时测试端点(/hang

安装与部署

使用Docker

方法一:使用预编译镜像(推荐)

docker run -p 8080:80 ghcr.io/echo-server/echo-server:main

预编译镜像同时支持ARM和x86两种CPU架构,无需自行构建。

方法二:本地构建

  1. 克隆仓库
git clone https://github.com/echo-server/echo-server.git
cd echo-server
  1. 构建Docker镜像
docker build -t echo-server .
  1. 运行容器
docker run -p 8080:80 echo-server

现在,Echo Server将在 http://localhost:8080 上运行。

使用方式

基本用法

访问服务器的根路径来查看请求信息:

curl http://localhost:8080

或者使用浏览器访问 http://localhost:8080

发送不同类型的请求

POST请求示例

curl -X POST -d "Hello World" http://localhost:8080

带自定义头的请求

curl -H "X-Custom-Header: CustomValue" http://localhost:8080

响应超时测试

curl --verbose --max-time 10 http://localhost:8080/hang

这个端点会接受请求,但故意不发送任何响应头或响应体。连接会一直保持到客户端主动关闭,可用于验证 HTTP 客户端是否正确配置了读取超时或请求整体截止时间。如果客户端没有设置超时,请求会按设计一直等待。

例如,下面的 Python Requests 请求会先成功建立连接,然后在大约 5 秒后抛出 requests.exceptions.ReadTimeout

import requests

requests.get("http://localhost:8080/hang", timeout=(3.05, 5))

客户端关闭连接后,OpenResty 会检测到断开并清理对应的请求处理器。连接保持期间,请求处理器会让出执行权给 Nginx 事件循环,不会阻塞 worker 线程,但连接本身仍会占用一个 socket 和请求上下文。对于对端未发送 FIN 或 RST 就消失的 TCP 半开连接,检测时间取决于操作系统的 TCP keepalive 配置。

如果通过反向代理或负载均衡器暴露 /hang,还需要相应配置其中间层的上游响应超时。否则即使 Echo Server 自身保持连接,中间层也可能终止或重试请求,并最终返回网关超时。

在Kubernetes中使用

Echo Server可以在Kubernetes集群中部署,它会自动显示Pod相关信息(如果环境变量可用)。

使用预编译镜像:

ghcr.io/echo-server/echo-server:main

部署示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: echo-server
  template:
    metadata:
      labels:
        app: echo-server
    spec:
      containers:
      - name: echo-server
        image: ghcr.io/echo-server/echo-server:main
        ports:
        - containerPort: 80
        env:
        - name: HOSTNAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
---
apiVersion: v1
kind: Service
metadata:
  name: echo-server
spec:
  selector:
    app: echo-server
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP

这些环境变量将被回显服务器显示,有助于调试和了解Pod的运行环境。

技术栈

贡献

欢迎提交问题和拉取请求!

许可证

请查看项目中的LICENSE文件。