From 826fd655b16c9b2f0aaaa81abce220980b9bd9ff Mon Sep 17 00:00:00 2001 From: wangbo Date: Fri, 20 Sep 2024 11:21:26 +0800 Subject: [PATCH] =?UTF-8?q?oe2203sp3=E6=96=B0=E5=A2=9Eopenresty=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E9=95=9C=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openresty/1.21.4.1/22.03-lts-sp3/Dockerfile | 50 +++++++++++++++ openresty/README.md | 65 ++++++++++++++++++++ openresty/doc/image-info.yml | 58 +++++++++++++++++ openresty/doc/picture/logo.png | Bin 0 -> 16161 bytes openresty/meta.yml | 2 + 5 files changed, 175 insertions(+) create mode 100644 openresty/1.21.4.1/22.03-lts-sp3/Dockerfile create mode 100644 openresty/README.md create mode 100644 openresty/doc/image-info.yml create mode 100644 openresty/doc/picture/logo.png create mode 100644 openresty/meta.yml diff --git a/openresty/1.21.4.1/22.03-lts-sp3/Dockerfile b/openresty/1.21.4.1/22.03-lts-sp3/Dockerfile new file mode 100644 index 00000000..81333b79 --- /dev/null +++ b/openresty/1.21.4.1/22.03-lts-sp3/Dockerfile @@ -0,0 +1,50 @@ +ARG BASE=openeuler/openeuler:22.03-lts-sp3 +FROM ${BASE} +ARG VERSION="1.21.4.1" +RUN yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel --nogpgcheck curl wget perl make tar \ + && cd /tmp \ + && curl -o openresty-${VERSION}.tar.gz https://openresty.org/download/openresty-${VERSION}.tar.gz \ + && tar zxvf openresty-${VERSION}.tar.gz \ + && cd openresty-${VERSION} \ + && ./configure \ + --prefix=/usr/local/openresty \ + --with-cc-opt='-O2 -DNGX_LUA_ABORT_AT_PANIC -I/usr/local/openresty/zlib/include -I/usr/local/openresty/pcre/include -I/usr/local/openresty/openssl111/include' \ + --with-ld-opt='-Wl,-rpath,/usr/local/openresty/luajit/lib -L/usr/local/openresty/zlib/lib -L/usr/local/openresty/pcre/lib -L/usr/local/openresty/openssl111/lib -Wl,-rpath,/usr/local/openresty/zlib/lib:/usr/local/openresty/pcre/lib:/usr/local/openresty/openssl111/lib' \ + --with-pcre-jit \ + --with-stream \ + --with-stream_ssl_module \ + --with-stream_ssl_preread_module \ + --with-http_v2_module \ + --without-mail_pop3_module \ + --without-mail_imap_module \ + --without-mail_smtp_module \ + --with-http_stub_status_module \ + --with-http_realip_module \ + --with-http_addition_module \ + --with-http_auth_request_module \ + --with-http_secure_link_module \ + --with-http_random_index_module \ + --with-http_gzip_static_module \ + --with-http_sub_module \ + --with-http_dav_module \ + --with-http_flv_module \ + --with-http_mp4_module \ + --with-http_gunzip_module \ + --with-threads --with-stream \ + --with-http_ssl_module \ + && make build \ + && make install \ + && cd /tmp \ + && rm -rf openresty-${VERSION}.tar.gz \ + && rm -rf openresty-${VERSION}/ \ + && yum clean all + +ENV PATH=$PATH:/usr/local/openresty/luajit/bin:/usr/local/openresty/nginx/sbin:/usr/local/openresty/bin +ENV LUA_PATH="/usr/local/openresty/site/lualib/?.ljbc;/usr/local/openresty/site/lualib/?/init.ljbc;/usr/local/openresty/lualib/?.ljbc;/usr/local/openresty/lualib/?/init.ljbc;/usr/local/openresty/site/lualib/?.lua;/usr/local/openresty/site/lualib/?/init.lua;/usr/local/openresty/lualib/?.lua;/usr/local/openresty/lualib/?/init.lua;./?.lua;/usr/local/openresty/luajit/share/luajit-2.1.0-beta3/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/openresty/luajit/share/lua/5.1/?.lua;/usr/local/openresty/luajit/share/lua/5.1/?/init.lua" +ENV LUA_CPATH="/usr/local/openresty/site/lualib/?.so;/usr/local/openresty/lualib/?.so;./?.so;/usr/local/lib/lua/5.1/?.so;/usr/local/openresty/luajit/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall.so;/usr/local/openresty/luajit/lib/lua/5.1/?.so" + +ENV PATH /usr/local/nginx:$PATH +WORKDIR /usr/local/nginx/html + +EXPOSE 80 +ENTRYPOINT ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/openresty/README.md b/openresty/README.md new file mode 100644 index 00000000..4b6db62d --- /dev/null +++ b/openresty/README.md @@ -0,0 +1,65 @@ +# Quick reference + +- The official OpenResty 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). + +# OpenResty | openEuler +Current OpenResty docker images are built on the [openEuler](https://repo.openeuler.org/). This repository is free to use and exempted from per-user rate limits. + +OpenResty is a full-fledged web platform that integrates our enhanced version of the Nginx core, our enhanced version of LuaJIT, many carefully written Lua libraries, lots of high quality 3rd-party Nginx modules, and most of their external dependencies. It is designed to help developers easily build scalable web applications, web services, and dynamic web gateways. Learn more on [https://openresty.org/en/](https://openresty.org/en/)⁠. + +Features: +- OpenResty® is a full-fledged web platform that integrates our enhanced version of the Nginx core, our enhanced version of LuaJIT, many carefully written Lua libraries, lots of high quality 3rd-party Nginx modules, and most of their external dependencies. It is designed to help developers easily build scalable web applications, web services, and dynamic web gateways. + +- By taking advantage of various well-designed Nginx modules (most of which are developed by the OpenResty team themselves), OpenResty® effectively turns the nginx server into a powerful web app server, in which the web developers can use the Lua programming language to script various existing nginx C modules and Lua modules and construct extremely high-performance web applications that are capable to handle 10K ~ 1000K+ connections in a single box. + +- OpenResty® aims to run your server-side web app completely in the Nginx server, leveraging Nginx's event model to do non-blocking I/O not only with the HTTP clients, but also with remote backends like MySQL, PostgreSQL, Memcached, and Redis. + +# Supported tags and respective Dockerfile links +The tag of each `openresty` docker image is consist of the version of `openresty` and the version of basic image. The details are as follows +| Tag | Currently | Architectures | +|----------|-------------|------------------| +|[1.21.4.1-oe2203sp3](https://gitee.com/openeuler/openeuler-docker-images/blob/master/openresty/1.21.4.1/22.03-lts-sp3/Dockerfile)| openresty 1.21.4.1 on openEuler 22.03-LTS-SP3 | amd64, arm64 | + + +# Usage +In this usage, users can select the corresponding `{Tag}` and `container startup options` based on their requirements. + +- Pull the `openeuler/openresty` image from docker + + ```bash + docker pull openeuler/openresty:{Tag} + ``` + +- Start a openresty instance + + ```bash + docker run -d --name my-openresty -p 8080:80 openeuler/openresty:{Tag} + ``` + After the instance `my-openresty` is started, access the openresty service through `http://localhost:8080`. + +- Container startup options + + | Option | Description | + |--|--| + | `-p 8080:80` | Expose nginx on `localhost:8080`. | + | `-v /local/path/to/website:/usr/local/nginx/html` | Mount and serve a local website. | + | `-v /path/to/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf` | Local [configuration file](https://nginx.org/en/docs/)⁠ `nginx.conf`. | + +- View container running logs + + ```bash + docker logs -f my-openresty + ``` + +- To get an interactive shell + + ```bash + docker exec -it my-openresty /bin/bash + ``` + +# 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/openresty/doc/image-info.yml b/openresty/doc/image-info.yml new file mode 100644 index 00000000..7d8bc4cb --- /dev/null +++ b/openresty/doc/image-info.yml @@ -0,0 +1,58 @@ +name: openresty +category: cloud +description: OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。 +environment: | + 本应用在Docker环境中运行,安装Docker执行如下命令 + ``` + yum install -y docker + ``` +tags: | + openresty镜像的Tag由其版本信息和基础镜像版本信息组成,详细内容如下 + + | Tag | Currently | Architectures | + |----------|-------------|------------------| + |[1.21.4.1-oe2203sp3](https://gitee.com/openeuler/openeuler-docker-images/blob/master/openresty/1.21.4.1/22.03-lts-sp3/Dockerfile)| openresty 1.21.4.1 on openEuler 22.03-LTS-SP3 | amd64, arm64 | + +download: | + 拉取镜像到本地 + ``` + docker pull openeuler/openresty:{Tag} + ``` + +usage: | + - 启动容器 + ``` + docker run -d --name my-openresty -p 8080:80 openeuler/openresty:{Tag} + ``` + 用户可根据自身需求选择对应版本的{Tag}、容器启动的选项。`my-openresty`启动之后,通过`http://localhost:8080`访问openresty服务。 + + - 启动参数 + + | Parameter | Description | + |----------------|---------------| + | -p 8080:80 | 暴露Nginx服务端口 | + | -v /local/path/to/website:/usr/local/nginx/html | 挂载本地网页进行服务 | + | v /path/to/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf | 使用本地配置文件 | + + - 容器测试 + + 查看运行日志 + ``` + docker logs -f my-openresty + ``` + + 使用shell交互 + ``` + docker exec -it my-openresty /bin/bash + ``` + +license: 2-clause BSD license. +similar_packages: + - Nginx: 一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。 + - Apache HTTP Server: 一个广泛使用的Web服务器软件,具有悠久的历史和广泛的应用。 + - Tomcat: 一个Java应用服务器,但它也提供了Web服务器的功能。 + - Caddy: 一个现代的Web服务器,具有简洁的配置和强大的功能。它支持自动HTTPS、HTTP/2、反向代理等,并且易于扩展和定制 +dependency: + - gcc + - make + - openssl-devel \ No newline at end of file diff --git a/openresty/doc/picture/logo.png b/openresty/doc/picture/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..60a8dfa7e41ebce9192719bae68f75f3e57e7d4a GIT binary patch literal 16161 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