Nginx 怎么在 Nginx 中配置访问日志记录客户端的设备类型与操作系统信息

夏静姑娘_1531

夏静姑娘_1531

2026-08-18

646人浏览

原创

Nginx 默认不解析 User-Agent,但可通过 OpenResty 集成 lua-resty-useragent 实现设备与系统识别;若无 Lua 环境,可用 map 正则粗略匹配,但精度较低。

nginx 怎么在 nginx 中配置访问日志记录客户端的设备类型与操作系统信息

Nginx 本身不直接解析 User-Agent 字符串来识别设备类型(如手机、平板、桌面)或操作系统(如 iOS、Android、Windows),但可以通过 log_format 结合第三方模块或 Lua 脚本实现。最常用、轻量且生产可用的方式是使用 ngx_http_lua_module(OpenResty)配合成熟的 UA 解析库(如 lua-resty-useragent)。

前提:使用 OpenResty 或编译 Lua 支持

标准 Nginx 不含 Lua,需改用 OpenResty(推荐),或自行编译 Nginx 并添加 lua-nginx-module。确认已安装后,在配置中可使用 set_by_lua* 指令提取 UA 特征。

  • 检查是否支持 Lua:nginx -V 2>&1 | grep -o with-http-lua-module,有输出即支持
  • 若未安装,建议直接下载 OpenResty(自带 Lua 环境和常用库)

定义日志格式并注入设备与系统字段

在 http 块中定义带 $device_type 和 $os_name 的日志格式,并用 Lua 变量填充:

http {
    # 加载 Lua 模块(OpenResty 默认已加载)
    lua_package_path "/path/to/lua-resty-useragent/lib/?.lua;;";
<pre class="brush:php;toolbar:false;"># 初始化 UA 解析器(可选:全局复用提升性能)
init_worker_by_lua_block {
    local useragent = require "resty.useragent"
    -- 可预编译正则或缓存,此处简化
}

# 定义变量,由 Lua 计算
map $http_user_agent $device_type {
    default "unknown";
    "" "empty";
}
map $http_user_agent $os_name {
    default "unknown";
    "" "empty";
}

# 实际解析逻辑放在 server 或 location 中
server {
    location / {
        # 使用 set_by_lua* 提取信息(注意:不能在 log_format 中直接调用 Lua,需提前赋值)
        set_by_lua $device_type '
            local useragent = require "resty.useragent"
            local ua = ngx.var.http_user_agent or ""
            local info = useragent:new(ua)
            return info:device_type() or "unknown"
        ';

        set_by_lua $os_name '
            local useragent = require "resty.useragent"
            local ua = ngx.var.http_user_agent or ""
            local info = useragent:new(ua)
            return info:os_name() or "unknown"
        ';

        # 自定义日志格式(含新字段)
        log_format extended '$remote_addr - $remote_user [$time_local] '
                            '"$request" $status $body_bytes_sent '
                            '"$http_referer" "$http_user_agent" '
                            '$device_type $os_name';

        access_log /var/log/nginx/access.log extended;
        ...
    }
}

}

替代方案:纯 Nginx 正则匹配(简单场景适用)

若无法部署 Lua,可用 map 指令做粗粒度 UA 字符串匹配,适合只需区分「移动端 vs PC」的场景:

协同养育操作系统
协同养育操作系统

协同养育操作系统(Co-Parenting OS)— 离异家庭专业协同养育支持系统。12模块覆盖接送管理、成长记忆库、孩子观察站、亲子关系粘合剂、共同挑战中心、情绪冲突观察、父母成长、成长档案馆、成长阶段引擎、风险预警、驾驶舱、被恶意攻击急救包。当用户涉及离异家庭育儿、协同养育、抚养探视、接送安排、孩子成长记录、亲子关系、离异冲突、被恶意攻击、前任矛盾等话题时触发。

下载
map $http_user_agent $device_type {
    ~*(Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|WPDesktop) "mobile";
    ~*(Tablet|iPad) "tablet";
    default "desktop";
}
<p>map $http_user_agent $os_name {
~<em>Windows "Windows";
~</em>Mac OS X "macOS";
~<em>Linux "Linux";
~</em>Android "Android";
~*iPhone|iPad "iOS";
default "unknown";
}</p><p>log_format ua_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$device_type $os_name';</p><p>access_log /var/log/nginx/access.log ua_log;</p>

⚠️ 注意:正则方式易误判(如某些桌面浏览器 UA 含 “Mobile”),且无法识别新版系统或小众设备,仅作基础分类。

验证与调试技巧

启用后,检查日志是否输出预期字段,并用 curl 模拟不同 UA 测试:

  • 查日志实时输出:tail -f /var/log/nginx/access.log
  • 模拟 iPhone 请求:curl -H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)..." http://your-site/
  • 模拟 Windows Chrome:curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..." http://your-site/
  • 若字段为空,检查 Lua 模块路径、语法错误(nginx -t)、或 UA 字符串是否为空

不复杂但容易忽略的是变量作用域和执行时机——set_by_lua 必须在日志写入前完成赋值,且不能放在 log_format 内部。用 OpenResty + resty-useragent 是目前最可靠、可扩展的方案。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

nginx 操作系统

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
视频服务器配置参数有哪些
视频服务器配置参数有哪些

视频服务器配置参数有处理器、内存、存储、视频编解码器、网络接口、视频输入输出接口、操作系统、安全性、环境适应性和成本。在搭建视频服务器时,需要根据实际需求和预算,合理选择这些参数,以实现高性能、高稳定性和低成本的目标。

2023.10.17

3960

11

linux的操作系统介绍
linux的操作系统介绍

Linux是一个灵活、稳定、安全的操作系统,适用于各种不同的应用场景,从个人电脑到服务器和嵌入式系统。想了解更多Linux的相关内容,可以阅读本专题下面的文章。

2024.03.20

3166

12

Linux操作系统的主要用途
Linux操作系统的主要用途

Linux操作系统用途广泛,包括:服务器运营,软件开发,科学研究和教育,嵌入式系统,以及个人电脑和笔记本电脑。想了解更多Linux的相关内容,可以阅读本专题下面的文章。

2024.03.21

5339

8

linux操作系统的作用
linux操作系统的作用

linux操作系统在以下领域发挥着关键作用:服务器和云计算;嵌入式系统;个人电脑和笔记本电脑;超级计算;其他领域等等。想了解更多linux操作系统的相关内容,可以阅读本专题下面的文章。

2024.04.12

2515

5

有哪些常见的网络操作系统
有哪些常见的网络操作系统

常见的网络操作系统有windows server、linux、unix、macos server、freebsd、cisco ios、juniper junos和hp-ux等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.09.12

3064

6

32位操作系统怎么改成62位的
32位操作系统怎么改成62位的

要将 32 位操作系统升级到 64 位,需要遵循以下步骤:1. 检查硬件和软件兼容性;2. 备份数据;3. 获取 64 位操作系统;4. 创建可启动安装媒体;5. 从安装媒体启动计算机;6. 选择“升级”选项;7. 完成安装。

2025.04.02

3263

9

nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

383

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3167

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

5785

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习