常见Nginx常用模块及使用示例

一、前言

Nignx(Engine X)是一款高度模块化的,轻量级的,高性能的HTTP和反向代理服务,其特点是占有内存少,并发能力强。本文将会介绍Nginx的常用模块及相关案例,了解并掌握相应模块的配置将帮助我们更快更好地了解掌握Nginx服务的配置。官方的模块介绍链接为:http://nginx.org/en/docs/

Nginx服务的主配置文件为/etc/nginx/nginx.conf及/etc/nginx/conf.d 目录下的以conf结尾的配置文件。默认情况下,其配置文件的结构分为主配置段、events配置段、http配置段等等。而http配置段又包括server、location、if in location等配置段
Nginx 模块的配置段通常来有着多个配置指令,而不同的配置指令所起作用的配置环境各不相同,下行我们来看看Nginx的常见模块及对应的示例。

二、常用模块指令及示例

- Core functionality

1、events { ... }
事件驱动配置段。
配置段环境:main
2、use method;
指明并发连接请求的处理方法;
配置段环境:main
3、accept_mutex on|off;
处理新的连接请求的方法;on意味着由各自worker轮流处理新请求,off意味着每个新请求的到达都会通知所有的worker进程;
配置段环境:events

4、worker_processes number | auto;
一般来说一个CPU内核对应一个worker_process,worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低。
配置环境:main

- Module ngx_http_core_module

ngx_http_core_module 核心模块中可配置的指令包括:
1、http { ... }:指定http服务器指令的配置段;
示例:

