OpenResty是一个基于Nginx的Web平台,可以使用其LuaJIT引擎执行Lua指令码。由章亦春建立。2011年之前,它最初由淘宝网赞助,2012年至2016年主要由Cloudflare支援。自2017年起,主要得到OpenResty软体基金会和OpenResty公司的支援。OpenResty旨在构建可延伸的Web应用、Web服务和动态Web闸道器。OpenResty的架构是基于几个nginx模组,这些模组已经被扩充,以便将nginx扩充为一个web应用服务器,处理大量的请求。

OpenResty下载安装包

cd /home/resource && wget https://openresty.org/download/openresty-1.19.9.1.tar.gz   #下载安装包到/home/resource

OpenResty所需依赖的包安装

yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
yum install -y openldap-devel 
yum install -y git

下载第三方模块

mkdir /opt/extra_modules && cd /opt/extra_modules/  #创建extra_modules,用于存放第三方模块
cd /opt/extra_modules/ && git clone https://github.com/kvspb/nginx-auth-ldap.git   #支持ldap网页认证
cd /opt/extra_modules/ && wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/master.tar.gz #支持cookie
mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42/ nginx-sticky-module  #把下载到的文件夹改成nginx-sticky-module,方便后面编译不然会报错./configure: error: no /opt/extra_modules/nginx-sticky-module/config was found
tar  -xf master.tar.gz 
cd /opt/extra_modules && git clone https://github.com/FRiCKLE/ngx_cache_purge.git  #清除缓存
cd /opt/extra_modules && git clone https://github.com/yaoweibin/nginx_upstream_check_module.git   #用于ustream健康检查

解压OpenResty安装包

cd /home/resource
tar -xf openresty-1.19.9.1.tar.gz

编译需要安装的模块

cd /home/resource/openresty-1.19.9.1
#配置文件
./configure --prefix=/home/openresty \
--pid-path=/var/run/nginx.pid \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--with-luajit \
--with-pcre \
--with-http_v2_module \
--with-http_ssl_module \
--with-pcre-jit \
--with-compat \
--with-threads \
--with-file-aio \
--with-http_gunzip_module \
--with-http_iconv_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_degradation_module \
--with-http_auth_request_module \
--with-http_stub_status_module \
--without-lua_resty_memcached \
--without-http_memcached_module \
--without-lua_resty_mysql \
--without-lua_redis_parser \
--without-lua_resty_redis \
--without-http_redis_module \
--without-http_redis2_module \
--without-lua_rds_parser \
--without-http_rds_csv_module \
--without-http_rds_json_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module \
--add-module=/opt/extra_modules/nginx-auth-ldap \
--add-module=/opt/extra_modules/nginx-sticky-module \
--add-module=/opt/extra_modules/ngx_cache_purge \
--add-module=/opt/extra_modules/nginx_upstream_check_module  \
-j8#用全部的两个核心去编译#我们的机器就俩核心

编译安装

gmake && gmake install
/home/openresty/nginx/sbin/nginx -t  #查看新修改的nginx配置文件是否有语法错误/结构错误,如果能运行,证明编译安装成功
/home/openresty/nginx/sbin/nginx -V    #显示所有的编译模块

创建可执行文件软链接

ln -s /home/openresty/nginx/sbin/nginx /usr/bin/
#ln创建链接;-s创建软链接

写入Nginx配置文件

