Alpine安装Nginx已编译upload_progress模块却提示未知指令
问题根因
nginx -V输出中的--add-dynamic-module参数说明:nginx-upload-progress-module是作为动态模块编译的,没有静态链接到Nginx主二进制文件中,必须在Nginx配置的最开头显式加载对应模块的.so文件,才能使用模块提供的upload_progress指令。
Alpine官方源的Nginx包将绝大多数第三方模块都编译为动态模块存放在/usr/lib/nginx/modules/目录下,不会默认自动加载,这就是编译参数中存在模块、配置语法无错误,但Nginx仍然识别不到对应指令的核心原因。
修复步骤
- 第一步:验证模块文件是否存在,进入容器执行以下命令:
ls /usr/lib/nginx/modules/ngx_http_uploadprogress_module.so
如果提示文件不存在,执行命令安装对应动态模块包即可:
apk add nginx-mod-http-upload-progress
- 第二步:修改
nginx.conf,在配置文件最顶部(worker_processes指令之前)添加动态模块加载指令:
load_module modules/ngx_http_uploadprogress_module.so;
- 第三步:修正后的完整配置开头示例如下,其余原有配置保持不变即可:
# nginx.conf load_module modules/ngx_http_uploadprogress_module.so; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; upload_progress uploads 1m; types_hash_max_size 4096; client_max_body_size 1000M; sendfile on; keepalive_timeout 600; server { server_name aldrune.com; autoindex off; listen 80; root /frontend; location /session_audio/ { #CORS add_header Access-Control-Allow-Origin '*'; alias /audiomedia/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } }
- 第四步:重新执行
nginx -t验证配置合法性,此时不会再报unknown directive "upload_progress"错误。
补充说明
Alpine源的Nginx中,所有编译参数带=dynamic后缀、以及通过--add-dynamic-module编译的模块,都需要通过load_module指令手动加载,加载语句必须放在全局配置块最开头,不能放在http、events等块内部。后续如果需要使用其他第三方模块(比如brotli压缩、headers-more、lua模块等),也需要先确认对应动态模块.so文件路径,在配置顶部加载后才能使用对应指令。
内容的提问来源于stack exchange,提问作者Philipp Doerner
相关产品推荐
相关产品推荐

