欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

为什么要编译nginx-clojure源码

  • 作为《Java扩展Nginx》的第二篇,本想与大家一起开始nginx-clojure的深度之旅,但有个问题若不解决,会让大多数有兴趣的读者立即止步、关闭网页、再也不见
  • 前文咱们使用的是nginx-clojure官方的安装包,这是个编译好的nginx可执行文件,开箱即用,当时我们还用命令查看过nginx版本是1.18.0,如下图:
  • 直接使用nginx-clojure官方编译好的安装包,虽然好处是简单省事儿,但同样带来一些致命问题,导致咱们不敢将其用于生产环境,其实相信聪明的您已经想到了:
  1. 如果nginx1.18.0被曝出有安全问题,需要升级到更高版本,咋办?寄希望于nginx-clojure官方推出更高nginx版本的包吗?
  2. 如果说问题1可以通过等待来解决,那么,假设咱们的nginx不仅需要nginx-clojure能力,还需要集成其他第三方或者自研模块,那又该如何呢?
  • 所以,nginx-clojure提供的安装包,只能作为一个学习工具,帮助咱们熟悉nginx-clojure技术框架,或者在开发的时候用到,至于生产环境就不适合了
  • 此刻,经验丰富的您一定看出了欣宸的套路:啰啰嗦嗦、拐弯抹角扯了这么多,可以给出解决方案了吧,嗯嗯,既要用上nginx-clojure,又要避免上述两个致命问题,最合适的方案应该是:下载nginx和nginx-clojure的源码,自行编译和安装

本篇概览

  • 本篇的主题十分明确,就是编译源码和安装,所以整体上由以下几部分组成:
  1. 准备环境
  2. 编译安装操作
  3. 验证功能
  • 本次实战,所用nginx源码的版本是1.21.6,nginx-clojure源码的版本是0.5.2

  • 整个编译和验证的过程,由以下步骤组成:

  • 不说废话,直接开始动手

准备环境

  • 建议准备一个纯净的linux环境用来实战,我这里是租用的腾讯云轻应用服务器,安装了CentOS7.6,话说这轻应用服务器还真的方便,价格便宜,重装系统也很简单,如下图:
  • 为了省事儿,全程使用root账号
  • 远程连接腾讯云服务的客户端工具是FinalShell-3.9.2.2

安装jdk

  • nginx-clojure的源码中有java文件,因此要准备好JDK用于编译
  • 去oracle官网下载jdk安装包,例如jdk-8u291-linux-x64.tar.gz,将其上传到linux服务器
  • 解压,移动到指定目录:
tar -zxvf jdk-8u291-linux-x64.tar.gz \
&& mkdir -p /usr/lib/jvm/ \
&& mv jdk1.8.0_291 /usr/lib/jvm/
  • 打开.bashrc,在尾部增加以下内容:
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
  • 执行source .bashrc使得配置生效
  • 检查是否安装成功,如下:
[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
    ),若遇到此类错误,请重试几次,即可成功
  • 下载的过程有点耗时,就看您的网络状况了:
  • 执行lein -version,控制台输出如下,表示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
  • 此刻新增了两个文件夹,它们的完整路径分别是/root/nginx-1.21.6和/root/nginx-clojure-0.5.2,前者是nginx源码,后者是nginx-clojure模块的源码

编译和安装nginx

  • 执行以下命令,完成配置、编译、安装,注意add-module参数,里面指定了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
  • 还要增加名为nginx的用户组和用户:
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文件放入新建的目录/usr/local/nginx/jars:
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仓库了,下载并放入新建的目录/usr/local/nginx/libs:
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上,下载到/usr/local/nginx/jars/目录下:
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
  • 还要修改/usr/local/nginx/conf/nginx.conf,先在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';
}
  • 完整的/usr/local/nginx/conf/nginx.conf内容如下:
#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,命令是/usr/local/nginx/sbin/nginx
  • 直接在服务器上用curl命令验证,命令是curl 127.0.0.1/java,响应如下图红框,可见服务正常,咱们写的java类被正常调用并且返回了预期的内容:
  • 至此,nginx和nginx-clojure的源码编译以及验证都完成了,既然可以自由的编译源码,那么之前提到的安全、与其他模块共存的问题也就得以解决,接下来,咱们会深入研究nginx-clojure,以便更好的扩展nginx为实际项目所用。

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

