nginx配置及常用模块示例
第一节:nginx 配置
1.1 配置文件的组成部分
主配置文件:/nginx.conf
子配置文件:include conf.d/*.conf
fastcgi,uwsgi,scgi 等协议相关的配置文件
mime.types:支持的 mime 类型
1.2 主配置文件的配置指令
directive value [value2...];
1.3 注意
指令必须以分号结尾;
支持使用配置变量
内建变量:由 nginx 模块引入,可直接引入
自定义变量:由用户使用set命令定义
set variable_name value;
引用变量:$variable_name
1.4 主配置文件结构
1.5 http 协议相关的配置结构
1.6 main 全局配置段常见的配置指令分类
(1)正常运行必备的配置
user:指定 worker 进程的运行身份,组不指定,默认和用户名同名
pid:指定存储 nginx 主进程 PID 文件的路径
include:指明包含进来的其他配置文件
load_module file:加载模块的配置文件;装载的动态模块的路径
(2)优化性能相关的配置
#worker进程的数量,通常为当前主机CPU物理核数 worker_processes number | auto; #提高缓存命中率 worker_cpu_affinity cpumask... | auto [cpumask]; #CPUMASK:00000001:0号CPU 00000010:1号CPU 10000000:8号CPU #例:worker_cpu_affinity 0001 0010; #指定worker进程的nice值,设定worker进程优先级 [-20,20] worker_priority number;
#worker进程所能打开的文件描述符 worker_rlimit_nofile number;
(3)用于调试及定位问题相关的配置
#是否以守护进程方式运行nginx,默认是守护进程 daemon on | off; #是否以master/worker模型运行nginx,默认为on master_process on | off; #错误日志文件及其级别,出于调试需要,可设定为debug,但debug仅在编译时使用了“--with-debug”选项时才有效 error_log file [level]; 方式:file /path/logfile; stderr:发送到标准错误(可以将日志发送到远程服务器上) syslog:server-address[,parameter=values]:发送到syslog memory:size内存 level:debug | info | notice | warn | error | crit | alter | emerg
(4)事件驱动相关的配置
#每个worker进程所能打开的最大并发连接数数量 worker_connections number; #总最大并发数:worker_processes * worker_connections; #指明并发连接请求的处理方法,默认自动选择最优方法(例:use epoll;) use method; #处理新的连接请求的方法;on指由各个worker轮流处理新请求,off指每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊群”,影响性能 accept_mutex on | off;
2、与 http 服务相关的配置:ngx_http_core_module(http核心模块)
1>server{
...
}配置一个虚拟主机
server { listen address[:port] port; server_name server_name; root /path/to/document_root; }
可以直接添加server到主配置文件/etc/nginx/nginx.conf中,也可以include包含调用,即可以自定义文件夹存放多个server主机,便于管理。
例:/apps/nginx/conf/*.conf //server主机存放站点目录
在主配置文件http模块引用:include /etc/nginx/conf/*.conf(而/etc/nginx/*.conf软链接到/apps/nginx/conf/*.conf)
vim /apps/nginx/conf/www.a.com.conf
server {
...
}
vim /apps/nginx/conf/*.conf
...... //等等,每个主机单独文件,以此方便server主机管理
listen port | address[:port] | unix:/path/to/socket_file
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
default_server 设定为默认虚拟主机
ssl 限制仅能够通过ssl连接提供服务
backlog=number 超过并发连接数后,新请求进入后援队列的长度
rcvbuf=size 接收缓冲区大小
sndbuf=size 发送缓冲区大小
server_name name...;
虚拟主机的主机名称后可跟多个由空白字符分隔的字符串,支持*通配任意长度的任意字符
server_name *.boke.com www.boke.*
支持~起始的字符做正则表达式模式匹配,性能原因慎用
server_name ~^www\d+\.boke\.com$
说明:\d表示[0-9]
匹配优先级机制从高到低:
首先是字符串精确匹配 如:www.boke.com
左侧*通配符 如:*.boke.com
右侧*通配符 如:www.boke.*
正则表达式 如:~^.*\.boke\.com$
dafault_server
root:定义web资源的路径映射,用于指明请求的URL所对应的文档的目录路径
注意:
基于port;
listen port; 指令监听在不同的端口
基于ip的虚拟主机
listen ip:port; ip地址不同
基于hostname
server_name fqdn; 指令指向不同的主机名
2>tcp_nodelay on | off;
在keepalived模式下的连接是否启用tcp_nodelay选项
当为off时,延迟发送,合并多个请求后再发送,默认on时,不延迟发送
可用于:http,server,location
3>sendfile on | off;
是否启用sendfile功能,在内核中封装报文直接发送,默认off
4>server_tokens on | off | build | string;
是否在响应报文的server首部显示nginx版本
5>location [= | ~ | ~* | ^~ | uri] {...}
说明:虚拟主机网页文件及存放目录:/www/site{a,b...}
虚拟主机配置目录:/apps/nginx/conf/*.conf
配置:
[root@centos7 ~]#mkdir /www/sitea/test
[root@centos7 ~]#echo /www/sitea/test/index.html > /www/sitea/test/index.html
[root@centos7 ~]#vim /apps/nginx/conf/www.a.com.conf
server {
listen 80;
server_name www.a.com;
root /www/sitea;
location /test {
root /www/sitea/;
}
}
[root@centos7 ~]#systemctl restart nginx
测试(测试机提前做好域名解析):
[root@test ~]# curl www.a.com /www/sitea/html [root@test ~]# curl www.a.com/test/ //访问网站www.a.com下的test/,相当于访问/www/sitea/test/index.html,即location规则 /www/sitea/test/index.html
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射,nginx会根据用户请求的uri来检查定义的所有location,并找出最佳匹配,而后应用其配置
=:对uri做精确匹配
^~:对uri的最左边部分做匹配检查,不区分字符大小写
~:对uri做正则表达式模式匹配,区分字符大小写
~*:对uri做正则表达式模式匹配,不区分字符大小写
不带符号:匹配起始于此uri的所有的uri
匹配优先级从高到低:
=,^~,~/~*,不带符号
6>地址重写
rewrite对称url rewrite,即url重写,就是把传入web的请求重定向到其他url的过程。
(1)url rewrite最常见的应用是url伪静态化,是将动态页面显示为静态页面方式的一种技术。即php转换显示为html,搜索引擎对静态页面的评分一般要高于动态页面。所以,url rewrite可以让我们网站的网页更容易被搜索引擎所收录,网址更简洁。
(2)从安全角度上讲,如果在url中暴露太多的参数,无疑会造成一定量的信息泄漏,所以静态化的url地址可以给我们带来更高的安全性。
(3)实现网站地址跳转,例如用户访问 www.360buy.com,将其跳转到 www.jd.com。例如当用户访问 tianyun.com 的 80 端口时,将其跳转到 443 端口。
nginx 的 rewrite 功能需要 PCRE 软件的支持,即通过 perl 兼容正则表达式语句进行规则匹配的。默认参数编译 nginx 就会支持 rewrite 的模块,但是也必须要 PCRE 的支持。
rewrite 是实现 URL 重写的关键指令,根据 regex(正则表达式)部分内容,重定向到 replacement,结尾是 flag 标记。
rewrite 语法格式及参数语法说明如下:
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag 标记
关键字:其中关键字 rewrite 不能改变
正则:perl 兼容正则表达式语句进行规则匹配
替代内容:将正则匹配的内容替换成 replacement
flag 标记:rewrite 支持的 flag 标记
flag 标记说明:
last #本条规则匹配完成后,继续向下匹配新的 location URI 规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址
permanent #返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址
7>alias path; 路径别名,文档映射的另一种机制
[root@centos7 ~]#mkdir /www/sitea/alias
[root@centos7 ~]#echo /www/sitea/alias/index.html > /www/sitea/alias/index.html
[root@centos7 ~]#vim /apps/nginx/conf/www.a.com.conf
server {
listen 80;
server_name www.a.com;
root /www/sitea;
location /bbs {
alias /www/sitea/alias/;
}
}
测试:
[root@test ~]# curl www.a.com/bbs/ /www/sitea/alias/index.html
8>index file...; 指定默认网页文件,注意:ntp_http_index_module模块
9>error_page code...[=[response]] uri;
模块:ntp_http_core_module
定义错误页,以指定的响应状态码进行响应
error_page 404 /404.html
error_page 404 =200 /404.html
[root@centos7 ~]#mkdir /www/sitea/error
[root@centos7 ~]#echo "current page error" > /www/sitea/error/404.html
[root@centos7 ~]#vim /apps/nginx/conf/www.a.com.conf
server {
listen 80;
server_name www.a.com;
root /www/sitea;
error_page 404 /404.html;
location /404.html {
root /www/sitea/error/;
}
}
[root@centos7 ~]#systemctl restart nginx
测试:
[root@test ~]# curl www.a.com/xxxxx
current page error
10>try_files file ... uri;
try_file file ... =code;
按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部uri的指向。最后一个参数是回退uri且必须存在,否则会出现内部505错误。
location /images/ { try_files $uri /images/default.html; }
11>定义客户端请求的相关配置
keepalive_timeout timeout [header_timeout];
设定保持连接超时时长,0表示禁止长连接,默认为75s
keepalive_requests number;
在一次长连接上允许请求的资源的最大数量,默认为100
keepalive_disable none | browser ...
对那种浏览器禁用长连接
send_timeout time;
向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长
client_body_buffer_size size;
用于接收每个客户端请求报文的body部分的缓冲区大小,默认为16k。超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
client_body_temp_path path [level1 [level2 [level3]]];
设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量
目录名为16进制的数字;
client_body_temp_path /var/tmp/client body 1 2 2
1 1级目录占1位16进制,即2^4=16个目录0-f
2 2级目录占2位16进制,即2^8=256个目录00-ff
2 3级目录占2位16进制,即2^8=256个目录00-ff
12>对客户端进行限制的相关配置
limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second
默认值0表示无限制
limit_except method ... {...},仅用于location
限制客户端使用除了指定的请求方法之外的其他方法
method:GET,HEAD,POST,PUT,DELETE
MKCOL,COPY,MOVE,OPTIONS,PROPFIND,PROPPATCH,LOCK,UNLOCK,PATCH
limit_except GET { allow 192.168.1.0/24; deny all; }除了GET和HEAD之外其他方法仅允许192.168.1.0/24网段主机使用
13>文件操作优化的配置
aio on | off | threads[=poll]; //是否启用aio功能
directio size | off; //直接io
当文件大于等于给定大小时,例如directio 4M,同步(直接)写磁盘,而非写缓存
open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1)文件元数据:文件的描述符、文件大小和最近一次的修改时间
(2)打开的目录结构
(3)没有找到的或者没有权限访问的文件的相关信息
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法(最近最少使用算法)实现管理
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses指令所指定的次数的缓存项即为非活动项,将被删除
open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息,默认值为off
open_file_cache_min_uses number;
open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项,默认值为1
open_file_cache_valid time;
缓存项有效性的检查频率,默认值为60s
3、ngx_http_access_module模块:实现基于ip的访问控制功能
allow address | CIDR | unix: | all;
deny address | CIDR | unix: | all;
http,server,location,limit_except
自上而下检查,一旦匹配,将生效,条件严格的置前
示例:
location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 127.0.0.0/8; allow 2001:0db8:/32; deny all; }
4、ngx_http_auth_basic module模块:实现基于用户的访问控制,使用basic机制进行用户认证
auth_basic string | off;
auth_basic_user_file file;
location /admin/ { auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/.ngxpasswd; } //对目录进行访问验证
例:
[root@centos7 ~]#vim /apps/nginx/conf/www.a.com.conf
server {
listen 80;
server_name www.a.com;
root /www/sitea;
auth_basic "login info"; //设置提示信息
auth_basic_user_file "/www/sitea/.nginxuser"; //用户密码文件路径(放到server里,对整个网站加密,也可以对特定目录加密)
location /test {
root /www/sitea/;
}
error_page 404 /404.html;
location /404.html {
root /www/sitea/error/;
}
}
[root@centos7 ~]#cd /www/sitea/
[root@centos7 sitea]#htpasswd -cm .nginxuser user1 //该命令依靠httpd-tools包,没有该命令的请安装httpd-tools
New password:
Re-type new password:
Adding password for user user1
[root@centos7 sitea]#htpasswd -m .nginxuser user2 //第一次创建用户生成密码需要-c选项,第二次不需要
New password:
Re-type new password:
Adding password for user user2
[root@centos7 sitea]#cat .nginxuser
user1:$apr1$bSbhPGpb$4xbxLI7yphxRFLjn2a2GX1
user2:$apr1$d15.Dgzq$xSYRxSsZv4lPI/q0zkXw31
[root@centos7 ~]#systemctl restart nginx //重启服务
浏览器测试:
用户口令文件:
明文文本:格式name:password:comment
加密文本:由htpasswd命令实现
httpd-tools所提供
5、ngx_ http_ stub_status_ module模块:用于输出nginx的基本状态信息(状态页),配合监控软件实现状态监控
输出信息示例:
Active connections: 291 //活动连接 server accepts handled requests //服务器接收、处理的请求 16630948 16630948 31070465 //分别对应accepts,handled,requests 三个值 Reading: 6 Writing: 179 Waiting: 106
Active connections:当前状态,活动状态的连接数
accepts:统计总值,已经接受的客户端请求的总数
handled:统计总值,已经处理完成的客户端请求的总数
requests:统计总值,客户端发来的总的请求数
Reading:当前状态,正在读取客户端请求报文首部的连接的连接数
Writing:当前状态,正在向客户端发送响应报文过程中的连接数
Waiting:当前状态,正在等待客户端发出请求的空闲连接数
stub_status;
示例:
[root@centos7 sitea]#vim /apps/nginx/conf/www.a.com.conf
server {
listen 80;
server_name www.a.com;
root /www/sitea;
location /status {
stub_status;
auth_basic "login info";
auth_basic_user_file "/www/sitea/.nginxuser"; //将用户的访问限制放到状态页,对查看状态页信息加以限制
}
error_page 404 /404.html;
location /404.html {
root /www/sitea/error/;
}
}
[root@centos7 sitea]#systemctl restart nginx
6、ngx_http_log_module模块:指定日志格式记录请求,只能在http模块
1>log_format name string ...;
string可以使用nginx核心模块及其它模块内嵌的变量
2>access_log path [format [buffer=size] [gzip[ =level]] [flush=time] [if=condition]]; 可以放到http、server
access_log off;
访问日志文件路径,格式及相关的缓冲的配置
buffer=size
flush=time
3>open_log_file_cache max= N [inactive=time] [min_ _uses=N] [valid =time];
open_log_file_cache off;
缓存各日志文件相关的元数据信息
max:缓存的最大文件描述符数量
min_uses:在inactive指定的时长内访问大于等于此值方可被当作活动项
inactive:非活动时长
valid:验证缓存中各缓存项是否为活动项的时间间隔
7、ngx_http_gzip_module:用gzip方法压缩响应数据,节约带宽
1>gzip on | off;
启用或禁用gzip压缩
2>gzip_comp_level level;
压缩比由低到高:1到9,默认:1
3>gzip_disable regex ...;
匹配到客户端浏览器不执行压缩
4>gzip_min_length length;
启用压缩功能的响应报文大小阈值
5>gzip_http_version 1.0 | 1.1;
设定启用压缩功能时,协议的最小版本,默认: 1.1
6>gzip_buffers number size;
支持实现压缩功能时缓冲区数量及每个缓存区的大小,默认:324k或168k
7>gzip_types mime-typel ...;
指明仅对哪些类型的资源执行压缩操作,即压缩过滤器
默认包含有text/html,不用显示指定,否则出错
8>gzip_vary on | off;
如果启用压缩,是否在响应报文首部插入"Vary: Accept-Encoding"
9>gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
nginx充当代理服务器时,对于后端服务器的响应报文,在何种条件下启用压缩功能
off:不启用压缩
expired,no-cache,no-store,private:对后端服务器的响应报文首部
Cache-Control值任何一个,启用压缩功能
示例:
gzip on; gzip_comp_level 6; gzip_min_length 64; gzip_proxied any; gzip_types text/xml text/css application/javascript;
curl -I --compressed http://192.168.129.128/test.html //--compressed启用压缩
8、ngx_http_ssI_module模块:
1>ssl on | off;
为指定虚拟机启用HTTPS protocol,建议用listen指令代替
2>ssI_certificate file;
当前虚拟主机使用PEM格式的证书文件
3>ssl_certificate_key file;
当前虚拟主机上与其证书匹配的私钥文件
4>ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];支持ssl协议版本,默认为后三个
5>ssI_session_cache off | none | [builtin[:size]] [shared:name:size];
none:通知客户端支持ssI session cache,但实际不支持
builtin[:size]:使用OpenSSL内建缓存,为每worker进程私有
[shared:name:size]:在各worker之间使用一个共享的缓存
9、ngx_http_proxy_module
1>正向代理:局域网内的机器借助于代理服务器访问局域网外的网站
这时正向代理的功能:
(1)增强局域网内部网络安全
(2)利用正向代理可以堆局域网对外网的访问进行必要的监控和管理
注意:正向代理服务不支持外部对内部网络的请访问求
2>与正向代理相反,如果局域网向外网提供资源,让外网上的其他用户可以访问局域网内的资源,这时候可以设置一个代理服务器,而这个代理服务器它提供服务就叫做 反向代理服务器
3>ngx_http_proxy_module 模块常见指令解释
ngx_http_proxy_module 模块允许将请求传递给另一个服务器
(1)proxy_pass URL;
该指令用于设置被代理服务器的协议、主机名、 IP 地址和端口等形式。
Context: location, if in location, limit_except
注意:proxy_pass 后面的路径不带 uri 时,其会将 location 的 uri 传递给后端 主机;
proxy_pass 后面的路径是一个 uri时,其会将 location的 uri替换为 proxy_pass的 uri;
如果 location 定义其 uri 时使用了正则表达式的模式,或在 if 语句 或 limt_execept 中使用 proxy_pass 指令,则 proxy_pass 之后必须不能使用 uri; 用户请求时传递的 uri 将直接附加代理到的服务的之后;
(2)proxy_set_header field value;
设定发往后端主机的请求报文的请求首部的值;
Context: http, server, location
Field:要更改信息所在的头域
Value:更改的值,支持使用文本、变量或者变量的组合
示例:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
(3)proxy_cache_path
定义可用于 proxy 功能的缓存; Context: http
proxy_cache_path path [levels=levels] [use_temp_path=on|off]
keys_zone=name:size [inactive=time] [max_size=size]…
levels:设置在对于 path 指定目录的第几级 hash 目录中缓存数据
key_zone:Nginx 服务器的缓存索引从简进程在内存中为缓存数据建立索引,用来定义放存缓存索引的内存区域的名称和大小
inactive:表示缓存有效时间
max_size:设置硬盘中缓存数据大大小
(4)proxy_cache zone | off;
指明要调用的缓存,或关闭缓存机制;
Context: http, server, location
(5)proxy_cache_key string;
缓存中用于 “键”的内容;
默认值:proxy_cache_key $scheme$proxy_host$request_uri;
(6)proxy_cache_valid [code …] time;
定义对特定响应码的响应内容的缓存时长;
(7)proxy_cache_use_stale
用法:proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off …;
如果Nginx在访问被代理服务器过程中出现被代理服务器无法访问或者访问错误等现象时,Niginx 服务器可以使用历史缓存响应客户端的请求,这些数据不一定和被代理服务器上的最新的数据相一致,但对于更新频率不高的后端服务器来说,nginx 服务器的该功能在一定程度上能够为客户端提供不间断访问
(8)proxy_cache_methods GET | HEAD | POST …;
根据客户端请求报文请求方式,来选着需要缓存的数据
(9)proxy_hide_header field;
该指令用于设置 nginx 服务器在发送响应报文时,隐藏一些头信息
(10)proxy_connect_timeout time;
该指令来设定 nginx 服务器域后端被代理服务器尝试连接的超时时间。默认为 60s;最长为 75s;
(11)proxy_read_timeout time;
该指令设置 nginx 服务器向后端被代理服务器发出 read 请求后,等待响应的超时时间
(12)proxy_send_timeout time;
该指令设置 nginx 服务器向后端被代理服务器发出 write 请求后,等待响应的超时时间
更多模块学习请访问nginx官网:https://nginx.org→[documentation]→[Modules reference]进行学习