nginx + lua脚本

news/2024/12/23 19:58:49/文章来源:https://www.cnblogs.com/jackjavacpp/p/18624920

Nginx配合Lua

案例

今天实现一个非常简单的例子.

云服务器上部署的了一个很通用的应用程序(它没有保护策略),其端口是a,但是我想使用他,就要通过公网ip:端口去访问它。暴露在外面很不安全。

那么就可以通过nginx反向代理,就达到了不暴露端口的目的了。

但是,我又不想别人随便访问,要加一些限制。比如必须要有指定的请求头。

解决方案: 用nginx配置就行了呗。

但是,还是不安全呐,随便别人如果F12查看请求的话,还是可以发现我的请求头啊。他随便捏造一个也可以访问这个应用了呀。

终极方案: lua脚本 + nginx反向代理

  1. 生成的请求头的值value,存到Redis里面【有一定时限】
  2. 用lua脚本获取请求头,如果是空的,返回指定的json字符串
  3. 如果第二步通过了,把请求头的值去Redis查一查,如果有,就通过;如果Redis里面没有,返回指定的json字符串

环境:openresty【它就是升级版的nginx,里面要记得安装redis的模块】

我这里是宝塔面板的openresty,安装的自带有redis模块。(这个安装就不放了)

配置

通用配置:nginx.conf

