美文网首页
02. 写出你的"hello world"

02. 写出你的"hello world"

作者: 六弦极品 | 来源:发表于2021-09-27 16:26 被阅读0次

    一、OpenResty 的安装

    # add the yum repo:
    wget https://openresty.org/package/centos/openresty.repo
    sudo mv openresty.repo /etc/yum.repos.d/
    
    # update the yum index:
    sudo yum check-update
    

    然后你可以安装一个包,比如openresty,像这样:

    sudo yum install openresty
    

    如果要安装resty命令行实用程序,请安装openresty-resty如下所示的软件包:

    sudo yum install openresty-resty
    

    二、resty写第一个 OpenResty 程序

    $ resty -e "ngx.say('hello world')"
    hello world
    

    三、更正式的 hello world

    需要三步才能完成:
    a、创建工作目录;
    b、修改 NGINX 的配置文件,把 Lua 代码嵌入其中;
    c、启动 OpenResty 服务。

    创建工作目录:

    mkdir geektime
    cd geektime
    mkdir logs conf
    

    下面是一个最简化的 nginx.conf,在根目录下新增 OpenResty 的content_by_lua指令,里面嵌入了ngx.say的代码:

    $ cat conf/nginx.conf
    pid logs/nginx.pid;
    events {
        worker_connections 1024;
    }
    
    http {
        server {
            listen 8090;
            location / {
                content_by_lua 'ngx.say("hello, world")';
            }
        }
    }
    

    确认是否已经把openresty加入到PATH环境中;然后,启动 OpenResty 服务就可以了:

    openresty -p `pwd` -c conf/nginx.conf
    

    没有报错的话,OpenResty 的服务就已经成功启动了。可以打开浏览器,或者使用 curl 命令,来查看结果的返回:

    # curl -i 127.0.0.1:8090
    HTTP/1.1 200 OK
    Server: openresty/1.19.9.1
    Date: Mon, 27 Sep 2021 08:42:05 GMT
    Content-Type: text/plain
    Transfer-Encoding: chunked
    Connection: keep-alive
    
    hello, world
    

    如何把 Lua 代码从 nginx.conf 里面抽取出来,保持代码的可读性和可维护性呢?
    在 geektime 的工作目录下,创建一个名为 lua 的目录,专门用来存放代码:

    $ mkdir lua
    $ cat lua/hello.lua
    ngx.say("hello, world")
    

    然后修改 nginx.conf 的配置,把 content_by_lua 改为 content_by_lua_file:

    pid logs/nginx.pid;
    events {
        worker_connections 1024;
    }
    
    http {
        server {
            listen 8090;
            location / {
                content_by_lua_file lua/hello.lua;
            }
        }
    }
    

    最后,重启 OpenResty 的服务就可以了:

    $ sudo kill -HUP `cat logs/nginx.pid`
    

    四、问题及答案

    1、content_by_lua_file lua/hello.lua; 里面写的是相对路径,那么 OpenResty 是如何找到这个 Lua 文件的?
    如果原本给出的是相对路径,那么 OpenResty 在启动时,会把 OpenResty 启动的命令行参数中的 -p PATH 作为前缀,将相对路径拼接为绝对路径。这样,自然就可以顺利找到 Lua 文件。

    2、Lua 代码内容的变更,需要重启 OpenResty 服务才会生效,这样显然不方便调试,那么有没有什么即时生效的方法呢?
    Lua 代码在第一个请求时会被加载,并默认缓存起来。所以在每次修改 Lua 源文件后,都必须重新加载 OpenResty 才会生效。其实,在 nginx.conf 中关闭 lua_code_cache 就能避免重新加载,这一点可以测试。不过,特别需要注意的是,这种方法只能临时用于开发和调试,如果是线上部署,一定要记得打开缓存,否则会非常影响性能。

    3、如何把 lua 代码所在的文件夹,加入到 OpenResty 的查找路径中呢?
    OpenResty 提供了 lua_package_path 指令,可以设置 Lua 模块的查找路径。针对上面的例子,可以把 lua_package_path 设置为 prefix/lua/?.lua;;,其中:prefix 就是启动参数中的 -p PATH;
    /lua/?.lua 表示 lua 目录下所有以 .lua 作为后缀的文件;
    最后的两个分号,则代表内置的代码搜索路径。

    相关文章

      网友评论

          本文标题:02. 写出你的"hello world"

          本文链接:https://www.haomeiwen.com/subject/iyxknltx.html