您当前的位置:首页 > 计算机 > 服务器 > 网络服务

Mac 下 openresty 安装

时间:12-14来源:作者:点击数:

下载 openresty,按照这份方法:

# 安装目标目录
export OPENRESTY_HOME=$HOME/openresty
mkdir -p $OPENRESTY_HOME

# 安装openssl和pcre
brew install pcre openssl
# 设置pcre和openssl的安装目录
export PCRE_HOME=/usr/local/Cellar/pcre/8.42
export OPENSSL_HOME=/usr/local/Cellar/openssl/1.0.2q

# 编译安装
tar xzf openresty-1.11.2.5.tar.gz
cd openresty-1.11.2.5

./configure \
  --prefix="$OPENRESTY_HOME" \
  --with-cc-opt="-I$PCRE_HOME/include -I$OPENSSL_HOME/include" \
  --with-ld-opt="-L$PCRE_HOME/lib -L$OPENSSL_HOME/lib" \
  -j8\
  --with-pcre-jit \
  --with-http_realip_module \
  --with-http_ssl_module \
  --with-http_stub_status_module \
  --with-http_v2_module

make -j8
make install

参考 Mac 下 Kong 的安装与使用

brew install openresty/brew/openresty

Mac 下 Kong 的安装与使用

原文 点击,安装由于使用 homebrew 各种报错,最后直接使用源码安装

安装 openresty

Mac OS X (macOS) 用户安装过程中由于pcre和openssl可能出错,直接使用 brew 单独安装 http://openresty.org/cn/installation.html

brew update
brew install pcre openssl

安装成功后使用 list 查询安装路径

brew list pcre openssl

/usr/local/Cellar/pcre/8.41/bin/pcre-config
/usr/local/Cellar/pcre/8.41/bin/pcregrep
/usr/local/Cellar/pcre/8.41/bin/pcretest
/usr/local/Cellar/pcre/8.41/include/ (6 files)
/usr/local/Cellar/pcre/8.41/lib/libpcre.1.dylib
/usr/local/Cellar/pcre/8.41/lib/libpcre16.0.dylib
/usr/local/Cellar/pcre/8.41/lib/libpcre32.0.dylib
/usr/local/Cellar/pcre/8.41/lib/libpcrecpp.0.dylib
/usr/local/Cellar/pcre/8.41/lib/libpcreposix.0.dylib
/usr/local/Cellar/pcre/8.41/lib/pkgconfig/ (5 files)
/usr/local/Cellar/pcre/8.41/lib/ (10 other files)
/usr/local/Cellar/pcre/8.41/share/doc/ (64 files)
/usr/local/Cellar/pcre/8.41/share/man/ (103 files)
/usr/local/Cellar/openssl/1.0.2n/.bottle/etc/ (8 files)
/usr/local/Cellar/openssl/1.0.2n/bin/c_rehash
/usr/local/Cellar/openssl/1.0.2n/bin/openssl
/usr/local/Cellar/openssl/1.0.2n/include/openssl/ (75 files)
/usr/local/Cellar/openssl/1.0.2n/lib/libcrypto.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.2n/lib/libssl.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.2n/lib/engines/ (12 files)
/usr/local/Cellar/openssl/1.0.2n/lib/pkgconfig/ (3 files)
/usr/local/Cellar/openssl/1.0.2n/lib/ (4 other files)
/usr/local/Cellar/openssl/1.0.2n/share/man/ (1680 files)

安装 luarocks

brew install lua
brew link luarocks
git clone git://github.com/diegonehab/luasocket.git
cd luasocket
make macosx
sudo make install

安装 openresty

wget https://openresty.org/download/openresty-1.11.2.5.tar.gz
tar xzf openresty-1.11.2.5.tar.gz
cd openresty-1.11.2.5

./configure \
  --with-cc-opt="-I/usr/local/Cellar/openssl/1.0.2o_1/include/ -I/usr/local/Cellar/pcre/8.41/include/" \
  --with-ld-opt="-L/usr/local/Cellar/openssl/1.0.2o_1/lib/ -L/usr/local/Cellar/pcre/8.41/lib/" \
  -j8\
  --with-pcre-jit \
  --with-ipv6 \
  --with-http_realip_module \
  --with-http_ssl_module \
  --with-http_stub_status_module \
  --with-http_v2_module

