Nginx 教程

Nginx 教程 Nginx 简介 Nginx 源码架构分析 Nginx 编译安装 Nginx(Tengine) 编译安装 Nginx(OpenResty) 编译安装 Nginx 配置简述 Nginx Docker 容器化配置

Nginx 核心配置指令

Nginx 核心配置指令 Nginx 配置文件 Nginx 进程配置指令 Nginx 端口监听:listen Nginx 主机名server_name Nginx 处理HTTP请求 Nginx 路由匹配规则:localhost Nginx 重定向配置:rewrite Nginx 根目录配置:root Nginx 访问路径别名:alias Nginx 文件判断:try_files Nginx 零复制:sendfile Nginx 日志记录配置

Nginx HTTP模块

Nginx 镜像模块 Nginx 请求头控制模块 Nginx IP访问控制模块 Nginx 用户cookie模块 Nginx 并发连接数限制模块 Nginx 首页处理模块 Nginx 请求频率限制模块 Nginx 页面缓存时间配置 Nginx gzip压缩及相关配置

Nginx Web服务

Nginx 静态资源服务器搭建 Nginx 文件下载服务器搭建 Nginx 伪动态SSI服务器 Nginx HTTPS服务器搭建 Nginx FastCGI模块配置简述 Nginx PHP服务器环境搭建 Nginx 基于FastCGI负载均衡 Nginx CGI网关接口 Nginx uWSGI模块配置 Nginx Python项目部署 Nginx 伪流媒体服务器搭建 Nginx HTTP2模块配置简述 Nginx WebDAV模块配置简述

Nginx 代理服务器

Nginx HTTP代理服务器 Nginx stream模块简述 Nginx TCP/UDP代理简述 Nginx 基于SSL的TCP代理服务器 Nginx gRPC代理服务器

Nginx 缓存

Nginx Web缓存配置 Nginx 代理缓存配置 Nginx Memcached 缓存模块 Nginx 反向代理缓存服务器配置 Nginx 客户端缓存控制

Nginx 负载均衡

Nginx 负载均衡模块 Nginx 负载均衡策略 Nginx 长连接负载均衡 Nginx upstream容错机制 Nginx upstream动态更新 Nginx TCP/UDP负载均衡

Nginx 日志管理监控

Nginx 日志分析简述 Nginx 访问日志配置 Nginx 错误日志配置 Nginx 日志归档配置 Nginx 日志分析工具 ELK Nginx 监控工具 Prometheus

Nginx 集群

LVS(Linux虚拟服务器)简介 Keepalived 配置简述 Nginx 集群负载搭建 Nginx 集群配置管理规划 Nginx 配置归档工具GitLab Nginx 配置修改工具Ansible Jenkins 安装与配置简述 Nginx 集群配置管理实例

Nginx 在 k8s 的应用

Kubernetes(k8s)系统简述 Kubernetes(k8s)集群部署 Kubernetes(k8s)网络通信 Nginx Ingress 简介 Nginx Ingress 安装部署 Nginx Ingress 配置映射 Nginx Ingress 注解


Nginx 伪动态SSI服务器

Nginx 可以通过 SSI 命令将多个超文本文件组合成一个页面文件发送给客户端。SSI(Server Side Include)是一种基于服务端的超文本文件处理技术。由于 SSI 仍是通过其他动态脚本语言获取动态数据的,所以此处将其归类为伪动态服务功能。

SSI 服务器可通过 SSI 命令实现诸多动态脚本语言的 HTML 模板功能,配合其他动态脚本服务的 API,完全可以实现前后端分离的 Web 应用。

1、配置指令

Nginx 是通过 ngx_http_ssi_module 模块实现 SSI 命令处理的,SSI 配置指令如下表所示。

指令名称  指令值格式  默认值 指令说明
ssi on 或 off off 启用 SSI 命令功能
ssi_last_modified on 或 off off  允许保留原始响应头中的属性字段 Last-Modified,默认配置下该字段会被移除
ssi_min_file_chunk size 1k 设置存储在磁盘上的响应数据的最小值,超过该值的文件使用 sendfile 功能发送
ssi_silent_errors on 或 off off 当指令值为 on 时,SSI 处理出现错误后不输出 errmsg 的内容
ssi_types mime-type...  text/html 设置 SSI 处理的 MIME 类型
ssi_value_length length 256   SSI 中变量值的最大长度

