# NGINX WebDAV、图像处理与特殊功能模块 ## 1. ngx_http_dav_module (WebDAV 模块) WebDAV (Web-based Distributed Authoring and Versioning) 是一种基于 HTTP 的协议扩展,允许客户端远程管理服务器上的文件。NGINX 的 `ngx_http_dav_module` 模块实现了 WebDAV 的基本功能。 ### 模块编译 该模块需要显式启用,默认不编译: ```bash ./configure --with-http_dav_module --add-module=/path/to/nginx-dav-ext-module ``` ### dav_methods 指令 设置允许的 WebDAV HTTP 方法。 **语法**:`dav_methods [off | method ...];` **可用方法**: | 方法 | 说明 | |------|------| | `PUT` | 上传文件到服务器 | | `DELETE` | 删除服务器上的文件 | | `MKCOL` | 创建目录 | | `COPY` | 复制文件或目录 | | `MOVE` | 移动或重命名文件/目录 | **配置示例**: ```nginx location /upload/ { root /var/www/files; dav_methods PUT DELETE MKCOL COPY MOVE; } ``` ### dav_ext_methods 指令 启用额外的 WebDAV 方法(需要第三方模块 `nginx-dav-ext-module`)。 **语法**:`dav_ext_methods [method ...];` **可用方法**: | 方法 | 说明 | |------|------| | `PROPFIND` | 获取文件/目录属性 | | `OPTIONS` | 获取服务器支持的方法 | | `LOCK` | 锁定资源 | | `UNLOCK` | 解锁资源 | **配置示例**: ```nginx location /webdav/ { root /var/www/webdav; dav_methods PUT DELETE MKCOL COPY MOVE; dav_ext_methods PROPFIND OPTIONS; } ``` ### create_full_put_path 指令 允许使用 PUT 方法创建不存在的中间目录。 **语法**:`create_full_put_path on | off;` **默认值**:`off` **配置示例**: ```nginx location /upload/ { root /var/www/files; dav_methods PUT; create_full_put_path on; # 允许自动创建父目录 } ``` ### min_delete_depth 指令 设置允许 DELETE 方法删除目录的最小深度。 **语法**:`min_delete_depth number;` **默认值**:`0`(允许删除任何目录) **配置示例**: ```nginx location /webdav/ { root /var/www/webdav; dav_methods DELETE; min_delete_depth 1; # 禁止删除根目录下的直接子目录 } ``` ### WebDAV 完整配置示例 ```nginx server { listen 80; server_name webdav.example.com; root /var/www/webdav; client_max_body_size 100m; # 限制上传文件大小 location / { dav_methods PUT DELETE MKCOL COPY MOVE; dav_ext_methods PROPFIND OPTIONS; create_full_put_path on; dav_access user:rw group:r all:r; # 设置文件权限 # 认证配置 auth_basic "WebDAV Authentication"; auth_basic_user_file /etc/nginx/webdav.htpasswd; # 允许的方法 if ($request_method !~ ^(OPTIONS|GET|HEAD|POST|PUT|DELETE|MKCOL|COPY|MOVE|PROPFIND)$) { return 405; } } } ``` ### 客户端配置 **Windows 资源管理器**: ``` 映射网络驱动器 -> \\webdav.example.com@80\DavWWWRoot ``` **macOS Finder**: ``` 前往 -> 连接服务器 -> http://webdav.example.com ``` **Linux (davfs2)**: ```bash sudo mount -t davfs http://webdav.example.com /mnt/webdav ``` --- ## 2. ngx_http_image_filter_module (图像处理模块) NGINX 的图像处理模块可以实时处理 JPEG、PNG、WebP 和 GIF 图像,支持调整大小、裁剪、旋转等操作。 ### 依赖安装 该模块依赖 **libgd** 库: ```bash # Ubuntu/Debian sudo apt-get install libgd-dev # CentOS/RHEL sudo yum install gd-devel # macOS brew install gd ``` ### 模块编译 ```bash ./configure --with-http_image_filter_module ``` ### image_filter 指令 定义图像处理操作。 **语法**:`image_filter (test | size | resize width height | crop width height | rotate 90|180|270);` **操作类型**: | 操作 | 说明 | |------|------| | `test` | 验证文件是否为有效图像,返回 204 或 415 | | `size` | 返回图像的 JSON 元数据(宽度、高度、类型) | | `resize width height` | 按比例调整大小,保持宽高比 | | `crop width height` | 裁剪到指定尺寸,从中心开始 | | `rotate 90\|180\|270` | 按指定角度旋转图像 | **配置示例**: ```nginx # 验证图像 location /img/test/ { image_filter test; } # 获取图像尺寸信息 location /api/img-size/ { image_filter size; } # 调整图像大小(最大 200x200,保持比例) location /img/thumb/ { proxy_pass http://backend; image_filter resize 200 200; image_filter_jpeg_quality 75; } # 裁剪图像为固定尺寸 location /img/crop/ { proxy_pass http://backend; image_filter crop 100 100; } ``` ### image_filter_jpeg_quality 指令 设置 JPEG 图像处理的质量。 **语法**:`image_filter_jpeg_quality quality;` **默认值**:`75` **范围**:`1-100` **配置示例**: ```nginx location /img/jpeg/ { proxy_pass http://backend; image_filter resize 800 -; # - 表示自动计算高度 image_filter_jpeg_quality 85; } ``` ### image_filter_webp_quality 指令 设置 WebP 图像处理的质量。 **语法**:`image_filter_webp_quality quality;` **默认值**:`80` **范围**:`1-100` **配置示例**: ```nginx location /img/webp/ { proxy_pass http://backend; image_filter resize 800 -; image_filter_webp_quality 90; } ``` ### image_filter_transparency 指令 定义是否保留透明通道(PNG/WebP)。 **语法**:`image_filter_transparency on | off;` **默认值**:`on` **配置示例**: ```nginx location /img/png/ { proxy_pass http://backend; image_filter resize 200 200; image_filter_transparency on; } ``` ### 动态图片处理示例 ```nginx server { listen 80; server_name images.example.com; # 原始图像 location /original/ { alias /var/www/images/; } # 缩略图 200x200 location /thumb/ { alias /var/www/images/; image_filter resize 200 200; image_filter_jpeg_quality 75; image_filter_buffer 10M; # 限制源文件大小 } # 中等尺寸 800x600 location /medium/ { alias /var/www/images/; image_filter resize 800 600; image_filter_jpeg_quality 85; } # 带缓存的动态处理 location /dynamic/ { proxy_pass http://localhost:8080; image_filter resize $arg_w $arg_h; image_filter_jpeg_quality $arg_q; proxy_cache img_cache; proxy_cache_valid 200 24h; } } # 缓存配置 http { proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=img_cache:10m max_size=1g; } ``` ### 安全注意事项 ```nginx location /img/ { # 限制最大图像尺寸 image_filter_buffer 10M; # 限制源文件大小 image_filter_size 10M; # 限制输出文件大小 # 限制 resize 参数 image_filter resize 2000 2000; # 最大输出尺寸 proxy_pass http://backend; } ``` --- ## 3. ngx_http_random_index_module (随机索引模块) 该模块从目录中随机选择一个文件作为索引文件,适用于随机展示内容。 ### random_index 指令 启用或禁用随机索引。 **语法**:`random_index on | off;` **默认值**:`off` **上下文**:`location` **配置示例**: ```nginx server { listen 80; server_name gallery.example.com; location / { root /var/www/gallery; random_index on; # 从目录随机选择文件作为首页 } } ``` ### 应用场景 - **随机图片展示**:每次访问显示不同的图片 - **轮播广告**:随机展示广告内容 - **A/B 测试**:随机分配不同页面版本 --- ## 4. ngx_http_empty_gif_module (空 GIF 模块) 该模块生成一个 1x1 像素的透明 GIF 图像,常用于追踪像素、占位符等场景。 ### empty_gif 指令 返回 1x1 像素的透明 GIF。 **语法**:`empty_gif;` **上下文**:`location` **配置示例**: ```nginx server { listen 80; # 追踪像素 location = /track.gif { empty_gif; access_log /var/log/nginx/track.log tracking; } # 广告占位符 location = /ad/placeholder.gif { empty_gif; } } ``` ### 追踪像素用途 ```nginx # 统计访问数据 log_format tracking '$remote_addr - $time_local "$request" ' '$http_referer "$http_user_agent" ' '$cookie_sessionid'; server { location = /pixel.gif { empty_gif; access_log /var/log/nginx/pixel.log tracking; # 设置追踪 cookie add_header Set-Cookie "visited=1; Path=/; Max-Age=86400"; } } ``` ### 性能优势 - 不读取磁盘文件,内存中直接返回 - 极小的响应体(43 字节) - 零 I/O 开销 --- ## 5. ngx_http_flv_module / ngx_http_mp4_module (流媒体模块) 这两个模块支持 FLV 和 MP4 视频的伪流式传输(pseudo-streaming),允许用户从视频任意位置开始播放。 ### 模块编译 ```bash ./configure --with-http_flv_module --with-http_mp4_module ``` ### FLV 伪流式传输 FLV 模块支持 `start` 参数,允许从指定字节位置开始播放。 **配置示例**: ```nginx server { listen 80; server_name video.example.com; location ~ \.flv$ { root /var/www/videos; flv; # 启用 FLV 伪流式传输 # 支持 ?start= 参数 # 例如:http://video.example.com/movie.flv?start=1024000 } } ``` ### MP4 伪流式传输 MP4 模块支持更精确的基于时间的定位。 **配置示例**: ```nginx server { listen 80; server_name video.example.com; location ~ \.mp4$ { root /var/www/videos; mp4; # 启用 MP4 伪流式传输 mp4_buffer_size 1m; # 设置 MP4 元数据缓冲区大小 mp4_max_buffer_size 10m; # 设置 MP4 元数据最大缓冲区 } } ``` ### MP4 模块指令 | 指令 | 说明 | 默认值 | |------|------|--------| | `mp4` | 启用 MP4 伪流式传输 | - | | `mp4_buffer_size` | 初始元数据缓冲区大小 | `512K` | | `mp4_max_buffer_size` | 最大元数据缓冲区大小 | `10M` | ### 流媒体配置示例 ```nginx server { listen 80; server_name video.example.com; root /var/www/videos; # MP4 视频 location ~ \.mp4$ { mp4; mp4_buffer_size 1m; mp4_max_buffer_size 5m; # 添加 CORS 头 add_header Access-Control-Allow-Origin "*"; } # FLV 视频 location ~ \.flv$ { flv; add_header Access-Control-Allow-Origin "*"; } # 限速(可选) limit_rate_after 5m; limit_rate 500k; } ``` ### 客户端播放器示例 **Video.js**: ```html ``` **Flowplayer**: ```html