vim /home/openresty/nginx/conf/nginx.conf  
# 定义作为web服务器/反向代理服务器时的 worder process 进程数
worker_processes    auto;
# 开启多核支持,且自动根据CPU个数均匀分配 worder process 进程数
worker_cpu_affinity auto;
# 指定一个nginx进程可以打开的最多文件描述符数目
worker_rlimit_nofile    65535;
# error_log配置,等级类型:[ debug | info | notice | warn | error | crit ]
error_log  /var/log/nginx/error.log  debug;
# nginx的进程pid位置;
pid        /var/run/nginx.pid;
# 连接处理相关设置
events{
    # 使用epoll的 I/O 模型,必开项,极其有利于性能
    use            epoll;
    # 设置是否允许一个worker可以接受多个请求,默认是off;
    # 值为OFF时,一个worker process进程一次只接收一个请求,由master进程自动分配worker(nginx精于此道,故建议设置为off);
    # 值为ON则一次可接收所有请求,可避免master进程额外调度,但是在高瞬时值的情况下可能导致tcp flood;
    multi_accept off;
    # 每个工作进程的并发连接数(默认为1024)
    # 理论上nginx最大连接数 = worker_processes * worker_connections
    worker_connections 65535;
}
http {
    # mime.types 指定了nginx可以接受的 Content-Type,该文件默认位于nginx.conf的同级目录
    include       mime.types;
    # 设置默认文件类型,application/octet-stream 表示未知的应用程序文件,浏览器一般不会自动执行或询问执行
    default_type  application/octet-stream;
    # 设置日志的记录格式
    log_format main escape=json '{ "time": "$time_iso8601", '
        '"remote_addr": "$remote_addr", '
        '"status": "$status", '
        '"bytes_sent": "$bytes_sent", '
        '"host": "$host", '
        '"request_method": "$request_method", '
        '"request_uri": "$request_uri", '
        '"request_time": "$request_time", '
        '"response_time": "$upstream_response_time",'
        '"http_referer": "$http_referer", '
        '"body_bytes_sent": "$body_bytes_sent", '
        '"http_user_agent": "$http_user_agent", '
        '"http_x_forwarded_for": "$http_x_forwarded_for", '
        '"cookie": "$http_cookie" '
        '}';
    # 用来指定日志文件的存放路径及内容格式
    access_log  /var/log/nginx/access.log  main;
    # 不记录404错误的日志
    log_not_found   off;
    # 隐藏nginx版本号
    server_tokens   off;
    # 开启0拷贝,提高文件传输效率
    sendfile    on;
    # 配合 sendfile 使用,启用后数据包会累计到一定大小之后才会发送,减小额外开销,提高网络效率;
    tcp_nopush  on;
    # 启用后表示禁用 Nagle 算法,尽快发送数据
    # 与 tcp_nopush 结合使用的效果是:先填满包,再尽快发送
    # Nginx 只会针对处于 keep-alive 状态的 TCP 连接才会启用 tcp_nodelay
    tcp_nodelay on;
    # 指定客户端与服务端建立连接后发送 request body 的超时时间,超时Nginx将返���http 408
    client_body_timeout 10;
    # 开启从client到nginx的连接长连接支持,指定每个 TCP 连接最多可以保持多长时间
    # keepalive_timeout的值应该比 client_body_timeout 大
    keepalive_timeout   60;
    # keepalive_requests指令用于设置一个keep-alive连接上可以服务的请求的最大数量,当最大请求数量达到时,连接将被关闭
    keepalive_requests  1000;
    # 客户端请求头部的缓冲区大小,设置等于系统分页大小即可,如果header过大可根据实际情况调整;
    # 查看系统分页:getconf PAGESIZE
    client_header_buffer_size       32k;
    # 设置客户端请求的Header头缓冲区大小,如果客户端的Cookie信息较大,按需增加
    large_client_header_buffers     4 64k;
    # 优化读取$request_body变量时的I/O性能
    client_body_in_single_buffer    on;
    # 设定request body的缓冲大小,仅在 Nginx被设置成使用内存缓冲时有效(使用文件缓冲���该参数无效)
    client_body_buffer_size     128k;
    # 开启proxy忽略客户端中断,避免499错误
    proxy_ignore_client_abort       on;
    # 默认的情况下nginx引用header变量时不能使用带下划线的变量,设置underscores_in_headers为 on取消该限制
    underscores_in_headers      on;
    # 默认的情况下nginx会忽略带下划线的变量,设置ignore_invalid_headers为off取消该限制
    ignore_invalid_headers      off;
    # 设置客户端向服务端发送一个完整的 request header 的超时时间,优化弱网场景下nginx的性能
    client_header_timeout   10;
    # 设置向客户端传输数据的超时时间
    send_timeout        60;
    # 用于启用文件功能时用限制文件大小;
    client_max_body_size    50m;
    # 文件压缩配置,对文本文件效果较好,对图像类应用效果一般反而徒增服务器资源消耗
    gzip        on;
    # 兼容http 1.0
    gzip_http_version   1.0;
    # 压缩比,数值越大:压缩的程度越高、空间占用越低、压缩效率越低、资源消耗越大
    gzip_comp_level 6;
    # 设置压缩门限,小于该长度将不会进行压缩动作(数据过小的情况下,压缩效果不明显)
    gzip_min_length 1k;
    # 用于在nginx作为反向代理时,根据请求头中的“Via”字段决定是否启用压缩功能,默认值为off,any表示对所有请求启动压缩;
    gzip_proxied    any;
    # 用于在启动gzip压缩功能时,在http响应中添加Vary: Accept-Encoding头字段告知接收方使用了gzip压缩;
    gzip_vary       on;
    # 当Agent为IE6时禁用压缩:IE6对Gzip不友好,所以不压缩
    gzip_disable    msie6;
    # 设置系统用于存储gzip的压缩结果数据流的缓存大小(4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存)
    gzip_buffers    4 64k;
    # 指定需要压缩的文件mime类型
    gzip_types      text/xml text/plain text/css application/javascript application/x-javascript application/xml application/json application/rss+xml;
    # 作为反向代理服务器配置
    # 当请求未携带“Host”请求头时将Host设置为虚拟主机的主域名
    proxy_set_header        Host $host;
    # 设置真实客户端IP
    proxy_set_header        X-Real-IP $remote_addr;
    # 简称XFF头,即HTTP的请求端真实的IP,在有前置cdn或者负载均衡可能会被修改;如果要提取客户端真实IP,需要根据实际情况调整,如若后端程序获得对X-Forwarded-For兼容性不好的话(没有考虑到X-Forwarded-For含有多个IP的情况),建议设置为:$http_x_forwarded_for
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    # 启用nginx和后端server(upstream)之间长连接支持(必设项,否则很影响nginx性能),HTTP协议中从1.1版本才支持长连接;启用时需要评估upstream的keepalive参数(默认是关闭的,比较懒的���学可以设置为500)
    proxy_http_version 1.1;
    # 为了兼容老的协议以及防止http头中有Connection close导致的keepalive失效,需要及时清掉HTTP头部的Connection;
    # 该参数决定了访问完成后,后端server后如何处理本次连接,默认配置是主动close(会给后端server带来大量的TIME_WAIT连接,降低后端server性能),设置为""结合proxy_http_version设置连接保持(长连接);
    proxy_set_header Connection "";
    # 用于对发送给客户端的URL进行修改,使用不到的话可以关闭
    proxy_redirect          off;
    # 设置缓冲区的大小和数量,用于放置被代理的后端服务器取得的响应内容
    proxy_buffers           64 8k;
    # 设置和后端建立连接的超时时间,单位秒
    proxy_connect_timeout   60;
    # 设置Nginx向后端被代理服务器发送read请求后,等待响应的超时时间,默认60秒
    proxy_read_timeout 60;
    # 设置Nginx向后端���代理服务器发送write请求后,等待响应的超时时间,默认60秒
    proxy_send_timeout 60;
    # 用于配置存放HTTP报文头的哈希表容量,默认为512个字符。一般都设置为1024,这个大小是哈希表的总大小,
    #设定了这个参数Nginx不是一次全部申请出来,需要用的时候才会申请;
    #但是当真正需要使用的时候也不是一次全部申请,而是会设置一个单次申请最大值(proxy_headers_hash_bucket_size)
    proxy_headers_hash_max_size 1024;
    # 用于设置Nginx服务器申请存放HTTP报文头的哈希表容量的单位大小,默认为64个字符。一般配置为128。
    #这个大小是单次申请最多申请多大,也就是每次用需要申请,但是每次申请最大申请多少,整个哈希表大小不可超过上面设置的值。
    proxy_headers_hash_bucket_size 128;
    # 预防 DDOS 攻击配置策略
    #limit_req_zone          $binary_remote_addr  zone=req:20m   rate=3r/s;
    #limit_req               zone=req  burst=60;
    #limit_zone              conn $binary_remote_addr  20m;
    #limit_conn              conn 5;
    #limit_rate              50k;
    # 设置nginx可以捕获的服务器名字(server_name)的最大数量
    server_names_hash_max_size    1024;
    # 设置nginx中server_name支持的最大长度
    server_names_hash_bucket_size 128;
    include conf.d/*.conf;
}

配置成服务,设置开机启动

cat > /etc/systemd/system/nginx.service << EOF
[Unit]
Description=Nginx(OpenResty ) - high performance web server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
User=root
Group=root
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/home/openresty/nginx/sbin/nginx -t -c /home/openresty/nginx/conf/nginx.conf
ExecStart=/home/openresty/nginx/sbin/nginx -c /home/openresty/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

重载 systemctl&启用Nginx服务

systemctl daemon-reload && systemctl enable nginx

下载解压keepalived、编译安装

cd /home/resource/
wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.2.tar.gz
tar -xf keepalived-2.2.2.tar.gz
yum install -y gcc openssl-devel popt-devel#安装编译依赖
cd keepalived-2.2.2
./configure --prefix=/home/keepalived/
make && make install
mkdir /etc/keepalived
#,在安装好keepalived后有提供许多的配置文件模板(在keepalived/etc中)。启动Keepalived时默认会在/etc/keepalived目录中去找keepalived.conf文件,如果没有将配置文件放在该目录,启动Keepalived时需要使用-f选项来指定配置文件路径:
cp /home/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived/
cp /home/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/
ln -s /home/keepalived/sbin/keepalived /usr/bin/

修改keepalived配置文件

vim /etc/keepalived/keepalived.conf

master

cat >/etc/keepalived/keepalived.conf<<EOF
global_defs {
    router_id red_master137 #一个没重复的名字即可,主从不可重复
}

vrrp_script nginx_check { 
    script "/etc/keepalived/nginx_check.sh"  # 检测nginx是否运行
    interval 1 #脚本执行间隔,每1s检测一次
    weight 2
}
vrrp_instance VI_1 {
    state BACKUP
    #nopreempt  # 设置nopreempt防止抢占资源,即使master恢复了,也不会去抢,只有slave挂了,才到master
    interface ens192
    virtual_router_id 139 #局域网中有相同的virtual_router_id会失败
    priority 100      # 权重,master要大于slave
    advert_int 1      # 主备通讯时间间隔
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.23.188.139
    }
    track_script {
        nginx_check
    }
}
EOF

slave

cat >/etc/keepalived/keepalived.conf<<EOF
global_defs {
    router_id red_slave138 #一个没重复的名字即可,主从不可重复
}

vrrp_script nginx_check {
    script "/etc/keepalived/nginx_check.sh" # 检测nginx是否运行
    interval 1 #脚本执行间隔,每1s检测一次
    weight 2
}
vrrp_instance VI_1 {
    state BACKUP
    #nopreempt  # 设置nopreempt防止抢占资源,即使master恢复了,也不会去抢,只有slave挂了,才到master
    interface ens192
    virtual_router_id 139 #局域网中有相同的virtual_router_id会失败
    priority 80      # 权重,master要大于slave
    advert_int 1       # 主备通讯时间间隔
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.23.188.139
    }
    track_script {
        nginx_check
    }
}
EOF

编写脚本停止脚本

当本机Nginx停止时,停止本机keepalived

touch /etc/keepalived/nginx_check.sh
chmod +x /etc/keepalived/nginx_check.sh

#!/bin/bash
pidof nginx
if [ $? -ne 0 ];then
systemctl stop keepalived
fi

##############################
service keepalived start
# 配置开机自启动
systemctl enable keepalived
ps -aux |grep keepalived

测试

56、57 正常运行时,访问VIP时,显示master

图片没了自己脑补

停止56,查看keepalived状态,也顺利的被脚本停掉了,再访问VIP时

图片没了自己脑补

添加模块

测试成功

假如用了一段时间,发现想要的功能忘了编译进去,可以重新编译。

[root@nginx1 /]# nginx -V  #查看现有的nginx编译的参数,在此基础上添加
nginx version: openresty/1.19.9.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/home/openresty/nginx --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.3.1 --add-module=../iconv-nginx-module-0.14 --add-module=../echo-nginx-module-0.62 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2 --add-module=../set-misc-nginx-module-0.32 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.08 --add-module=../srcache-nginx-module-0.32 --add-module=../ngx_lua-0.10.20 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.19 --add-module=../ngx_stream_lua-0.0.10 --with-ld-opt=-Wl,-rpath,/home/openresty/luajit/lib --pid-path=/var/run/nginx.pid --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --with-pcre --with-http_v2_module --with-http_ssl_module --with-pcre-jit --with-compat --with-threads --with-file-aio --with-http_gunzip_module --with-http_realip_module --with-http_gzip_static_module --with-http_degradation_module --with-http_auth_request_module --with-http_stub_status_module --without-http_memcached_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --add-module=/opt/extra_modules/nginx-auth-ldap --add-module=/opt/extra_modules/nginx-sticky-module --add-module=/opt/extra_modules/ngx_cache_purge --add-module=/opt/extra_modules/ngx-fancyindex --add-module=/opt/extra_modules/nginx_upstream_check_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module

再编译除了需要加上这些和新的模块,还需要添加–with-luajit参数,由于再次编译时没有生成动态链接库,需要手动链接。不然编译完后是不能使用,提示libluajit-5.1.so.2找不到,我已经上过当了。

[root@nginx1 /]# nginx -V
nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory

这就是重新编译时没有加–with-luajit参数 的下场

./configure --prefix=/home/openresty \
--pid-path=/var/run/nginx.pid \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--with-luajit \
--with-pcre \
--with-http_v2_module \
--with-http_ssl_module \
--with-pcre-jit \
--with-compat \
--with-threads \
--with-file-aio \
--with-luajit \  #新加的
--with-http_gunzip_module \
--with-http_iconv_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_degradation_module \
--with-http_auth_request_module \
--with-http_stub_status_module \
--without-lua_resty_memcached \
--without-http_memcached_module \
--without-lua_resty_mysql \
--without-lua_redis_parser \
--without-lua_resty_redis \
--without-http_redis_module \
--without-http_redis2_module \
--without-lua_rds_parser \
--without-http_rds_csv_module \
--without-http_rds_json_module \
--without-mail_pop3_module \
--without-mail_imap_module \
--without-mail_smtp_module \
--add-module=/opt/extra_modules/nginx-auth-ldap \
--add-module=/opt/extra_modules/nginx-sticky-module \
--add-module=/opt/extra_modules/ngx_cache_purge \
--add-module=/opt/extra_modules/ngx-fancyindex \ #新加的
--add-module=/opt/extra_modules/nginx_upstream_check_module \
-j2#用全部的两个核心去编译#我们的机器就俩核心

然后make,完成后/home/resource/openresty-1.19.9.1/build/nginx-1.19.9/objs这个路径下面会有一个nginx的可执行文件 备份好原来的,然后用这个替换。再用nginx -V检查新模块是不是已经加进来了。