Nginx 基础详解

Posted 雪狐晨光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx 基础详解相关的知识,希望对你有一定的参考价值。

思念可以到达比河流更远的地方

目录

后端服务器组配置指令upstream

rewrite配置

地址重写 

地址转发

常规指令

Rewrite使用

常用全局变量

域名跳转

域名镜像

独立域名

目录添加“/”

目录合并

 防盗链

 常用正则


后端服务器组配置指令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。

地址转发

它是指在网络数据传输过程中数据分组到达路由器或桥接器后,该设备通过检查分组地址并将数据转发到最近的局域网的过程。

因此地址重写和地址转发有以下不同点:

  1. 地址重写会改变浏览器中的地址,使之变成重写成浏览器最新的地址。而地址转发他是不会改变浏览器的地址的。
  2. 地址重写会产生两次请求,而地址转发只会有一次请求。
  3. 地址转发一般发生在同一站点项目内部,而地址重写且不受限制。
  4. 地址转发的速度比地址重定向快。

常规指令

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 基础详解的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 基础详解

Nginx 基础详解

Nginx 基础详解

nginx 基础配置中文详解

Nginx 的请求处理流程,你了解吗?

Nginx详解七:Nginx基础篇之Nginx官方模块