http {
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        location / {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

2、server { ... }:指设置虚拟主机的配置段,其配置环境为http配置段。
示例:

server {
        listen 192.168.0.83:80;
        server_name www.a.com;
        root /var/www/html;
        location / {
                allow all;
        }

        location /status {
                stub_status;
        }
}

3、location [ = | ~ | ~* | ^~ ] uri { ... }location @name { ... }:设置根据请求的URI作出何种相应的配置段,其配置环境为server和location配置段;
其中

=:表示对URI做精确匹配;
~ : 对URI做正则表达式模式匹配,区分字符大小写;
~*:对URI做正则表达式模式匹配,不区分字符大小写;
^~:对URI的左部分做匹配检查,不区分字符大小写;
不带符号:匹配起始于此URI的所有URL;
@:内部服务跳转;

上述符号的匹配优先级从高到低为:=,^~,~ / ~*,不带符号
示例:

#使用=号精确匹配/data/locatio目录下的location.html文件
location = /location.html {
        root /data/location/;
}
#使用~号正则匹配/data/locatio目录下带有test的文件
location ~ .*test.* {
        root /data/location/;
}
#使用~号正则匹配/data/locatio目录下带有PAGE的文件
location ~* .*page.* {
        root /data/location/;
}
#匹配/data/html/www目录下的文件
location ^~ /www {
}

4、listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE [options];
用于指定监听的接口和端口等信息,options包括:

default_server:设置为默认虚拟主机;
ssl:限制仅能通过ssl连接提供服务;
backlog=number:后援队列长度;
rcvbuf=size:接受缓冲区大小;
sndbuf=size:发送缓冲区大小;

该指令的配置环境为server配置段。
示例:

#监听指定的IP及端口
listen 192.168.0.83:80;
#监听指定端口只能通过SSL
listen 443 ssl;

5、server_name name....;
用于指定虚拟主机名称,其后可跟多个由空白字符分隔而成的字符串并且支持通配符和正则表达式。

此指令的执行环境为server配置段。
示例:

#支持*通配任意长度的任意字符
server_name *.magedu.com www.magedu.*;
#支持~起始的字符做正则表达式模式匹配
server_name ~^www\d+\.magedu\.com$;

6、tcp_nodelay on | off;
在keepalived模式下的连接是否启用tcp_nodelay选项,默认为on;
配置段环境为:http、server、location
7、tcp_nopush on|off;
在sendfile模式下,是否启用tcp_cork选项,默认为off;
配置段环境为:http、server、location
8、sendfile on|off;
是否启用sendfile功能,默认为off;
其配置段环境为: http, server, location, if in location
9、root path;
设置web资源路径映射;用于指定用户请求的url所对应的本地文件系统上的文档所在目录路径;
配置段环境:http,server,location,if in location;
示例:

server {
        listen 192.168.0.83:80;
        server_name www.a.com;
        root /data/html;  #设置虚拟主机的web根目录
        location = /location.html {
                root /data/location/;  #指定location的web根目录
        }
}

10、alias path;
定义路径别名,文档映射的另一个机制。注意alias和root不能同时用在一个location配置段中。
配置段环境:location。
示列:

#将/charlie 映射到/data/location目录
location ^~ /charlie {
        alias /data/location/;
}

11、error_page code...[=[response]] uri;
定义了指定错误的URI路径;
配置段环境:http, server, location, if in location
示例:

#当网页的状态码为404时,跳转到指定的404.html页面
error_page 404             /404.html;
#当网页错误码属于服务器错误状态码时,返回状态码200,并跳转到指定页面
error_page 500 502 503 504 =200 /50x.html;

12、try_files file ... [uri|=code];
找指定路径下文件,如果不存在,则跳转到指定的uri或者返回指定状态码。
配置段环境:server,location
示例:

#尝试打开test.html文件,如果过没有,则跳转到404.html文件
location ~ .*test.* {
        try_files test.html /404.html;
}
#尝试打开test.html,如果没有此文件,则返回状态码500
location ~ .*test.* {
        try_files test.html =500;
}

13、keepalive_timeout timeout [header_timeout];
定义保存连接的超时时长,0表示禁止长连接;默认为75s;
配置段环境:http、server、location。
14、keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量,默认为100;
配置段环境:http, server, location。
示例:

keepalive_requests 1000

15、keepalive_disable none | browser ...;
对哪种浏览器禁用长连接;
配置段环境:http, server, location。
示例:

keepalive_disable safari;

16、send_timeout time;
向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长,默认为60s;
配置段环境:http、server、location。
17、client_body_buffer_size size;
用于接收客户端请求报文的body部分的缓冲区大小;默认为16k,超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置;
配置段环境:http, server, location。
18、client_body_temp_path path [level [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;
其中level表示存储目录的数量,使用十六进制的数字表示。
配置段环境: http, server, location。
示例:

#2表示256个一级子目录,1表示16个二级子目录,1表示16个三级子目录
client_body_temp_path /var/tmp/client_body 2 1 1;

19、limit_rate rate;
限制响应给客户端的传输速率,单位是byfes/second,0表示无限制;
配置段环境:http, server, location, if in location。
20、limit_except method ... {...}
限制指定请求方法的使用客户端;
配置段环境:location。
示列:

#限制只能192.168.1.0/24的网段主机使用GET请求
limit_except GET{
    allow 192.168.1.0/24;
    deny all;
}

21、aio on |off|threads[=pool];
是否启用aio功能。
配置段环境: http, server, location。

22、directio size | off;
在linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如:directio 4m;
配置段环境: http, server, location。

23、open_file_cache off;
open_file_cache max=N [inactive=time];
配置缓存静态文件的信息,此指令可缓存以下三种信息:
1)文件的描述符、文件大小和最近一次的修改时间;
2)打开的目录结构;
3)没有找到的或者没有权限访问的文件的相关信息;
max=N :可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项;
配置段环境: http, server, location
示例:

#配置缓存上限为1000,非活动时长为20s
open_file_cache          max=1000 inactive=20s;

24、open_file_cache_valid time;
缓存项有效性的检查频率;默认为60s;
配置段环境:http, server, location。

25、open_file_cache_min_uses number;
在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项,默认为1;
配置段环境: http, server, location。
26、open_file_cache_errors on|off;
是否缓存查找时发生错误的文件一类的信息,默认为off;
配置段环境: http, server, location。

- Module ngx_http_index_module

此模块用于实现基于IP的访问控制功能。
1、index file...;
定义默认的web网页资源,默认为index index.html
配置段环境:http、server、location
示例:

location / {
    index index.html;
}

- Module ngx_http_access_module

1、[allow|deny] address | CIDR | unix: | all;
允许或拒绝访问的Ip网段,匹配顺序为从上往下匹配。
配置段环境: http, server, location, limit_except。
示例:

#限制访问到web根目录的Ip
location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}

示例:

#只允许192.168.0.38主机访问到指定的URI
location ^~ /charlie {
        alias /data/location/;
        allow 192.168.0.38;
        deny all;
}

- Module ngx_http_auth_basic_module

此模块用于实现基于用户的访问控制功能。
1、auth_basic string |off
配置auth_basic提示的信息。
配置段环境:http, server, location, limit_except。
2、auth_basic_user_file file;
保存用户的file文件由htpasswd命令生成。
配置段环境: http, server, location, limit_except。
示例:

