Docker 部署 OpenResty 及常见问题解决

阅读时长 9 分钟读完

随着互联网技术的发展,Web 服务不断涌现,前端工程师的后台知识需求也在逐渐提高。其中,OpenResty 是一个基于 Nginx 和 LuaJIT 的 Web 服务器,可以用于构建高性能的 Web 应用程序。Docker 是一个流行的容器化解决方案,它将应用程序和其依赖项全部打包到一个独立的可执行文件中,使得开发者可以更方便地进行部署和管理,也能有效减少环境差异带来的问题。

本文将介绍如何在 Docker 环境下部署 OpenResty,并解决在过程中可能会遇到的问题,帮助读者更深入地理解 OpenResty 的相关知识点和如何进行 Docker 部署。

前置知识

本文假设读者已经熟悉 Docker 基础操作和 OpenResty 原理,对于完全不了解这两个内容的读者,可以先阅读官方文档。

Docker 部署

构建镜像

要在 Docker 环境下部署 OpenResty,需要首先构建一个 OpenResty 镜像。可以通过以下命令创建一个 Dockerfile 来进行构建:

-- -------------------- ---- -------
---- -----------

--- ----------------- --------

- ----
--- --- ---------- --- -
      ---- -
      ------------ -
      ---------------- -
      -------- -
      ---- -
      --- -
      -------- -
      -------- -
      ------------ -
      ----------- -
      ---- -
      -- -- --- ----------------

- -----
--- ---- -------------------------------------------------------------------- -
      -- --- ----- ------------------------------------- -
      -- -- ------------------------------ -
      -- ----------- ------------------------------ -
                     ------------------------- -
                     ------------------------ -
                     ------------------------------- -
                     ------------------------------ -
                     ------------------------------ -
                     ------------- -
                     ----------------------------------------- -
                     ---------------------------------------------- -
      -- ---- -- ---- ------- -
      -- -- - -
      -- -- --- ------------------------------ -------------------------------------

- - ----- -- ---- -
--- ---- -------------------------------------

- ----
------- --------------------------

上述 Dockerfile 文件将从 alpine:3.13 镜像开始构建,并且安装了 OpenResty 所需的所有依赖项和必要的模块,包括 GeoIP、lua-nginx-module 等。

然后,构建镜像:

运行容器

构建完镜像后,就可以通过以下命令来运行容器:

其中,-p 参数表示将宿主机的 80 端口映射到容器内的 80 端口,-d 参数表示以后台模式运行容器。

配置 OpenResty

要配置 OpenResty,需要更改 Nginx 的配置文件。由于 OpenResty 的配置文件语法是基于 Lua 的,所以需要编辑 lua 脚本来进行配置。可以先将目标配置文件放到本地配置文件夹,然后将其映射到容器中,例如:

其中,$(pwd)/conf 是宿主机的配置文件夹路径,-v 参数表示将这个路径映射到容器中的 /usr/local/openresty/nginx/conf 目录下。

接下来,修改 lua 脚本:

上述 lua 脚本会从 Redis 中获取 key 为 foo 的值,并在返回客户端前打印出来。

使用插件

OpenResty 有很多插件,可以帮助开发者快速实现某些功能。例如,我们想要在容器中使用 Prometheus 监控,可以通过以下步骤来实现:

  1. 安装 lua-resty-prometheus 模块:

  2. 编辑 Nginx 配置文件:

    -- -------------------- ---- -------
    ---- -
      - -- ---------- --
      ---------------- --------------------------------------
      --------------- ------------------ ----
      ----------------- -
        ---------- - ------------------------------------------------
        ----- ------------- - -------------------
          ---------------------- ------- -- ---- ---------- ---------- ------- ---------
        -
        ----- ----------------------------- - ---------------------
          -------------------------------- ----- ------- ----------
          ---------- -------- ---------
        -
        ------- - -
          ------------- - --------------
          ----------------------------- - -----------------------------
        -
      -
    
      - -- ---------- --
      ------ -
        ------ -----
        -------- -------- -
          -------------------- -
            --------------------
          -
        -
      -
    -

上述配置做了如下操作:

  1. 安装了 lua-resty-prometheus 模块
  2. 定义了一个共享字典 prometheus_metrics
  3. 创建了两个统计指标,分别是 http_requests_totalhttp_request_duration_seconds
  4. /metrics 路由下,将 prometheus_metrics 中的数据输出为 Prometheus 格式

最后,重启 Nginx,就可以在浏览器中访问 localhost:9090/metrics 来查看监控数据了。

常见问题解决

1. 403 Forbidden 错误

如果在安装完 OpenResty 镜像并运行容器之后,得到了 403 Forbidden 错误,原因可能是容器内部的 Nginx 以一个没有权限的用户运行,所以无法访问一些文件夹。

解决方法:

在 Dockerfile 中修改 Nginx 的用户和用户组,例如:

2. set_real_ip_from 失效

在 OpenResty 的 Nginx 配置文件中,可以通过 set_real_ip_from 指令来进行 IP 转发,确保 Nginx 能够正确地获取到客户端的真实 IP。但是,有一些场景下,这个指令可能会失效。

解决方法:

在 docker run 命令中增加 --add-host 参数,例如:

上述命令将 host.docker.internal 映射到容器的 host-gateway 地址,这样就可以正确获取客户端的真实 IP 了。

总结

本文介绍了如何在 Docker 环境下部署 OpenResty,并解决在过程中可能会遇到的问题。Docker 可以帮助开发者更方便地进行应用程序的部署和管理,而 OpenResty 作为一个高性能的 Web 服务器,也能提高 Web 应用程序的响应速度和并发能力。希望读者通过本文,了解到这些工具的使用方法和技巧,以构建更好的 Web 服务。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a13f9d48841e9894d82546

纠错
反馈