https://www.cnblogs.com/woodman/p/6200634.html
nginx的http web功能
必须使用虚拟机来配置站点:每个虚拟主机使用一个server{}段来配置
非虚拟主机的配置、公共选项,需要定义在server之外,http之内
http{
directive value;
....
server{
}
server{
}
......
}
1.server{}
定义一个虚拟主机:nginx支持使用基于主机名或IP的虚拟主机
注意:
PORT :基于监听的端口
server_name :基于主机名区分
2.listen
listen address[:port][default_server][ssl][http2|spdy] [rcvbuf=size] [sndbuf=size] ;
listen port [default_server][ssl][http2|spdy] [rcvbuf=size] [sndbuf=size] ;
default_server:定义此server为http中默认的server;如果所有的server中无任何一个listen使用此参数,那么第一个server即为默认server
rcvbuf=SIZE:接收缓存大小
sndbuf=SIZE: 发送缓存大小
ssl:https server:必须以ssl连接
3.server_name [...];
server_name可以跟多个主机名,名称可以使用通配符和正则表达式(通常以~开头):当nginx收到一个请求时,会取出其首部的server的值,而后跟众server_name进行比较:比较方式
(1) 先做精确匹配 www.tshare365.com
(2) 左侧通配符匹配 *.tshare365.com
(3) 右侧通配符匹配 www.*
(4) 正则表达式匹配 ~^.*\.tshare365\.com$
4.server_name_hash_bucket_size 32|64|128
为了实现快速主机查找,nginx使用hash表来保存主机名
5.location [ =|~|~*|^~] uri { ... }
location @name { ... }
功能:允许根据用户请求的URI来匹配指定的各location以进行访问配置;匹配到时,将被location块中的配置所处理
=:精确匹配
~:正则表达式模式匹配,匹配时区分字符大小写
~*:正则表达式模式匹配,匹配时忽略字符大小写
^~:只需要前半部分与uri匹配即可,不检查正则表达式
匹配优先级:
字符字面量最精确匹配、正则表达式检索(由多个时,由第一个匹配到的所处理),按字符字面量
匹配优先级:精确匹配=、^~ 、~或* 、不带符号的URL;
6、tcp_nopush on | off ,默认off(推荐)
是否启用TCP_NOPUSH(freebsd)或TCP_CORK(Linux)选项;仅在启用sendfile为On时有用;
文件路径定义
1.root path
设置web资源路径,用于指定请求的根文档目录,从跟开始匹配
root:root/URI
location ^~ /images/{
root /web;
}
打开logo.png则访问的是 /web/images/logo.png
http:///www.tshare365.com/images/logo.png
2.alias path
指定路径别名,只能用于location中,从最后一个/开始匹配
alias:alias/
location ^~ /images/{
alias /web;
}
打开logo.png则访问的是 /web/logo.png
http:///www.tshare365.com/images/logo.png
3.index file....
定义默认页面,可以跟多个值。自左向右匹配
4.error_page code ... [=[response]] uri;
当对于某个请求发回错误时,如果匹配上了error_page指令中设定的code,则从定向至新的新URI中 (写在server{}之后)
错误重定向
5.try_files path1 [path2...] uri;
http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
自左向右尝试读取有path所指定路径,在第一找到即停止并返回,如果所有path均不存在,则返回最后一个uri
location ~* ^/document/(.*)${
root /www/htdocs;
try_files $uri /docu/$1 /temp.html; #$1表示 ( )中的内容
}
location /images/ { try_files $uri /images/default.gif; } location = /images/default.gif { expires 30s; }
网络连接相关的设置
1.keepalive_timeout time;
保持连接的超时时长,默认为75s;0表示禁止连接;
2.keepalive_requests n;
在一次长连接上允许承载的最大请求数,默认100;
3.keepalive_disable [msie6|safari |none]
对指定的浏览器禁用长连接
4.tcp_nodelay on|off
对keepalive模式下的链接是否使用TCP_NODELAY选项;(关闭TCP延迟响应)
5.client_header_timeout time
读取http请求首部的超时时长
6.client_body_timeout time
读取http请求包体的超时时间
7.send_timeout #;
发送响应的超时时长,默认60s;
8.压缩:
gzip
gzip on|off
gzip_buffer 使用的缓存大小
gzip_comp_level 压缩的级别
gzip_disable 不压缩的类型或浏览器
gzip_min_length 最少压缩的大小
gzip_http_version 压缩完成以后发送http的版本
gzip_types:只压缩的格式
对客户端请求的限制:
1.client_max_body_size size;
http请求包体的最大值,常用于限定客户端所能够请求的最大包体,根据请求首部中的Content-Length来检查,以避免无用的传输
client_body_buffer_size size;默认16k
客户请求报文body的缓冲区大小,超出默认则移存于磁盘上;
client_body_temp_path path [level1 [level2 [level3]]];
设定存储客户端请求body的临时存储路径以及子目录结构数量和数量
2.limit_except method ...{ ... };
设置禁止的方法,只能用于location中
控制1网段除get外的其他方法都可用。
limit_except GET { allow 192.168.1.0/32; deny all; }
3. limit_rate speed;
限制客户端每秒传输的字节数,默认为0,表示没有限制
4.limit_rate_after time;
nginx向客户端发送响应报文时,如果时长超过了此处指定的时长,则后续的发送过程开始限速;
文件操作的优化
1. sendfile on|off
直接从内存空间读取,速度加快
tcp_nopush on | off ,默认off(推荐)
是否启用TCP_NOPUSH(freebsd)或TCP_CORK(Linux)选项;仅在启用sendfile为On时有用;
2. aio on|off ;异步IO模式。
是否启用aio功能
4. directio size |off ; 默认关闭。
5. open_file_cache max=N [inactive=time]|off
是否打开文件缓存功能
max:缓存条目的最大值,当满了以后将根据LRU(最近最少连接数)算法进行置换
inactive:某缓存条目在指定时长内没有被访问过时,将自动被删除;默认为60s
缓存的信息包括:
(1)文件句柄、文件大小和上次修改时间
(2)已经打开的目录结构:
(3)没有找到或没有访问权限的信息;由6开启。
6. open_file_cache_errors on|off
是否缓存文件找不到或没有权限访问等相关信息
7. open_file_cache_valid time
多长时间检查一次缓存中的条目是否超出非活动时长,默认为60s;
8. open_file_cache_min_use #;
在inactive指定的时长内被访问超过此处指定的次数时,才不会被删除;
9. autoindex on | off ;
是否开启目录浏览,多拥有下载页面。一般定义在location中。
对客户端请求的特殊处理
1.ignore_invalid_headers on|off ;只能用于server和http
是否忽略不合法的http首部,默认为on,off意味着请求首部中出现不合规的首部将拒绝响应
2.log_not_found on|off TSL(http server location)
用户访问的文件不存在时,是否将其记录到错误日志中
3.resolver address ;
指定nginx使用的dns服务器地址
4.resolver_timeout times;
指定DNS解析超时时长,默认为30s
5.server_tokens on|off TSL
是否在错误页面中显示nginx的版本号
6. auth_basic string;
auth_basic_user_file FILE; 用户认证的帐号文件
# htpasswd -c /etc/nginx/conf/nginx.passwd username //使用http-tool工具创建密文密码
格式:
name:passwd
密码格式
(1)encrypted with the crypt() function;
(2)md5;
7. satisfy all | any ;
如果在一个字段中同时使用了Access模块和Auth Basic模块的指令,可以使用这个指令确定一种验证方式:
all - 必须同时匹配Access和Auth Basic中指令指定的权限。
any - 具有Access 或 Auth Basic指令任一权限即可通过匹配
location / {
satisfy any;
allow 192.168.1.0/32;
deny all;
auth_basic "closed site";
auth_basic_user_file conf/htpasswd;
}
8. log_format name string ……;
定义日志格式和名称;日志格式一般通过调用变量来定义;
9. access_log
path
[format
[buffer
=size
[flush
=time
]] [if
=condition
]]; access_log
path
format
gzip[=
[level
]buffer
=size
] [flush
=time
] [if
=condition
]; access_log
syslog:
server
=address
[,parameter
=value
] [format
[if
=condition
]]; access_log
off
;
访问日志路径,格式名称以及缓存大小和刷写时间间隔;建议定义buffer提示性能;
10. open_log_file_cache
max
=N
[inactive
=time
] [min_uses
=N
] [valid
=time
]; open_log_file_cache
off
;
11. stub_status
location /basic_status {
stub_status on;
allow x.x.x.0/16;
deny all;
}
Active connections : 当前活动的客户端连接数;
accepts :已接受的客户端连接总数量;
handled :已经处理过的客户端连接总数量;
requests :客户端总的请求数量;
Reading :正在读取的客户端请求的数量;
Writing :正在向其发送响应报文的连接数量;
Waiting :当前等待请求的空闲连接数量;
12 防盗链 ngx_http_referer_module (基于请求报文中的referer首部的值做访问控制)
(1)定义和规定有效引用
valid_referers none |blocked |server_names|string ...
(2)判断不合规的引用
location ~* \.(jpg|png|gif|jpeg)$ {
root /www;
valid_referers none blocked *.tshare365.com *.woodman.com ;
if ($invalid_referer) {
# return 403;
rewrite http://www.woodman.com/403.html;
}
}
none:请求报文不存在referer首部;
blocked:请求报文中存在referer首部,但其没有有效值。
server_names:值为主机名
arbitrary string:直接字符串,可以使用 * 通配
regular expression:以~起始的正则表达式;
内置变量:$invalid_referer (所有不能符合valid_referers指定定义的引用请求均为不合法)
13.URL rewrite
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
rewrite regex replacement [flag];
location / {
root /www;
rewrite ^/imgages/(.*)$ /imgs/$1 last;
rewrite ^/imgs/(.*)$ /images/$1 break;
}
http://www.b.org./images/a.jpg --> http://www.b.org/imgs/a.jpg
flag:标志位
last:一旦被当前规则匹配并重写后立即停止检查后续的其他rewrite的规则,而后通过重写后的规则重新发起请求
break:一旦被当前规则匹配并重写后立即停止检查后续的其他rewrite的规则,而后继续由nginx进行后续的操作
redirect:返回302临时重定向代码
permanent:返回301永久重定向
nginx最多循环10次,超出之后返回500错误
括号不需要转移
注意:一般将rewrite写在location中时都使用break标志,或者将rewrite写在if上下文中
rewrite_log on|off
是否将重写过程记录在错误日志中,默认为notice级别;默认为off;
return code:
用于结束rewrite规则,并且为客户返回状态码:可以使用的状态码有204,400,402-406,500-504等
if (condition) {
return code;
}
用于检测条件是否成立
http核心模块的内置变量:
$uri:当前请求的uri,不带参数
$request_uri:请求的uri,带完整参数
$host:http请求报文中host首部;如果请求中没有host首部,则以处理此请求的虚拟主机的主机名代替
$hostname:nginx服务运行所在主机的主机名
$remote_addr:客户端IP
$remote_port::客户端port
$remote_user:使用用户认证时客户端用户输入的用户名
$request_filename:用户请求中的URI经过本地root或alias转换后映射的本地的文件路径
$request_method:请求方法
$server_addr:服务器地址
$server_name: 服务器名称
$server_port:服务器端口
$server_protocol:服务器向客户端发送响应时的协议,如http/1.1,http/1.0
$scheme:在请求中使用的scheme 映射协议本身的协议。 如https://www.tshare365.com中的https;
$http_HEADER:匹配请求报文中指定的HEADER,$http_host匹配请求报文中的host首部
$sent_http_HEADER:匹配响应报文中指定的HERDER,例如$http_content_type匹配相应报文中的content-type首部
$document_root:当前请求映射到的root配置
$status : 引用状态码