Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

nginx4j 是 nginx 的java 版本。

License

NotificationsYou must be signed in to change notification settings

houbb/nginx4j

Repository files navigation

nginx4j 是基于 netty 实现的 nginx 的java 版本。

Maven CentralBuild StatusCoverage Status

如果你想知道 servlet 如何处理的,可以参考我的另一个项目:

简易版 tomcat

特性

  • 完全兼容 nginx.conf 的配置文件格式

  • 基于 netty 的 nio 高性能处理

  • 静态网资源支持

  • 默认 index.html

  • 404

  • 文件夹的自动索引

  • 大文件的下载支持

  • gzip 压缩

  • sendfile 零拷贝特性

  • http keep-alive 特性

  • 支持多 server

  • 请求头的修改+响应头的修改

  • 常见占位符$ 的内置支持

  • cookie 的操作处理 proxy_cookie_domain/proxy_cookie_flags/proxy_cookie_path 内置支持

  • proxy_pass 反向代理实现

变更日志

变更日志

快速开始

maven 依赖

<dependency>    <groupId>com.github.houbb</groupId>    <artifactId>nginx4j</artifactId>    <version>0.27.0</version></dependency>

启动测试

配置文件

# nginx.conf# 定义运行Nginx的用户和组user nginx;# 主进程的PID文件存放位置pid /var/run/nginx.pid;# 事件模块配置events {    worker_connections 1024;  # 每个工作进程的最大连接数}# HTTP模块配置http {    include /etc/nginx/mime.types;  # MIME类型配置文件    default_type application/octet-stream;  # 默认的MIME类型    # 文件传输设置    sendfile on;  # 开启高效文件传输    # Keepalive超时设置    keepalive_timeout 65;    # 定义服务器块    server {        listen 8080;        server_name 192.168.1.12:8080;  # 服务器域名        # 单独为这个 server 启用 sendfile        sendfile on;        # 静态文件的根目录        root D:\data\nginx4j;  # 静态文件存放的根目录        index index.html index.htm;  # 默认首页        # 如果需要为这个 server 单独配置 gzip,可以覆盖全局配置        gzip on;        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;        # 默认匹配        location / {            proxy_set_header X-DEFINE-PARAM myDefineParam;            proxy_set_header X-DEFINE-HOST 127.0.0.1;            # 增加或修改响应头 这里就提现了一些占位符的强大之处。下一次可以考虑支持            add_header X-Response-Time 2024-06-08;            # 删除响应头            proxy_hide_header X-Unwanted-Header;            # 占位符测试 v0.17.0            set $myVal 1000;            add_header X-MY-VAL $myVal;            add_header X-MY-HOST $host;        }    }    # 定义服务器块2    server {        listen 8081;        server_name 192.168.1.12:8081;  # 服务器域名        # 单独为这个 server 启用 sendfile        sendfile on;        # 静态文件的根目录        root D:\data\nginx4j;  # 静态文件存放的根目录        index index.txt; # 默认首页        # 默认匹配        location / {            proxy_set_header X-DEFINE-PARAM myDefineParam;            proxy_set_header X-DEFINE-HOST 127.0.0.2;            # 增加或修改响应头 这里就提现了一些占位符的强大之处。下一次可以考虑支持            add_header X-Response-Time 2024-06-09;            # 删除响应头            proxy_hide_header X-Unwanted-Header;        }    }}

启动代码

// 指定配置文件的位置NginxUserConfignginxUserConfig =NginxUserConfigLoaders.configFile("D:\\github\\nginx4j\\src\\main\\resources\\nginx.conf").load();Nginx4jBs.newInstance().nginxUserConfig(nginxUserConfig).init().start();

启动日志:

[DEBUG] [2024-05-24 23:40:37.573] [main] [c.g.h.l.i.c.LogFactory.setImplementation] - Logging initialized using 'class com.github.houbb.log.integration.adaptors.stdout.StdOutExImpl' adapter.[INFO] [2024-05-24 23:40:37.576] [main] [c.g.h.n.s.s.NginxServerSocket.start] - [Nginx4j] listen on port=8080

页面访问:http://127.0.0.1:8080

响应:

Welcome to nginx4j!

其他页面

