一.应用场景

nginx代码架构 nginx架构分析_html

 

  1. 静态资源服务
  2. 反向代理服务:缓存,负载均衡
  3. api服务(通过openresty)

二.软件说明

组成部分

  1. 可执行文件
  2. 配置文件:nginx.conf
  3. Log:  access.log  error.log

nginx的请求处理流程

请求端:下游(downstream)==>  nginx  ==> 目标端:上游(upstream)

nginx底层使用非阻塞的事件驱动引擎,结合状态机来完成异步通知

nginx代码架构 nginx架构分析_nginx_02

 

进程结构

nginx是多进程结构,多进程结构设计是为了保证nginx的高可用高可靠,包含:

*master进程:也是父进程,负责worker进程的管理。

*worker进程:也是子进程,worker进程一般配置成与服务器的CPU核数相同,worker进程用来处理具体的请求的。

*cache进程:也是子进程,包括cache manager和cache loader进程,主要是反向代理时做缓存使用。

 

nginx代码架构 nginx架构分析_nginx_03

nginx代码架构 nginx架构分析_html_04

 

 

反向代理与负载均衡流程

支持4层反向代理与7层反向代理

分发策略:基于轮训/权重算法,URL,ip或者其他信息

4层:基于ip+port进行分发

7层:根据http协议中某些属性做分发

nginx代码架构 nginx架构分析_服务器_05

 

负载策略:内置策略,扩展策略

内置策略:轮询,加权轮询,ip hash

 

 

三.配置说明

nginx.conf结构 :

nginx代码架构 nginx架构分析_nginx_06

 

概要:

#nginx.exe -c  conf\nginx.conf

#1、main全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

#2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

#3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

#4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。

#5、location块:配置请求的路由,以及各种页面的处理情况。

 

注意点:

#1.对于匹配后的url地址,将匹配的location中的root路径替换访问url的host即得到文件的真实地址。(多个斜杠其实等价于一个斜杠)

#2.如果不匹配location,则寻找更外层的root做替换。(默认server层默认root为安装目录下html目录)

#3.root指令最后的斜杠可加可不加。

报错解决:查看log文件报错信息

匹配规则:

#= 表示精确匹配 (只匹配完全相同的路径)

#^~表示uri以某个常规字符串开头,大多情况下用来匹配url路径,nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。

#~ 正则匹配(区分大小写)

#~* 正则匹配(不区分大小写)

#!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则

#/ 任何请求都会匹配

示例讲解:

1.全局块

user  nobody  nginx;  #运行用户和用户组
worker_processes  1;   #进程数,建议设置为CPU数
#全局错误日志类型 [ debug | info | notice | warn | error | crit ]
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
pid        logs/nginx.pid; #进程文件

2.event块 

 

events { #每个进程最大连接数
    worker_connections  1024;   
}

3.http块

include       mime.types; #文件扩展名与文件类型映射表
default_type  application/octet-stream; #默认文件类型
sendfile on;  #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来 输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置 为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常 把这个改成off。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒
gzip on; #开启gzip压缩输出

4.server块:虚拟主机

最重要的两个属性:listen , server_name

Listen

属性

含义

listen

定义了该虚拟服务器监听的ip和port对,只有当ip和port同时匹配的时候才进行下一步匹配

server_name

定义了该虚拟服务器监听的主机名,用于当ip和port无法确定唯一server块时启用,进行进一步区分

 

属性格式

形式

描述

例子

默认补全

ip地址+port端口

完整形式

listen 123.123.123.123:23

listen 123.123.123.123:23

只有ip

会自动加上80的web监听端口

listen 2.2.2.2

listen 2.2.2.2:80

只有ip

会自动加上0.0.0.0的全监听地址

listen 45

listen 0.0.0.0:45

 

匹配规则

第一步 当nginx匹配的时候,会将缩写的格式补全
第二步 匹配描述的最精确的(缩写的没有完整的格式准确)
第三步 如果第二步的情况下还有多个,那么listen就判断不出来了,交给server_name判断

 

1.server_name属性详解

作用:通过http的HOST字段,匹配server_name,转发到相应服务器

server {

        listen       80;

        server_name  localhost;

     .....

  }

格式

形式

例子

不带有通配符*

www.example.com

带有前缀通配符*

*.example.com

带有后缀通配符*

www.example.*

 

匹配规则

优先匹配不带通配符的完整表达
接着匹配带有前缀通配符的表达
最后匹配带有后缀通配符的表达

5.location块

