百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

使用javascript轻松扩展nginx的功能

zhezhongyun 2024-12-22 21:55 47 浏览

njs是 nginx 官方推出的一个基于 JavaScript 的扩展,启用后可以通过 javascript 脚本来扩展 nginx 功能。安装完成njs模块即可使用njs的相关指令导入和运行js代码实现相关功能了。

一、安装njs模块

njs模块有两种安装方式:包管理器安装和源码编译安装。这里都以Ubuntu22.04LTS版本为例。

1.1、包管理器安装

包管理器安装比较省事,不用操心软件包之间的依赖。但是直接apt install nginx的话,安装的版本比较旧,是1.18.0版本,而不是前最新稳定版1.24.0,而且还没有njs模块可安装。所以必须要按照nginx官网的说明文档先添加nginx的apt源。

# 添加apt源,见:http://nginx.org/en/linux_packages.html#Ubuntu
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/99nginx
sudo apt update
# 安装nginx和njs模块
sudo apt install nginx
sudo apt install nginx-module-njs
# 修改配置文件,加载模块,在events之前加一行:load_module modules/ngx_stream_js_module.so;
sudo vi /etc/nginx/nginx.conf


1.2、源码编译安装

这njs模块并不能简单的通过configure --with参数添加,需要单独下载源码构建才行。

# 安装源码管理工具mercurial
sudo apt install mercurial
# 下载源码,会自动在当前目录下创建njs目录
hg clone http://hg.nginx.org/njs
# 安装编译所需的软件包
sudo apt install gcc libpcre3-dev zlib1g zlib1g-dev libssl-dev make libxslt1-dev
# 配置和构建,添加--add-module参数
./configure --prefix=/usr/local/nginx --with-http_gzip_static_module --with-http_realip_module --with-stream --with-http_ssl_module --with-http_v2_module --add-module=/home/user/njs/nginx
make && sudo make install


二、在Nginx当中运行javascript代码

假定目标是处理rtsp推流预读,将rtsp的url记录到日志,可以编写js代码/etc/nginx/njs/rtsp_log.js,内容如下:

function onpreread(s) {
    s.on("upload", function(data, flags){
        var _idx, _str;
        if(data != null && (_idx = data.indexOf("\r\n")) > 0) {
            _str = data.substr(0, _idx);
            if(_str.substr(0, 8) == "OPTIONS ") {
                s.variables.rtsp_preread_url = _str.substr(8);
                s.allow();
                return;
            }
            s.deny();
        }
    });
}
export default {onpreread};

修改nginx配置文件/etc/nginx/nginx.conf,增加如下配置

stream {
    # 定义一个nginx的全局变量,可通过js代码读写
    js_var $rtsp_preread_url;
    # 导入js代码,并处理预读,记录到变量
    js_import rtsp from njs/rtsp_log.js;
    js_preread rtsp.onpreread;
    # 将预读的结果(变量$rtsp_preread_url)记录到日志
    log_format basic '$remote_addr:$remote_port [$time_local] $protocol '
    '$server_port $rtsp_preread_url '
    '$status $bytes_received $bytes_sent $session_time';
    access_log /var/log/nginx/stream-access.log basic buffer=32k;

    server {
        listen 10554;
        proxy_pass 127.0.0.1:554; # 转发给rtsp流媒体服务器
    }
}


重启nginx,rtsp推流一下,再次重启nginx(日志量不够32k,不重启不会写到磁盘)再查看日志文件,可看到如下日志:

192.168.1.102:55382 [23/Sep/2023:06:47:41 +0000] TCP 10554 rtsp://***:554/live/demostream RTSP/1.0 200 902 1044 8.544

相关推荐

3 分钟!AI 从零开发五子棋全过程曝光,网友:这效率我服了

<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8...

一行代码实现display&quot;过渡动画&quot;原理

作者:Peter谭老师转发链接:https://mp.weixin.qq.com/s/XhwPOv62gypzq5MhhP-5vg写本文的起因上篇文章,提到如何让display出现过渡动画,却没有仔...

