不一般,在 Nginx 中运行 JavaScript
Posted 前端瓶子君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不一般,在 Nginx 中运行 JavaScript相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章