欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
为什么要编译nginx-clojure源码
- 作为《Java扩展Nginx》的第二篇,本想与大家一起开始nginx-clojure的深度之旅,但有个问题若不解决,会让大多数有兴趣的读者立即止步、关闭网页、再也不见
- 前文咱们使用的是nginx-clojure官方的安装包,这是个编译好的nginx可执行文件,开箱即用,当时我们还用命令查看过nginx版本是1.18.0,如下图:
- 直接使用nginx-clojure官方编译好的安装包,虽然好处是简单省事儿,但同样带来一些<font color="red">致命问题</font>,导致咱们不敢将其用于生产环境,其实相信聪明的您已经想到了:
- 如果nginx1.18.0被曝出有安全问题,需要升级到更高版本,咋办?寄希望于nginx-clojure官方推出更高nginx版本的包吗?
- 如果说问题1可以通过等待来解决,那么,假设咱们的nginx不仅需要nginx-clojure能力,还需要集成其他第三方或者自研模块,那又该如何呢?
- 所以,nginx-clojure提供的安装包,只能作为一个学习工具,帮助咱们熟悉nginx-clojure技术框架,或者在开发的时候用到,至于生产环境就不适合了
此刻,经验丰富的您一定看出了欣宸的套路:啰啰嗦嗦、拐弯抹角扯了这么多,可以给出解决方案了吧,嗯嗯,既要用上nginx-clojure,又要避免上述两个致命问题,最合适的方案应该是:<font color="blue">下载nginx和nginx-clojure的源码,自行编译和安装</font>
本篇概览
- 本篇的主题十分明确,就是编译源码和安装,所以整体上由以下几部分组成:
- 准备环境
- 编译安装操作
- 验证功能
- 本次实战,所用nginx源码的版本是<font color="blue">1.21.6</font>,nginx-clojure源码的版本是<font color="blue">0.5.2</font>
- 整个编译和验证的过程,由以下步骤组成:
不说废话,直接开始动手
准备环境
- 建议准备一个纯净的linux环境用来实战,我这里是租用的腾讯云轻应用服务器,安装了<font color="blue">CentOS7.6</font>,话说这轻应用服务器还真的方便,价格便宜,重装系统也很简单,如下图:
- 为了省事儿,全程使用<font color="blue">root账号</font>
远程连接腾讯云服务的客户端工具是FinalShell-3.9.2.2
安装jdk
- nginx-clojure的源码中有java文件,因此要准备好JDK用于编译
- 去oracle官网下载jdk安装包,例如<font color="blue">jdk-8u291-linux-x64.tar.gz</font>,将其上传到linux服务器
解压,移动到指定目录:
tar -zxvf jdk-8u291-linux-x64.tar.gz \ && mkdir -p /usr/lib/jvm/ \ && mv jdk1.8.0_291 /usr/lib/jvm/
打开<font color="blue">.bashrc</font>,在尾部增加以下内容:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_291 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
- 执行<font color="blue">source .bashrc</font>使得配置生效
检查是否安装成功,如下:
[root@VM-20-17-centos ~]# java -version java version "1.8.0_291" Java(TM) SE Runtime Environment (build 1.8.0_291-b10) Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
准备编译nginx所需的应用
更新yum:
yum update -y
安装必要的应用:
yum install -y epel-release \ vim \ net-tools \ bridge-utils \ firewalld \ bc \ iotop \ bc \ gcc \ gcc-c++ \ glibc \ glibc-devel \ pcre \ pcre-devel \ openssl \ openssl-devel \ zip \ unzip \ zlib-devel \ lrzsz \ tree \ ntpdate \ telnet \ lsof \ tcpdump \ wget \ libevent \ libevent-devel \ systemd-devel \ bash-completion \ traceroute \ psmisc
安装lein
- lein是编译nginx-clojure源码时用到的工具
安装步骤如下:
curl -o /usr/bin/lein https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein \ && chmod a+x /usr/bin/lein \ && lein
- 实测在腾讯云服务器上执行上述命令,可能出现连接超时的错误(Failed to download https://github.com/technomancy/leiningen/releases/download/2.9.8/leiningen-2.9.8-standalone.jar
),若遇到此类错误,请重试几次,即可成功 - 下载的过程有点耗时,就看您的网络状况了:
执行<font color="blue">lein -version</font>,控制台输出如下,表示lein安装成功:
[root@VM-20-17-centos ~]# lein -version WARNING: You have $CLASSPATH set, probably by accident. It is strongly recommended to unset this before proceeding. Leiningen 2.9.8 on Java 1.8.0_291 Java HotSpot(TM) 64-Bit Server VM
下载nginx和nginx-clojure源码
用一行命令搞定下载nginx和nginx-clojure源码的压缩包,并将它们分别解压,然后删除压缩包:
cd ~ \ && curl -O http://nginx.org/download/nginx-1.21.6.tar.gz \ && curl -o nginx-clojure-0.5.2.zip https://codeload.github.com/nginx-clojure/nginx-clojure/zip/refs/tags/v0.5.2 \ && tar -zxvf nginx-1.21.6.tar.gz \ && unzip nginx-clojure-0.5.2.zip \ && rm -f nginx-1.21.6.tar.gz nginx-clojure-0.5.2.zip
此刻新增了两个文件夹,它们的完整路径分别是<font color="blue">/root/nginx-1.21.6</font>和<font color="blue">/root/nginx-clojure-0.5.2</font>,前者是nginx源码,后者是nginx-clojure模块的源码
编译和安装nginx
执行以下命令,完成配置、编译、安装,注意<font color="blue">add-module</font>参数,里面指定了nginx-clojure模块的源码位置:
cd ~/nginx-1.21.6 \ && ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/local/nginx/sbin/nginx \ --conf-path=/usr/local/nginx/conf/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --user=nginx --group=nginx \ --with-http_ssl_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/tmp/nginx/client/ \ --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ --http-scgi-temp-path=/var/tmp/nginx/scgi \ --with-pcre \ --add-module=/root/nginx-clojure-0.5.2/src/c \ && make \ && make install
还要增加名为<font color="blue">nginx</font>的用户组和用户:
groupadd nginx && useradd -d /home/nginx -g nginx -m nginx
创建必要的文件夹:
mkdir -p /var/tmp/nginx/client
此时nginx已经安装好了,验证一下:
[root@VM-20-17-centos ~]# /usr/local/nginx/sbin/nginx -version nginx version: nginx/1.21.6
编译nginx-clojure的jar包
二进制的nginx编译已经完成,还需要nginx-clojure模块的源码,得到的jar在运行时要用,执行以下命令:
cd ~/nginx-clojure-0.5.2 \ && lein jar
编译构建成功后,将得到的jar文件放入新建的目录<font color="blue">/usr/local/nginx/jars</font>:
mkdir /usr/local/nginx/jars \ && mv ~/nginx-clojure-0.5.2/target/nginx-clojure-0.5.2.jar /usr/local/nginx/jars/
安装clojure的jar包
nginx-clojure在运行的时候还要用到clojure-1.7.0.jar,我将其放在自己的GitHub仓库了,下载并放入新建的目录<font color="blue">/usr/local/nginx/libs</font>:
mkdir /usr/local/nginx/libs \ && curl -o /usr/local/nginx/libs/clojure-1.7.0.jar https://raw.githubusercontent.com/zq2599/blog_download_files/master/files/clojure-1.7.0.jar
- 至此,完整的nginx和nginx-clojure已经安装完成,接下来验证是否可用
验证
- 既然是验证nginx-clojure是否可用,简简单单就好,就用前文的Hello World功能吧
前文的jar包,我已经上传到GitHub上,下载到<font color="blue">/usr/local/nginx/jars/</font>目录下:
curl -o /usr/local/nginx/jars/simple-hello-1.0-SNAPSHOT.jar https://raw.githubusercontent.com/zq2599/blog_download_files/master/files/simple-hello-1.0-SNAPSHOT.jar
还要修改<font color="blue">/usr/local/nginx/conf/nginx.conf</font>,先在http的配置中增加以下两行:
jvm_path auto; jvm_classpath "/usr/local/nginx/libs/*:/usr/local/nginx/jars/*";
然后在server的配置中增加一个location:
location /java { content_handler_type 'java'; content_handler_name 'com.bolingcavalry.simplehello.HelloHandler'; }
完整的<font color="blue">/usr/local/nginx/conf/nginx.conf</font>内容如下:
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; jvm_path auto; jvm_classpath "/usr/local/nginx/libs/*:/usr/local/nginx/jars/*"; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /java { content_handler_type 'java'; content_handler_name 'com.bolingcavalry.simplehello.HelloHandler'; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
- 启动nginx,命令是<font color="blue">/usr/local/nginx/sbin/nginx</font>
- 直接在服务器上用curl命令验证,命令是<font color="blue">curl 127.0.0.1/java</font>,响应如下图红框,可见服务正常,咱们写的java类被正常调用并且返回了预期的内容:
- 至此,nginx和nginx-clojure的源码编译以及验证都完成了,既然可以自由的编译源码,那么之前提到的安全、与其他模块共存的问题也就得以解决,接下来,咱们会深入研究nginx-clojure,以便更好的扩展nginx为实际项目所用。
欢迎关注思否:程序员欣宸
学习路上,你不孤单,欣宸原创一路相伴...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。