#location 描述符 匹配串
location / {
    root   html;
    index  index.html  index.htm;
}

语法中的optional_modifier是描述符,location_match是具体匹配的串形式,如果描述符是正则的一种,那么就会以正则的方式来对待location_match,否则以普通方式用location_match来当前缀匹配。

 

optional_modifier

|类型|含义|匹配方式|优先级|例子|
|:--|:--|:--|:--|
|(none)|最普通的前缀匹配|前缀方式匹配|4|location / {}|
|=|要求绝对相等|前缀方式匹配|1|location = /image {}|
|~|区分大小写的正则匹配|正则方式匹配|3|location ~ .(jpe?g)$ {}|
|~|不区分大小写的正则匹配|正则方式匹配|3|location ~ .(jpe?g)$ {}|
|^~|高优先级的前缀匹配|前缀方式匹配|2|location ^~ /page {}|

匹配规则

· 最高优先级的是=,这个只能完全相等才能匹配上,如果找到符合条件的那么完成匹配。

· 接着在~和(none)中找到一个能够匹配出最长串的<sup>1</sup>规则,如果这个规则是属于~的,那么完成匹配。

· 否则如果上一步中规则是属于(none)的,则还需要给正则表达式验证一下。这时候按照location定义的顺序一个一个地检测*和规则,如果发现一个满足的,那么就用这条正则规则。

· 最后如果正则规则中没有符合条件的,那么就用刚才属于(none)的规则,如果刚才连各最长串都没有,那就跳到默认location去了。

server {
  location = /abc {...}
  location / {...}
  location ^~ /big/middle {...}
  location /big/middle/small {...}
  location ~ 123+\.jpg {...}
  location ~* a+\.jpg {...}
}

目录配置

root属性可以定义在server块中,也可以定义在location块中。

如果声明在server块中那么所有的location都会继承这个定义。同时若location中也定义了root属性,那么以location中的定义为主。

server {
  root /var/www/html    #server级root
  location /cs {
     root /share/usr   #location级root
     try_files $uri $uri/ =404;
  }
  location /eg {
     try_files $uri $uri/ =404;
  }}

如果访问/cs/vr/audio.mp3,==>  /share/usr/cs/vr/audio.mp3的资源
如果访问/eg/file/new.pdf,==>  /var/www/html/eg/file/new.pdf的资源

 

6.proxy_pass讲解

代理转发

nginx中配置proxy_pass转发时,如果proxy_pass后面的url加”/”,表示绝对根路径;如果没有”/”,表示相对路径。把路径部分也给代理走。

当访问: http://192.168.1.1/proxy/test.html 有以下四种情况,

第一种:

location /proxy/ {
proxy_pass http://127.0.0.1/;
}
代理到URL:http://127.0.0.1/test.html

第二种(相对于第一种,最后少一个 / )

location /proxy/ {
proxy_pass http://127.0.0.1;
}
代理到URL:http://127.0.0.1/proxy/test.html

第三种:

location /proxy/ {
proxy_pass http://127.0.0.1/aaa/;
}
代理到URL:http://127.0.0.1/aaa/test.html

第四种(相对于第三种,最后少一个 / )

location /proxy/ {
proxy_pass http://127.0.0.1/aaa;
}
代理到URL:http://127.0.0.1/aaatest.html

7.upstream

upstream作用是定义一组服务器,服务器可以在不同的监听端口,还可以混合使用侦听tcp/unix套接字的服务器。

参数          描述

Service       反向服务地址 加端口

Weight       权重

max_fails     失败多少次 认为主机已挂掉则,踢出

fail_timeout   踢出后重新探测时间

Backup       备用服务

max_conns    允许最大连接数

slow_start     当节点恢复,不立即加入

例:

http{

upstream feng {

server 127.0.0.1:8050 weight=1 max_fails=1 fail_timeout=20;

server 127.0.0.1:8060 weight=1;

}

server{

  location / {

proxy_pass http://feng;

}

}

}

 

8.header处理

proxy_set_header

location / {

proxy_pass   https://taobao;

proxy_set_header  Host  www.taobao.com;

}

add header   key  value

fastcgi_hide_header  key

 

9.tcp/udp代理,四层代理

stream{

    upstream tcpssh{

        hash $remote_addr consistent;

        server  8.8.8.8:389 max_fails=3 fail_timeout=10s;  

    }

    server{

        listen 3389;

        proxy_connect_timeout 20s;

        proxy_timeout 5m;

        proxy_pass tcpssh;

    }

}