Nginx Web服务应用实战
1、静态文件服务器的搭建
静态文件服务器是指提供HTML文件访问或客户端可直接从中下载文件的Web服务器。对于图片、JavaScript或CSS文件等渲染页面外观的、不会动态改变内容的文件,大多数网站会单独提供以静态文件服务器的方式对其进行访问,实现动静分离的架构。
1.1、静态Web服务器
HTML是一种标记语言,提供HTML文件读取是Web服务器最基本的功能,Web服务器的配置样例如下:
bash
server {
listen 8080;
root /opt/nginx-web/www; # 存放静态文件的文件目录
location / {
index index.html;
}
location /js {
alias /opt/nginx-web/static/js/; # 存放JavaScript文件的文件目录
index index.html;
}
}
在以上配置中,每个server指令域等同于一个虚拟服务器,每个location指令域等同于一个虚拟目录。
1.2、文件下载服务器
在对外分享文件时,利用Nginx搭建一个简单的下载文件管理服务器,文件分享就会变得非常方便。利用Nginx的诸多内置指令可实现自动生成下载文件列表页、限制下载带宽等功能。配置样例如下:
bash
server {
listen 8080;
server_name localhost;
charset utf-8;
root /opt/nginx-web/files; # 文件存放目录
# 下载
location / {
autoindex on; # 启用自动首页功能
autoindex_format html; # 首页格式为HTML
autoindex_exact_size off; # 文件大小自动换算
autoindex_localtime on; # 按照服务器时间显示文件时间
default_type application/octet-stream;# 将当前目录中所有文件的默认MIME类型设置为
# application/octet-stream
if ($request_filename ~* ^.*?\.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){
# 当文件格式为上述格式时,将头字段属性Content-Disposition的值设置为"attachment"
add_header Content-Disposition: 'attachment;';
}
sendfile on; # 开启零复制文件传输功能
sendfile_max_chunk 1m; # 每个sendfile调用的最大传输量为1MB
tcp_nopush on; # 启用最小传输限制功能
aio on; # 启用异步传输
directio 5m; # 当文件大于5MB时以直接读取磁盘的方式读取文件
directio_alignment 4096; # 与磁盘的文件系统对齐
output_buffers 4 32k; # 文件输出的缓冲区大小为128KB
limit_rate 1m; # 限制下载速度为1MB
limit_rate_after 2m; # 当客户端下载速度达到2MB时进入限速模式
max_ranges 4096; # 客户端执行范围读取的最大值是4096B
send_timeout 20s; # 客户端引发传输超时时间为20s
postpone_output 2048; # 当缓冲区的数据达到2048B时再向客户端发送
chunked_transfer_encoding on; # 启用分块传输标识
}
}
1.3、伪动态SSI服务器
Nginx可以通过SSI命令将多个超文本文件组合成一个页面文件发送给客户端。SSI(Server Side Include)是一种基于服务端的超文本文件处理技术。由于SSI仍是通过其他动态脚本语言获取动态数据的,所以此处将其归类为伪动态服务功能。SSI服务器可通过SSI命令实现诸多动态脚本语言的HTML模板功能,配合其他动态脚本服务的API,完全可以实现前后端分离的Web应用。
1.3.1、配置指令
Nginx是通过ngx_http_ssi_module模块实现SSI命令处理的,SSI配置指令如表所示。