脑洞:琼恩·雪诺、蝙蝠侠和魔形女的灵魂宠物了解一下

AlekseiVinogradovisaRussianfreelancedigitalartistwhoshareshisskillsandtalentwith120k...

浏览器的渲染机制、重绘、重排

1、什么是重排和重绘网页生成过程:HTML被HTML解析器解析成DOM树css则被css解析器解析成CSSOM树结合DOM树和CSSOM树,生成一棵渲染树(RenderTree)生成布局(flo...

托福写作高频考题写作思路&amp;词汇丨考虫独家

科技话题与媒体话题是托福写作的常考话题很多考生对这两类话题里的专有词汇表达也许很不了解所以今天就跟随考虫托福写作老师刘云龙老师一起来学习在这些话题的写作里你可以使用哪些有用的表达。希望大家有收获!记得...

在优麒麟上使用 Electron 开发桌面应用

使用Web标准来创建桌面GUI,上手快、成本低、跨平台、自适应分辨率,这些都是Electron的优势。作者/来源:优麒麟Electron是由Github开发,用HTML、CSS和...

php手把手教你做网站(三十八)jquery 转轮盘抽奖,开盲盒

抽奖和开盲盒性质一样的都是通过ajax读取后台的随机数据。1、转轮盘本来是想直接绘图实现轮盘,但是没有找到怎么填充文字,只好把轮盘弄成了背景图,通常用于游戏抽道具,商城积分抽奖,公司年末员工抽奖点击抽...

用 CSS 整活!3D 轮播图手把手教学,快乐代码敲出来

兄弟们,今天咱来搞点好玩的——用CSS整一个3D轮播图!咱野生程序员就是要在代码里找乐子,技术和快乐咱都得要!代码是写不完的,但咱能自己敲出快乐来,走起!一、先整个容器,搭个舞台咋先写一个...

实现一个超酷的 3D 立体卡片效 #前端开发

今天我们来实现一个超酷的3D立体卡片效果。正常情况下就是一个普通的图片展示卡片,鼠标悬停的时候图片会跳出卡片,并将影子投射到背景卡片上,在视觉上有一个3D立体感。html主要分成3个部分:容器→背景层...

Vue 3 Teleport与Suspense:解决UI难题的两个&quot;隐藏大招&quot;

模态框的"层级噩梦"与Teleport的救赎"这个模态框怎么又被父容器截断了?"团队协作开发后台系统时,小张第N次遇到这个问题。多层嵌套的组件结构里,弹窗被overfl...

让交互更加生动!有意思的鼠标跟随 3D 旋转动效

今天,群友问了这样一个问题,如下所示的鼠标跟随交互效果,如何实现:简单分析一下,这个交互效果主要有两个核心:借助了CSS3D的能力元素的旋转需要和鼠标的移动相结合本文,就将讲述如何使用纯CSS...

填坑:transform元素导致zindex失效终极方法

今天遇到了使用css3动画的元素层级被放大置顶的问题,ios浏览器上没问题,安卓原生浏览器和安卓微信上有问题。使用了css3动画的元素z-index失效,兄弟元素设置多高的z-index都盖不住解决办...

诡异的层级错乱:一个被transform隐藏的CSS陷阱

周五下午三点十七分,设计部突然发来紧急截图——原本应该悬浮在顶部的导航菜单,此刻正诡异地被下方的轮播图遮挡。我盯着屏幕上错乱的层级关系,手指下意识地敲下z-index:9999,心里清楚这不过是程序...

动画篇--碎片动画

本文授权转载,作者:Sindri的小巢(简书)前言从最开始动笔动画篇的博客,至今已经过去了四个多月。这段时间回头看了看自己之前的动画文章,发现用来讲解动画的例子确实不那么的赏心悦目。于是这段时间总是想...

Nature:大洋转换断层处的拉张构造与两阶段地壳增生

Nature:大洋转换断层处的拉张构造与两阶段地壳增生转换断层是三种基本的板块边界之一,全球总长度超过48000km(Bird,2003),它们的发现为板块构造理论的建立奠定了重要的基础(Wil...