访问http://localhost:8080/1.txt

将返回对应的文件内容:

hello nginx4j!

不存在

http://localhost:8080/asdfasdf

返回:

404 Not Found: The requested resource was not found on this server.

gzip

NginxUserConfignginxUserConfig =NginxUserConfigLoaders.configFile("D:\\github\\nginx4j\\src\\main\\resources\\nginx.conf").load();Nginx4jBs.newInstance() .nginxUserConfig(nginxUserConfig) .init() .start();

可以开启 gzip 的处理。

拓展阅读

从零手写实现 nginx-01-为什么不能有 java 版本的 nginx?

从零手写实现 nginx-02-nginx 的核心能力

从零手写实现 nginx-03-nginx 基于 Netty 实现

从零手写实现 nginx-04-基于 netty http 出入参优化处理

从零手写实现 nginx-05-MIME类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展类型)

从零手写实现 nginx-06-文件夹自动索引

从零手写实现 nginx-07-大文件下载

从零手写实现 nginx-08-范围查询

从零手写实现 nginx-09-文件压缩

从零手写实现 nginx-10-sendfile 零拷贝

从零手写实现 nginx-11-file+range 合并

从零手写实现 nginx-12-keep-alive 连接复用

从零手写实现 nginx-13-nginx.conf 配置文件介绍

从零手写实现 nginx-14-nginx.conf 和 hocon 格式有关系吗?

从零手写实现 nginx-15-nginx.conf 如何通过 java 解析处理?

从零手写实现 nginx-16-nginx 支持配置多个 server

从零手写实现 nginx-17-nginx 默认配置优化

从零手写实现 nginx-18-nginx 请求头+响应头操作

从零手写实现 nginx-19-nginx cors

从零手写实现 nginx-20-nginx 占位符 placeholder

从零手写实现 nginx-21-nginx modules 模块信息概览

从零手写实现 nginx-22-nginx modules 分模块加载优化

从零手写实现 nginx-23-nginx cookie 的操作处理

从零手写实现 nginx-24-nginx IF 指令

从零手写实现 nginx-25-nginx map 指令

从零手写实现 nginx-26-nginx rewrite 指令

从零手写实现 nginx-27-nginx return 指令

从零手写实现 nginx-28-nginx error_pages 指令

从零手写实现 nginx-29-nginx try_files 指令

从零手写实现 nginx-30-nginx proxy_pass upstream 指令

从零手写实现 nginx-31-nginx load-balance 负载均衡

从零手写实现 nginx-32-nginx load-balance 算法 java 实现

从零手写实现 nginx-33-nginx http proxy_pass 测试验证

从零手写实现 nginx-34-proxy_pass 配置加载处理

从零手写实现 nginx-35-proxy_pass netty 如何实现?

ROAD-MAP

static

  • 基于 netty 实现
  • index.html
  • 404 403 等常见页面
  • 基于 netty 的请求/响应封装
  • 各种文件类型的请求头处理
  • 文件夹的自动索引
  • 大文件的分段传输?chunk
  • range 范围请求
  • 请求的压缩 gzip 等常见压缩算法
  • sendFile 特性支持
  • range 的代码合并到 file
  • http keep-alive
  • 配置的标准 POJO
  • nginx.conf 的解析=》POJO
  • http 全局的默认配置属性
  • 请求头信息重写
  • CORS 这个还是让用户处理,不过可以单独写一篇文章
  • $ 占位符的实现
  • 常见 cookie 的处理
  • if 指令的支持
  • map 变量修改指令
  • rewrite 指令,重写 URL
  • return 返回指令
  • error_page 自定义错误页面
  • try_files 文件处理指令
  • 更多 directive 指令实现
  • 更多文件格式的内置支持?
  • ETag 和 Last-Modified + cache 相关
  • 压缩更好的实现方式? zlib 算法 + 实现优化?
  • http2
  • http3
  • ssl/https
  • 安全 访问限制

反向代理

  • reverse-proxy
  • load-balance

system

  • cache
  • rateLimit 限流
  • filter 过滤器
  • listener 监听器

Releases

No releases published

Packages

No packages published

Languages


[8]ページ先頭

©2009-2025 Movatter.jp