Nginx 基础详解
Posted 雪狐晨光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 基础详解相关的知识,希望对你有一定的参考价值。
思念可以到达比河流更远的地方
目录
后端服务器组配置指令upstream
通过 upstream 可以设定后端服务器,指定的方式可以是 IP 地址与端口、域名、UNIX 套接字(socket)。其中如果域名可以被解析为多个地址,则这些地址都作为 backend。下面举例说明:
upstream name ... . //其中name是服务器组名称, 中是服务器组中包含的服务器。默认是轮询,也有加权
配置样例:
upstream my_backend
# ip_hash;
least_conn;
server www.baidu.com backup;
server 111.222.101.102:8080 down;
server unix:/home/work/hhvm/var/hhvm.sock max_failes=3 fail_timeout=10s weight=5;
keepalive_timeout 30s;
keepalive_requests 100;
server
location /
proxy_pass http://my_backend;
常用参数说明:
server:负载均衡后端的服务器的IP或域名,不写端口默认是80。
weight:后端服务器的权重,默认为1,权重越大接收的请求越多。
max_fails:检查节点的健康状态并允许请求失败的次数,达到该次数将节点下线,默认为1,0表示禁止失败尝试,例如:max_fails=2。
fail_timeout:max_fails失败次数达到限制后暂停该节点服务器时间,默认是10秒。
backup:热备配置,当服务池中所有的服务器出现问题后会自动上线backup服务器。
down:标志服务器不可用,不参与负载均衡,这个参数通常配合IP_HASH使用。
max_conns:限制最大连接数,通常对后端服务器硬件不一致的情况进行配置。
keepalive:限制空闲长连接的最大数量。
keepalive_timeout:空闲长连接的最长保持时间。
keepalive_requests:每个长连接最多可以处理的请求数。
ip_hash:实现会话保持功能,将某个客户端的多次请求定向到同一台服务器上,保证客户端与服务端之间建立稳定的会话。首先ip_hash不能够和weight变量一起使用,其次,由于ip_hash是根据客户端ip地址分配的服务器,因此在整个系统中,nginx服务器应该是处于最前端的服务器,才能够获取客户端ip地址,否则它获取的将是位于它前面的服务器地址,产生问题。同时注意客户端IP必须是C类地址。
least_conn: 实际的含义,选取活跃连接数与权重weight的比值最小者为下一个处理请求的server,上一次已选的server和已达到最大连接数的server照例不在选择的范围。
rewrite配置
Rewrite是nginx服务器提供的一个重要的基本功能,通过正则表达式的使用来改变URI,可以在server块或location块中配置,其基本语法结构如下:
rewrite regex replacement [flag];注:flag使用last和break时浏览器中的地址不会改变,使用redirect和permanent则会改变
- last 停止处理后续rewrite指令集,跳出location作用域,并开始搜索与更改后的URI相匹配的location,URL地址不变(继续匹配)
- break 停止处理后续rewrite指令集,不会跳出location作用域,不再进行重新查找,终止匹配,URL地址不变(终止匹配)
- redirect 返回302临时重定向,浏览器地址栏会显示跳转后的URL地址,爬虫不会更新自己的URL数据库
- permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫会更新自己的URL数据库
地址重写
是为了实现地址的标准化,比如我们可以在地址栏中中输入 www.baidu.com. 我们也可以输入 www.baidu.cn. 最后都会被重写到 www.baidu.com 上。浏览器的地址栏也会显示www.baidu.com。
地址转发
它是指在网络数据传输过程中数据分组到达路由器或桥接器后,该设备通过检查分组地址并将数据转发到最近的局域网的过程。
因此地址重写和地址转发有以下不同点:
- 地址重写会改变浏览器中的地址,使之变成重写成浏览器最新的地址。而地址转发他是不会改变浏览器的地址的。
- 地址重写会产生两次请求,而地址转发只会有一次请求。
- 地址转发一般发生在同一站点项目内部,而地址重写且不受限制。
- 地址转发的速度比地址重定向快。
常规指令
if:用于支持条件判断
if (!-f $request_filename)
return 414;
正则表达式匹配:
=,!=:等值比较;
~: 与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写;
~*:与指定正则表达式模式匹配时返回“真”,判断匹配与否时不区分字符大小写;
!~: 与指定正则表达式模式不匹配时返回“真”,判断匹配与否时区分字符大小写;
!~*: 与指定正则表达式模式不匹配时返回“真”,判断匹配与否时不区分字符大小写;
文件及目录匹配判断:
-f, !-f: 判断指定的路径是否为存在且为文件;
-d, !-d:判断指定的路径是否为存在且为目录;
-e, !-e:判断指定的路径是否存在,文件或目录均可;
-x, !-x:判断指定路径的文件是否存在且可执行;
break:用于中断当前相同作用域的其他nginx配置。处于break指令前,配置有效;反之,配置无效。
return:用于完成对请求的处理,直接向客户端返回响应状态代码。处于该指令后的所有nginx配置都是无效的。
return 200 "ok";
return 301 http://www.baidu.com;
return http://www.baidu.com
- 第一种: return code [text];
- 第二种: return code URL;
- 第三种: return URL;
rewrite:通过正则表达式的使用改变URI,可以同事存在一个或者多个指令,按照顺序依次对URL匹配和处理。
rewrite regex replacement [flag];
rewrite的含义:URL重写的指令。
regex的含义:匹配URI的正则表达式。
replacement:将regex正则匹配到的内容替换成 replacement。
flag: flag标记。
set:指令是用于定义一个变量,并且赋值。应用环境server,location,if。
if ( $host ~* "^(.*)\\.dabaidu\\.com$" )
set $user $1;
rewrite .* http://www.baidu.com/$user permanent;
rewrite_log:配置是否开启URL重写日志的输出功能。
rewrit_log on|off
Rewrite使用
常用全局变量
- $args : #这个变量等于请求行中的参数,同$query_string
- $content_length : 请求头中的Content-length字段。
- $content_type : 请求头中的Content-Type字段。
- $document_root : 当前请求在root指令中指定的值。
- $host : 请求主机头字段,否则为服务器名称。
- $http_user_agent : 客户端agent信息
- $http_cookie : 客户端cookie信息
- $limit_rate : 这个变量可以限制连接速率。
- $request_method : 客户端请求的动作,通常为GET或POST。
- $remote_addr : 客户端的IP地址。
- $remote_port : 客户端的端口。
- $remote_user : 已经经过Auth Basic Module验证的用户名。
- $request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
- $scheme : HTTP方法(如http,https)。
- $server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
- $server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
- $server_name : 服务器名称。
- $server_port : 请求到达服务器的端口号。
- $request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
- $uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
- $document_uri : 与$uri相同。
域名跳转
域名镜像
独立域名
类似于域名镜像,针对不同的域名对应后端同一个服务的不同目录
目录添加“/”
目录合并
防盗链
常用正则
. : 匹配除换行符以外的任意字符
? : 重复0次或1次
+ : 重复1次或更多次
* : 重复0次或更多次
\\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的介绍
n : 重复n次
n, : 重复n次或更多次
[c] : 匹配单个字符c
[a-z] : 匹配a-z小写字母的任意一个小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\\转义特殊字符。
以上是关于Nginx 基础详解的主要内容,如果未能解决你的问题,请参考以下文章