通过openresty和lua实现随机壁纸

效果:

图片存放路径:

/home/jobs/webs/imgs/
├── default/
│   ├── image1.jpg
│   ├── image2.png
├── cats/
│   ├── cat1.jpg
│   ├── cat2.gif
├── dogs/
│   ├── dog1.jpg

访问http://demo.com/imgs/default 随机返回/home/jobs/webs/imgs/default下的图片
访问http://demo.com/imgs/ 随机返回/home/jobs/webs/imgs/所有的图片(包含所有子目录)

安装openresty

yum方式安装

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install -y openresty

修改默认配置

vi /usr/local/openresty/nginx/conf/nginx.conf

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /usr/local/openresty/nginx/logs/nginx.pid;
include /usr/share/nginx/modules/*.conf;events {worker_connections 1024;
}http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';sendfile            on;tcp_nopush          on;tcp_nodelay         on;keepalive_timeout   65;types_hash_max_size 2048;gzip on;gzip_buffers 32 4K;gzip_comp_level 9;gzip_min_length 100;gzip_types text/plain application/xml application/json application/javascript text/css text/xml application/x-javascript;gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)gzip_vary on;include             /etc/nginx/mime.types;default_type        application/octet-stream;include /etc/nginx/conf.d/*.conf; # 后面配置会放在/etc/nginx/conf.d/xxx.conf
}# tcp转发
include /etc/nginx/tcp.d/*.conf;

编写lua脚本,实现从指定路径下随机返回图片(包含子路径)
vi /etc/nginx/conf.d/random_image.lua

-- random_image.lua
package.path = package.path .. ";/usr/local/share/lua/5.1/?.lua;/usr/share/lua/5.1/?.lua"
package.cpath = package.cpath .. ";/usr/local/lib/lua/5.1/?.so;/usr/lib64/lua/5.1/?.so"local lfs = require("lfs")
local images = {}-- 从 Nginx 配置中获取 base_dir
local base_dir = ngx.var.base_dir-- 确保 base_dir 以斜杠结尾
if not base_dir:match("/$") thenbase_dir = base_dir .. "/"
end-- 遍历目录及其子目录
local function find_images(dir)for file in lfs.dir(dir) doif file ~= "." and file ~= ".." thenlocal full_path = dir .. filelocal attr = lfs.attributes(full_path)if attr.mode == "directory" then-- 如果是目录,递归查找find_images(full_path .. "/")elseif attr.mode == "file" and (file:match("%.jpg$") or file:match("%.png$") or file:match("%.gif$")) then-- 如果是图片文件(jpg、png、gif),添加到列表table.insert(images, full_path)endendend
end-- 开始查找图片
find_images(base_dir)-- 随机选择一张图片
if #images > 0 thenlocal random_image = images[math.random(#images)]local file = io.open(random_image, "rb")  -- 以二进制模式打开文件if file thenlocal data = file:read("*all")  -- 读取文件内容file:close()-- 根据文件扩展名设置 Content-Typeif random_image:match("%.jpg$") thenngx.header.content_type = "image/jpeg"elseif random_image:match("%.png$") thenngx.header.content_type = "image/png"elseif random_image:match("%.gif$") thenngx.header.content_type = "image/gif"elsengx.header.content_type = "application/octet-stream"  -- 默认类型endngx.say(data)  -- 直接输出图片内容elsengx.say("Failed to open image.")end
elsengx.say("No images found.")
end

在server的配置使用lua脚本
vi /etc/nginx/conf.d/demo.conf

# 处理 /imgs/ 路径的请求
location /imgs/ {# 设置 base_dir 变量set $base_dir "/home/jobs/webs/imgs/";# 提取子路径(例如 /imgs/default -> default)set $sub_path "";if ($uri ~ ^/imgs/(.+)$) {set $sub_path $1;set $base_dir "$base_dir$sub_path/";}# 调用 Lua 脚本content_by_lua_file /etc/nginx/conf.d/random_image.lua;
}

启动openresty

systemctl start openresty

如果出现报错
tail -f /var/log/nginx/error.log

2025/02/11 15:32:47 [error] 15294#15294: *321 lua entry thread aborted: runtime error: /etc/nginx/conf.d/random_image.lua:1: module 'lfs' not found:no field package.preload['lfs']no file '/usr/local/openresty/site/lualib/lfs.ljbc'no file '/usr/local/openresty/site/lualib/lfs/init.ljbc'no file '/usr/local/openresty/lualib/lfs.ljbc'

安装lua开发包

yum -y install lua-devel

确保你已安装 luarocks

yum -y install luarocks

先确认 luafilesystem 是否已经安装。你可以使用 luarocks 命令列出已安装的模块:

luarocks list

如果列表中没有 luafilesystem,那么你需要安装它:

luarocks install luafilesystem

安装完成后,你可以通过以下命令来验证 lfs 模块是否成功安装,如果没有错误输出,说明安装成功:

lua -e "require'lfs'"

然后你可以通过以下命令查找它的路径:

luarocks show luafilesystem

修改 package.path 和 package.cpath
在你的 Lua 脚本的开头添加以下代码,确保包含 lfs 模块的路径:

package.path = package.path .. ";/usr/local/share/lua/5.1/?.lua;/usr/share/lua/5.1/?.lua"
package.cpath = package.cpath .. ";/usr/local/lib/lua/5.1/?.so;/usr/lib64/lua/5.1/?.so"

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

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

相关文章

CAS单点登录(第7版)20.用户界面

如有疑问,请看视频:CAS单点登录(第7版) 用户界面 概述 概述 对 CAS 用户界面 (UI) 进行品牌化涉及编辑 CSS 样式表以及一小部分相对简单的 HTML 包含文件,也称为视图。(可选&…

安全测试中的身份认证与访问控制深度解析

第一部分:基本概念与核心问题 1. 身份认证与访问控制基础 1.1 身份认证三要素 知识因素(密码、PIN码)持有因素(硬件令牌、手机)生物因素(指纹、面部识别)1.2 访问控制模型 DAC(自主访问控制)MAC(强制访问控制)RBAC(基于角色的访问控制)2. 关键安全机制 2.1 会话…

AI 编程工具—Cursor 进阶篇 数据分析

AI 编程工具—Cursor 进阶篇 数据分析 上一节课我们使用Cursor 生成了北京房产的销售数据,这一节我们使用Cursor对这些数据进行分析,也是我们尝试使用Cursor 去帮我们做数据分析,从而进一步发挥Cursor的能力,来帮助我们完成更多的事情 案例一 房产销售数据分析 @北京202…

算法1-1 玩具谜题

题目描述 小南有一套可爱的玩具小人,它们各有不同的职业。 有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图: 这时 singer 告诉小南一个谜题&…

Java函数计算冷启动从8s到800ms的优化实录

在函数计算场景中,冷启动性能对用户体验至关重要。本文将分享如何将 Java 函数计算的冷启动时间从 8 秒优化到 800 毫秒,包括具体的技术手段和代码示例。 一、背景介绍 函数计算是一种事件驱动的计算服务,用户只需上传代码,无需管理服务器。但在实际使用中,函数计算的冷…

《AI大模型开发笔记》deepseek提示词技巧

为什么你的 AI 助手总是答非所问? 「写篇产品分析」 → 收到一堆不知所云的文字 「做个竞品对比」 → 得到几页没有重点的废话 揭秘:不是 AI 不够聪明,而是你的指令太“高冷”! 一、新手进阶: 5 大法则,让…

二、OpenSM排障----实战生产

目录 一、确认 OpenSM 服务端故障的步骤 1. 检查客户端与服务器的连通性 2. 检查客户端 InfiniBand 接口状态 3. 检查子网管理器状态 4. 检查拓扑信息 5. 检查路由表 二、客户端日志位置及查看方法 1. 系统日志 2. OpenSM 客户端日志 3. 内核日志 4. 性能计数器日志…

[矩形绘制]

矩形绘制 真题目录: 点击去查看 E 卷 200分题型 题目描述 实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除 当新绘制的矩形与之前的图形重叠时,对图形取并集当新擦除的矩形与之前的图形重叠时,对图形取差集给定一系列矩形的绘制和擦除操作,计算最终图形的面积。 …

在软件产品从开发到上线过程中,不同阶段可能出现哪些问题,导致软件最终出现线上bug

在软件产品从开发到上线的全生命周期中,不同阶段都可能因流程漏洞、技术疏忽或人为因素导致线上问题。以下是各阶段常见问题及典型案例: 1. 需求分析与设计阶段 问题根源:业务逻辑不清晰或设计缺陷 典型问题: 需求文档模糊&#…

渲染相机设置 pyrender cameralib

目录 cameralib 设置相机 numpy获取相机参数: pyrender设置相机: hmr2渲染设置 multi_hmr获取cam_t cameralib 设置相机 cameralib安装教程: cameralib 安装-CSDN博客 import cameralibcamera = cameralib.Camera.from_fov(fov_degrees=55, imshape=(720,1280))intri…

ros:ur机械臂初识

这是用来可视化的launch文件 比如,我运行 roslaunch ur_description view_ur3.launch ur3模型 ur3e模型 ur5模型 ur5e模型 ur10模型 ur20模型 ur30模型 后来我搜了一下 UR5 和 UR10 都是由 Universal Robots(简称 UR)生产的协作机器人&…

【VSCode】一键清理旧版本插件脚本(Mac或者Windows都可)

文章目录 清理VSCode旧版本插件为什么会有旧版本插件Mac 环境脚本源码原理解释实例解释 Windows 环境 清理VSCode旧版本插件 为什么会有旧版本插件 vscode 插件经常需要更新的,有时候更新之后旧版本的插件还是会留存在插件文件夹中(更新插件之后vscode…

制作一个项目用于研究elementUI的源码

需求:修改el-tooltip的颜色,发现传递参数等方法都不太好用,也可以使用打断点的方式,但也有点麻烦,因此打算直接修改源码,把组件逻辑给修改了 第一步下载源码 源码地址 GitHub - ElemeFE/element: A Vue.j…

【ClickHouse】Ubuntu下离线安装ClickHouse数据库并使用DBeaver连接

目录 0. 安装前准备1 安装ClickHouse1.1 下载安装包1.2 离线安装1.3 配置密码1.4 启动ClickHouse服务 2 DBeaver连接配置2.1 下载ClickHouse驱动2.2 DBeaver配置2.2.1 配置主要参数2.2.2 配置驱动 2.3 常见问题处理2.3.1 修改远程登录配置2.3.2 更新驱动配置 0. 安装前准备 有…

unity学习36:老版的动画 Animation

目录 1 unity关于动画的分为两种 2 旧版动画 Animation 2.1 添加Animation组件 2.2 对应的动画clip 2.3 动画的属性 3 如何做出一个简单动画 3.1 打开老的动画编辑器 3.2 Animation 窗口,拖到下面的game窗口一起 3.3 新建动画 3.4 动画编辑器 3.4.1 时间…

学习数据结构(9)栈和队列上

1.栈的概念 栈是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作 的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出(先进先出)的原则 栈的插入操作叫做进栈/压栈/入栈&#xff…

【ESP32指向鼠标】——icm20948与esp32通信

【ESP32指向鼠标】——icm20948与esp32通信 ICM-20948介绍 ICM-20948 是一款由 InvenSense(现为 TDK 的一部分)生产的 9 轴传感器集成电路。它结合了 陀螺仪、加速度计和磁力计。 内置了 DMP(Digital Motion Processor)即负责执…

docker学习---第3步:docker实操大模型

文章目录 1.Images2.Container3.DockerfileENTRYPOINT和CMDCOPY和ADDLABLE、EXPOSE和VOLUME卷中的数据是如何做数据备份的? ARG和ENVHEALTHCHECK 4. Network(本节讲容器与容器之间的通信方案) 跟着b站 胖虎遛二狗学习 Docker动手入门 &…

无人机之无线传输技术!

一、Lightbridge和OcuSync图传技术 Lightbridge技术:这是大疆自主研发的一种专用通信链路技术,使用单向图像数据传输,类似于电视广播塔的数据传输形式。它主要采用2.4GHz频段进行传输,并且可以实现几乎“零延时”的720p高清图像传…

Druid GetConnectionTimeoutException解决方案之一

> Druid版本:v1.2.18 最近项目中经常出现:com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 120000, active 0, maxActive 128, creating 0, createErrorCount 2,但是其他平台连接这个数据源正常的 于是做了一个实验复…