
前言
在使用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;
}
}