Java扩展Nginx之二:编译nginx-clojure源码相关推荐

  1. Slicer学习笔记(四十二)slicer c++源码编译

    Slicer学习笔记(四十二)slicer c++源码编译 1.cmake生成项目 2.编译失败的原因汇总 2.1.下载代码失败 之前在windows下编译slicer,没有做笔记. 后面再次编译还会 ...

  2. Cura二次开发之源码编译

    Cura源码编译 1.Cura内部连接关系 2.CuraEngine源码编译 2.1Protobuf源码编译 三级目录 3.Cura源码编译 4.Error解决方案 1.Cura内部连接关系 2.Cu ...

  3. Jar包反编译后修改源码再编译

    Jar包反编译后修改源码再编译 文章目录 Jar包反编译后修改源码再编译 1. 场景 2. 详细步骤 2.1 查看源码 2.2 生成源文件 2.3 构建项目 2.4 编译成jar包 3. 参考链接 1 ...

  4. 在Ubuntu Server14.04上编译Android6.0源码

    此前编译过Android4.4的源码,但是现在Android都到了7.0的版本,不禁让我感叹Google的步伐真心难跟上,趁这周周末时间比较充裕,于是在过去的24小时里,毅然花了9个小时编译了一把An ...

  5. 速通AOSP,成功编译调试Android源码

    /   今日科技快讯   / 近日据不少网友反馈,爱奇艺App开始对投屏功能作出限制,之前黄金VIP会员支持最高4K清晰度投屏,现在只能选最低的480P清晰度,要想进行4K投屏必须购买白金VIP会员. ...

  6. VS2019编译python解释器源码及学习方法

    Python源码编译   Python是当下很火的一门编程语言,在人工智能.数据分析.后端开发等领域可谓是人人都会的语言,在用python实现各种应用服务的同时,估计很少有人去关注python的实现, ...

  7. 小程序源码:最新wordpress黑金壁纸微信小程序 二开修复版源码下载支持流量主收益

    这是一款wordpress系统框架的壁纸小程序源码 相信很多人以前也有用过这类的壁纸小程序源码吧 现在给大家发的这一款是二开修复版的 和以前的安装方式差不多,支持流量主收益模式 介绍: WordPre ...

  8. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇...

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  9. 最新wordpress黑金壁纸微信小程序 二开修复版源码下载支持流量主收益

    这是一款wordpress系统框架的壁纸小程序源码 相信很多人以前也有用过这类的壁纸小程序源码吧 现在给大家发的这一款是二开修复版的 和以前的安装方式差不多,支持流量主收益模式 介绍: WordPre ...

  10. 最新wordpress黑金壁纸微信小程序 二开修复版源码下载

    这是一款wordpress系统框架的壁纸小程序源码 相信很多人以前也有用过这类的壁纸小程序源码吧 现在给大家发的这一款是二开修复版的 和以前的安装方式差不多, 介绍: WordPress独立后台壁纸小 ...

最新文章

  1. 解决IOS微信中 HTML5 中audio的自动播放问题。
  2. Matlab-PEAKS函数曲线
  3. 大数据在高校的应用场景_高校大数据及AI应用解决方案
  4. 5.1 Tensorflow:图与模型的加载与存储
  5. Cognos 10.1 饼图百分比小数点显示的问题
  6. SAP Spartacus的CMSPageGuard
  7. hdu 3572 Task Schedule 网络流
  8. qt怎么设置标签背景图片_HTML中怎么设置h1的字体样式你知道吗?关于设置h1标签的样式详解...
  9. 炫彩色块海报设计背景PSD素材,跟上设计趋势
  10. win11如何快速加密硬盘 Windows11快速加密硬盘的设置方法
  11. datagrid设置单元格边框_更改 DataGridView 控件中的边框和网格线样式 - Windows Forms .NET Framework | Microsoft Docs...
  12. 频繁切换网卡,一款快速设置IP地址的工具,爽到爆。
  13. 通达oa php漏洞,通达OA前台任意用户登录漏洞
  14. My97DatePicker日期插件的使用
  15. RabbitMQ第二话 -- Springboot基于四种Exchange(Direct、Fanout、Topic、Heders、延时队列)的实现和多虚拟主机下的生产消费者实现
  16. 深度解析:一文让你领略支付宝应用架构的厉害之处!
  17. 叶胜超:V SYSTEMS(VSYS)--人人可发币的公链项目!
  18. 支付宝小程序(支付)
  19. 程序员难以逃避的几个坎儿及解决方法
  20. lstm模型_基于LSTM模型的学生反馈文本学业情绪识别方法

热门文章

  1. C#Excel导入和导出
  2. 龙争虎斗,360数科金融科技输出的强者恒强定律
  3. 基于Unity开发的血条(Health Bar)的预制设计
  4. HAWE哈威DG系列压力继电器
  5. 链表反转 递归实现Java
  6. 悬赏计划 | 参与Gitee X OpenMLDB开源项目,做开源才不是「用爱发电」!
  7. 21岁空姐打滴滴被害,悬赏百万捉凶还远远不够
  8. 电子技术课程设计基于FPGA的音乐硬件演奏电路的设计与实现
  9. Ultra96V2 使用教程1: mini dp的使用
  10. VScode安装教程(超级详细)