Skip to content

Latest commit

 

History

History
121 lines (91 loc) · 4.53 KB

nginx-mruby-cn.md

File metadata and controls

121 lines (91 loc) · 4.53 KB

前言

mruby是松本行弘(Yukihiro Matsumoto)实现的高性能的ruby,语法上是ruby的简化版, 可满足嵌入式设备和一些高性能应用的使用场景. 同时mruby也是得到日本政府支持的重要项目.

从开发人员的角度来看,mrubyruby之间几乎没有学习成本, 由于作者所在的团队主要是做Ruby相关的开发, 所以当需要扩展nginx的时候,就想到用mruby来实现.

nginx是目前开源界为数不多的几个俄罗斯人实现的、广为使用的软件之一, 它独特的状态机和事件驱动模型让其在相对较低的资源占用(有限的worker)的下提供极强的并发能力(100000+).

本文针对用mruby来扩展nginx梳理了需要关注的点,不专门介绍mruby和nginx开发, 一些nginx的实现相关内容会略过,欢迎大家回复讨论.

实战指南

主要分为:

  • 打包新的nginx
  • 扩展Nginx功能

打包新的nginx

Nginx 1.9.11引入了动态模块,之前的版本都是需要把module和nginx源码编译成一个二进制文件. 本文出于工程上动态模块目前还不成熟,只介绍后者.

本文所使用的nginx为1.9.5mruby module版本为v1.18.4.

# nginx源码目录 $NGINX_SRC
# ngx_mruby源码目录 $NGX_MRUBY_SRC

cd ${NGX_MRUBY_SRC}
./configure --with-ngx-src-root=${NGINX_SRC}
make build_mruby
make generate_gems_config
cd ${NGINX_SRC}
./configure --prefix=/usr/local/nginx --add-module=${NGX_MRUBY_SRC} --add-module=${NGX_MRUBY_SRC}/dependence/ngx_devel_kit
make

注意这里加的 --prefix=/usr/local/nginx 意味着以后只能将配置文件放在/usr/local/nginx/conf下.

生成的Nginx二进制文件位于$NGINX_SRC/objs/nginx. 以下是一些常用命令:

# 启动Nginx
$NGINX_SRC/objs/nginx
# 停止Nginx
$NGINX_SRC/objs/nginx -s stop
# Reload Nginx
$NGINX_SRC/objs/nginx -s reload

mruby module 已经默认加入了一些MRuby Gems, 可以通过修改$NGX_MRUBY_SRC/build_config.rb来增/删一些功能.

# $NGX_MRUBY_SRC/build_config.rb
conf.gem :github => 'iij/mruby-io'
conf.gem :github => 'iij/mruby-env'
conf.gem :github => 'iij/mruby-dir'
conf.gem :github => 'iij/mruby-digest'
conf.gem :github => 'iij/mruby-process'
conf.gem :github => 'iij/mruby-pack'
conf.gem :github => 'iij/mruby-socket'
conf.gem :github => 'mattn/mruby-json'
conf.gem :github => 'mattn/mruby-onig-regexp'
conf.gem :github => 'matsumoto-r/mruby-redis'
conf.gem :github => 'matsumoto-r/mruby-vedis'
conf.gem :github => 'matsumoto-r/mruby-sleep'
conf.gem :github => 'matsumoto-r/mruby-userdata'
conf.gem :github => 'matsumoto-r/mruby-uname'
conf.gem :github => 'matsumoto-r/mruby-mutex'
conf.gem :github => 'matsumoto-r/mruby-localmemcache'

# ngx_mruby extended class
conf.gem './mrbgems/ngx_mruby_mrblib'
conf.gem './mrbgems/rack-based-api'

最后需要注意的是:修改配置重新编译Nginx时,应该把$NGX_MRUBY_SRC$NGINX_SRC 下编译期间动态生成的文件全部清除,以免应用了cache,带来不必要的麻烦.

编译Nginx成功后,就可以在配置文件中嵌入一些MRuby脚本来方便地扩展Nginx功能.

扩展Nginx功能

这里的扩展Nginx功能指在Nginx的状态机的生命周期中嵌入一些额外的mruby脚本来实现 额外的功能, 如负载均衡和限流等.

Nginx在请求处理中支持stream(websocket, 静态文件等), http, mail处理, 本节以http请求的限流扩展为例来介绍(Supported Directives).

http {
  # ...
  # 启动阶段做可以初始化变量,比如公有的锁等
  mruby_init $location_of_your_mruby_script;
  # 请求到来处理阶段,如果是反向代理配置,这个阶段在转发之前
  mruby_access_handler $location_of_your_mruby_script;
  # ...
}

上面的例子在初始化配置(stop/reload/start)和请求到来时扩展nginx的功能, 具体的例子见 ngx_mruby用户手册

值得注意的是,配置文件中mruby_init $location_of_your_mruby_script在每次修改了 mruby脚本时默认会重新加载新的逻辑.

参考文献

Mruby Module for Nginx

Emiller's Guide To Nginx Module Development

ngx_mruby用户手册

Supported Directives