做排名出租网站,创意网站制作,义乌网站建设制作商,设计网站的结构时下面哪个方法不好一些服务不带认证#xff0c;凡是可以访问到服务端口#xff0c;都可以正常使用该服务#xff0c;方便是方便#xff0c;但是不够安全。 比如ollama默认安装后就是这样。现在据说网上扫一下端口11434#xff0c;免apikey的ollama服务一大堆。。。 那我们怎样将本机安装的o…一些服务不带认证凡是可以访问到服务端口都可以正常使用该服务方便是方便但是不够安全。 比如ollama默认安装后就是这样。现在据说网上扫一下端口11434免apikey的ollama服务一大堆。。。 那我们怎样将本机安装的ollama能提供给其他用户使用并且可以加apikey的限制呢其实方案有很多我说一个轻量级的解决方案nginx代理转发并且进行header中的Authorization信息的检查。 固定值的可以直接写在nginx.conf配置文件里最简单如果是使用json文件来存放apikey信息的话nginx需要使用lua模块来读取json文件进行解码windows版的nginx默认不带lua模块可以用openresty它相当于集成了lua模块的nginx。json内容可以由其他应用来维护不过内容有变化需要考虑如果要求实时更新那么最好在应用修改json文件内容时也同时通知nginx来更新或者干脆由另外一个web服务来负责header中apikey的检查nginx里要写lua代码去执行调用根据返回结果来决定是否放行还有一个就是我最终选择的方案-redisapikey维护服务在apikey生效或者失效时更新redis的集合nginx从redis里检查集合里是否包含请求头中的apikey。nginx.conf里的lua部分相关代码如下
...
http {# 引入 Lua 模块lua_package_path lualib/?.lua;;;lua_package_cpath lualib/?.so;;;# 定义 Redis 连接参数upstream redis_backend {server 127.0.0.1:6379; # Redis 服务器地址keepalive 10; # 保持连接}...server {listen 443 ssl;...location /ollama/ {#if ($request_method OPTIONS) {# return 204;# }access_by_lua_block {-- 获取请求头中的 Authorizationlocal auth_header ngx.var.http_Authorizationif not auth_header thenngx.status ngx.HTTP_UNAUTHORIZEDngx.say(Unauthorized: Missing Authorization header)return ngx.exit(ngx.HTTP_UNAUTHORIZED)end-- 连接 Redislocal redis require resty.redislocal red redis:new()red:set_timeout(1000) -- 设置超时时间为 1 秒local ok, err red:connect(127.0.0.1, 6379)if not ok thenngx.status ngx.HTTP_INTERNAL_SERVER_ERRORngx.say(Internal Server Error: Failed to connect to Redis)return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)end-- 查询 Redis 中是否存在该密钥local is_member, err red:sismember(auth_keys, auth_header)if not is_member thenngx.status ngx.HTTP_INTERNAL_SERVER_ERRORngx.say(Internal Server Error: Failed to query Redis)return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)end-- 关闭 Redis 连接local ok, err red:set_keepalive(10000, 100)if not ok thenngx.log(ngx.ERR, Failed to set keepalive: , err)end-- 检查密钥是否有效if is_member 0 thenngx.status ngx.HTTP_UNAUTHORIZEDngx.say(Unauthorized: Invalid Authorization key)return ngx.exit(ngx.HTTP_UNAUTHORIZED)end}# 如果验证通过代理到目标服务器#add_header Access-Control-Allow-Origin *;#add_header Access-Control-Allow-Methods GET, POST, OPTIONS;#add_header Access-Control-Allow-Headers Authorization, Content-Type;#add_header Access-Control-Max-Age 1728000;#proxy_set_header origin http://127.0.0.1:11434;#proxy_set_header X-Real-IP $remote_addr;#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#proxy_set_header X-Forwarded-Proto $scheme;#proxy_set_header Authorization $http_authorization;#proxy_set_header Host localhost:11434;proxy_pass http://127.0.0.1:11434;}...}
}
...主要是可以参考下lua里将header里认证信息与redis集合进行匹配其他nginx转发设置头信息跟后端服务要求而定。