不一般,在 Nginx 中运行 JavaScript

Posted 前端瓶子君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不一般,在 Nginx 中运行 JavaScript相关的知识,希望对你有一定的参考价值。


模块将 Lua 语言嵌入到 nginx 中,可以使用 Lua 脚本扩展 Nginx 功能,并可以访问 mysql、Redis 等数据库。

Lua 虽然是个强大的脚本语言,但过于小众。Nginx 团队选择非常流行的 javascript 研发 NGINX JavaScript 模块 (njs),让更多工程师可以使用 JavaScript 来扩展 Nginx 功能,从而更好的发展 Nginx 社区生态。

动态模块,需要 Nginx 版本为 1.9.11 之后支持动态模块的载入。

yum install nginx-module-njs

安装后,在配置文件 nginx.conf 中需要使用 load_module 指令加载 njs 动态模块。

load_module modules/ngx_http_js_module.so;
js_import http.js;
# or js_import http from http.js;

server
listen 8000;

location /
js_content http.hello;



http.js:

: 导入一个 njs 模块,没有指定模块名称则默认为文件名称。

js_content : 使用 njs 模块里导出的方法处理这个请求。

发起子请求。

nginx.conf:

js_import http.js;

location /start
js_content http.content;


location /foo
proxy_pass <http://backend1>;


location /bar
proxy_pass <http://backend2>;

http.js:

: 可以去请求内部的其他 API ,headers 和该请求相同,并且可以在 location 块里使用 proxy_set_header 来设置或覆盖原来的 header。

listen 80;
root /usr/share/nginx/html;
access_log /var/log/nginx/access.log kvpairs;

logging.js:

: 将 njs 模块里的 kvAccess 方法执行后,执行结果放到 $access_log_headers 变量中。但如果只被引用在 log_format 中,则只会在日志记录阶段被执行。

r : HTTP request 对象。属性列表:http://nginx.org/en/docs/njs/reference.html#http

来访问 Redis 数据。

nginx.conf:

js_import http.js;

# GET /redis_get?key=some_key
location = /redis_get
# 解码 uri 中的参数 key,赋值到变量 $key
set_unescape_uri $key $arg_key;
redis2_query get $key;
redis2_pass 127.0.0.1:6379;


# GET /redis_set?key=one&val=first%20value
location = /redis_set
set_unescape_uri $key $arg_key;
set_unescape_uri $val $arg_val;
redis2_query set $key $val;
redis2_pass 127.0.0.1:6379;


# GET /get_redis_data?key=some_key
location /get_redis_data
js_content http.get_redis_data;

http.js:

:解码 uri 中参数的 %XX 编码。

redis2_query : 执行的 Redis 命令。

redis2_pass : Redis 后端服务。

redis2_pass 返回值为类似 redis-cli 执行后的返回值,需要有一个 parser 来解析是否执行成。

二、访问 MySQL

使用 drizzle-nginx-module 动态模块,结合 subrequest 来访问 MySQL 数据。

nginx.conf:

upstream backend 
drizzle_server 127.0.0.1:3306 dbname=test
password=some_pass user=monty protocol=mysql;


server
js_import http.js;

location /mysql
set_unescape_uri $name $arg_name;
# 为防止 SQL 注入攻击,使用 set_quote_sql_str 来设置 sql 语句中的变量
set_quote_sql_str $quoted_name $name;

drizzle_query "select * from cats where name = $quoted_name";
drizzle_pass backend;

drizzle_connect_timeout 500ms; # default 60s
drizzle_send_query_timeout 2s; # default 60s
drizzle_recv_cols_timeout 1s; # default 60s
drizzle_recv_rows_timeout 1s; # default 60s


# GET /get_mysql_data?name=cat_name
location /get_mysql_data
js_content http.get_mysql_data;


http.js:

: 为防止 SQL 注入攻击,来设置 sql 语句中的变量。

drizzle_query : 执行的 SQL 语句。

drizzle_pass : Drizzle 或 MySQL 服务的 upstream。

结语

在 njs 之前,Nginx+Lua 生态虽然已日趋成熟,但 Nginx 毕竟是一个 Web 服务器,JavaScript 作为 Web 开发的最流行的语言,可以使用 JavaScript 生态来扩展 Nginx 的功能,可能会更加的有一些想象力做更多的事情。

关于本文

作者:whilefor

https://zhuanlan.zhihu.com/p/393788937

最后
欢迎关注【前端瓶子君】✿✿ヽ(°▽°)ノ✿
回复「算法」,加入前端编程源码算法群,每日一道面试题(工作日),第二天瓶子君都会很认真的解答哟!
回复「交流」,吹吹水、聊聊技术、吐吐槽!
回复「阅读」,每日刷刷高质量好文!
如果这篇文章对你有帮助,在看」是最大的支持
 》》面试官也在看的算法资料《《
“在看和转发”就是最大的支持





nginx指定路径运行

在日常运维过程中,偶尔出现一台机器上运行多个nginx,一般运行多个nginx需要重新编译,配置路径,但通过摸索,发现可以通过运行时指定参数可以实现不需要重新编译,能正常运行。

具体命令如下:

启动:/usr/local/nginx8094/sbin/nginx -p /usr/local/nginx8094/

停止:/usr/local/nginx8094/sbin/nginx -p /usr/local/nginx8094/ -s stop

如启动报错,注意检查nginx.conf配置,不要引起重复写一个地方日志或读同一个文件。

本文出自 “IT技术” 博客,请务必保留此出处http://lysweb.blog.51cto.com/3468677/1880019

以上是关于不一般,在 Nginx 中运行 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章

nginx指定路径运行

Javascrip 淡入淡出思路

架构师的成长之路初片~nginx优化篇

Nginx运行原理和配置详解(个人总结笔记)

nginx优化

nginx gzip 相关

(c)2006-2024 SYSTEM All Rights Reserved IT常识