首页开发教程OpenResty配置教程 nginx.conf、location与Lua脚本的使用方法

OpenResty配置教程 nginx.conf、location与Lua脚本的使用方法

2026-09-29 660

OpenResty安装完成后,需要通过nginx.conf配置监听端口、站点域名和请求处理规则。不同路径可以交给Lua脚本处理,也可以转发到后端应用。掌握server与location的配置方式,是继续实现接口鉴权、动态路由等功能的基础。

以下示例使用安装目录/usr/local/openresty。如果实际路径不同,请相应调整。已有网站正在运行时,不要用最小示例覆盖整个配置文件,应保留原有站点、证书和其他业务配置。

一、修改前先备份配置

备份当前的nginx.conf,在文件名中加入时间,避免反复备份时覆盖旧文件。

sudo cp -p \
  /usr/local/openresty/nginx/conf/nginx.conf \
  /usr/local/openresty/nginx/conf/nginx.conf.bak.$(date +%Y%m%d-%H%M%S)

随后使用文本编辑器打开配置文件。

sudo vi /usr/local/openresty/nginx/conf/nginx.conf

操作前记下备份文件名。后续如果需要恢复,应恢复对应备份,再检查配置并重载。

二、编写最小可用配置

在独立测试环境中,可以先使用以下配置,验证OpenResty能否通过Lua返回内容。

worker_processes 1;

events {
    worker_connections 1024;
}

http {
    server {
        listen 80;
        server_name localhost;

        location / {
            default_type text/plain;

            content_by_lua_block {
                ngx.say("hello openresty")
            }
        }
    }
}

content_by_lua_block中的Lua代码负责生成响应,ngx.say()将内容写入响应正文。完成第六节的检查与重载后,访问首页应返回hello openresty。

这里的location /是前缀匹配,也会处理没有被其他规则接管的路径。它适合入门验证,正式网站需要另外安排正常页面和不存在路径的处理规则。

三、理解server配置

server用于定义一个虚拟服务器,放在http配置块内。同一份配置可以包含多个server,分别处理不同域名或监听端口上的请求。

示例中的两条指令分别负责监听和名称匹配。

listen 80;
server_name localhost;
  • listen指定监听地址或端口。
  • server_name指定用于匹配请求的服务器名称。

server_name localhost不等于只允许本机访问。 如果只是做本地测试,可以将监听配置改为绑定回环地址。

listen 127.0.0.1:80;

正式部署时,再结合实际域名、网络访问要求及HTTPS配置调整站点。

四、配置location与反向代理

location负责选择请求路径对应的处理规则。以下配置片段都放在第二节已有的server中,不需要另外建立一个完整的http块。

1. 添加健康检查路径

为/health添加精确匹配规则。

location = /health {
    default_type text/plain;
    return 200 "ok\n";
}

重载后,请求该路径应返回200和ok。这只是当前OpenResty处理入口的简单检查,没有检测数据库或后端应用。

2. 将API请求转发到后端

假设后端应用已经监听127.0.0.1:8080,可以添加以下规则。

location ^~ /api/ {
    proxy_pass http://127.0.0.1:8080;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

这个示例中的proxy_pass没有附带URI部分,因此请求/api/users时,后端接收到的路径仍是/api/users。

如果改为末尾带斜杠的形式,则含义不同。

proxy_pass http://127.0.0.1:8080/;

在上述前缀匹配配置中,请求/api/users会被转发为后端的/users。是否保留/api/,应与后端接口路由保持一致。

3. 正确认识匹配顺序

不能简单理解为“越具体的location写在越前面,优先级就越高”。

对于本例这种没有嵌套的配置,可以按以下顺序理解。

  1. 优先检查=精确匹配,命中后直接采用。
  2. 在前缀规则中找出匹配路径最长的一项。
  3. 如果这一项带有^~,则采用它,不再检查正则规则。
  4. 否则按书写顺序检查正则规则,采用第一个匹配项;没有正则命中时,使用此前找到的最长前缀规则。

普通前缀规则主要比较匹配长度,正则规则之间才需要特别注意书写顺序。

例如,/admin/可以单独配置访问控制,但仅仅写出这个路径不会自动完成鉴权,还需要相应的检查逻辑。

五、选择合适的Lua执行位置

OpenResty允许在不同请求阶段运行Lua代码,常用指令包括以下几种。

  • access_by_lua_block在访问控制阶段执行,适合鉴权及访问限制。
  • content_by_lua_block在内容处理阶段执行,用于生成响应。
  • log_by_lua_block在日志阶段执行,用于记录请求处理结果。
  • content_by_lua_file在内容处理阶段加载独立Lua文件。

代码较多时,可以将Lua逻辑单独保存,减少nginx.conf中的业务代码。

先创建目录。

sudo mkdir -p /usr/local/openresty/nginx/lua

创建示例脚本。

sudo tee /usr/local/openresty/nginx/lua/hello.lua > /dev/null <<'EOF'
ngx.say("hello from lua file")
EOF

确保OpenResty的工作进程能够读取该文件,再在server中添加一个独立路径。

location = /hello {
    default_type text/plain;
    content_by_lua_file /usr/local/openresty/nginx/lua/hello.lua;
}

默认开启Lua代码缓存时,修改脚本后也需要重载,才能让新工作进程使用更新后的代码。生产环境不建议为了省去重载而关闭代码缓存。

需要代理后端时,可以使用access_by_lua_block先检查请求,再交给proxy_pass。不要在同一个location中同时用content_by_lua_block和proxy_pass争用内容处理阶段。

六、检查配置并平滑重载

先使用OpenResty自带的Nginx检查配置,避免误调用服务器上另一个Nginx程序。

sudo /usr/local/openresty/nginx/sbin/nginx -t

如果实际使用的是其他配置文件,应通过-c指定;原服务使用了自定义-p或-c参数时,检查和重载也应保持一致。

检查通过后再重载,可以使用&&确保前一条命令成功后才继续。

sudo /usr/local/openresty/nginx/sbin/nginx -t &&
sudo /usr/local/openresty/nginx/sbin/nginx -s reload

重载会让主进程检查并尝试应用新配置,启动新的工作进程,同时让旧工作进程逐步结束已有请求。这里假设OpenResty已经启动,reload不用于首次启动服务。

按实际添加的配置验证访问结果。

curl -i http://127.0.0.1/
curl -i http://127.0.0.1/health
curl -i http://127.0.0.1/hello

预期分别获得首页测试文本、健康检查响应和独立Lua脚本的输出。验证反向代理时,应使用后端真实存在的接口路径。

相关阅读:

《OpenResty Lua 脚本入门:读取参数、请求头与返回响应》

《Nginx LuaJIT架构说明:OpenResty、Nginx与LuaJIT关系》

《Linux安装OpenResty教程:替代Nginx并支持Lua脚本》

  • 广告合作

  • QQ群号:4114653

温馨提示:
1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。 2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。
OpenResty
下一篇:

已经没有下一篇了!

相关文章