From 592de8da6c88bb7f83fa0de99443c72cca61b272 Mon Sep 17 00:00:00 2001 From: GuangJie1 Date: Mon, 30 Jun 2025 10:05:22 +0800 Subject: [PATCH] add haproxy readme --- Others/haproxy/README.md | 87 ++++++++++++++++++++++++++++ Others/haproxy/doc/image-info.yml | 85 +++++++++++++++++++++++++++ Others/haproxy/doc/picture/logo.png | Bin 0 -> 17956 bytes 3 files changed, 172 insertions(+) create mode 100644 Others/haproxy/README.md create mode 100644 Others/haproxy/doc/image-info.yml create mode 100644 Others/haproxy/doc/picture/logo.png diff --git a/Others/haproxy/README.md b/Others/haproxy/README.md new file mode 100644 index 00000000..f44dd9b2 --- /dev/null +++ b/Others/haproxy/README.md @@ -0,0 +1,87 @@ +# Quick reference + +- The official HAProxy docker image. + +- Maintained by: [openEuler CloudNative SIG](https://gitee.com/openeuler/cloudnative). + +- Where to get help: [openEuler CloudNative SIG](https://gitee.com/openeuler/cloudnative), [openEuler](https://gitee.com/openeuler/community). + +# HAProxy | openEuler +Current HAProxy docker images are built on the [openEuler](https://repo.openeuler.org/). This repository is free to use and exempted from per-user rate limits. + +HAProxy is a free, very fast and reliable reverse-proxy offering high availability, load balancing, and proxying for TCP and HTTP-based applications. + +Read more on [HAProxy Docs](http://docs.haproxy.org/). + +# Supported tags and respective Dockerfile links +The tag of each `haproxy` docker image is consist of the version of `haproxy` and the version of basic image. The details are as follows + +| Tag | Currently | Architectures | +|----------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|------------------| +| [3.1.7-oe2403sp1](https://gitee.com/openeuler/openeuler-docker-images/blob/master/Others/haproxy/3.1.7/24.03-lts-sp1/Dockerfile) | HAProxy 3.1.7 on openEuler 24.03-LTS-SP1 | amd64, arm64 | + +# Usage +In this usage, users can select the corresponding `{Tag}` based on their requirements. + +- Pull the `openeuler/haproxy` image from docker + + ```bash + docker pull openeuler/haproxy:{Tag} + ``` + +- Run with an interactive shell + + You can start the container with an interactive shell to use haproxy. + ``` + docker run -it --rm openeuler/haproxy:{Tag} bash + ``` + +- Create haproxy configuration file + + Create a file named `haproxy.cfg` in your working directory with the following contents: + ``` + global + daemon + maxconn 256 + + aults + mode http + timeout connect 5000ms + timeout client 50000ms + timeout server 50000ms + + frontend http_in + bind *:8080 + default_backend servers + + backend servers + server local_srv 127.0.0.1:8000 maxconn 32 + ``` + * `frontend` listens on port `8080`. + * `backend` forwards traffic to `127.0.0.1:8080` inside the container. + +- Start a simple backend HTTP server + + Run a basic HTTP server using Python3 on port 8080: + ``` + nohup python3 -m http.server 8080 & + ``` + This starts a minimal HTTP server that serves the current working directory on port `8080`. + +- Start haproxy in the background + + ``` + haproxy -f haproxy.cfg + ``` + HAProxy will listen on port `8080` and forward incoming requests to the local HTTP server on `127.0.0.1:8080`. + +- Test haproxy HTTP service + + Access your service from your host machine: + ``` + curl http://localhost:8080 + ``` + You should see the reponse from the local HTTP server through HAProxy. + +# Question and answering +If you have any questions or want to use some special features, please submit an issue or a pull request on [openeuler-docker-images](https://gitee.com/openeuler/openeuler-docker-images). \ No newline at end of file diff --git a/Others/haproxy/doc/image-info.yml b/Others/haproxy/doc/image-info.yml new file mode 100644 index 00000000..f5c49262 --- /dev/null +++ b/Others/haproxy/doc/image-info.yml @@ -0,0 +1,85 @@ +name: haproxy +category: others +description: HAProxy(High Availability Proxy)是一个开源的、高性能的 负载均衡器 和 代理服务器,主要用于 TCP(第4层)和 HTTP(第7层)应用。 +environment: | + 本应用在Docker环境中运行,安装Docker执行如下命令 + ``` + yum install -y docker + ``` +tags: | + haproxy镜像的Tag由其版本信息和基础镜像版本信息组成,详细内容如下 + + | Tag | Currently | Architectures | + |----------|-------------|------------------| + |[3.1.7-oe2403sp1](https://gitee.com/openeuler/openeuler-docker-images/blob/master/Others/haproxy/3.1.7/24.03-lts-sp1/Dockerfile)| HAProxy 3.1.7 on openEuler 24.03-LTS-SP1 | amd64, arm64 | + +download: | + 拉取镜像到本地 + ``` + docker pull openeuler/haproxy:{Tag} + ``` + +usage: | + - 以交互式Shell运行容器: + + 通过交互式 Shell 启动容器,使用haproxy: + ``` + docker run -it --rm openeuler/haproxy:{Tag} bash + ``` + + - 创建haproxy配置文件 + + 创建的配置文件`haproxy.cfg`内容如下: + ``` + global + daemon + maxconn 256 + + aults + mode http + timeout connect 5000ms + timeout client 50000ms + timeout server 50000ms + + frontend http_in + bind *:8080 + default_backend servers + + backend servers + server local_srv 127.0.0.1:8000 maxconn 32 + ``` + * `frontend`: 监听端口 `8080`。 + * `backend`: 将流量转发到 `127.0.0.1:8080`。 + + - 启动一个简单的后端 HTTP 服务 + + 使用 Python3 启动一个基础的 HTTP 服务,监听在 `8080` 端口: + ``` + nohup python3 -m http.server 8080 & + ``` + 在后台启动一个最小的 HTTP 服务,默认会把当前工作目录暴露出来,监听在 `8080` 端口。 + + - 在后台启动 HAProxy + + ``` + nohup haproxy -f haproxy.cfg & + ``` + HAProxy 会监听 `8080` 端口,把收到的请求转发到本地的 `127.0.0.1:8080`。 + + - 测试 HAProxy HTTP 服务 + + Access your service from your host machine: + ``` + curl http://localhost:8080 + ``` + 通过 HAProxy 转发后,后端 HTTP 服务返回的内容。 + +license: GPL v2 +similar_packages: + - Nginx: 支持 HTTP 缓存和负载均衡,广泛用于加速网站和应用。 +dependency: + - systemd + - pcre + - zlib + - lua + - openssl diff --git a/Others/haproxy/doc/picture/logo.png b/Others/haproxy/doc/picture/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..96ebcd7901b09ed2b7eef1f30c9cada88925244b GIT binary patch literal 17956 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 literal 0 HcmV?d00001 -- Gitee