zhaoyu@home:~$

nginx-模块配置

http core 模块配置

Nginx整个应用使用模块化构建。每个模块可以在编译的时候禁用或者启用。开发者也可以创建自己的模块。

Rewrite模块

Rewrite定义了一种全新级别的请求处理方式。该模块的主要目的是执行URL重写。URL重写可以将常规的URL如 http://example.com/article.php?id=1234&comment=32 转换成可读性更高的URL,如:http://website.com/article-1234-32-USeconomy-strengthens.html 同时对搜索引擎更加友好,URL重写是搜索引擎优化(SEO)的一个关键因素。

内部请求

Nginx将请求分为内部和外部,外部请求直接面向客户端,而内部请求通过指定的指令触发。在默认的Nginx模块中,如下指令会产生内部请求:error_page,index, rewrite,try_files,add_before_body, add_after_body,include。 内部请求可以分为两种:

  1. 内部重定向:

将客户端请求在内部重定向,URI会被改变,最常用的是Rewrite指令,允许我们重写request URI。

  1. 子请求:

内部触发额外的请求产生内容,对主请求进行补充,add_after_body让我们可以指定URI,在原请求处理完成后,处理这个URI,将产生的内容附加到原请求的body中。

常用内部请求指令如下:

  • error_page

当出现一个指定错误码时,服务器如何处理。通常的做法是指向一个错误页面。

  • rewrite

rewrite指令产生一个内部的重定向。如下例子将/documents/重定向到内部路径/storage/

server {
    server_name website.com;
    root /var/www/vhosts/website.com/httpdocs/;
    location /documents/ {
        rewrite ^/documents/(.*)$ /storage/$1;
    }
    location /storage/ {
        internal;
        alias /var/www/storage/;
    }
}

rewrite的语法如下:

rewrite regexp replacement [flag];

flag的值如下:

  1. last:

匹配完成后,继续匹配其他location,但是不再处理后续的rewrite指令。

  1. break:

匹配完成后终止,不再匹配其他location,也不再处理后续的rewrite指令。

  1. redirect:

返回302临时重定向,将headr location修改为重写后的URI。

  1. permanent:

返回301永久重定向,将headr location修改为重写后的URI。 如果replacement是以http,https开头,那么nginx自动使用redirect。

  • Server Side Includes(SSI)

SSI是子求的一种,SSI会在发送响应给客户端之前解析文档。如在HTML中,你可能会使用Nginx能够解析的指令插入include标签。如下:

<html>
  <head>
    <!--# include file="header.html" -->
  </head>
  <body>
    <!--# include file="body.html" -->
  </body>
</html>

在上面的代码中,nginx会处理标签,将header.html和body.html插入到文档中,然后返回给客户端。

  • 条件语句

Rewrite模块中还引入了一些新的指令,如if指令等。

server {
  if ($request_method = POST) {
    […]
  }
}

if条件中可以使用的语法如下标

操作 描述
None 变量或者数据不等于空字符串且字符串不是以0开头,
则返回true if($string){ […]}
=, != 等于和不等于
~, ~*, !~,!~* 正则表达式的匹配,如果匹配返回true,依次为匹配,大小写铭感匹配,
不匹配,大小写铭感不匹配
-f, !-f 文件是否存在
-d, !-d 路径是否存在
-e, !-e 是否存在检测,可用于文件,路径或者软连接
-x, !-x 检测文件是否存在并且可以执行

指令

  • break

用于终止后续的rewrite指令。如:

if (-f $uri) {
  break; # break if the file exists
}
  • return

中断request处理过程,直接返回HTTP 状态码和内容。如

return 403;
  • set

设置变量:

set $var1 "some text";
if ($var1 ~ ^(.*) (.*)$) {...}
  • rewrite_log

on/off 开启或者关闭error级别的重定向日志。

index模块和logging模块

  • index

index指令指定默认主页。

  • autoindex

on/off 当目录没有设置一个主页时,自动展示目录列表。

  • autoindex_exact_size

指定autoindex的文件大小单位如果为on,默认为byte,可以指定为其他的单位:KB,MB,GB,默认为on。

  • access_log

指定访问日志的路径,格式。语法如下:

access_log path [format [buffer=size]] |off;

format指定日志格式模版,关联log_format指令,如果不指定,默认是(combined)。

  • log_format

定义日志的格式化模版,默认的模版是combined。如下:

log_format combined '$remote_addr - $remote_user [$time_local] '"$request" $status $body_bytes_sent '"$http_referer" "$http_user_agent"';

auth_basic模块

auth_basic模块有两个指令,auth_basic和auth_basic_user_file,启用时,完成基本的用户名密码认证功能。如:

location /admin/ {
  auth_basic "Admin control panel";
  auth_basic_user_file access/password_file;
}
  • auth_basic

可以被设置为off或者文本消息,用于指定一个授权领域名称。当客户端要访问需要认证的资源时,浏览器会显示一个用户名密码的输入框。

  • auth_basic_user_file

定义密码文件的相对路径(相对于配置文件)密码文件的由如下语法的行组成:

username:password[:comment]

密码使用crypt(3)函数加密。可以使用 openssl passwd 111 对111进行加密或者在线搜索crypt加密器。

access模块

access模块有两个指令:allow和deny,指定IP地址或者IP范围或者all。如:

location {
  allow 127.0.0.1; # allow local IP address
  deny all; # deny all other IP addresses
}

连接限制模块

该模块可以让我们定义一个zone,然后定义这个zone上的最大并发连接数。 第一步是使用limit_conn_zone指令定义一个zone。语法:limit_conn_zone $variable zone=name:size;。其中$variable将客户端区分开来, 常用的如$binary_remote_addr,通过客户端的二进制IP划分客户端。name为zone的名称,size指定存储会话状态的最大尺寸。例子如下:

limit_conn_zone $binary_remote_addr zone=myzone:10m;

然后通过limit_conn指令限制连接数。语法:limit_conn zone_name connection_limit;,例子如下: location /downloads/ { limit_conn myzone 1; } 如上例子限制了在/downloads/下,每一个ip最多只有一个连接访问。如果超出,客户端会返回503 Service unavailable。

请求限制模块

该模块通过定义一个zone,限制request的数量,和连接限制模块类似。 第一步是使用limit_req_zone指令定义一个zone。语法:limit_req_zone $variable zone=name:max_memory_size rate=rate;。其中rate表示 每秒请求数(r/s)或者每分请求数(r/m),用于限制请求的频率。通过limit_req将zone应用到location。如下:

limit_req zone=name burst=burst [nodelay];

burst参数定义了突发情况的最大请求数。如果设置了nodelay,在突发请求数大于burst时,会丢弃这部分请求,返回503。使用例子说明如下: 设置一个每秒请求为1的zone 如下:

limit_req_zone  $binary_remote_addr  zone=qps1:1m   rate=1r/s;

延迟处理的例子如下:

location /delay { limit_req   zone=qps1  burst=5;}
  1. 处理速度严格按照1qps的速度处理。

  2. 允许峰值出现,每秒请求超过rate(1qps)时,超过burst的会丢弃,在rate和burst之间的会延迟到后面的时间处理,占用后面时间的rate。

  3. 客户端只要控制并发在burst内,就不会触发limit_req_error_log。 nodelay处理的例子:
    location /nodelay {  limit_req   zone=qps1  burst=5 nodelay;}
    
  4. 处理速度可以大于1qps。

  5. 允许峰值出现,超过burst的会被丢弃。小于burst的,如果时间段内qps小于等于rate,那么会立即处理。如果大于则只处理小于等于rate的,拒绝大于rate的。

  6. 客户端需要控制每秒请求数,才不会触发limit_req_error_log。

内容和编码

  • add_header:添加header。

  • expires:控制Expires and Cache-Control头信息。

  • gzip: on或者off。使用gzip压缩响应的body,发送给客户端。

  • gzip_buffer: 定义gzip buffer的大小。

  • gzip_comp_level:指定压缩等级,1-9,等级越高,压缩越慢,压缩比例越高。默认:1。

  • gzip_disable:当request的header 匹配正则表达式时,禁用gzip压缩。

  • gzip_min_length: 如果响应body小于指定值,不压缩。默认:0。

  • gzip_types:除了默认的text/html MIME类型以外,需要压缩的类型。

  • gzip_static:开启静态内容的压缩,不容每次请求都执行一次压缩。默认的module中没有包含。

  • charset: 向响应头中的Content-Type添加指定的编码类型。默认:off。例子:charset utf-8;

  • source_charset: 定义response的初始化编码类型。

  • charset_types:定义符合重新编码条件的MIME类型。默认的是:

text/html, text/xml, text/plain, text/vnd.wap.wml, application/x-javascript, application/rss+xml

客户端

  • real_ip_header 重新设定header中的X-Real-IP。

第三方插件

nginx有大量的第三方插件,可以从http://wiki.nginx.org/nginx3rdPartyModules 下载。集成第三方插件的步骤如下:

  1. 下载对应插件的tar.gz包。

  2. 解压插件包。

  3. 使用如下命令配置Nginx 构建。

    ./configure --add-module=/module/source/path