关于Openresty的一些事情

在对Openresty这块理解很初级的时候,写的一些脚本存在的低级错误。

  • 把一些状态存储在lua的对象中,在收到请求的时候把对象内的值修改。这个操蛋的做法有什么问题?

    1. 这么做,当前你只有一个nginx工作进程,并且lua_code_cache on;的时候,居然是可以用的。

    2. 并且在Window环境下,你会发现大部分情况都是居然可以用的。

    3. 在多个进程的情况下,你处理请求的进程只是其中一个,在修改对应的变量的时候,只会修改掉接收到请求的进程中的Lua对象值。这个时候就会出现,有的请求返回的值是正确的,有的不正确。

    4. 在代码缓存是off的时候,每次都会去重新载入代码文件,行为也会存在问题。

      所以针对可变的配置内容,不要写在lua文件中,nginx在尝试写入文件的时候,往往都会遇到权限问题,导致不能更新,因此对于动态配置的信息,存储到redis或者其它数据库中。如果实在不想加入数据库。那么可以存储到nginx的共享内存中去。

  • 在Window下ngx.worker.id()的值都是0值。

    1. 如果定时任务,只在一个进程中执行即可,如果多个进程会导致多次执行。

      第一版本:

    2. 在共享内存中存储pid的标志位,只有第一个设置共享内存的进程执行后续的定时任务。后续的进行运行到此代码的时候,获取pid标志位存在的,就退出,这个也是有毛病的。

    3. 因为当我们去执行nginx -s reload的时候,共享内存的值是存在的,这个就会导致定时任务后续就不再执行了。

      第二版本:

    4. 因为nginx的多个进程启动速度是比较快的。通过设置一个时间到共享内存中。通过判断时间间隔小于5秒的值全部退出掉。

      第三版本:

    5. 没有了,如果有希望大神发个邮件给我,在此先感谢了。