Nginx Web服务应用实战
7、HTTP增强协议服务器的搭建
7.1、HTTP/2协议服务
HTTP/2是HTTP协议的2.0版本,该协议通过多路复用、请求优化、HTTP头压缩等功能提升网络传输速度、优化用户体验。HTTP/2使用二进制分帧层将传输的数据分割为更小的数据和帧,并对它们进行二进制格式编码处理,以实现在不改变HTTP现有语义等标准的基础上提升传输性能,从而降低响应延迟、提高请求吞吐的能力。HTTP/2通过多路复用技术使客户端可以并行发送多个请求,以提高带宽的利用率。HTTP/2是基于SPDY协议设计的,是SPDY的演进版本,但其不强制使用HTTPS协议,仍可支持HTTP明文传输。Nginx是通过ngx_http_v2_module实现HTTP/2协议支持的,编译配置时可通过增加参数--with-http_v2_module启用HTTP2模块。HTTP2模块配置指令如下。

- http2_recv_buffer_size指令可编写在http指令域中。
- http2_chunk_size、http2_push、http2_push_preload指令可编写在http、server、location指令域中。
- 其余的指令可编写在http、server指令域中。
HTTP2服务器推送可以实现将多个资源文件(CSS、JS、图片等)同时发送到客户端,如下页面中包含style.css和nginx.png两个资源文件。
html
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<title>Nginx HTTPv2 Test</title>
<head>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Nginx HTTPv2 Test</h1>
<img src="nignx.png">
</body>
</html>
在没有服务器推送的情况下,客户端通过3个GET方法获取该页面的所有资源。在启用服务器推送后客户端只需通过一个GET方法,就可以获取到该页面的所有资源。配置样例如下:
bash
server {
listen 443 ssl http2 default_server;
ssl_certificate ssl/www_nginxbar_org.pem; # 网站证书文件
ssl_certificate_key ssl/www_nginxbar_org.key; # 网站证书密钥文件
ssl_password_file ssl/www_nginxbar_org.pass; # 网站证书密钥密码文件
root /opt/nginx-web;
location / {
http2_push /style.css # 服务端推送
http2_push /nginx.png # 服务端推送
}
}
7.2、WebDAV协议服务
WebDAV(Web-based Distributed Authoring andVersioning)是基于HTTP/1.1的增强协议。该协议使用户可以直接对Web服务器进行文件读写,并支持对文件的版本控制和写文件的加锁及解锁等操作。Nginx通过ngx_http_dav_module模块实现对WebDAV协议的支持,使用户通过WebDAV模块的配置指令实现文件的管理操作,该模块支持WebDAV协议的PUT、DELETE、MKCOL、COPY和MOVE请求方法,在配置编译参数时,需要添加--with-http_dav_module参数启用该功能。ngx_http_dav_module模块的配置指令如表所示。

上述指令都可编写在http、server、location指令域中。
Nginx的自有模块对WebDAV协议的支持并不完整,可以通过第三方模块nginx-dav-ext-module增加文件特性查找和对写文件的加锁与解锁支持。ngx_http_dav_module模块的配置指令如表所示。

- dav_ext_lock_zone指令只能编写在http指令域中。
- dav_methods和dav_ext_lock指令可编写在http、server、location指令域中。
- WebDAV协议方法及方法说明如表所示。

进行WebDAV协议的MOVE/COPY操作时,会通过HTTP请求头属性字段Destination指定目标路径,如果客户端请求头中没有字段Destination, Nginx会直接报错。为增加服务端兼容性,可以通过第三方模块headers-more-nginx-module的more_set_input_headers指令在MOVE/COPY操作的HTTP请求头中强制添加Destination字段。
WebDAV协议服务配置过程如下所示。
-
(1)模块编译
模块编译配置样例如下:bash# 编译模块 $ ./configure --with-http_dav_module --add-module=../nginx-dav-ext-module --add-module=../headers-more-nginx-module -
(2)设置文件夹权限
文件夹权限配置样例如下:bashchown -R nobody:nobody /opt/nginx-web/davfile chmod -R 700 /opt/nginx-web/davfile -
(3)设置登录账号及密码
登录账号及密码配置样例如下:bashecho "admin:$(openssl passwd 123456)" >/etc/nginx/conf/.davpasswd -
(4)Nginx配置
Nginx配置样例如下:bashdav_ext_lock_zone zone=davlock:10m; # DAV文件锁内存共享区 server { listen 443 ssl http2; # 启用HTTPS及HTTP/2提升传输性能 server_name dav.nginxbar.org; access_log logs/webdav.access.log main; root /opt/nginx-web/davfile; ssl_certificate ssl/www_nginxbar_org.pem; # 网站证书文件 ssl_certificate_key ssl/www_nginxbar_org.key; # 网站证书密钥文件 ssl_password_file ssl/www_nginxbar_org.pass; # 网站证书密钥密码文件 ssl_session_cache shared:SSL:10m; # 会话缓存存储大小为10MB ssl_session_timeout 20m; # 会话缓存超时时间为20分钟 client_max_body_size 20G; # 最大允许上传的文件大小 location / { autoindex on; autoindex_localtime on; set $dest $http_destination; if (-d $request_filename) { # 对目录请求、对URI自动添加"/" rewrite ^(.*[^/])$ $1/; set $dest $dest/; } if ($request_method ~ (MOVE|COPY)) { # 对MOVE|COPY方法强制添加Destination请求头 more_set_input_headers 'Destination: $dest'; } if ($request_method ~ MKCOL) { rewrite ^(.*[^/])$ $1/ break; } dav_methods PUT DELETE MKCOL COPY MOVE; # DAV支持的请求方法 dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;# DAV扩展支持的请求方法 dav_ext_lock zone=davlock; # DAV扩展锁绑定的内存区域 create_full_put_path on; # 启用创建目录支持 dav_access user:rw group:r all:r; # 设置创建的文件及目录的访问权限 auth_basic "Authorized Users WebDAV"; auth_basic_user_file /etc/nginx/conf/.davpasswd; } }
主流操作系统均支持WebDAV协议,用户既可以直接通过添加网络设备的方式添加WebDAV网站目录,也可以使用支持WebDAV协议的客户端进行访问。