一.应用场景
- 静态资源服务
- 反向代理服务:缓存,负载均衡
- api服务(通过openresty)
二.软件说明
组成部分
- 可执行文件
- 配置文件:nginx.conf
- Log: access.log error.log
nginx的请求处理流程
请求端:下游(downstream)==> nginx ==> 目标端:上游(upstream)
nginx底层使用非阻塞的事件驱动引擎,结合状态机来完成异步通知
进程结构
nginx是多进程结构,多进程结构设计是为了保证nginx的高可用高可靠,包含:
*master进程:也是父进程,负责worker进程的管理。
*worker进程:也是子进程,worker进程一般配置成与服务器的CPU核数相同,worker进程用来处理具体的请求的。
*cache进程:也是子进程,包括cache manager和cache loader进程,主要是反向代理时做缓存使用。
反向代理与负载均衡流程
支持4层反向代理与7层反向代理
分发策略:基于轮训/权重算法,URL,ip或者其他信息
4层:基于ip+port进行分发
7层:根据http协议中某些属性做分发
负载策略:内置策略,扩展策略
内置策略:轮询,加权轮询,ip hash
三.配置说明
nginx.conf结构 :
概要:
#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;
.....
}
格式
形式 | 例子 |
不带有通配符* | |
带有前缀通配符* | *.example.com |
带有后缀通配符* |
匹配规则
优先匹配不带通配符的完整表达
接着匹配带有前缀通配符的表达
最后匹配带有后缀通配符的表达
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;
}
}