作为运维,我们可能使用最多的web服务器有可能是NGINX了。在工作中,我们或者有需求针对不同内外网、同一站点不同目录需要做权限认证。以下简单列举下:

  • 1、内网访问不需要账号认证,而外网却需要
  • 2、访问test1不需要账号认证,访问test2目录下却需要

当我们遇到以上需要时候,采用NGINX或者有点吃力。这时可以推荐春哥的openresty。

如果使用auth_basic方式

1
2
3
4
5
6
7
8
9
10
11
12
       location / {

if ($remote_addr = "8.8.8.8"){
auth_basic "User Authentication";
auth_basic_user_file /usr/local/nginx/conf/solf_pass.db;
}

if ($remote_addr !~ "8.8.8.8|192.168.\*.\*")
{return 403;}
proxy_pass http://192.168.162.113/test2;
...省略部分跳转代码
}

当执行nginx -t报错
[root@log1 upstream]# nginx -t
nginx: [emerg] “auth_basic” directive is not allowed here in /usr/local/nginx/conf/upstream/soft.xxxx.com.conf:13
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

使用openresty结合lua

当我们遇到以上需要时候,采用NGINX或者有点吃力。这时可以推荐春哥的openresty。

1
2
3
4
5
6
7
8
9
10
11
12
13
       location / {
if ($remote_addr = "8.8.8.8"){
access_by_lua '
if ngx.var.remote_user == "test" and ngx.var.remote_passwd == "test" then
return
end
ngx.header.www_authenticate = [[Basic realm="Restricted"]]
ngx.exit(401)
';}
if ($remote_addr !~ "8.8.8.8|192.168.\*.\*")
{return 403;}
proxy_pass http://192.168.162.113/test2;
}

通过实践证明,使用lua是可以完美解决我们的需求,当然lua并非只能做这些简单需求。我们可以把openresty+lua直接变成web服务器也可,直接对数据库操作。详情可以参考https://github.com/openresty/lua-nginx-module#name

Comments

2017-11-18