通过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"
相关文章:
通过openresty和lua实现随机壁纸
效果: 图片存放路径: /home/jobs/webs/imgs/ ├── default/ │ ├── image1.jpg │ ├── image2.png ├── cats/ │ ├── cat1.jpg │ ├── cat2.gif ├── dogs/ │ ├── dog1.jpg访问http://demo.com/imgs/default 随机返回…...
Day 36 卡玛笔记
这是基于代码随想录的每日打卡 56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1…...
【Elasticsearch】match查询
Elasticsearch 的match查询是全文搜索中最常用和最强大的查询类型之一。它允许用户在指定字段中搜索文本、数字、日期或布尔值,并提供了丰富的功能来控制搜索行为和结果。以下是match查询的详细解析,包括其工作原理、参数配置和使用场景。 1.match查询的…...
MATLAB 生成脉冲序列 pulstran函数使用详解
MATLAB 生成脉冲序列 pulstran函数使用详解 目录 前言 一、参数说明 二、示例一 三、示例二 总结 前言 MATLAB中的pulstran函数用于生成脉冲序列,支持连续或离散脉冲。该函数通过将原型脉冲延迟并相加,生成脉冲序列,适用于信号处理和系统…...
开源、免费项目管理工具比较:2025最新整理30款
好用的开源、免费版项目管理系统有:1.Redmine;2. Taiga;3. OpenProject; 4.ProjectLibre; 5.GanttProject; 6.Tuleap; 7.Trac;8. Phabricator; 9.Notion; 10.…...
ffmpeg -muxers
1. ffmpeg -muxers -loglevel quiet 显示ffmpeg支持的复用器。复用器的作用是将多个独立的媒体流(如视频流、音频流、字幕流等)按照一定的格式和规则组合成一个单一的复合流;解复用器的作用与复用器相反,它将复合流分解为多个独立…...
设置mysql的主从复制模式
mysql设置主从复制模式似乎很容易,关键在于1)主库启用二进制日志,2)从库将主库设为主库。另外,主从复制,复制些什么?从我现在获得的还很少的经验来看,复制的内容有表,用户…...
ASP.NET Core的贫血模型与充血模型
目录 概念 需求 贫血模型 充血模型 总结 概念 贫血模型:一个类中只有属性或者成员变量,没有方法。充血模型:一个类中既有属性、成员变量,也有方法。 需求 定义一个类保存用户的用户名、密码、积分;用户必须具有…...
君海游戏岗位,需要私我
游戏岗位内推啦,需要找我哈 共14个职位 广告投放主管 社会招聘全国 广告投放 社会招聘全国 设计主管 社会招聘全国 海外投放 社会招聘广东省广州市 海外运营 社会招聘广东省广州市 产品运营专员 社会招聘广东省广州市 平台运营 社会招聘广东…...
IBM服务器刀箱Blade安装Hyper-V Server 2019 操作系统
案例:刀箱某一blade,例如 blade 5 安装 Hyper-V Server 2019 操作系统(安装进硬盘) 刀箱USB插入安装系统U盘,登录192.168... IBM BlandeCenter Restart Blande 5,如果Restart 没反应,那就 Power Off Blade 然后再 Power On 重启后进入BIOS界面设置usb存储为开机启动项 …...
Unity中实现动态图集算法
在 Unity 中,动态图集(Dynamic Atlas)是一种在运行时将多个纹理合并成一个大纹理图集的技术,这样可以减少渲染时的纹理切换次数,提高渲染效率。 实现原理: 动态图集的核心思想是在运行时动态地将多个小纹理…...
MySQL中的覆盖索引的使用
文章目录 1. 覆盖索引的定义2. 覆盖索引的工作原理2.1 索引和回表2.2 如何实现覆盖索引 3. 覆盖索引的优势4. 覆盖索引的限制5. 创建和优化覆盖索引5.1 分析查询模式5.2 确定需要覆盖的列5.3 创建复合索引5.4 使用覆盖索引优化查询5.5 避免过度索引5.6 索引整理与优化 6. 实际应…...
XML DOM
XML DOM XML DOM(Document Object Model)是一种用于访问和操作XML文档的标准方式。它提供了一种树形结构来表示XML文档,使得开发者能够方便地对XML数据进行读取、修改和操作。本文将详细介绍XML DOM的基本概念、结构、操作方法以及应用场景。 一、XML DOM的基本概念 XML …...
[开源]MaxKb+Ollama 构建RAG私有化知识库
MaxKbOllama,基于RAG方案构专属私有知识库 关于RAG工作原理实现方案 一、什么是MaxKb?二、MaxKb的核心功能三、MaxKb的安装与使用四、MaxKb的适用场景五、安装方案、 docker版Docker Desktop安装配置MaxKb安装和配置 总结和问题 MaxKB 是一款基于 LLM 大…...
迅为RK3568开发板篇OpenHarmony实操HDF驱动配置LED-LED测试
将编译好的镜像全部进行烧写,镜像在源码根目录 out/rk3568/packages/phone/images/目录下。 烧写完成之后,在调试串口查看打印日志,如下图所示: 然后打开 hdc 工具,运行测试程序,输入“led_test 1”&…...
将Mac上Python程序的虚拟环境搬到Windows
1. 导出Mac上Python虚拟环境的依赖 cd py && source venv/bin/activate && pip freeze > requirements.txt 2. 在Windows上创建一个新的虚拟环境 python -m venv venv 3. 激活虚拟环境 venv\Scripts\activate 4. 安装依赖 pip install -r requiremen…...
大语言模型评价 怎么实现去偏见处理
大语言模型评价 怎么实现去偏见处理 在训练大语言模型(LLMs)时,去偏处理对于避免模型学习到带有偏见的模式至关重要,以下从数据处理、模型训练、评估监测三个阶段介绍具体实现方法,并结合招聘场景进行举例说明: 数据处理阶段 数据清洗:仔细审查并剔除包含明显偏见的训练…...
3.React 组件化开发
react:版本 18.2.0node: 版本18.19.1脚手架:版本 5.0.1 一、类组件 (一) 一个干净的脚手架 【1】使用已经被废弃的 CRA (create-react-app) create-react-app 已经被废弃,且目前使用会报错,官方已经不推荐使用&…...
19vue3实战-----菜单子树的展示
19vue3实战-----菜单子树的展示 1.实现目标2.实现思路3.实现步骤3.1新建config配置文件3.2封装组件3.3使用组件 1.实现目标 如上,以上效果的难点是“在表格里面实现树形结构”。可以用element-plus框架中的table作为辅助: 可以自己查看文档了解怎么使用。 2.实现思路 上面的…...
【AI大模型】Ollama部署本地大模型DeepSeek-R1,交互界面Open-WebUI,RagFlow构建私有知识库
文章目录 DeepSeek介绍公司背景核心技术产品与服务应用场景优势与特点访问与体验各个DeepSeek-R系列模型的硬件需求和适用场景 Ollama主要特点优势应用场景安装和使用配置环境变量总结 安装open-webui下载和安装docker desktop配置镜像源安装open-webui运行和使用 RagFlow介绍主…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