make -j8
make install

安装 postgresql

在 Mac OS 安装

brew install postgresql
initdb /usr/local/var/postgres -E utf8
pg_ctl -D /usr/local/var/postgres -l logfile start
/usr/local/bin/psql -d postgres

#初始化kong的用户和数据库
CREATE USER kong; CREATE DATABASE kong OWNER kong;

在 Centos7 安装 postgresql 9.6 rpm

yum install -y https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
yum install -y postgresql96-server postgresql96-contrib
# 初始化数据库
/usr/pgsql-9.6/bin/postgresql96-setup initdb
# 设置开机启动
systemctl enable postgresql-9.6.service
# 启动数据库
systemctl start postgresql-9.6.service
# 配置远程访问
vi /var/lib/pgsql/9.6/data/postgresql.conf

安装 kong

wget https://codeload.github.com/Kong/kong/tar.gz/0.12.2 -O kong-0.12.2.tar.gz
tar xzf kong-0.12.2.tar.gz
sudo make
sudo make install

设置环境变量,我这里是直接改了 zsh 的环境变量,不用 zsh 的可以改 ~/.bash_profile

vi ~/.zsh_profile
export PATH="$PATH:/usr/local/openresty/bin"
export PATH="$PATH:/Users/LvYong/dev/kong-0.12.2/kong-0.12.2/bin"
启动kong
#初始化
kong migrations up
#启动
kong start
测试kong
⋊> ~ curl -i http://localhost:8001/                                                                                                                                                                                                                              
HTTP/1.1 200 OK
Date: Thu, 08 Mar 2018 08:49:08 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/0.12.2

问题1:

/usr/include/sys/resource.h:204:2: error: unknown type name 'uint64_t'

解决办法:

mv /usr/local/include /usr/local/include.old
brew install llvm

问题2:

Error: Failed installing dependency: https://luarocks.org/luasec-0.6-2.src.rock - Could not find header file for OPENSSL
  No file openssl/ssl.h in /usr/local/include
  No file openssl/ssl.h in /usr/include

解决办法:

cd /usr/local/include 
ln -s ../opt/openssl/include/openssl

本机脚本:

➜  typhon4g git:(master) brew list pcre openssl
/usr/local/Cellar/pcre/8.43/bin/pcre-config
/usr/local/Cellar/pcre/8.43/bin/pcregrep
/usr/local/Cellar/pcre/8.43/bin/pcretest
/usr/local/Cellar/pcre/8.43/include/ (6 files)
/usr/local/Cellar/pcre/8.43/lib/libpcre.1.dylib
/usr/local/Cellar/pcre/8.43/lib/pkgconfig/ (5 files)
/usr/local/Cellar/pcre/8.43/lib/ (10 other files)
/usr/local/Cellar/pcre/8.43/share/doc/ (64 files)
/usr/local/Cellar/pcre/8.43/share/man/ (103 files)
/usr/local/Cellar/openssl/1.0.2s/.bottle/etc/ (8 files)
/usr/local/Cellar/openssl/1.0.2s/bin/openssl
/usr/local/Cellar/openssl/1.0.2s/include/openssl/ (75 files)
/usr/local/Cellar/openssl/1.0.2s/lib/libcrypto.1.0.0.dylib

./configure \
  --prefix="/Users/bingoobjca/run/openresty-1.13.6.2" \
  --with-cc-opt="-I/usr/local/Cellar/openssl/1.0.2s/include/ -I/usr/local/Cellar/pcre/8.43/include/" \
  --with-ld-opt="-L/usr/local/Cellar/openssl/1.0.2s/lib/ -L/usr/local/Cellar/pcre/8.43/lib/" \
  -j8 \
  --with-pcre-jit \
  --with-ipv6 \
  --with-http_realip_module \
  --with-http_ssl_module \
  --with-http_stub_status_module \
  --with-http_v2_module

--prefix=path — 定义服务器文件的完整路径,该路径同时也是 configure 命令设置的 相对路径(除类库源文件外)以及 nginx.conf 文件定义的相对路径的基准路径。其默认 值是 /usr/local/nginx。参考

kong 1.2.1 是基于 lua5.1的,所以得先按照 5.1,不能是 5.2+ 等。