上述指令均可编写在 http、server、location 指令域中,ssi 指令还可编写在 if 指令域中。

2、SSI 命令

SSI 命令格式如下:

<!--# 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 文件配置样例如下:

<!--# 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中样例配置如下:

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")。

<!--# 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)。

<!--# set var="This_TEST" value="with a SSI test value" -->
<!--# echo var="This_TEST" -->

6) if

通过 if 命令可进行条件控制,且 if 命令支持正则判断。

<!--# if expr="$name != /text/" -->
    <!--# echo var="name" -->
<!--# endif -->
<!--# if expr="$name = /(.+)@(?P<domain>.+)/" -->
    <!--# echo var="domain" -->
<!--# else -->
    <!--# echo var="1" -->
<!--# endif -->

3、配置样例

根据 Nginx SSI 模块提供的功能可以搭建一个类似 HTML 框架的前端模板网站。模板目录规划如下:

├── _footer.html 
├── _header.html
├── _head.html
├── index.html
├── _sidebar.html
├── static
│     └── main.css
└── table.html

文件 _footer.html 内容如下:
  1. <div id="footer">
  2. <!--# config timefmt="%Y" -->&copy;<!--# echo var="date_local" --> Nginx
  3. SSI sample - All Rights Reserved.
  4. </div>
文件 _header.html 内容如下:
  1. <div id="logo">
  2. <img src="http://nginx.org/nginx.png" style="width: 100px;" alt="nginx">
  3. </div>
  4. <div id="header">
  5. <ul class="nav nav-pills">
  6. <li class="active"><a href="index.html">首页</a></li>
  7. <li><a href="table.html">表格测试</a></li>
  8. <li><a href="#">测试2</a></li>
  9. </ul>
  10. </div>
文件 _head.html 内容如下:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html>
  3. <head>
  4. <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
  5. <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
  6. <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
  7. <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
  8. <link rel="stylesheet" href="/static/main.css?v=12">
  9. </head>
文件 index.html 内容如下:
  1. <!--# block name="one" --><!--# endblock -->
  2. <!--# include file="_head.html" stub="one" -->
  3. <body>
  4. <div>
  5. <!--# include file="_header.html" stub="one" -->
  6. <!--# include file="_sidebar.html" stub="one" -->
  7. </div>
  8. <div id="section">
  9. <h1>Hello World</h1>
  10. </div>
  11. <!--# include file="_footer.html" stub="one" -->
  12. </body>
  13. </html>
文件 _sidebar.html 内容如下:
  1. <div id="sidebar">
  2. <ul class="nav navbar-nav">
  3. <li class="active"><a href="http://www.baidu.com" target="blank">百度</a></li>
  4. <li class="active"><a href="#">测试</a></li>
  5. </ul>
  6. </div>
首页页面效果如下图所示。

SSI框架首页
图:SSI框架首页

文件 table.html 内容如下:
  1. <!--# block name="one" --><!--# endblock -->
  2. <!--# include file="_head.html" stub="one" -->
  3. <body>
  4. <div>
  5. <!--# include file="_header.html" stub="one" -->
  6. <!--# include file="_sidebar.html" stub="one" -->
  7. </div>
  8. <div id="section">
  9. <table class="table">
  10. <caption>表格示例</caption>
  11. <thead>
  12. <tr>
  13. <th>省份</th>
  14. <th>省会</th>
  15. </tr>
  16. </thead>
  17. <tbody>
  18. <tr>
  19. <td>上海</td>
  20. <td>上海</td>
  21. </tr>
  22. <tr>
  23. <td>广东</td>
  24. <td>广州</td>
  25. </tr>
  26. </tbody>
  27. </table>
  28. </div>
  29. <!--# include file="_footer.html" stub="one" -->
  30. </body>
  31. </html>
表格页页面效果如下图所示。

SSI 框架表格页
图:SSI 框架表格页

Nginx 配置内容如下:
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;
    }
}