#生成保存认证用户信息的文件
[root@nginx ~]# htpasswd -c /etc/nginx/wwwpasswd  charlie
New password: 
Re-type new password: 
Adding password for user charlie
[root@nginx ~]# htpasswd /etc/nginx/wwwpasswd  magedu
New password: 
Re-type new password: 
Adding password for user magedu

#添加nginxbasic认证配置
location ^~ /www {
        auth_basic "Welcome to www auth.";
        auth_basic_user_file /etc/nginx/wwwpasswd;
}

- Module ngx_http_stub_status_module

此模块用于输出nginx的基本状态信息。
1、stub_status;
配置段环境为:server, location。
使用示例:

location /status {
        stub_status;
}

访问http://192.168.0.83/status可获取nginx服务器的状态信息,如下:

Active connections: 1 
server accepts handled requests
 100313 100313 100386 
Reading: 0 Writing: 1 Waiting: 0

其各项解释为:

Active connections:活动连接数;
accepts:已经接受的客户端请求的总数;
handled:已经处理完成的客户端请求的总数;
requests:客户端发来的请求总数;
Reading:正处于读取客户端请求报文首部的连接的数量;
Writing:正处于向客户端发送响应报文过程中的连接数;
Waiting:正处于等待客户端发送请求的空闲连接数;

- Module ngx_http_log_module

1、access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];access_log off;
用于设置访问日志文件路径,格式及相关的缓冲的配置。默认情况下,access_log预定义了combined的日志格式,用户可在format中直接调用。
配置段环境为:http, server, location, if in location, limit_except。
示例:

#将日志以combined格式记录在指定路径
access_log  /var/log/nginx/access.log  combined;

#将访问nginx的status的页面以指定的test格式存放在指定的路径中
        location /status {
                stub_status;
                access_log /data/log/access_log test;
        }

2、log_format name [escape=default|json|none] string ...;
在string中可使用nginx核心模块及其他模块内嵌的变量来生成log日志,默认日志的格式为combined格式。
配置段环境为http。
示例:

#按照combined的格式定义nginx的log格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
#自定义log_format
log_format test '$remote_addr        $status        "$request"'

3、open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];open_log_file_cache off;
用于缓存各日志文件相关的元数据信息。
配置段环境:http, server, location。

max:缓存的最大文件描述符数量,如缓存到达最大值,则会清除保存时间最长的文件描述符。
min_uses:在inactive指定的时长内访问大于等于此值方可被当作活动项,默认为1。
inactive:设置在关闭缓存的文件描述符之前的非活动时长;
valid:验正缓存中各缓存项是否为活动项的时间间隔,默认为60s。

示例:

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

- Module ngx_http_gzip_module

此模块能够使用gzip压缩响应报文的大小,通过能够将需要传输的数据减少一半或者更多。
1、gzip on | off;
是否开启压缩响应。
配置段环境:http, server, location, if in location。
2、gzip_comp_level level;
设置压缩响应的等级,从1到9。
配置段环境:http, server, location
3、gzip_disable regex ...;
根据正则表达式匹配客户端浏览器类型来关闭响应压缩。
配置段环境:http, server, location
4、gzip_min_length length;
指定被压缩的响应报文的最小长度,默认为20个字节
配置段环境:http, server, location
5、gzip_buffers number size;
设置压缩响应报文时的缓冲区数量及每个缓冲区大小。
配置段环境:http, server, location
6、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
nginx作为代理服务器接收到从被代理服务器发送的响应报文后,在何种条件下启用压缩功能的;
off:对代理的请求不启用
no-cache, no-store,private:表示从被代理服务器收到的响应报文首部的Cache-Control的值为此三者中任何一个,则启用压缩功能;
配置段环境:http, server, location

7、gzip_types mime-type ...;
压缩过滤器,仅对此处设定的MIME类型的内容启用压缩功能,默认压缩text/html。
配置段环境:http, server, location

示例:

gzip  on;
gzip_comp_level 6;
gzip_min_length 64;
gzip_proxied any;
gzip_types text/xml text/css  application/javascript;

- Module ngx_http_ssl_module

1、ssl on | off;
在虚拟服务器上启动https协议。
配置段环境:http, server
2、ssl_certificate file;
指定当前https协议使用的SSL证书,证书需为pem格式。
配置段环境: http, server
3、ssl_certificate_key file;
指定当前https协议所使用证书的私钥文件
配置段环境: http, server

4、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
指定支持的ssl协议的版本,默认为后三个。
配置段环境: http, server

