Java扩展Nginx之四:远程调试

java,扩展,nginx,远程,调试 · 浏览次数 : 292

小编点评

**文章简介** 文章介绍了如何使用 IntelliJ IDEA 的远程 JVM Debug 功能来远程调试 Nginx-Clojure 模块。通过配置 JVM 选项,可以设置远程调试端口并执行单步调试。文章还提供了配置示例,帮助读者在本地和远程服务器上配置 Nginx-Clojure。 **配置步骤** 1. 打开项目中 Nginx-Clojure 的配置文件(`nginx.conf`)。 2. 配置 `jvm_options` 中的 `address` 属性以指定远程调试的 IP 地址和端口。 3. 在远程调试配置中设置 `remote_debug` 属性为 `true`。 4. 运行 Nginx-Clojure 模块。 5. 在本地代码中打断点并执行远程连接。 6. 在远程调试窗口中查看堆栈和内存变量。 **示例代码** 文章没有提供实际的代码示例,但可以从 `nginx.conf` 中获取以下配置: ``` server { ... location /java { content_handler_type 'java'; content_handler_name 'com.bolingcavalry.simplehello.HelloHandler'; } ... jvm_options "-Xdebug"; jvm_options "-Xrunjdwp:server=y,transport=dt_socket,address=840#{pno},suspend=n"; } ``` **结论** 通过使用 IntelliJ IDEA 的远程 JVM Debug 功能,可以轻松地调试 Nginx-Clojure 模块。通过配置 JVM 选项和设置远程调试端口,可以实现对 Nginx-Clojure 模块的深入调试。

正文

欢迎访问我的GitHub

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

本篇概览

  • 本文是《Java扩展Nginx》系列的第四篇,一起来体验个实用的功能,此能力定会让爱学习的您大呼过瘾,它就是广大java程序员在日常开发和定位问题过程中常用的神技:远程调试;
  • 看变量、看堆栈,不论阅读代码还是定位问题,打断点都是我们最值得信赖的手段,当您的代码运行在nginx-clojure模块中的时候,如果能像tomcat那样远程打断点,单步调试,会大幅度提高工作效率
  • 远程断点的效果如下图所示,通过IDEA的Remote JVM Debug功能远程连接到nginx-clojure监听的远程debug端口,当浏览器请求触发了java代码的执行时,就会进入断点状态,停留在断点位置,可以看到堆栈和内存中的变量情况,以及单步执行:
    在这里插入图片描述

关于工具

  • 本篇使用的编码工具是IntelliJ IDEA 2021.3.2 (Ultimate Edition)

关于代码

package com.bolingcavalry.simplehello;

import nginx.clojure.java.ArrayMap;
import nginx.clojure.java.NginxJavaRingHandler;
import java.time.LocalDateTime;
import java.util.Map;
import static nginx.clojure.MiniConstants.CONTENT_TYPE;
import static nginx.clojure.MiniConstants.NGX_HTTP_OK;

public class HelloHandler implements NginxJavaRingHandler {

    @Override
    public Object[] invoke(Map<String, Object> request) {
        return new Object[] {
                NGX_HTTP_OK, //http status 200
                ArrayMap.create(CONTENT_TYPE, "text/plain"), //headers map
                "Hello, Nginx clojure! " + LocalDateTime.now()  //response body can be string, File or Array/Collection of them
        };
    }
}
  • 在nginx.conf中,配置了一个location,path是/java
location /java {
	content_handler_type 'java';
	content_handler_name 'com.bolingcavalry.simplehello.HelloHandler';
}
  • 以上就是今天要打断点调试的代码和配置了

nginx-clojure的远程调试配置

  • 打开nginx.conf文件,在http的配置中增加以下两行,即可开启nginx-clojure的远程调试:
jvm_options "-Xdebug";
jvm_options "-Xrunjdwp:server=y,transport=dt_socket,address=840#{pno},suspend=n";
  • 上述配置中,address=840#{pno}的含义要注意:
  1. 如果worker_processes配置的值等于1,address=840#{pno}表示远程调试的端口是8401
  2. 如果worker_processes配置的值大于1,例如等于3,此时有3个java进程,每个进程都有一个端口被用于远程调试,这三个端口分别是address=840#{pno}表示远程调试的端口是840184028403
  • 要注意的是,请确保这些端口没有被占用
  • 今天的实战为了简单省事儿,worker_processes的值等于1,所以只有一个java进程,它的远程调试端口是8401
  • 配置完成后,启动nginx
  • 用postman访问/java,确认可以响应成功,证明nginx和nginx-clojure是正常的:
    在这里插入图片描述

IDEA上的远程调试操作

  • 用IDEA打开工程,点击下图红框中的按钮:
    在这里插入图片描述
  • 操作如下图,新增一个Remote JVM Debug配置:
    在这里插入图片描述
  • Remote JVM Debug的设置如下,红框1是nginx的ip地址,我这里IDEA和nginx在同一台电脑上,所以用localhost即可,红框2是端口号,对应nginx配置的jvm_options中的address=840#{pno}
    在这里插入图片描述
  • 配置完成后,按照下图红框数字的顺序操作,先在代码上打断点,然后执行远程连接,顺利的话会看到红框3中的连接成功提示:
    在这里插入图片描述
  • 至此,远程调试功能已经准备好,可以使用了

验证

  • 在postman上再发一次请求,IDEA上立即进入断点状态,如下图:
    在这里插入图片描述
  • 如果想看堆栈中的代码,可以操作如下图:
    在这里插入图片描述
  • 此刻,NginxClojureRT.java已经被下载下来,可以更仔细的阅读和研究nginx-clojure了:
    在这里插入图片描述
  • 至此,nginx-clojure的远程调试功能演示完毕,各位java同僚们,如虎添翼的感觉有没有?学习和使用nginx-clojure的信心是否更强了呢?

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

与Java扩展Nginx之四:远程调试相似的内容:

Java扩展Nginx之四:远程调试

广大java程序员日常开发和定位问题时常用的远程调试功能,nginx-clojure也支持,来体验吧

Java扩展Nginx之五:五大handler(系列最核心)

本篇概览本文是《Java扩展Nginx》系列的最核心篇章,咱们写的代码主要集中在这些handler中

Java扩展Nginx之六:两大filter

nginx-clojure提供了两种filter,分别用于处理header和body

Java扩展Nginx之七:共享内存

使用nginx-clojure提供的共享内存工具,让多个worker之间的数据保持同步,还有类似分布式锁的能力

Java扩展Nginx之一:你好,nginx-clojure

如果我说可以用java对nginx进行扩展,就像OpenResty支持Lua扩展一样,您相信吗?一起来体验nginx-clojure吧

Java扩展Nginx之二:编译nginx-clojure源码

只有掌握了nginx-clojure的编译,才能按照实际情况灵活的调整nginx的版本和模块的组合

Java扩展Nginx之三:基础配置项

与大家一起了解nginx-clojure最基本的知识点,为后面的学习夯实基础

精选版:用Java扩展Nginx(nginx-clojure 入门)

让 Java 代码直接在 Nginx 上运行?这么有趣的功能,随本文一起来实战体验吧,图文并茂,一定能成功的那种实战

什么是 Java 字节码?采用字节码的好处是什么?

在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过

关于《Java并发编程之线程池十八问》的补充内容

一、写在开头 在上一篇文章我们写《Java并发编程之线程池十八问》的时候,鉴于当时的篇幅已经过长,很多内容就没有扩展了,在这篇文章里对一些关键知识点进行对比补充。 二、Runnable vs Callable 在创建线程的时候,一般会选用 Runnable 和 Callable 两种方式。 【源码对