zoukankan      html  css  js  c++  java
  • 部署openresty遇到的一些坑

    最近,遇到一个问题,就是我们CMS系统制作的产品页面和产品列表页面,发布到nginx服务器上,因为业务要求,客户看到的链接必须是短链接,当前的做法就是在nginx的配置中通过rewrite的方式做的。这个是静态的做法,当业务要修改短链接或者有新产品发布的话,就存在问题,要运维人员去修改nginx的配置文件,若这个运维忘记了或者改错了,或者业务运营人员找不到运维人员,会是什么效果?404呗。

    针对这个问题,我希望通过lua+nginx+redis的方式,动态的加载这些链接的映射关系。

    openresty对lua以及nginx的诸多模块都有很好的封装,所以,我就要自己在测试环境下尝试下,基于openresty的lua功能,首先就是部署openresty。

    1. 下载openresty。从官网下载最新的版本。本博文案例用到的是openresty-1.11.2.2.tar.gz

        解压缩,首先,因为openresty(确切的说,是nginx)依赖pcre做正则引擎,还有要用openssl做安全引擎。所以,先要安装pcre和openssl。千万注意,要用源码,在安装openresty的时候,通过--with-<module>指定源码路径。

     1 [root@localhost openresty-1.11.2.2]# ./configure --prefix=/usr/local/openresty --with-pcre=/opt/pcre2-10.23 --with-openssl=/opt/openssl-1.1.0e
     2 。。。。。。。
     3 Configuration summary
     4   + using PCRE library: /opt/pcre2-10.23
     5   + using OpenSSL library: /opt/openssl-1.1.0e
     6   + using system zlib library
     7 
     8   nginx path prefix: "/usr/local/openresty/nginx"
     9   nginx binary file: "/usr/local/openresty/nginx/sbin/nginx"
    10   nginx modules path: "/usr/local/openresty/nginx/modules"
    11   nginx configuration prefix: "/usr/local/openresty/nginx/conf"
    12   nginx configuration file: "/usr/local/openresty/nginx/conf/nginx.conf"
    13   nginx pid file: "/usr/local/openresty/nginx/logs/nginx.pid"
    14   nginx error log file: "/usr/local/openresty/nginx/logs/error.log"
    15   nginx http access log file: "/usr/local/openresty/nginx/logs/access.log"
    16   nginx http client request body temporary files: "client_body_temp"
    17   nginx http proxy temporary files: "proxy_temp"
    18   nginx http fastcgi temporary files: "fastcgi_temp"
    19   nginx http uwsgi temporary files: "uwsgi_temp"
    20   nginx http scgi temporary files: "scgi_temp"
    21 
    22 cd ../..
    23 Type the following commands to build and install:
    24     gmake
    25     gmake install

    上面日志中可以看出来,我的pcre和openssl的版本。pcre是pcre2-10.23,openssl的版本是openssl-1.1.0e。

    这时看上去一切ok,没问题,可以依据提示信息,执行gmake了。

    2. 执行gmake

    。。。。。。。。。。。。。。。
    install apps/openssl -> /opt/openssl-1.1.0e/.openssl/bin/openssl install ./tools/c_rehash -> /opt/openssl-1.1.0e/.openssl/bin/c_rehash gmake[3]: 离开目录“/opt/openssl-1.1.0e” cc -c -I/opt/openresty-1.11.2.2/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1 -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -g -O2 -DNDK_SET_VAR -DNDK_UPSTREAM_LIST -DNDK_SET_VAR -DNDK_SET_VAR -DNDK_SET_VAR -DLUA_DEFAULT_PATH='"/usr/local/openresty/site/lualib/?.lua;/usr/local/openresty/site/lualib/?/init.lua;/usr/local/openresty/lualib/?.lua;/usr/local/openresty/lualib/?/init.lua"' -DLUA_DEFAULT_CPATH='"/usr/local/openresty/site/lualib/?.so;/usr/local/openresty/lualib/?.so"' -DNDK_SET_VAR -I src/core -I src/event -I src/event/modules -I src/os/unix -I ../ngx_devel_kit-0.3.0/objs -I objs/addon/ndk -I ../ngx_lua-0.10.7/src/api -I /opt/pcre2-10.23 -I /opt/openssl-1.1.0e/.openssl/include -I objs -o objs/src/core/nginx.o src/core/nginx.c In file included from src/core/ngx_core.h:72:0, from src/core/nginx.c:9: src/core/ngx_regex.h:15:18: 致命错误:pcre.h:没有那个文件或目录 #include <pcre.h> ^ 编译中断。 gmake[2]: *** [objs/src/core/nginx.o] 错误 1 gmake[2]: 离开目录“/opt/openresty-1.11.2.2/build/nginx-1.11.2” gmake[1]: *** [build] 错误 2 gmake[1]: 离开目录“/opt/openresty-1.11.2.2/build/nginx-1.11.2” gmake: *** [all] 错误 2

    gmake有问题,如上红色的错误显示,找不到pcre.h,我到/opt/pcre2-10.23/src下面看,的确没有这个文件,莫非是版本的问题?我果断的更换了一个pcre的版本,没有用pcre2,选择的是pcre-8.40.再次configure并gmake。

    。。。。。。。。。。。。。。。  
    -o objs/src/os/unix/ngx_linux_sendfile_chain.o src/os/unix/ngx_linux_sendfile_chain.c cc -c -I/opt/openresty-1.11.2.2/build/luajit-root/usr/local/openresty/luajit/include/luajit-2.1 -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -g -O2 -DNDK_SET_VAR -DNDK_UPSTREAM_LIST -DNDK_SET_VAR -DNDK_SET_VAR -DNDK_SET_VAR -DLUA_DEFAULT_PATH='"/usr/local/openresty/site/lualib/?.lua;/usr/local/openresty/site/lualib/?/init.lua;/usr/local/openresty/lualib/?.lua;/usr/local/openresty/lualib/?/init.lua"' -DLUA_DEFAULT_CPATH='"/usr/local/openresty/site/lualib/?.so;/usr/local/openresty/lualib/?.so"' -DNDK_SET_VAR -I src/core -I src/event -I src/event/modules -I src/os/unix -I ../ngx_devel_kit-0.3.0/objs -I objs/addon/ndk -I ../ngx_lua-0.10.7/src/api -I /opt/pcre-8.40 -I /opt/openssl-1.1.0e/.openssl/include -I objs -o objs/src/event/ngx_event_openssl.o src/event/ngx_event_openssl.c src/event/ngx_event_openssl.c: 在函数‘ngx_ssl_connection_error’中: src/event/ngx_event_openssl.c:2048:21: 错误:‘SSL_R_NO_CIPHERS_PASSED’未声明(在此函数内第一次使用) || n == SSL_R_NO_CIPHERS_PASSED /* 182 */ ^ src/event/ngx_event_openssl.c:2048:21: 附注:每个未声明的标识符在其出现的函数内只报告一次 gmake[2]: *** [objs/src/event/ngx_event_openssl.o] 错误 1 gmake[2]: 离开目录“/opt/openresty-1.11.2.2/build/nginx-1.11.2” gmake[1]: *** [build] 错误 2 gmake[1]: 离开目录“/opt/openresty-1.11.2.2/build/nginx-1.11.2” gmake: *** [all] 错误 2

    这次看来,没有pcre的那个头文件找不到的问题了,走的更远一步了,这次报错是openssl有问题,这个就不是那么简单好查看了,去网络上查看吧,找到原因,是因为openssl的API改动很大,对应openresty的使用,我选择了老版本的openssl,将当前的1.1.0e版本的改成1.0.1u的了。再次configure并gamke。

    。。。。。。。。。。。。。
    objs/addon/src/ngx_http_rds_csv_output.o objs/ngx_modules.o -L/opt/openresty-1.11.2.2/build/luajit-root/usr/local/openresty/luajit/lib -Wl,-rpath,/usr/local/openresty/luajit/lib -Wl,-E -ldl -lpthread -lcrypt -L/opt/openresty-1.11.2.2/build/luajit-root/usr/local/openresty/luajit/lib -lluajit-5.1 -lm -ldl /opt/pcre-8.40/.libs/libpcre.a /opt/openssl-1.0.1u/.openssl/lib/libssl.a /opt/openssl-1.0.1u/.openssl/lib/libcrypto.a -ldl -lz -Wl,-E sed -e "s|%%PREFIX%%|/usr/local/openresty/nginx|" -e "s|%%PID_PATH%%|/usr/local/openresty/nginx/logs/nginx.pid|" -e "s|%%CONF_PATH%%|/usr/local/openresty/nginx/conf/nginx.conf|" -e "s|%%ERROR_LOG_PATH%%|/usr/local/openresty/nginx/logs/error.log|" < docs/man/nginx.8 > objs/nginx.8 gmake[2]: 离开目录“/opt/openresty-1.11.2.2/build/nginx-1.11.2” gmake[1]: 离开目录“/opt/openresty-1.11.2.2/build/nginx-1.11.2

    这次,没有openssl的问题了。gmake的过程ok。

    3. gmake install

    。。。。。。。。。。
    gmake[1]: 进入目录“/opt/openresty-1.11.2.2/build/nginx-1.11.2”
    gmake -f objs/Makefile install
    gmake[2]: 进入目录“/opt/openresty-1.11.2.2/build/nginx-1.11.2”
    test -d '/usr/local/openresty/nginx' || mkdir -p '/usr/local/openresty/nginx'
    test -d '/usr/local/openresty/nginx/sbin' 
            || mkdir -p '/usr/local/openresty/nginx/sbin'
    test ! -f '/usr/local/openresty/nginx/sbin/nginx' 
            || mv '/usr/local/openresty/nginx/sbin/nginx' 
                    '/usr/local/openresty/nginx/sbin/nginx.old'
    cp objs/nginx '/usr/local/openresty/nginx/sbin/nginx'
    test -d '/usr/local/openresty/nginx/conf' 
            || mkdir -p '/usr/local/openresty/nginx/conf'
    cp conf/koi-win '/usr/local/openresty/nginx/conf'
    cp conf/koi-utf '/usr/local/openresty/nginx/conf'
    cp conf/win-utf '/usr/local/openresty/nginx/conf'
    test -f '/usr/local/openresty/nginx/conf/mime.types' 
            || cp conf/mime.types '/usr/local/openresty/nginx/conf'
    cp conf/mime.types '/usr/local/openresty/nginx/conf/mime.types.default'
    test -f '/usr/local/openresty/nginx/conf/fastcgi_params' 
            || cp conf/fastcgi_params '/usr/local/openresty/nginx/conf'
    cp conf/fastcgi_params 
            '/usr/local/openresty/nginx/conf/fastcgi_params.default'
    test -f '/usr/local/openresty/nginx/conf/fastcgi.conf' 
            || cp conf/fastcgi.conf '/usr/local/openresty/nginx/conf'
    cp conf/fastcgi.conf '/usr/local/openresty/nginx/conf/fastcgi.conf.default'
    test -f '/usr/local/openresty/nginx/conf/uwsgi_params' 
            || cp conf/uwsgi_params '/usr/local/openresty/nginx/conf'
    cp conf/uwsgi_params 
            '/usr/local/openresty/nginx/conf/uwsgi_params.default'
    test -f '/usr/local/openresty/nginx/conf/scgi_params' 
            || cp conf/scgi_params '/usr/local/openresty/nginx/conf'
    cp conf/scgi_params 
            '/usr/local/openresty/nginx/conf/scgi_params.default'
    test -f '/usr/local/openresty/nginx/conf/nginx.conf' 
            || cp conf/nginx.conf '/usr/local/openresty/nginx/conf/nginx.conf'
    cp conf/nginx.conf '/usr/local/openresty/nginx/conf/nginx.conf.default'
    test -d '/usr/local/openresty/nginx/logs' 
            || mkdir -p '/usr/local/openresty/nginx/logs'
    test -d '/usr/local/openresty/nginx/logs' 
            || mkdir -p '/usr/local/openresty/nginx/logs'
    test -d '/usr/local/openresty/nginx/html' 
            || cp -R docs/html '/usr/local/openresty/nginx'
    test -d '/usr/local/openresty/nginx/logs' 
            || mkdir -p '/usr/local/openresty/nginx/logs'
    gmake[2]: 离开目录“/opt/openresty-1.11.2.2/build/nginx-1.11.2”
    gmake[1]: 离开目录“/opt/openresty-1.11.2.2/build/nginx-1.11.2”
    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

    这么看来,openresty安装部署完毕,是不是要检查一下,openresty能否启用呢?先查看下openresty的文件目录结构,如下,含有lua的组件,测试lua,后续就靠它了。

    [root@localhost openresty]# ll
    总用量 176
    drwxr-xr-x.  2 root root   4096 3月   8 13:20 bin
    drwxr-xr-x.  6 root root     52 3月   8 12:08 luajit
    drwxr-xr-x.  6 root root     65 3月   8 13:20 lualib
    drwxr-xr-x. 11 root root   4096 3月   8 12:42 nginx
    drwxr-xr-x. 43 root root   4096 3月   8 12:08 pod
    -rw-r--r--.  1 root root 165176 3月   8 13:20 resty.index
    drwxr-xr-x.  5 root root     44 3月   8 12:08 site

    4.验证openresty是否安装成功

    [root@localhost sbin]# pwd
    /usr/local/openresty/nginx/sbin
    [root@localhost sbin]# ./nginx
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

    报错,地址被占用了,看到这个第一时间想到的是这个机器上安装了基本版的nginx,于是乎,将openresty的nginx配置文件中listen的端口修改一下,不用默认的80,改成8090.重新启动nginx。这次没有地址被占用的错误了。在地址栏输入地址http://localhost:8090, 看到下面的内容,OK,部署完毕!

    到此,openresty部署完毕,总结一下,这里的坑无外乎两点:

    1》 openresty需要的pcre插件,不能用pcre2来代替。

    2》 openssl的版本更替中,API的改动非常大,版本兼容有问题,openresty需要的openssl版本,一定要匹配。

    解除上面两个坑之后,我的部署其实变成了openresty-1.11.2.2 + pcre-8.40 + openssl-1.0.1u

  • 相关阅读:
    支持向量机SVM知识点概括
    决策树知识点概括
    HDU 3081 Marriage Match II
    HDU 3572 Task Schedule
    HDU 4888 Redraw Beautiful Drawings
    Poj 2728 Desert King
    HDU 3926 Hand in Hand
    HDU 1598 find the most comfortable road
    HDU 4393 Throw nails
    POJ 1486 Sorting Slides
  • 原文地址:https://www.cnblogs.com/shihuc/p/6519026.html
Copyright © 2011-2022 走看看