前言
在使用Nginx实现访问时的Token验证,将会使用到一个基于 Nginx 与 Lua 模块来实现Token的验证。在请求Nginx配置的地址时,将使用Headers传递Token参数,并在Nginx端做网关校验。
环境说明
有两种方式可选择,推荐使用OpenResty简单快捷:
1)使用nginx的lua模块配置环境
- LuaJIT (下载地址:http://luajit.org/download.html)
- lua-nginx-module (下载地址:https://github.com/openresty/lua-nginx-module/releases)
- nginx (下载地址:http://nginx.org/en/download.html)
2)封装过后的高性能 Web 平台 OpenResty
OpenResty 其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
其官网做了更多详细的简介描述:
OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。
OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
以上信息参考OpenResty官方中文网站 http://openresty.org/cn/
软件安装
Nginx及模块安装可参阅官方的安装介绍,再此不再重述。
附赠Centos7的简单安装脚本
yum install -y yum-utils yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo yum install -y openresty
另Centos7 OpenResty Dockerfile见GitHub: https://github.com/bywei/Centos_OpenResty_Dockerfile
Nginx配置
Nginx的Token校验实现在nginx.conf中配置相应的Lua脚本,编辑Nginx配置文件即可。
vi nginx/conf/nginx.conf
完整的nginx.conf配置文件演示如下,在实际业务场景中通过扩展Lua脚本功能逻辑来实现即可。比如可通过增加Redis来实现Nginx Token权限校验Api网关,具体通过Redis实现权限校验网关,有兴趣的网友可在文章下方评论留言,将附赠Lua实现源码。
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; access_log logs/access.log; location / { autoindex on; autoindex_exact_size off; autoindex_localtime on; root /fileroot; index index.html index.htm; access_by_lua ' --获取请求的Header参数列表 local args = ngx.req.get_headers(); --提取Header中的token参数,该参数在请求地址时必须加上 local token1 = args["token"]; --配置验证的token,此处可增加Redis做存储,然后提取 local token2 = "f7781231c6f2ea3161sd244453580f73a"; --token不一致则相应403无权限访问该地址 if token1 ~= token2 then ngx.exit(ngx.HTTP_FORBIDDEN); end '; } #通过该地址可测试Lua脚本是否安装成功 location /lua { default_type 'text/html'; content_by_lua 'ngx.say("hello world");'; } #error_page 404 /404.html; } }