curl -R -O http://www.lua.org/ftp/lua-5.1.5.tar.gz
tar zxf lua-5.1.5.tar.gz
cd lua-5.1.5
make macosx test
sudo make install
$ brew tap kong/kong
$ brew install kong
$ /usr/local/opt/openresty@1.13.6.2/luarocks/bin/luarocks install cqueues 20171014.51-0 --tree=/usr/local/Cellar/kong/1.2.1 make CRYPTO_DIR=/usr/local/opt/openresty@1.13.6.2/openssl OPENSSL_DIR=/usr/local/opt/openresty@1.13.6.2/openssl
$ brew install kong

mac 上安装 openresty-1.13.6.2:

➜  openresty-1.13.6.2 ls /usr/local/Cellar/openssl
1.0.2s
➜  openresty-1.13.6.2 ls /usr/local/Cellar/pcre
8.43
➜  openresty-1.13.6.2 ./configure \
  --with-cc-opt="-I/usr/local/Cellar/openssl/1.0.2s/include/ -I/usr/local/Cellar/pcre/8.43/include/" \
  --with-ld-opt="-L/usr/local/Cellar/openssl/1.0.2s/lib/ -L/usr/local/Cellar/pcre/8.43/lib/" \
  -j8\
  --with-pcre-jit \
  --with-ipv6 \
  --with-http_realip_module \
  --with-http_ssl_module \
  --with-http_stub_status_module \
  --with-http_v2_module

➜  openresty-1.13.6.2 make -j8
➜  openresty-1.13.6.2 sudo make install
...
mkdir -p /usr/local/openresty/site/lualib /usr/local/openresty/site/pod /usr/local/openresty/site/manifest
ln -sf /usr/local/openresty/nginx/sbin/nginx /usr/local/openresty/bin/openresty

安装 luarocks:

➜  Downloads curl -LO https://luarocks.github.io/luarocks/releases/luarocks-2.4.3.tar.gz
➜  Downloads tar zxf luarocks-2.4.3.tar.gz
➜  Downloads cd luarocks-2.4.3
➜  luarocks-2.4.3 ls /usr/local/openresty/luajit/include/
luajit-2.1
➜  luarocks-2.4.3  ./configure \
   --lua-suffix=jit \
   --with-lua=/usr/local/openresty/luajit \
   --with-lua-include=/usr/local/openresty/luajit/include/luajit-2.1
➜  luarocks-2.4.3 make build
➜  luarocks-2.4.3 make install
➜  luarocks-2.4.3 luarocks

LuaRocks 2.4.3, the Lua package manager

安装 kong

➜  Downloads curl -LO https://github.com/Kong/kong/archive/1.2.2.tar.gz
➜  Downloads tar zxf 1.2.2.tar.gz
➜  Downloads cd kong-1.2.2
➜  kong-1.2.2 export LDFLAGS="-L/usr/local/opt/openssl/lib"
➜  kong-1.2.2 export CPPFLAGS="-I/usr/local/opt/openssl/include"
➜  kong-1.2.2 sudo luarocks make OPENSSL_DIR=/usr/local/opt/openssl   CRYPTO_DIR=/usr/local/opt/openssl

