ngx_log_init

定义在 src\core\ngx_log.c

ngx_log_t *
ngx_log_init(u_char *prefix, u_char *error_log)
{
    u_char  *p, *name;
    size_t   nlen, plen;

    ngx_log.file = &ngx_log_file;
    ngx_log.log_level = NGX_LOG_NOTICE;

    if (error_log == NULL) {
        error_log = (u_char *) NGX_ERROR_LOG_PATH;
    }

    name = error_log;
    nlen = ngx_strlen(name);

    if (nlen == 0) {
        ngx_log_file.fd = ngx_stderr;
        return &ngx_log;
    }

    p = NULL;

#if (NGX_WIN32)
    if (name[1] != ':') {
#else
    if (name[0] != '/') {
#endif

        if (prefix) {
            plen = ngx_strlen(prefix);

        } else {
#ifdef NGX_PREFIX
            prefix = (u_char *) NGX_PREFIX;
            plen = ngx_strlen(prefix);
#else
            plen = 0;
#endif
        }

        if (plen) {
            name = malloc(plen + nlen + 2);
            if (name == NULL) {
                return NULL;
            }

            p = ngx_cpymem(name, prefix, plen);

            if (!ngx_path_separator(*(p - 1))) {
                *p++ = '/';
            }

            ngx_cpystrn(p, error_log, nlen + 1);

            p = name;
        }
    }

    ngx_log_file.fd = ngx_open_file(name, NGX_FILE_APPEND,
                                    NGX_FILE_CREATE_OR_OPEN,
                                    NGX_FILE_DEFAULT_ACCESS);

    if (ngx_log_file.fd == NGX_INVALID_FILE) {
        ngx_log_stderr(ngx_errno,
                       "[alert] could not open error log file: "
                       ngx_open_file_n " \"%s\" failed", name);
#if (NGX_WIN32)
        ngx_event_log(ngx_errno,
                       "could not open error log file: "
                       ngx_open_file_n " \"%s\" failed", name);
#endif

        ngx_log_file.fd = ngx_stderr;
    }

    if (p) {
        ngx_free(p);
    }

    return &ngx_log;
}

ngx_log_init 函数是 Nginx 中用于初始化错误日志的核心函数

参数解析

  • prefix : 日志路径的前缀(通常是 Nginx 安装目录的路径)。如果日志路径是相对路径,则会基于此前缀构建完整路径。
  • error_log : 指定的日志文件路径。如果为 NULL,则使用默认路径 NGX_ERROR_LOG_PATH

ngx_log_t *
ngx_log_init(u_char *prefix, u_char *error_log)
{
    u_char  *p, *name;
    size_t   nlen, plen;

    ngx_log.file = &ngx_log_file;
    ngx_log.log_level = NGX_LOG_NOTICE;
  • 将全局日志对象 ngx_log 的文件指针指向 ngx_log_file
  • 设置默认日志级别为 NGX_LOG_NOTICE(通知级别)。

    if (error_log == NULL) {
        error_log = (u_char *) NGX_ERROR_LOG_PATH;
    }

 未指定 error_log 时,则使用默认路径 NGX_ERROR_LOG_PATH

此时 

error_log=(null)

被赋值为 NGX_ERROR_LOG_PATH 后
error_log=/home/wsd/桌面/nginx/LOG/error.log


    name = error_log;
    nlen = ngx_strlen(name);

ngx_strlen 获取字符串长度,不包括结束符

此时

nlen=36


    if (nlen == 0) {
        ngx_log_file.fd = ngx_stderr;
        return &ngx_log;
    }

此时条件不成立


    p = NULL;

#if (NGX_WIN32)
    if (name[1] != ':') {
#else
    if (name[0] != '/') {
#endif

if (name[0] != '/') {

检查路径是否以 / 开头

此时 name=/home/wsd/桌面/nginx/LOG/error.log

是以 开头
所以当前 name 已经是绝对路径了,不需要拼接前缀

    ngx_log_file.fd = ngx_open_file(name, NGX_FILE_APPEND,
                                    NGX_FILE_CREATE_OR_OPEN,
                                    NGX_FILE_DEFAULT_ACCESS);

以追加的方式打开 name 指向的 日志文件 

ngx_open_file-优快云博客

此时 

ngx_log_file.fd=4


    if (ngx_log_file.fd == NGX_INVALID_FILE) {
        ngx_log_stderr(ngx_errno,
                       "[alert] could not open error log file: "
                       ngx_open_file_n " \"%s\" failed", name);
#if (NGX_WIN32)
        ngx_event_log(ngx_errno,
                       "could not open error log file: "
                       ngx_open_file_n " \"%s\" failed", name);
#endif

        ngx_log_file.fd = ngx_stderr;
    }

NGX_INVALID_FILE

#define NGX_INVALID_FILE         -1

-1 无效的文件描述符

文件打开失败

记录错误日志

此时

ngx_log_file.fd=4

条件不成立


    if (p) {
        ngx_free(p);
    }

由于 此次 name 在一开始是绝对路径,没有使用 p

所以 p 还是初始值 NULL

条件不成立


return &ngx_log;

最后返回 ngx_log 的地址

内容概要:本文档主要介绍了Intel Edge Peak (EP) 解决方案,涵盖从零到边缘高峰的软件配置和服务管理。EP解决方案旨在简化客户的入门门槛,提供一系列工具和服务,包括Edge Software Provisioner (ESP),用于构建和缓存操作系统镜像和软件栈;Device Management System (DMS),用于远程集群或本地集群管理;以及Autonomous Clustering for the Edge (ACE),用于自动化边缘集群的创建和管理。文档详细描述了从软件发布、设备制造、运输、安装到最终设备激活的全过程,并强调了在不同应用场景(如公共设施、工业厂房、海上油井和移动医院)下的具体部署步骤和技术细节。此外,文档还探讨了安全设备注册(FDO)、集群管理、密钥轮换和备份等关键操作。 适合人群:具备一定IT基础设施和边缘计算基础知识的技术人员,特别是负责边缘设备部署和管理的系统集成商和运维人员。 使用场景及目标:①帮助系统集成商和客户简化边缘设备的初始配置和后续管理;②确保设备在不同网络环境下的安全启动和注册;③支持大规模边缘设备的自动化集群管理和应用程序编排;④提供详细的密钥管理和集群维护指南,确保系统的长期稳定运行。 其他说明:本文档是详细描述了Edge Peak技术及其应用案例。文档不仅提供了技术实现的指导,还涵盖了策略配置、安全性和扩展性的考虑,帮助用户全面理解和实施Intel的边缘计算解决方案。
### 使用 Docker 部署 ngx_lua_waf 的方法 #### 一、Docker 容器化部署 OpenResty 和 ngx_lua_waf 为了在容器环境中成功部署 `ngx_lua_waf`,需要完成以下几个核心步骤: 1. **安装基础依赖** 在基于 OpenResty 的镜像中,首先需确保已安装必要的开发工具链以及 Nginx 扩展模块支持。这可以通过下载并编译 `ngx_devel_kit` 和 `lua-nginx-module` 来实现[^2]。 2. **构建自定义 OpenResty 镜像** 创建一个 Dockerfile 文件来定制 OpenResty 环境,并集成 WAF 功能所需的 Lua 脚本插件。以下是示例 Dockerfile 内容: ```dockerfile FROM openresty/openresty:alpine RUN apk add --no-cache build-base pcre-dev zlib-dev git \ && mkdir -p /usr/local/src \ && cd /usr/local/src \ && wget -O ngx_devel_kit.tar.gz https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1.tar.gz \ && tar zxvf ngx_devel_kit.tar.gz \ && wget -O lua_nginx_module.tar.gz https://github.com/openresty/lua-nginx-module/archive/v0.10.14.tar.gz \ && tar zxvf lua_nginx_module.tar.gz # 编译 OpenResty 并启用扩展模块 RUN OPENRESTY_PREFIX=/usr/local/openresty/nginx \ && ./configure --with-http_ssl_module \ --add-dynamic-module=/usr/local/src/ngx_devel_kit-0.3.1 \ --add-dynamic-module=/usr/local/src/lua-nginx-module-0.10.14 \ && make && make install # 安装 waf 插件及其依赖项 RUN luarocks install lua-resty-t1k \ && git clone https://github.com/unixhot/ngx_lua_waf.git /etc/nginx/waf/ CMD ["openresty", "-g", "daemon off;"] ``` 上述文件描述了一个完整的构建过程,包括从源码获取必要组件到最终启动服务的命令序列。 3. **配置 Nginx 及 WAF 参数** 将 `ngx_lua_waf` 加载至 Nginx 中涉及修改其主配置文件 `/etc/nginx/nginx.conf` 或者特定站点配置文件中的 location 块部分。例如,在 http{} 段加入如下指令即可激活防护机制: ```nginx init_by_lua_file /etc/nginx/waf/init.lua; access_by_lua_file /etc/nginx/waf/access.lua; log_by_lua_file /etc/nginx/waf/log.lua; server { listen 80 default_server; location / { proxy_pass http://backend_service; } } ``` 此外还需调整内部逻辑以适配实际业务需求,比如 IP 黑白名单管理、请求频率限制等策略均可以在对应的 Lua 脚本里设定[^4]。 --- #### 二、常见注意事项与调试技巧 当遇到错误提示 “if (tonumber(count)>3) then”,通常是因为 Redis 数据读取失败返回 nil 导致无法正常转换成数值型变量参与运算。因此建议增加额外校验措施防止异常中断程序执行流: ```lua local count = tonumber(redis:get('key')) if not count or type(count) ~= 'number' then count = 0 end if count > 3 then -- 处理超出阈值的情况 end ``` 另外关于日志记录功能也非常重要,它可以帮助快速定位问题所在位置。可以利用标准库函数 ngx.log() 输出诊断信息以便后续排查原因。 --- ### 总结 综上所述,借助 Docker 技术能够极大地简化复杂 Web 应用的安全加固工作量。通过预先准备好的模板工程配合自动化脚本来加速整个交付周期的同时还能保持高度灵活性满足不同场景下的个性化定制诉求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值