上述指令均可编写在http、server、location指令域中,ssi指令还可编写在if指令域中。
1.3.2、SSI命令
SSI命令格式如下:
bash
<!--# command parameter1=value1 parameter2=value2 ... -->
Nginx支持如下SSI命令。
-
(1)block
通过block命令可以定义一个超文本内容,该内容可以被include命令参数stub引用。超文本内容中可以包含其他SSI命令。
-
(2)include
通过include命令可以引入一个文件或请求响应的结果数据。参数有file(引入一个文件)、virtual(引入一个内部请求响应数据)、stub(引入一个block内容为默认数据)、wait(是否等待virtual参数发起请求处理完毕再处理SSI命令)、set(将virtual参数的响应内容输出到指定的变量)。
SSI文件配置样例如下:
bash<!--# block name="one" --> <!--# endblock --> # block one的内容为空 <!--# include file="footer.html" stub="one" --> # 引用文件footer.html的内容,若footer.html文件不存在或SSI命令出错,输出block one的内容 <!--# include virtual="/remote/body.php?argument=value" wait="yes" stub="one" set="body" --> # 引用内部请求的响应数据,等待请求完毕再处理SSI指令,若出错则输出block one的内容,成功则 # 把返回结果赋值给变量bodyNginx中样例配置如下:
bashlocation /remote/ { subrequest_output_buffer_size 128k; # 子请求的输出缓冲区大小是128KB ... }- include不支持".../"这样的相对路径。
- include参数set的响应数据大小通过指令subrequest_output_buffer_size设置。
-
(3)config
通过config命令可以设置SSI处理过程中使用的参数errmsg(SSI处理出错时输出的字符串)和timefmt(输出时间的格式,默认为"%A,%d-%b-%Y %H:%M:%S %Z")。
bash<!--# config errmsg="oh!出错了" timefmt="%A, %d-%b-%Y %H:%M:%S %Z" --> -
(4)set
通过set命令设置变量。参数有var(变量名)和value(变量值)。
-
(5)echo
通过echo命令输出变量的值。参数有encoding(HTML编码方式,默认为entity)、default(变量不存在时定义的默认输出,默认为none)。
bash<!--# set var="This_TEST" value="with a SSI test value" --> <!--# echo var="This_TEST" --> -
(6)if
通过if命令可进行条件控制,且if命令支持正则判断。
bash<!--# if expr="$name != /text/" --> <!--# echo var="name" --> <!--# endif --> <!--# if expr="$name = /(.+)@(?P<domain>.+)/" --> <!--# echo var="domain" --> <!--# else --> <!--# echo var="1" --> <!--# endif -->
1.3.3、配置样例
根据Nginx SSI模块提供的功能可以搭建一个类似HTML框架的前端模板网站。模板目录规划如下:
bash
├── _footer.html
├── _header.html
├── _head.html
├── index.html
├── _sidebar.html
├── static
│ └── main.css
└── table.html
文件_footer.html内容如下:
html
<div id="footer">
<!--# config timefmt="%Y" -->©<!--# echo var="date_local" --> Nginx
SSI sample - All Rights Reserved.
</div>
文件_header.html内容如下:
html
<div id="logo">
<img src="http://nginx.org/nginx.png" style="width: 100px;" alt="nginx">
</div>
<div id="header">
<ul class="nav nav-pills">
<li class="active"><a href="index.html">首页</a></li>
<li><a href="table.html">表格测试</a></li>
<li><a href="#">测试2</a></li>
</ul>
</div>
文件_head.html内容如下:
html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="/static/main.css?v=12">
</head>
文件index.html内容如下:
html
<!--# block name="one" --><!--# endblock -->
<!--# include file="_head.html" stub="one" -->
<body>
<div>
<!--# include file="_header.html" stub="one" -->
<!--# include file="_sidebar.html" stub="one" -->
</div>
<div id="section">
<h1>Hello World</h1>
</div>
<!--# include file="_footer.html" stub="one" -->
</body>
</html>
文件_sidebar.html内容如下:
html
<div id="sidebar">
<ul class="nav navbar-nav">
<li class="active"><a href="http://www.baidu.com" target="blank">百度</a></li>
<li class="active"><a href="#">测试</a></li>
</ul>
</div>
首页页面效果如图所示。

文件table.html内容如下:
html
<!--# block name="one" --><!--# endblock -->
<!--# include file="_head.html" stub="one" -->
<body>
<div>
<!--# include file="_header.html" stub="one" -->
<!--# include file="_sidebar.html" stub="one" -->
</div>
<div id="section">
<table class="table">
<caption>表格示例</caption>
<thead>
<tr>
<th>省份</th>
<th>省会</th>
</tr>
</thead>
<tbody>
<tr>
<td>上海</td>
<td>上海</td>
</tr>
<tr>
<td>广东</td>
<td>广州</td>
</tr>
</tbody>
</table>
</div>
<!--# include file="_footer.html" stub="one" -->
</body>
</html>
表格页页面效果如图所示。

Nginx配置内容如下:
bash
server {
listen 8081;
server_name localhost;
charset utf-8;
root /opt/nginx-web/nginx-ssi;
sendfile on;
ssi on; # 启用SSI命令解析支持
ssi_min_file_chunk 1k; # 存储在磁盘上的响应数据的最小值为1KB
ssi_value_length 1024; # SSI中变量值的最大长度为1024字节
ssi_silent_errors off; # 输出errmsg的内容
location / {
index index.html;
}
}