package.path 和 package.cpath, from Lua Unofficial FAQ (uFAQ)(https://www.luafaq.org/)

So what search path does require use? This is contained in the value of package.path: on a Unix system this would look like this (note that semicolons are used to separate items):

gt; lua -e "print(package.path)" ./?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua

On a Windows machine:

C:\>lua -e "print(package.path)"
.\?.lua;C:\Program Files\Lua\5.1\lua\?.lua;C:\Program Files\Lua\5.1\lua\?\init.
lua;C:\Program Files\Lua\5.1\?.lua;C:\Program Files\Lua\5.1\?\init.lua;C:\Progra
m Files\Lua\5.1\lua\?.luac

It's important to note that Lua itself does not know anything about directories; it will take the module name and substitute it as '?' in each pattern and see if that file exists; if so, that is then loaded.

A very instructive error message happens if you try to require a module that does not exist. This shows you explicitly how Lua is trying to find the module by matching the path entries:

gt; lua -lalice lua: module 'alice' not found: no field package.preload['alice'] no file './alice.lua' no file '/home/sdonovan/lua/lua/alice.lua' no file '/home/sdonovan/lua/lua/alice/init.lua' no file './alice.so' no file '/home/sdonovan/lua/clibs/alice.so' no file '/home/sdonovan/lua/clibs/loadall.so'

The second difference is the require keeps track of what modules have been loaded, so calling it again will not cause the module to be reloaded.

The third difference is that require will also load binary modules. In a similar fashion, package.cpath is used to find modules - they are shared libraries (or DLLs) which export an initialisation function.

gt; lua -e "print(package.cpath)" ./?.so;/usr/local/lib/lua/5.1/?.so;/usr/local/lib/lua/5.1/loadall.so
C:\>lua -e "print(package.cpath)"
.\?.dll;.\?51.dll;C:\Program Files\Lua\5.1\?.dll;C:\Program Files\Lua\5.1\?51.dl
l;C:\Program Files\Lua\5.1\clibs\?.dll;C:\Program Files\Lua\5.1\clibs\?51.dll;C:
\Program Files\Lua\5.1\loadall.dll;C:\Program Files\Lua\5.1\clibs\loadall.dll

package.path and package.cpath can be modified, changing the behaviour of require. Lua will also use the environment variables LUA_PATH and LUA_CPATH if they are defined, to override the default paths.

What does './?.lua' match? This matches any Lua module in the current directory, which is useful for testing.

Why is there the pattern '/usr/local/share/lua/5.1/?/init.lua'? This is allows for self-contained packages of modules. So if there was a directory 'mylib' on the Lua path, then require 'mylib' would load 'mylib/init.lua'.

What if the module name contains dots, such as require 'socket.core? Lua replaces the period with the appropriate directory separator ('socket/core' or 'socket\core') and performs the search using this form. So on a Unix machine, it replaces '?' in '/usr/local/lib/lua/5.1/?.so' to give '/usr/local/lib/lua/5.1/socket/core.so' which matches.

1.20 How to explicitly load a binary module?

A binary module is a shared library that must have one entry point with a special name. For instance, if I have a binary module fred then its initialisation function must be called luaopen_fred. This code will explicitly load fred given a full path:

local fn,err = package.loadlib('/home/sdonovan/lua/clibs/fred.so','luaopen_fred')
if not fn then print(err)
else
  fn()
end

(For Windows, use an extension of .dll)

LUA_INIT

luajit CMakeLists

set ( LUA_PATH "LUA_PATH" CACHE STRING "Environment variable to use as package.path." )

set ( LUA_CPATH "LUA_CPATH" CACHE STRING "Environment variable to use as package.cpath." )

set ( LUA_INIT "LUA_INIT" CACHE STRING "Environment variable for initial script." )

lua解释器执行其参数前,会先查找一个名为LUA_INIT的环境变量:

如果找到这个变量,并且其内容为 @filename,那么解释器会先执行这个文件; 如果LUA_INIT不是以 @ 开头,则作为 Lua 代码执行。

如下面的示例,将 LUA_INIT 定义为 @a.lua,然后启动 lua 解释器,自动加载了 a.lua 文件。

# Lua init
export LUA_INIT="@$HOME/.lua/init.lua"
package.path = package.path .. ";" .. os.getenv("HOME") .. "/.lua/?.lua"
package.cpath = package.cpath .. ";" .. os.getenv("HOME") .. "/.lua/?.so"
local resty_home = "/home/vagrant/openresty"
package.path = resty_home .. "/lualib/?.lua;" .. resty_home .. "/luajit/share/luajit-2.1.0-beta3/?.lua;/usr/local/share/lua/5.1/?.lua;/usr/local/share/lua/5.1/?/init.lua;".. resty_home .. "/luajit/share/lua/5.1/?.lua;" .. resty_home .. "/luajit/share/lua/5.1/?/init.lua;"
package.cpath = "./?.so;/usr/local/lib/lua/5.1/?.so;" .. resty_home .. "/luajit/lib/?.so;/usr/local/lib/lua/5.1/loadall.so"

OpenResty 指定 prefix 编译后,就不能随便调整路径继续正常运行了

No, the installation tree of OpenResty is not relocatable by design, as you can see from the runtime error messages. The nginx executable of OpenResty relies on the location specified (by --prefix=PATH of ./configure) when building OpenResty to find dynamic libraries it depends on. Similarly, OpenResty relies on the same prefix to locate the default Lua libraries shipped by OpenResty.

Very few C/C++ projects in the *NIX world allows moving the installation trees to a different location than specified at build time.

  1. Nginx Command-line parameters
  2. OpenResty
  3. 整理一下Openresty安装

编译环境:

# yum groupinstall "Development Tools"
yum -y install gcc gcc-c++ autoconf automake make
yum -y install zlib zlib-devel openssl pcre libxml2 libxml2-devel
yum -y install readline-devel pcre-devel openssl-devel

编译安装:

V=1.9.3.1 \
&& cd /usr/local/src \
&& ( [ -f "ngx_openresty-$V.tar.gz" ] || wget https://openresty.org/download/ngx_openresty-$V.tar.gz ) \
&& rm -rf ngx_openresty-$V \
&& tar zxvf ngx_openresty-$V.tar.gz \
&& cd ngx_openresty-$V \
&& ./configure \
--prefix=/usr/local/openresty \
--http-log-path=/var/log/openresty/access.log \
--error-log-path=/var/log/openresty/error.log \
--http-client-body-temp-path=/var/cache/openresty/client_temp \
--http-proxy-temp-path=/var/cache/openresty/proxy_temp \
--http-fastcgi-temp-path=/var/cache/openresty/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/openresty/uwsgi_temp \
--http-scgi-temp-path=/var/cache/openresty/scgi_temp \
--pid-path=/var/run/openresty.pid \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_ssl_module \
--with-cc-opt='-O2 -g' \
--with-luajit \
--without-lua_redis_parser \
--without-lua_rds_parser \
--without-lua_resty_dns \
--without-lua_resty_memcached \
--without-lua_resty_redis \
--without-lua_resty_mysql \
--without-lua_resty_upload \
--without-lua_resty_upstream_healthcheck \
--without-lua_resty_string \
--without-lua_resty_websocket \
--without-lua_resty_lock \
--without-lua_resty_lrucache \
--without-lua_resty_core \
--without-http_xss_module \
--without-http_coolkit_module \
--without-http_set_misc_module \
--without-http_form_input_module \
--without-http_encrypted_session_module \
--without-http_srcache_module \
--without-http_headers_more_module \
--without-http_array_var_module \
--without-http_memc_module \
--without-http_redis2_module \
--without-http_redis_module \
--without-http_rds_json_module \
--without-http_rds_csv_module \
&& make -j2 \
&& make install

基本配置:

[ -f /usr/sbin/nginx ] && mv /usr/sbin/nginx{,.backup}
ln -sfT /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx
 
mkdir -p /usr/local/openresty/nginx/conf/{sites-available,sites-enabled}
mkdir -p /var/cache/openresty/
 
cat > /etc/logrotate.d/openresty <<EOF
/var/log/openresty/*.log {
    daily
    missingok
    rotate 30
    compress
    notifempty
    dateext
    sharedscripts
    postrotate
        [ -f /var/run/openresty.pid ] && kill -USR1 \`cat /var/run/openresty.pid\`
    endscript
} 
EOF
 
cd /usr/local/openresty/nginx/conf/sites-available \
&& cat > default.conf <<EOF
#default site
server {
    listen 80 default;
    #server_name default;
    root /usr/local/nginx/html;
    index index.html index.htm;
  
    #charset gb2312,utf-8,gbk;
  
    #autoindex on;
    #autoindex_exact_size off;
    #autoindex_localtime on;
  
    access_log /var/log/openresty/access.log main;
    error_log /var/log/openresty/error.log warn;
 
    location /nginx_status {
        stub_status on;
        access_log off;
        #allow 127.0.0.1;
        #allow 172.17.10.0/24;
        #deny all;
    }
 
} #end server
EOF
cd /usr/local/openresty/nginx/conf/sites-enabled \
&& ln -sfT ../sites-available/default.conf default.conf

/usr/local/openresty/nginx/conf/nginx.conf

#nginx.conf(openresty)
user nobody;
worker_processes  2;
 
error_log  /var/log/openresty/error.log;
pid        /var/run/openresty.pid;
worker_rlimit_nofile 10240;
 
events {
    use epoll;
    worker_connections  10240;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
     
    access_log    /var/log/openresty/access.log;
 
    log_format main
          '$remote_addr - $remote_user [$time_local] '
          '"$request" $status $bytes_sent '
          '"$http_referer" "$http_user_agent" '
          '"$gzip_ratio" "$connection" "$request_time"';
 
    #server_names_hash_bucket_size 64
    #proxy_read_timeout 200;
    keepalive_timeout 65;
    sendfile on;
    #tcp_nopush on;
    tcp_nodelay on;
    server_tokens off;
 
    gzip on;
    gzip_min_length 1k;
    gzip_proxied any;
    gzip_buffers 4 32k;
    gzip_types text/plain text/css text/xml application/xml application/atom+xml;
    #gzip_types text/plain text/css text/xml;
    gzip_disable "MSIE [1-6]\.";
 
    ignore_invalid_headers    on;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 128k;
 
    include sites-enabled/*.conf;
} #end http

/etc/init.d/openresty

#!/bin/sh
#
# openresty     Startup script for openresty/nginx
#
# chkconfig: - 85 15
# processname: nginx
# config: /usr/local/openresty/nginx/conf/nginx.conf
# config: /etc/sysconfig/openresty
# pidfile: /var/run/openresty.pid
# description: nginx(openresty) is a HTTP and reverse proxy server
#
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop nginx/openresty
### END INIT INFO
  
# Source function library.
. /etc/rc.d/init.d/functions
  
if [ -f /etc/sysconfig/openresty ]; then
    . /etc/sysconfig/openresty
fi
  
prog=nginx
nginx=${NGINX-/usr/local/openresty/nginx/sbin/nginx}
conffile=${CONFFILE-/usr/local/openresty/nginx/conf/nginx.conf}
lockfile=${LOCKFILE-/var/lock/subsys/openresty}
pidfile=${PIDFILE-/var/run/openresty.pid}
SLEEPMSEC=100000
RETVAL=0
  
start() {
    echo -n $"Starting $prog: "
  
    daemon --pidfile=${pidfile} ${nginx} -c ${conffile}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch ${lockfile}
    return $RETVAL
}
  
stop() {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} ${prog}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
  
reload() {
    echo -n $"Reloading $prog: "
    killproc -p ${pidfile} ${prog} -HUP
    RETVAL=$?
    echo
}
  
upgrade() {
    oldbinpidfile=${pidfile}.oldbin
  
    configtest -q || return 6
    echo -n $"Staring new master $prog: "
    killproc -p ${pidfile} ${prog} -USR2
    RETVAL=$?
    echo
    /bin/usleep $SLEEPMSEC
    if [ -f ${oldbinpidfile} -a -f ${pidfile} ]; then
        echo -n $"Graceful shutdown of old $prog: "
        killproc -p ${oldbinpidfile} ${prog} -QUIT
        RETVAL=$?
        echo
    else
        echo $"Upgrade failed!"
        return 1
    fi
}
  
configtest() {
    if [ "$#" -ne 0 ] ; then
        case "$1" in
            -q)
                FLAG=$1
                ;;
            *)
                ;;
        esac
        shift
    fi
    ${nginx} -t -c ${conffile} $FLAG
    RETVAL=$?
    return $RETVAL
}
  
rh_status() {
    status -p ${pidfile} ${nginx}
}
  
# See how we were called.
case "$1" in
    start)
        rh_status >/dev/null 2>&1 && exit 0
        start
        ;;
    stop)
        stop
        ;;
    status)
        rh_status
        RETVAL=$?
        ;;
    restart)
        configtest -q || exit $RETVAL
        stop
        start
        ;;
    upgrade)
        upgrade
        ;;
    condrestart|try-restart)
        if rh_status >/dev/null 2>&1; then
            stop
            start
        fi
        ;;
    force-reload|reload)
        reload
        ;;
    configtest)
        configtest
        ;;
    *)
        echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|upgrade|reload|status|help|configtest}"
        RETVAL=2
esac
  
exit $RETVAL

rewrite_by_lua/access_by_lua/content_by_lua 的区别:

1、nginx 有11个处理阶段

nginx 把一个请求分成了很多阶段,这样第三方模块就可以根据自己行为,挂载到不同阶段进行处理达到目的。

阶段 说明
set_by_lua* 流程分支处理判断变量初始化
rewrite_by_lua* 转发、重定向、缓存等功能(例如特定请求代理到外网)
access_by_lua* IP准入、接口权限等情况集中处理(例如配合iptable完成简单防火墙)
content_by_lua* 内容生成
header_filter_by_lua* 应答HTTP过滤处理(例如添加头部信息)
body_filter_by_lua* 应答BODY过滤处理(例如完成应答内容统一成大写)
log_by_lua* 回话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其他机器)
  1. 实际上我们只使用其中一个阶段 content_by_lua*,也可以完成所有的处理。
  2. 但这样 会让我们的代码比较臃肿,越到后期越发难以维护。把我们的逻辑放在不同阶段,分工明确,代码独立,后期发力可以有很多有意思的玩法。

2、使用范围

阶段 使用范围
init_by_lua* http
set_by_lua* server, server if, location, location if
rewrite_by_lua* http, server, location, location if
access_by_lua* http, server, location, location if
content_by_lua* location, location if
header_filter_by_lua* http, server, location, location if
body_filter_by_lua* http, server, location, location if
log_by_lua* http, server, location, location if
timer -

set_by_lua*/header_filter_by_lua*/body_filter_by_lua/log_by_lua 阶段不能运行 Output API、Control API、Subrequest API、Cosocket API

  • output API(ngx.say和ngx.send_headers)
  • control API(ngx.exit和ngx.exec)
  • subrequest API(ngx.location.capture和ngx.location.capture_multi)
  • cosocket API(ngx.socket.tcp和ngx.req.socket, lua-resty-http是基于cosocket实现的)
  • 自从 v0.9.17 版本, 使用指令 xxx_by_lua 是 不优雅 的,应使用新的 xxx_by_lua_block 指令进行替代。
  • 在 rewrite_by_lua/access_by_lua 处理内部,当调用 ngx.exit(ngx.OK) 时,nginx 请求将继续下一阶段的内容处理。要在 rewrite_by_lua 处理中终结当前请求,调用 ngx.exit,成功的请求设定 status >= 200 (ngx.HTTP_OK) 并 status < 300 (ngx.HTTP_SPECIAL_RESPONSE),失败的请求设定 ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) (或其他相关的)。
  • Cosockets Not Available Everywhere
    Due to internal limitations in the Nginx core, the cosocket API is disabled in the following contexts: set_by_lua*, log_by_lua*, header_filter_by_lua*, and body_filter_by_lua.
    The cosockets are currently also disabled in the init_by_lua* and init_worker_by_lua* directive contexts but we may add support for these contexts in the future because there is no limitation in the Nginx core (or the limitation might be worked around).
    There exists a workaround, however, when the original context does not need to wait for the cosocket results. That is, creating a zero-delay timer via the ngx.timer.at API and do the cosocket results in the timer handler, which runs asynchronously as to the original context creating the timer.

参考 :

  1. Nginx高性能WEB服务器详解
  2. 浅谈nginx + lua在安全中的一些应用(link:https://zhuanlan.zhihu.com/p/21362834), 备份地址
  3. LuaNginxModule.md

Why /usr/lib64/liblua-5.1.so appears?

[footstone@tencent-beta18 ~]$ /home/footstone/openresty/nginx/sbin/nginx -p /home/footstone/openresty/nginx -s reload
[footstone@tencent-beta18 ~]$ ps -ef|grep nginx
footsto+  7175     1  0 8月30 ?       00:00:00 nginx: master process /home/footstone/openresty/nginx/sbin/nginx -p /home/footstone/openresty/nginx
footsto+ 26354  7175  0 14:16 ?        00:00:00 nginx: worker process
footsto+ 26355  7175  0 14:16 ?        00:00:00 nginx: worker process
footsto+ 26356  7175  0 14:16 ?        00:00:00 nginx: worker process
footsto+ 26357  7175  0 14:16 ?        00:00:00 nginx: worker process
footsto+ 26366 26131  0 14:16 pts/2    00:00:00 grep --color=auto nginx
[footstone@tencent-beta18 ~]$ cat /proc/26354/maps|grep lua
7f8c585ac000-7f8c58623000 r-xp 00000000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
7f8c58623000-7f8c58823000 ---p 00077000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
7f8c58823000-7f8c58825000 r--p 00077000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
7f8c58825000-7f8c58826000 rw-p 00079000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
[footstone@tencent-beta18 ~]$ cat /proc/26354/maps|grep lua
7f8c585ac000-7f8c58623000 r-xp 00000000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
7f8c58623000-7f8c58823000 ---p 00077000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
7f8c58823000-7f8c58825000 r--p 00077000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
7f8c58825000-7f8c58826000 rw-p 00079000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
[footstone@tencent-beta18 ~]$ cat /proc/26354/maps|grep lua
7f8c585ac000-7f8c58623000 r-xp 00000000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
7f8c58623000-7f8c58823000 ---p 00077000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
7f8c58823000-7f8c58825000 r--p 00077000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
7f8c58825000-7f8c58826000 rw-p 00079000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
[footstone@tencent-beta18 ~]$ curl localhost:8081
{"status":404, "message":"服务请求不存在", "more info":"URI没找到,请检查API设置"}[footstone@tencent-beta18 ~]$
[footstone@tencent-beta18 ~]$ cat /proc/26354/maps|grep lua
7f8c51f00000-7f8c51f2c000 r-xp 00000000 fd:01 329142                     /usr/lib64/liblua-5.1.so
7f8c51f2c000-7f8c5212b000 ---p 0002c000 fd:01 329142                     /usr/lib64/liblua-5.1.so
7f8c5212b000-7f8c5212d000 r--p 0002b000 fd:01 329142                     /usr/lib64/liblua-5.1.so
7f8c5212d000-7f8c5212e000 rw-p 0002d000 fd:01 329142                     /usr/lib64/liblua-5.1.so
7f8c5212e000-7f8c52131000 r-xp 00000000 fd:01 2786787                    /home/footstone/openresty/lualib/zlib.so
7f8c52131000-7f8c52331000 ---p 00003000 fd:01 2786787                    /home/footstone/openresty/lualib/zlib.so
7f8c52331000-7f8c52332000 rw-p 00003000 fd:01 2786787                    /home/footstone/openresty/lualib/zlib.so
7f8c52332000-7f8c52339000 r-xp 00000000 fd:01 2786465                    /home/footstone/openresty/lualib/cjson.so
7f8c52339000-7f8c52539000 ---p 00007000 fd:01 2786465                    /home/footstone/openresty/lualib/cjson.so
7f8c52539000-7f8c5253a000 r--p 00007000 fd:01 2786465                    /home/footstone/openresty/lualib/cjson.so
7f8c5253a000-7f8c5253b000 rw-p 00008000 fd:01 2786465                    /home/footstone/openresty/lualib/cjson.so
7f8c585ac000-7f8c58623000 r-xp 00000000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
7f8c58623000-7f8c58823000 ---p 00077000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
7f8c58823000-7f8c58825000 r--p 00077000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0
7f8c58825000-7f8c58826000 rw-p 00079000 fd:01 2786435                    /home/footstone/openresty/luajit/lib/libluajit-5.1.so.2.1.0

mac:

➜  api-gateway-ng git:(feature/feature_refactor) ✗ vmmap  63328 |grep lua
__TEXT                 0000000003806000-000000000380b000 [   20K    20K     0K     0K] r-x/rwx SM=COW          /Users/bingoobjca/run/openresty-1.13.6.2/lualib/cjson.so
__LINKEDIT             000000000380c000-000000000380f000 [   12K     4K     0K     0K] r--/rwx SM=COW          /Users/bingoobjca/run/openresty-1.13.6.2/lualib/cjson.so
__TEXT                 00000001039d6000-0000000103a51000 [  492K   472K     0K     0K] r-x/rwx SM=COW          /Users/bingoobjca/run/openresty-1.13.6.2/luajit/lib/libluajit-5.1.2.1.0.dylib
__LINKEDIT             0000000103a53000-0000000103a7a000 [  156K     8K     0K     0K] r--/rwx SM=COW          /Users/bingoobjca/run/openresty-1.13.6.2/luajit/lib/libluajit-5.1.2.1.0.dylib
__DATA                 000000000380b000-000000000380c000 [    4K     4K     4K     0K] rw-/rwx SM=COW          /Users/bingoobjca/run/openresty-1.13.6.2/lualib/cjson.so
__DATA                 0000000103a51000-0000000103a53000 [    8K     8K     8K     0K] rw-/rwx SM=COW        
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