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。 内部请求可以分为两种:
- 内部重定向:
将客户端请求在内部重定向,URI会被改变,最常用的是Rewrite指令,允许我们重写request URI。
- 子请求:
内部触发额外的请求产生内容,对主请求进行补充,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的值如下:
- last:
匹配完成后,继续匹配其他location,但是不再处理后续的rewrite指令。
- break:
匹配完成后终止,不再匹配其他location,也不再处理后续的rewrite指令。
- redirect:
返回302临时重定向,将headr location修改为重写后的URI。
- 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;}
-
处理速度严格按照1qps的速度处理。
-
允许峰值出现,每秒请求超过rate(1qps)时,超过burst的会丢弃,在rate和burst之间的会延迟到后面的时间处理,占用后面时间的rate。
- 客户端只要控制并发在burst内,就不会触发limit_req_error_log。
nodelay处理的例子:
location /nodelay { limit_req zone=qps1 burst=5 nodelay;}
-
处理速度可以大于1qps。
-
允许峰值出现,超过burst的会被丢弃。小于burst的,如果时间段内qps小于等于rate,那么会立即处理。如果大于则只处理小于等于rate的,拒绝大于rate的。
- 客户端需要控制每秒请求数,才不会触发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
下载。集成第三方插件的步骤如下:
-
下载对应插件的tar.gz包。
-
解压插件包。
-
使用如下命令配置Nginx 构建。
./configure --add-module=/module/source/path