1 概述
本文将介绍nginx里http配置段的相关配置,主要介绍ngx_http_core_module这个模块的相关功能和命令。由于主配置文件的http配置段里有 include /etc/nginx/conf.d/*.conf; 这个配置,因此可以单独在路径/etc/nginx/conf.d/下面单独编写配置文件
2 HTTP配置段
2.1 http协议相关的配置结构
http { ... ...各server的公共配置 server {每个server用于定义一个虚拟主机 ... } server { ... server_name 虚拟主机名 root 主目录 alias 路径别名 location [OPERATOR] URL { 指定URL的特性 ... if CONDITION { ... } } } }
2.2 与套接字相关的配置
.1、server
server { ... }
在ngnix里,实际是没有virtualhost的概念,都是主机,监听端口号,要放在server里,不能所有的机器只用一个监听端口配置。要分别配置监听端口
配置一个虚拟主机
server { listen address[:PORT]|PORT; server_name SERVER_NAME; root /PATH/TO/DOCUMENT_ROOT; }
注意:listen address[:PORT]|PORT;是两种写法
写法一:listen 172.18.50.73:8080
写法二:listen 8080
例子
server { listen 17 2.18.50.73:8088; server_name www.sunny.com; root /usr/share/nginx/html/diysrv; }
.2、listen
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 发送缓冲区大小
虚拟主机的创建,三个方法
(1) 基于port;
listen PORT; 指令监听在不同的端口
(2) 基于ip的虚拟主机
listen IP:PORT; IP 地址不同
(3) 基于hostname
server_name fqdn; 指令指向不同的主机名
例子如下
注意:基于ip 和FQDN要把默认主站点的server配置去除,否则主页面会出错
#基于ip server { listen 80; server_name 172.18.50.199; root /usr/share/nginx/html/baseip; } #基于FQDN server { listen 80; server_name www.tracy.com; location / { root /usr/share/nginx/html/basefqdn; index index.html; } } #基于端口 server { listen 9090; server_name www.sunny.com; root /usr/share/nginx/html/baseport; }
.3、server_name
server_name name...;
.虚拟主机的主机名称后可跟多个由空白字符分隔的字符串
.支持*通配任意长度的任意字符
dns先解析成名字,才和以下的配置做对比生效
server_name *.magedu.com www.magedu.*
.支持~起始的字符做正则表达式模式匹配,性能原因慎用
server_name ~^www\d+\.magedu\.com$
以上语句\d 表示[0-9],命令表示匹配www开头的,www[0-9].magedu.com结尾的
.匹配优先级机制从高到低:
(1) 首先是字符串精确匹配如:www.magedu.com
(2) 左侧*通配符如:*.magedu.com
(3) 右侧*通配符如:www.magedu.*
(4) 正则表达式如:~^.*\.magedu\.com$
(5) default_server
.4、tcp_nodelay
tcp_nodelay on | off;
在keepalived模式下的连接是否启用TCP_NODELAY选项
当为off时,延迟发送,合并多个请求后再发送,凑齐多个请求后在发送给后台处理,但是这个情况可能会导致客户端等待,会比较慢,所以一般是不延迟发送
默认on时,不延迟发送
可用于:http,server, location
.5、sendfile
sendfile on | off;
是否启用sendfile功能,在内核中封装报文直接发送,速度更快,默认Off
.6、server_tokens
server_tokens on | off | build | string
是否在响应报文的Server首部显示nginx版本,默认是on,建议设置为off
2.3 定义路径相关的配置
.7、root
.设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径,可用于http, server,location, if in location
server { ... root /data/www/vhost1; }
.8、location
location [ = | ~ | ~* | ^~ ] uri{ ... }
=:对URI做精确匹配;
^~:对URI的最左边部分做匹配检查,不区分字符大小写
~:对URI做正则表达式模式匹配,区分字符大小写
~*:对URI做正则表达式模式匹配,不区分字符大小写
不带符号:匹配起始于此uri的所有的uri
匹配优先级从高到低:=, ^~, ~/~*, 不带符号
location @name { ... }
location是重点,可以定义复杂的逻辑关系,或者实现身份验证,重定向等, 后面跟URL,根据URL做相应的控制,匹配到相应的url后做什么操作, 这个相当于条件判断
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置
.示例一:
server { server_name www.sunny.com; location /p_w_picpaths/ { root /data/imgs/; } }
测试: 当访问http:// www.sunny.com/p_w_picpaths/aa.jpg将会被转到访问/data/imgs/p_w_picpaths/aa.jpg
.9、alias
alias path;
路径别名,文档映射的另一种机制;仅能用于location上下文
例子
server { listen 8080; server_name www.sunny.com; root /usr/share/nginx/html/diysrv; location /p_w_picpaths { alias /app/test; } }
表示当访问http://www.sunny.com:8080/p_w_picpaths/将都会被转换到路径/app/test下的对应资源
如访问http://www.sunny.com:8080/p_w_picpaths/相当于是访问了/app/test/index.html
如访问http://www.sunny.com:8080/p_w_picpaths/aa相当于是访问了/app/test/aa
区分alias和root例子:
location /bbs/ { alias /web/forum/; }
当访问http://172.18.50.73/bbs相当于访问该机器下的/web/forum/index.html资源
location /bbs/ {
root /web/forum/;
} --> /web/forum/bbs/index.html
当访问http://172.18.50.73/bbs相当于访问该机器下的/web/forum/bbs/index.html资源
.注意:location中使用root指令和alias指令的意义不同
(a) root,给定的路径对应于location中的/uri/左侧的/
(b) alias,给定的路径对应于location中的/uri/右侧的/
.10、index
index file ...;
指定默认网页资源,注意:ngx_http_index_module模块
.11、error_page
error_page code ... [=[response]] uri;
模块:ngx_http_core_module
定义错误页,以指定的响应状态码进行响应
可用位置:http,server, location, if in location
error_page 404 /404.html error_page 404 =200 /404.html
例子
例一,用alias
error_page 404 /404.html; location /404.html { alias /app/error_pages/404.html; }
#表示当访问网站出现404报错的时候,就跳转到/app/error_pages/404.html这个页面
例二,用root
error_page 404 /404.html; location /404.html { alias /app/error_pages/; }
#表示当访问网站出现404报错的时候,就跳转到/app/error_pages/404.html这个页面
例三
error_page 404=200 /404.html; location /404.html { alias /app/error_pages/404.html; }
#注意等号的位置,404后面有空格,然后跟=200,等号和200之间没有空格,错误页面返回200的代码,而不返回404代码,防止客户端访问该网页发生错误代码的时候被劫持
.12、try_files
try_files file ... uri;
try_files file ... =code;
按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误
例子
location /p_w_picpaths/ { try_files $uri /p_w_picpaths/default.gif; }
默认先找$uri这个资源,如果没有,就访问/p_w_picpaths/default.gif
注意这里的$uri是变量,假设家目录是/usr/share/nginx/html,那么上例表示访问http://172.18.50.73/p_w_picpaths时尝试访问/usr/share/nginx/html/p_w_picpaths/index.html和/usr/share/nginx/html/ default.gif的资源
location / { try_files $uri $uri /index.html $uri.html =404; }
表示依次先找 $uri $uri /index.html$uri.html,如果都不存在,就返回报错代码是404报错
2.4 定义客户端请求的相关配置
.13、keepalive_timeout
keepalive_timeout timeout [header_timeout];
设定保持连接超时时长,0表示禁止长连接,默认为75s,可以调整短点。
.14、keepalive_requests
keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量,默认为100
.15、keepalive_disable
keepalive_disable none | browser ...
对哪种浏览器禁用长连接
.16、send_timeout
send_timeout time;
向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长
.17、client_body_buffer_size
client_body_buffer_size size;
用于接收每个客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置。注意,这里是接收,不是下发数据,上传文件到该网站,才看得到效果
.18、client_body_temp_path
client_body_temp_path path [level1 [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量
这里指定的路径下存放文件,目录名为16进制的数字,是经过hash运算后,利用hash的值的最后几位数,依次分层,如三层目录进行存放文件
例子
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
2.5 对客户端进行限制的相关配置
.19、limit_rate
limit_rate rate;
限制响应给客户端的传输速率,单位是bytes/second,默认值0表示无限制
.20、limit_except
limit_except method ... { ... },仅用于location
限制客户端使用除了指定的请求方法之外的其它方法
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE,OPTIONS, PROPFIND,PROPPATCH, LOCK, UNLOCK, PATCH
location { limit_except GET { allow 192.168.1.0/24; deny all; } }
除了GET和HEAD 之外其它方法仅允许192.168.1.0/24网段主机使用
2.6 文件操作优化的配置
.21、aio
aio on | off | threads[=pool];是否启用aio功能,默认是on
.22、directio
directio size | off;一般是异步
是否同步(直接)写磁盘,而非写缓存,在Linux主机启用O_DIRECT标记,则文件大于等于给定大小时使用,例如directio 4m
.23、open_file_cache
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指令所指定的次数的缓存项即为非活动项,将被删除
inactive=time 为10分钟;open_file_cache_min_uses为3,表示在10分钟内访问低于3次表示非活动的,该文件就不会被缓存,会被清空
.24、open_file_cache_errors
open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息,默认值为off
.25、open_file_cache_min_uses
open_file_cache_min_uses number;
open_file_cache指令的inactive参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项,默认值为1
.26、open_file_cache_valid
open_file_cache_valid time;
缓存项有效性的检查频率,默认值为60s