5、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
用于设置存储ssl会话参数的缓存类型及大小。
builtin[:size]:使用OpenSSL内建的缓存,此缓存为每worker进程私有;
[shared:name:size]:在各worker之间使用一个共享的缓存;
配置段环境: http, server
6、ssl_session_timeout time;
设置客户端可复用缓存的会话参数的时间。
配置段环境: http, server

示例:

server {
    listen 192.168.0.83:443 ssl;
    server_name www2.abc.com;
    root /data/https;
    ssl on;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_session_cache shared:sslcache:20m;
}   

- Module ngx_http_rewrite_module

此模块用于将用户请求的URI基于regex所描述的模式进行检查,而后完成替换,使得用户访问替换后的URI 。

1、rewrite regex replacement [flag];
此指令将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI。如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端。另外如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制,包括以下标志:

last:重写完成后停止对当前URI在当前location中后续的其他重写操作,而后对新的URI启动新一轮重写检查,即提前重启新一轮的重写循环;
break:重写完成后停止对当前URI在当期location中的后续的其他重写操作,而后直接跳转至重写规则配置块之后的其他配置,结束重写循环;
redirect:重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;此flag所重写的URI不能以http://或https://开头;
permanent:重写完成后以永久重定向的方式直接返回重写后生成的新的URI给客户端,由客户端重新发起请求;

配置段环境:server, location, if

示例:

#将域名404.abc.com的请求全部重写到www3.abc.com下
server {
        listen 80;
        server_name 404.abc.com;
        rewrite /(.*) http://www3.abc.com/$1 permanent;
}

2、return code [text];return code URL;return URL;
停止处理请求,并返回指定的文本信息、状态码或URL给客户端。
配置段环境:server, location, if
示例:

#返回指定状态码及文本信息
location ~ .*test.* {
        return 404 'test test test';
}

#返回指定的URL
location ~ .*test.* {
        return http://www3.abc.com/404.html;
}

3、rewrite_log on | off;
是否开启重写日志;
配置段环境:http, server, location, if

4、if (condition) { ... };
条件判断配置段,当满足条件时,执行配置段中的指令。
其中condition中的比较符有以下几种:

比较操作符:
  ==:模式
  !=
  ~:模式匹配,区分字符大小写;
  ~*:模式匹配,不区分字符大小写;
  !~:模式不匹配,区分字符大小写;
  !~*:模式不匹配,不区分字符大小写;
文件及目录存在性判断:
   -e, !-e
  -f, !-f
  -d, !-d
  -x, !-x

配置段环境:server, location
示例:

#若客户端的请求URI匹配给定的格式,则重写URL
        if ( $request_uri ~* /wch ) {
                rewrite /(.*) http://www3.abc.com/www/www.html permanent;
        }

5、set $variable value;
自定义用户变量。
配置段环境:server, location, if

示例:

#变量newindex,当客户端请求的host为abc.com时,abc.html赋值给newindex变量,并重新设置index
set $newindex "index.html";
if ( $host = abc.com) {
    set $newindex "abc.html";
}
index $newindex;

- Module ngx_http_referer_module

1、valid_referers none | blocked | server_names | string ...;
定义referer首部的合法可用值;

none:请求报文首部没有referer首部;
blocked:请求报文的referer首部没有值;
server_names:参数,其可以有值作为主机名或主机名模式;
    arbitrary_string:直接字符串,但可使用*作通配符;
    regular expression:被指定的正则表达式模式匹配到的字符串;要使用~打头,例如 ~.*\.magedu\.com;

配置段环境: server, location

示例:

#设置referer的合法值
valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.;
#当referer为非法值时,返回错误页面;
if($invalid_referer) {
    return http://www.magedu.com/invalid.jpg;
}   
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 我的妈妈非常慈祥,曾经有一张红润的圆脸,由于岁月的流逝,皱纹悄悄爬上了妈妈的脸颊。弯弯的眉毛下那双有神的眼...
    孙澜菲阅读 266评论 1 1
  • 从今天开始,我为大家摘引李笑来老师在得到app的专栏《通往财富自由之路》中的文章。 李笑来老师是原新东方名师,中国...
    付虹阅读 246评论 0 1
  • 没有吃货带路是怎么也走不到这里的,味道4颗星,还有那个卖情怀的建投书店。
    年糕的日常阅读 153评论 0 0
  • 安装mod_wsgi时提示最好使用Apache的apxs方式。 apxs添加apache扩展模块 安装mod_ws...
    Andrew玩Android阅读 1,663评论 0 1