当前位置:   article > 正文

记一次 Docker Nginx 自定义 log_format 报错的解决方案_log_format" directive no dyconf_version config in

log_format" directive no dyconf_version config in

问题描述

1、服务版本

  • Docker:18.06
  • Nginx:1.20.2

2、Nginx 持久化目录

.
├── bak
│   └── img.zip
├── conf
│   ├── conf.d
│   ├── nginx.conf
│   └── nginx.conf.bak
├── html
│   ├── config.js
│   ├── favicon.ico
│   ├── html
│   ├── img
│   ├── index.html
│   ├── readme.md
│   ├── robots.txt
│   ├── static
│   └── update.sh
└── logs
    ├── access.log
    ├── cls_label_access.log
    ├── cls_label_error.log
    └── error.log
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

3、问题描述

当我修改 Nginx 配置文件 nginx.conf,并新增自定义 log_format,如下所示:

    log_format cls '$remote_addr - $remote_user [$time_local] '
                      '"$request" $status $body_bytes_sent '
                      '"$http_referer" "$http_user_agent" '
                      '"$http_x_forwarded_for" $request_id '
                      '$geoip_country_name $geoip_country_code '
                      '$geoip_region_name $geoip_city ';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

但重启 Nginx 容器时报如下错:

nginx: [emerg] unknown "geoip_country_name" variable
  • 1

经网上查阅了一下资料,原因是 Nginx 缺少 geoip 的相关库文件,需要在配置文件中通过 load_module 参数加载引用。但需要注意的是该参数的位置不能位于 events 后,否则会报如下的报错:

nginx: [emerg] "load_module" directive is specified too late in /etc/nginx/nginx.conf:11
  • 1

解决方案

1、nginx.conf 配置文件中全局加载 geoip 的相关库文件

cat nginx.conf

...
load_module modules/ngx_http_geoip_module.so;

events {
    worker_connections  1024;
}
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2、重启 Nginx 容器

docker restart nginx

# 查看nginx日志是否报错
docker logs -f nginx
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/321114
推荐阅读
相关标签
  

闽ICP备14008679号