Nginx应用与运维——Nginx Web服务应用实战(静态文件服务器的搭建)

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" -->&nbsp;<!--# 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的内容,成功则
        # 把返回结果赋值给变量body

    Nginx中样例配置如下:

    bash 复制代码
    location /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" -->&copy;<!--# 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;
    }
}
相关推荐
海宇服务1 小时前
零信任架构实战:基于海宇身份证OCR构建自动化自助终端核验网关
运维·人工智能·架构·自动化
y = xⁿ1 小时前
关于Agent工程落地
前端·人工智能·python
ken22321 小时前
ubuntu 24.04, audacity 4 AppImage 加载 libavdevice.so.62 /.61 /.63 失败:依赖缺失?
linux·运维·ubuntu
web打印社区1 小时前
JS 静默打印怎么做:纯前端为什么不行,以及最小可跑通写法
开发语言·前端·javascript·websocket·网络协议·http·pdf
web打印社区2 小时前
HTML5 静默打印:前端页面怎么调用打印机且尽量不弹窗
前端·javascript·vue.js·pdf·html·html5
Python大数据分析2 小时前
开源免费、AI 驱动的 Web 打印设计器 OpenPrint:从拖拽设计到 ERP 对接全流程实战
前端·人工智能·开源
未完成的歌~2 小时前
Windows 系统镜像备份还原 操作手册
运维
阳光九叶草LXGZXJ2 小时前
达梦数据库-学习-69-DM9主备集群部署
linux·运维·服务器·数据库·sql·学习
溪语流沙2 小时前
【每天一个CSS | Day11】赛博朋克故障风文字:红青分离 + 切片抖动
前端·css