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

使用javascript轻松扩展nginx的功能

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

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

相关推荐

perl基础——循环控制_principle循环

在编程中,我们往往需要进行不同情况的判断,选择,重复操作。这些时候我们需要对简单语句来添加循环控制变量或者命令。if/unless我们需要在满足特定条件下再执行的语句,可以通过if/unle...

CHAPTER 2 The Antechamber of M de Treville 第二章 特雷维尔先生的前厅

CHAPTER1TheThreePresentsofD'ArtagnantheElderCHAPTER2TheAntechamber...

CHAPTER 5 The King'S Musketeers and the Cardinal'S Guards 第五章 国王的火枪手和红衣主教的卫士

CHAPTER3TheAudienceCHAPTER5TheKing'SMusketeersandtheCardinal'SGuard...

CHAPTER 3 The Audience 第三章 接见

CHAPTER3TheAudienceCHAPTER3TheAudience第三章接见M.DeTrévillewasatt...

别搞印象流!数据说明谁才是外线防守第一人!

来源:Reddit译者:@assholeeric编辑:伯伦WhoarethebestperimeterdefendersintheNBA?Here'sagraphofStea...

V-Day commemorations prove anti-China claims hollow

People'sLiberationArmyhonorguardstakepartinthemilitaryparademarkingthe80thanniversary...

EasyPoi使用_easypoi api

EasyPoi的主要特点:1.设计精巧,使用简单2.接口丰富,扩展简单3.默认值多,writelessdomore4.springmvc支持,web导出可以简单明了使用1.easypoi...

关于Oracle数据库12c 新特性总结_oracle数据库12514

概述今天主要简单介绍一下Oracle12c的一些新特性,仅供参考。参考:http://docs.oracle.com/database/121/NEWFT/chapter12102.htm#NEWFT...

【开发者成长】JAVA 线上故障排查完整套路!

线上故障主要会包括CPU、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题...

使用 Python 向多个地址发送电子邮件

在本文中,我们将演示如何使用Python编程语言向使用不同电子邮件地址的不同收件人发送电子邮件。具体来说,我们将向许多不同的人发送电子邮件。使用Python向多个地址发送电子邮件Python...

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...

linux常用系统命令_linux操作系统常用命令

系统信息arch显示机器的处理器架构dmidecode-q显示硬件系统部件-(SMBIOS/DMI)hdparm-i/dev/hda罗列一个磁盘的架构特性hdparm-tT/dev/s...

小白入门必知必会-PostgreSQL-15.2源码编译安装

一PostgreSQL编译安装1.1下载源码包在PostgreSQL官方主页https://www.postgresql.org/ftp/source/下载区选择所需格式的源码包下载。cd/we...

Linux操作系统之常用命令_linux系统常用命令详解

Linux操作系统一、常用命令1.系统(1)系统信息arch显示机器的处理器架构uname-m显示机器的处理器架构uname-r显示正在使用的内核版本dmidecode-q显示硬件系...

linux网络命名空间简介_linux 网络相关命令

此篇会以例子的方式介绍下linux网络命名空间。此例中会创建两个networknamespace:nsa、nsb,一个网桥bridge0,nsa、nsb中添加网络设备veth,网络设备间...