地址
- Nginx优秀特性
- Nginx配置⽂件
- Nginx⽇志配置
- Nginx状态监控
- Nginx下载站点
- Nginx访问限制
- Nginx访问控制
- Nginx虚拟主机
Nginx特性
Nginx基于IO多路复用
Nginx基于IO多路复用 , 解决的是并发性的问题,Socket
作为复用,
串行,产⽣阻塞
多线程, 消耗大
IO多路复用(主动上报)
- 多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫
I/O多路复用
, 复用
指的是复用同一个线程。
- 在同一个线程里面, 通过拨开关的方式,来同时传输多个I/O流,
- ngnix会有很多链接进来, epoll会把他们都监视起来,然后像拨开关一样,谁有数据就拨向谁,然后调用相应的代码处理。
CUP亲和
将CPU核⼼和Nginx⼯作进程绑定⽅式,把每个worker进程固定在一个cpu上执⾏,减少切换cpu的 cache miss
,获得更好的性能。
文件传输
传统文件传输, 在实现上其实是比较复杂的, 其具体流程细节如下:
调用read函数,文件数据被复制到内核缓冲
read函数返回,文件数据从内核缓冲区复制到用户缓冲区
write函数调用,将文件数据从用户缓冲区复制到内核与socket相关的缓冲区。
数据从socket缓冲区复制到相关协议引擎。
传统文件传输数据实际上是经过了四次复制操作:
硬盘—>内核buf—>用户buf—>socket缓冲区(内核)—>协议引擎
也就是说传统的文件传输需要经过多次上下文的切换才能完成拷贝或读取, 效率不⾼。
sendfile文件传输是在内核中操作完成的, 函数直接在两个文件描述符之间传递数据, 从而避免了
内核缓冲区数据和用户缓冲区数据之间的拷⻉, 操作效率很高, 被称之为零拷贝
。
1.系统调用sendfile函数通过 DMA 把硬盘数据拷⻉到 kernel buffer,
2.数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer。
3.DMA把数据从kernel buffer直接拷贝给协议栈。
这⾥没有用户空间和内核空间之间的切换,在内核中直接完成了从一个buffer到另一个buffer的拷贝。
Nginx配置
- server 用于对不同的域名做不同的配置
- Location 用于对不同的路径做不同的配置
这就是为什么 HTTP层下允许有不同的server , server下允许有不同的Location
1 | //nginx默认配置语法 |
测试配置 :
nginx -t
Nginx字符编码
1 | charset utf-8,gbk; |
用于server或者http
注意 :
charset utf-8,gbk;
和charset gbk,utf-8;
是不一样的
Nginx日志配置
1 | //Nginx默认配置 |
Nginx日志变量
- $remote_addr //表示客户端地址
- $remote_user //http客户端请求nginx认证用户名
- $time_local //Nginx的时间
- $request //Request请求⾏, GET等⽅法、http协议版本
- $status //respoence返回状态码
- $body_bytes_sent //从服务端响应给客户端body信息⼤⼩
- $http_referer //http上一级⻚⾯, 防盗链、用户⾏为分析
- $http_user_agent //http头部信息, 客户端访问设备
- $http_x_forwarded_for //http请求携带的http信息
Nginx状态监控
--with-http_stub_status_module
记录 Nginx 客户端基本访问状态信息
1 | Syntax: stub_status; |
1 | location /mystatus { |
1 | Active connections:2 |
Active connections:2 Nginx当前活跃连接数
server表示Nginx处理接收握手总次数。
accepts表示Nginx处理接收总连接数。
请求丢失数=(握⼿数-连接数)可以看出,本次状态显示没有丢失请求。
handled requests,表示总共处理了19次请求。
Reading : Nginx读取数据 , Nginx读取到客户端的 Header信息数
Writing : Nginx写的情况 , Nginx返回给客户端的 Header信息数。
Waiting : Nginx开启keep-alive⻓连接情况下,既没有读也没有写,建⽴连接情况
Nginx下载站点
1 | Syntax: autoindex on|off; |
autoindex常用参数
- autoindex_exact_size off;
默认为on, 显示出文件的确切大小,单位是bytes。
修改为off,显示出文件的大概大小,单位是kB或者MB或者GB。 - autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。
修改为on, 显示的文件时间为文件的服务器时间。 - charset utf-8,gbk;
默认中文⽬录乱码,添加上解决乱码。
eg
1 | //开启⽬录浏览 |
Nginx访问限制
- 连接频率限制 limit_conn_module
- 请求频率限制 limit_req_module
HTTP是建⽴在TCP, 在完成HTTP请求需要先建⽴TCP三次握⼿(称为TCP连接),在连接的基础
上在HTTP请求。
Nginx连接限制配置
limit_conn_zone必须自HTTP块中
1 | //Nginx连接限制语法 |
具体配置如下:
1 | http { |
1 | //压⼒测试 |
Nginx请求限制配置
1 | # Nginx请求限制语法 |
具体配置如下:
1 | http { |
压⼒测试
1 | yum install -y httpd-tools |
连接限制没有请求限制有效
- 多个请求可以建立在一次的TCP连接之上, 那么我们对请求的精度限制,当然比对一个连接的限制会更加的有效。
- 因为同一时刻只允许一个连接请求进入。但是同一时刻多个请求可以通过一个连接进入。所以请求限制才是比较优的解决⽅案。
Nginx访问控制
- 基于IP的访问控制 http_access_module
- 基于⽤户登陆认证 http_auth_basic_module
基于IP的访问控制
1 | # 允许配置语法 |
1 | # 配置拒绝某⼀个IP, 其他全部允许 |
注意 : 先允许 , 后拒绝
1
2
3
4
5 location / {
root html;
deny all;
allow 192.168.56.0/24;
}
- 上面的配置 , 谁都拿不到 , 因为
deny all;
已经拒绝所有人了 , 下面的allow
不起作用- 读配置文件的时候都是从上往下读的,读到deny就结束了,
- 所以必须调换deny和allow的位置
对于一些私有的路径 , 可以写成
1
2
3
4 location /secret_route {
allow 127.0.0.1;
deny all;
}比如 , 对于Django , 就可以设置
1
2
3
4 location /admin {
allow 127.0.0.1;
deny all;
}这样 , 就只允许127自己访问
http_access_module局限性
下图是使⽤ http_x_forwarded_for
记录真实客户端IP地址以及代理服务器IP
解决⽅式
- 采⽤HTTP头信息控制访问, 代理以及web服务开启 http_x_forwarded_for
- 结合geo模块作
- 通过HTTP⾃动以变量传递
基于⽤户登陆认证
1 | # 配置语法 |
⽤户登陆认证需要安装依赖
1 | yum install httpd-tools |
可在http,server,location下添加如下信息
1 | # 目录/下的文件必须用户登录后才能访问 |
⽤户认证局限性
- ⽤户信息依赖⽂件⽅式
- ⽤户管理⽂件过多, ⽆法联动
- 操作管理机械,效率低下
解决办法
- Nginx 结合 LUA 实现⾼效验证
- Nginx 结合 LDAP 利⽤ nginx-auth-ldap 模块
Nginx虚拟主机
- 所谓虚拟主机,在web服务器⾥是⼀个独⽴的⽹站站点,这个站点对应独⽴的域名(也可能是IP或端⼝),具有独⽴的程序及资源⽬录,可以独⽴地对外提供服务供⽤户访问。
- 虚拟主机功能: 一个nginx下运行多个网址(站点域名) ,
- 虚拟主机就是在同一个Nginx服务器上运行多个网站
方式一:基于不同域名
nginx.conf中的http{}中的每一个server{}就是一个站点(相同端口):
- 可多个网站通过不同的域名进行访问。
- 原理是 : 监听相同端口通过域名分发到不同的服务器
- 在服务器端首先会判断来访的域名(
a.com
或者b.com
);由对应的虚拟主机处理后将请求转发到不同的server;
1 | #虚拟主机1 |
同一默认端口:需要客户端修改hosts文件
1
2
3 # C:\Windows\System32\drivers\etc\hosts
192.168.160.132 www.nginx1.com
192.168.160.132 www.nginx2.com访问时直接输入域名,默认80
方式二:基于不同端口
nginx.conf中的http{}中的每一个server{}就是一个站点(不同端口指定访问)
1 | #虚拟主机1 |
不同端口:需要客户端修改hosts文件
1
2 192.168.160.132 www.nginx1.com:80
192.168.160.132 www.nginx1.com:81访问时输入域名并指定端口
注意 : 相同的域名,相同的端口,谁的文件名在前,谁会被优先读取
配置虚拟主机别名
- 所谓虚拟主机别名,就是虚拟主机设置除了主域名以外的⼀个域名,实现⽤户访问的多个域名对应同⼀个
虚拟主机⽹站的功能。- 以www.xuliangwei.com域名的虚拟主机为例 , 为其增加⼀个别名xuliangwei.com时,出现⽹站内容和访问www.xuliangwei.com是⼀样的
1 | # 默认配置 |