user  www www;
worker_processes auto;
error_log  /www/wwwlogs/nginx_error.log  crit;
pid        /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;stream {log_format tcp_format '$time_local|$remote_addr|$protocol|$status|$bytes_sent|$bytes_received|$session_time|$upstream_addr|$upstream_bytes_sent|$upstream_bytes_received|$upstream_connect_time';access_log /www/wwwlogs/tcp-access.log tcp_format;error_log /www/wwwlogs/tcp-error.log;include /www/server/panel/vhost/nginx/tcp/*.conf;
}events{use epoll;worker_connections 51200;multi_accept on;}http{include       mime.types;#include luawaf.conf;include proxy.conf;default_type  application/octet-stream;server_names_hash_bucket_size 512;client_header_buffer_size 32k;large_client_header_buffers 4 32k;client_max_body_size 50m;sendfile   on;tcp_nopush on;keepalive_timeout 60;tcp_nodelay on;fastcgi_connect_timeout 300;fastcgi_send_timeout 300;fastcgi_read_timeout 300;fastcgi_buffer_size 64k;fastcgi_buffers 4 64k;fastcgi_busy_buffers_size 128k;fastcgi_temp_file_write_size 256k;fastcgi_intercept_errors on;gzip on;gzip_min_length  1k;gzip_buffers     4 16k;gzip_http_version 1.1;gzip_comp_level 2;gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/json image/jpeg image/gif image/png font/ttf font/otf image/svg+xml application/xml+rss text/x-js;gzip_vary on;gzip_proxied   expired no-cache no-store private auth;gzip_disable   "MSIE [1-6]\.";limit_conn_zone $binary_remote_addr zone=perip:10m;limit_conn_zone $server_name zone=perserver:10m;server_tokens off;access_log off;server {................... 重点配置}
}include /www/server/panel/vhost/nginx/*.conf;
}

server的重点配置

server {listen 监听的端口;location / {# 使用 Lua 脚本进行请求认证 (可以将这里一块抽取出去)access_by_lua_block {local redis = require "resty.redis"local cjson = require "cjson"  -- 用于处理 JSON 格式的响应-- 创建 Redis 客户端local red = redis:new()red:set_timeout(1000)  -- 设置连接超时,单位是毫秒-- Redis 连接池设置local pool_size = 100  -- 连接池大小local keepalive_timeout = 60000  -- 连接池中连接的超时时间(单位:毫秒)local keepalive_pool_size = 100  -- Redis 连接池的大小local redis_host = "Redis的ip"  -- 更新 Redis IP 地址local redis_port = 6379local redis_password = "密码"  -- Redis 密码-- 获取请求头中的 judge-auth 值local auth_val = ngx.req.get_headers()["judge-auth"]-- 判断 judge-auth 是否为空if not auth_val or auth_val == "" thenlocal response = {code = 403,message = "请求头缺失!"}ngx.header.content_type = 'application/json; charset=utf-8'ngx.status = 403ngx.say(cjson.encode(response))return ngx.exit(ngx.HTTP_OK)end-- 连接到 Redis,使用连接池local ok, err = red:connect(redis_host, redis_port)if not ok thenngx.log(ngx.ERR, "failed to connect to Redis: ", err)return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)end-- Redis 密码验证local res, err = red:auth(redis_password)  -- Redis 密码if not res thenngx.log(ngx.ERR, "failed to authenticate with Redis: ", err)return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)end-- 查询 Redis 中是否存在该 keylocal res, err = red:get(auth_val)if not res thenngx.log(ngx.ERR, "failed to query Redis: ", err)return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)end-- 如果 Redis 中没有该 key,返回 403 错误if res == ngx.null thenlocal response = {code = 403,message = "尚未认证!"}ngx.header.content_type = 'application/json; charset=utf-8'ngx.status = 403ngx.say(cjson.encode(response))return ngx.exit(ngx.HTTP_OK)end-- 认证成功,将连接放回连接池local pool_ok, pool_err = red:set_keepalive(keepalive_timeout, keepalive_pool_size)if not pool_ok thenngx.log(ngx.ERR, "failed to set keepalive for Redis: ", pool_err)return ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)end}proxy_pass http://127.0.0.1:应用的端口号;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857633.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中指数概率分布函数的绘图详解

在数据科学和统计学中,指数分布是一种应用广泛的连续概率分布,通常用于建模独立随机事件发生的时间间隔。通过Python,我们可以方便地计算和绘制指数分布的概率密度函数(PDF)。本文将详细介绍指数分布的原理、应用场景,并提供详细的代码示例,展示如何在Python中绘制指数分…

VScode + cmake编写Qt程序

本机环境 Ubuntu 20.04 Qt 5.12.81. 安装Vscode直接在官网下载对应的deb包安装即 可。下载后在deb包所在目录执行如下命令安装deb包。sudo dpkg -i 安装包名.deb然后在应用程序中应该就有了Vscode的图标了。2. 安装cmake与gcc g++先安装cmakesudo apt-get install cmake然后安装…

RK3588开发板入门教程

一、EVM-RK3588 评估板外观二、常用系统信息查看1、查看系统内核版本信息,使用uname命令:$unamet-a2、查看操作系统信息:$ cat /etc/issue3、查看系统内存使用情况:$free-h4、查看系统磁盘使用情况:$ df -h5、查看磁盘和分区:# 查看所有分区 $ fdisk -l # 查看文件可看到…

【教程】第十章:任务仪表盘(2) —— 各有千秋

通过循序渐进的功能升级,你将打造一个强大的管理系统,让团队协作更高效、流程更智能。在本章中,我们将带您一步步完成任务仪表盘的下一部分,有任何疑问记得随时来论坛咨询。 从复习上章内容开始,让我们一起展开这段探索之旅吧! 10.1 揭晓上一章节答案 10.1.1 状态与链接 …

Llama 3.2 900亿参数视觉多模态大模型本地部署及案例展示

本文介绍了如何在本地部署Llama 3.2 90B(900亿参数)视觉多模态大模型,并开发一些Use Case,展示其强大的视觉理解能力。Llama 3.2 900亿参数视觉多模态大模型本地部署及案例展示 本文将介绍如何在本地部署Llama 3.2 90B(900亿参数)视觉多模态大模型,并开发一些Use Case,…

【新教程】Ubuntu server 24.04配置无线网WiFi

0 相关信息 Ubuntu Server 24.04 1 工具准备 sudo apt install network-manager wpasupplicant wireless-tools2 过程 查看无线网卡名称: ip addr一般wl开头的为无线网卡。比如,我这里的无线网卡就是wlo1 扫描无线网络: sudo iwlist wlo1 scan | grep ESSID # 注意将 wlan0…

BOE(京东方)亮相世界显示产业创新发展大会 以创新科技全面引领行业风向标

2024年12月19日,世界显示产业创新发展大会在成都举办,来自全球的显示领域企业及行业专家汇聚一堂,共同探讨新一轮产业升级趋势及行业未来发展方向。BOE(京东方)总裁高文宝博士应邀出席大会,并在开幕式发表《屏之物联 聚智创新》主题演讲,引发现场嘉宾和观众强烈共鸣。大…

BOE(京东方)“向新2025”年终媒体智享会落地成都 持续创新引领产业步入高价值增长新纪元

12月20日,BOE(京东方)“向新 2025”年终媒体智享会的脚步从上海延伸至成都。川渝之地,作为 BOE(京东方)产业生态战略布局中的关键一子,此刻再度成为行业瞩目的焦点。本次活动全面回溯了BOE(京东方)在2024年多个关键领域斩获的斐然佳绩,深入剖析了六大维度构建的“向新…

BOE(京东方)绿色低碳显示生态交流会成功举办 共筑行业绿色未来

2024年12月19日,世界显示产业创新发展大会在成都盛大召开,众多行业专家及产业链伙伴齐聚一堂,共同探讨显示产业科技创新成果与未来发展方向。作为全球半导体显示行业龙头企业,BOE(京东方)在大会同期举办了主题为“物联视界,碳索未来”的绿色低碳显示生态交流会,携手上下…

聊一下新电脑-macbook air 15寸 m2 16+512g

购买于转转二手商城 售价: 6250 配置:16+512g m2芯片 15寸 已经过保了,激活日期是去年的12月,差不多刚好一年电池健康:100%算是保养得很好的了!磁盘读写也不多:整体橙色95新以上! 我使用时间机器去换机的,整个过程十分的流畅! 除了换完之后开机有点卡顿,不知道是网络还是什么原…

小学数学思维训练 一年级 第一周(少儿思维启蒙)

前言 本文主要介绍了通过各种题型和解题方法培养孩子的数学思维能力。通过系统的方法训练一年级学生的数学思维能力,帮助他们学会举一反三,融会贯通地解决各类数学问题。 点击获取小学数学1-6年级思维训练电子版 第一周 比一比 比一比是实际生活中常见的一类数学问题,需要同…