目录
错误413 Request Entity Too Large
upstream prematurely closed connection错误
recv() failed (104:Connection reset by peer)错误
client intented to send too large body错误
Nginx的优点
Nginx简介
nginx是一个高性能的HTTP和反向代理服务器。是由塞索耶夫为俄罗斯访问量第二的Rambler.ur站点开发的,nginx是Apache服务不错的替代品。
Nginx的优点
可以高并发连接
nginx能够支撑5万并发连接,实际生产环境中可以支撑2~4万并发连接数。
原因是nginx使用了最新的epoll和kqueue网络I/O模型,而Apache使用的是传统的Select模型,所以消耗的CPU等服务器资源,要比nginx高得多。
内存消耗少
能够实现高性能低消耗得原因是nginx采用异步非阻塞的方式处理请求;nginx支持epoll等流行事件处理机制;nginx采用独立于系统的事件处理机制,能够高效处理请求。
成本低廉
购买F5BIG-IP,NetScaler等硬件负载均衡交换机,需要10多万到几十万人名币,而nginx为开源软件,采用的是2-clause BSD-like协议,可以免费使用,并且可用于商业用途。
配置文件非常易懂
和普通的程序一样通俗易懂,即使不是专业的系统管理员也能看懂。
稳定性高
用于反向代理,宕机的概率特别小。
内置有健康的检查功能
如果NginxProxy后端的某台Web服务器宕机了,不会影响到前端的访问。这个时候,nginx自带的ngx_http_proxy_module和ngx_http_upstream_module就会发挥作用。相对于比较精细的是淘宝技术团队开发的nginx_upstream_check_module模块。
支持Rewrite重写
能够根据域名,URL的不同,将http请求分到不同的后端服务器群组。
支持热部署
特点:在不重启或者关闭进程的情况下,新的应用直接替换旧的应用。
nginx热部署功能,在不影响用户体验下,可以全天的进行不间断的运行,即使运行数个月也不需要重新启动,能够在不间断服务的情况下进行软件版本更新升级,也就是不主动的杀死worker,就能够更换软件的二进制命令。
Nginx与Apache的对比
小知识:
CGI:通用网关接口,就是web server和web应用程序交流时的规范,是协议。
FastCGI:快速通用网关接口,实际上是增加了一些功能的CGI,是CGI的改进。
- nginx的FastCGI很好,而apache的一般
- nginx支持热部署,而apache不支持
- 但是nginx的安全性相对于apache比较低
- nginx比apache静态文件处理好
- nginx比apache的内存消耗小很多
Nginx多进程工作原理跟设计
nginx是以多进程的方式来工作的。nginx在启动后,会有一个master进程和多个worker进程。
master进程主要用来管理worker进程:
- 接收来自外界的信号,向各worker进程发送信号。
- 监控worker进程的运行状态,当worker进程退出后,会自动重新启动新的worker进程。
master处理过程如下:
master(master进程会先建立好需要的listen的socket)------fork生成子进程workers,继承socket(此时worker子进程们都继承了父进程master的所有属性,每个进程的这个socket会监控在同一个ip地址与端口),当一个连接进入,产生惊群现象。当一个连接进来后,所有在accept在这个socket上面的进程,都会收到通知,而只有一个进程可以accept这个连接。其它的则accept失败。
worker进程工作:
当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,一个完整的请求。一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。
master负责将请求分配给手下的worker,worker接到分配的请求来做具体的事情。所有的worker并不是轮询来处理master的请求,而是采用“争抢”机制。
惊群现象:指一个fd的事件被触发后,等待这个fd的所有进程,线程都被唤醒,但是只有一个会去响应。
Nginx对惊群现象的处理:
Nginx提供了一个accept_mutex这个对象,这是一个加在accept上的一把共享锁。有了这把锁之后,就只会有一个进程在accept连接,这样就不会有惊群问题了。
Nginx是如何实现高性能的
事件驱动模型
基于异步非阻塞的事件驱动模型,可以说是Nginx得以获得高并发高性能的关键因素。这一点上和Netty类似,底层都是使用BSD kqueue,Linux epoll等。
注意:
- Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。
- Kqueue是在UNIX上比较高效IO复用技术。
- Epoll是为了处理大批量句柄而作了改进的poll。
多进程机制
使用多进程的好处有两点:
进程之间不共享资源,不需要加锁,减少了使用锁对性能造成的影响。同时降低编程的复杂性,降低开发成本。
采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,master进程则很快启动新的worker进程,确保服务不中断。
内存池
为了避免出现内存碎片,减少向操作系统申请内存的次数,降低各个模块的开发复杂度,Nginx设计了简单的内存池,它的作用主要是把多次向系统申请内存的操作整合成一次,这大大减少了CPU资源的消耗,同时减少了内存碎片。
Nginx的安装配置
Nginx的安装
安装编译工具及库文件
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
先安装PCRE
为了让nginx支持Rewrite功能,需要对其进行安装。
- 下载PCRE安装包
cd /usr/local/src/
wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz - 解压安装包
tar zxvf pcre-8.35.tar.gz - 进入安装包目录编译安装
cd pcre-8.35
./configure
make && make install - 查看pcre版本
pcre-config –version
安装Nginx
- 下载 nginx 并解压压缩包
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.16.1.tar.gz
tar zxvf nginx-1.16.1.tar.gz - 进入安装包目录
cd nginx-1.16.1 - 编译安装
./configure --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35
make
make install - 查看nginx版本
/usr/local/webserver/nginx/sbin/nginx -v
到这里,nginx安装完成。
Nginx的平滑升级
由于nginx优越性能及强大功能,被业界大量使用,nginx版本升级必然是越来越快的,以优化自身性能或修复安全漏洞。同时线上业务又不能停,此时nginx的平滑升级就尤为重要,具体步骤如下:
- 先对原来安装nginx的版本以及编译的参数进行查看
- 下载要升级的nginx版本
- 解压nginx下载的压缩包编译make,切记不要make install
- 对原来老的nginx文件进行备份
- 最后使用make upgrade替换老的nginx进程
至此,平滑升级成功,以下是个人nginx从1.6版本升级到1.16.1版本成功的界面:
Nginx主要配置介绍及注意事项
注释
以#开头的一行为注释,只有单行注释。
server
server是一切的开始,代表一个代理的出现,里边两大配置项:listen监听接口和server_name监听的地址,里边还包括了location和其它配置项,当存在server的时候,nginx获取到的请求都会去匹配这些server(匹配其中的listen和server_name)。
- server_name:用来配置监听的地址
- listen:用来配置监听的端口号
location
location是nginx的精华,nginx就是通过拦截到的请求去对配置好的location块进行请求代理的。
- alias&root:将请求代理到本地的指令,也就是如果可以把请求发送到你的 硬盘里去获取资源,这个指令可以代理前端的静态资源
- proxy_pass:对请求进行转发重定向的
- rewrite:用来重写请求路径
set与if
set用来设置变量的,if是用来做判断的。
Nginx的启动,停止及信号控制
启动:
/usr/local/webserver/nginx/sbin/nginx -c /usr/local/webserver/nginx/conf/nginx.conf
从容停止:
kill -QUIT nginx
快速停止:
kill -TERM nginx主进程号;
解释:是请求彻底终止某项执行操作,它期望接收进程清除自给的状态并退出
kill -INT nginx主进程号
解释:拥有命令行或者输入模式的那些程序应该停止它们在做的事情,清除状态,并等待用户的再次输入
强制停止所有nginx进程:
pkill -9 nginx
平滑重启:
kill -HUP nginx主进程号
信号控制:
TERM,INT快速关闭;QUIT从容关闭;
HUP平滑重启;USR1重新打开日志文件,在切割日志时用途较大;
USR2平滑升级可执行程序;WHICH从容关闭工作进程
Nginx虚拟主机配置
管理虚拟主机
虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名和完整的internet服务器功能,同一台主机上的虚拟主机之间是完全独立的。
Nginx基本配置
Nginx的主配置文件是:nginx.conf,nginx.conf主要组成如下:
#全局区 有一个工作子进程,一般设置为cpu数*核数
worker_processes 1;
events{
#一般是配置nginx进程与连接的特性
#如1个word能同时允许多少连接,一个子进程最大允许连接1024个连接
worker_connections 1024;
}
#配置HTTP服务器配置段
http{
#配置虚拟主机段
server{
#定位,把特殊的路径或文件再次定位
location{…
}
}
server{…
}
}
基于域名的虚拟主机
在http大括号中添加如下代码块:
切换安装目录:cd /usr/local/webserver/nginx
创建目录:mkdir yun
新建index.html文件:vi /usr/local/webserver/nginx/yun/index.html
在windows的 本机中对host进行配置:
添加:192.168.1.129 http://www.yun.com
然后访问:http://www.yun.com
基于端口的虚拟主机
对nginx.conf进行配置
新建index.html文件,内容:
重新读取配置文件后进行访问:
基于IP地址虚拟主机
配置nginx.conf文件:
新建index.html文件:
执行命令:
mkdir /usr/local/webserver/nginx/ip
vi /usr/local/webserver/nginx/ip/index.html
重新读取配置文件,然后网页进行访问:http://192.168.1.129
Nginx的反向代理
代理
代理模式的定义:给某个对象提供一个代理对象,并由代理对象控制原对象的引用。
简单的说就是我们想做什么,但又不想直接去做,那么这个时候就找另外一个人帮我们去做,如同中介公司给我们做代理服务,我们委托中介公司帮我们看房子。
Nginx代理的协议中,用得最多的就是Http代理服务器。
反向代理
反向代理和正向代理的区别就是:正向代理代理客户端,反向代理代理服务器。
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
理解这两种代理的关键在于代理服务器所代理的对象是什么,正向代理代理的是客户端,我们需要在客户端进行一些代理的设置。而反向代理代理的是服务器,作为客户端的我们是无法感知到服务器的真实存在的。
为什么要使用代理服务器
提高访问速度
由于目标主机返回的数据会存放在代理服务器的硬盘中,因此下一次访问时,会直接读取,起到缓存作用。
防火墙作用
由于客户机请求必须通过代理服务器访问远程站点,因此可在代理服务器上设限,过滤某些不安全信息。
翻墙
翻墙浏览器就是利用了代理服务器,不用出国也能直接访问外网。
Nginx反向代理的配置
实现用nginx反向代理http://www.kkk.com直接跳转到192.168.1.129:8083
启动一个tomcat
浏览器地址栏输入192.168.1.129:8083,就可以出现tomcat首页的界面,这里我用curl测试:
通过修改本地host文件
将http://www.kkk.com映射到192.168.1.129
注意:修改host文件的时候,应该先将host文件拉到桌面进行修改,然后修改完成后再拖进etc文件夹,不然可能会无法生效。
配置完成后,就可以通过www.kkk.com:8083,访问到初始界面
配置nginx.conf
在nginx.conf中进行配置:
如上配置,我们进行80端口的监听,访问域名为http://www.kkk.com,不加端口号时默认为80端口,故访问该域名时会跳转到192.168.1.129:8083路径上,测试如下:
Nginx反向代理相关指令介绍
listen:该指令用于配置网络监听
server_name:该指令用于虚拟主机的配置,通常分为两种:
基于域名的虚拟主机配置:servername name …;
基于IP地址的虚拟主机的配置:server_name 192.168.1.129;
location:用于匹配URL
proxy_pass:用于设置被代理服务器的地址
index:用于设置网页的默认首页
Nginx的负载均衡
负载均衡的作用
分摊到多个操作单元上进行执行。我们就要一个调度者,保证所有后端服务器都能将性能充分发挥,从而保持服务器的整体性能最优,这就是负载均衡。
负载均衡的五种算法
round robin
轮询,依次将请求分配到各个后台服务器中,默认的负载均衡方式
使用于后台机器性能一致的情况
挂掉的机器可以自动从服务列表中剔除
weight
根据权重来分发请求到不同的机器中,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream zyk{
server 192.168.1.129:8081 weight=10;
server 192.168.1.129:8082 weight=10;
}
IP_hash
根据请求者ip的hash值将请求发送到后台服务器中,保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
例如:
upstream zyk{
ip_hash;
server 192.168.1.14:88;
server 192.168.1.15:80;
}
url_hash(第三方)
根据请求的url的hash值将请求分到不同的机器中,当后台服务器为缓存的时候效率高。
例如:
upstream zyk{
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
hash_method是使用的hash算法,crc32是一种校验数值的算法
fair(第三方)
根据后台相应时间来分发请求,响应时间短的分发的请求多
upstream zyk{
server server1;
server server2;
fair;
}
Nginx负载均衡配置
实现效果
浏览器地址栏输入地址http://192.168.1.129/edu/a.html负载均衡效果,平均8081和8082端口中。
准备工作
- 准备两台tomcat服务器,一台8081,一台8082
- 在8081文件夹下和8082文件夹下都创建一个edu文件夹,且创建a.html
- 然后对这两个进行测试
在nginx.conf中对负载均衡进行配置
在nginx.conf中的配置:
最终测试
测试url:
用Nginx做负载均衡的优缺点
优点:
- 对网络稳定性的依赖非常小
- 安装和配置比较简单
- 可以通过端口检测到服务器内部的故障
- 不仅是优秀的负载均衡器/反向代理软件,同时也是强大的web应用服务器
缺点:
- 适应范围小,仅能支持http,https,email协议
- 对后端服务器的检查,只支持通过端口检测,不支持url检测
- 不支持Session的直接保持,但可以通过ip_hash来解决
Nginx的正向代理
正向代理
正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标,然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
正向代理的配置
对nginx.conf进行配置
之所以要设置为默认的虚拟主机,是因为这样就不用设置server_name了,任何域名解析过来都可以正常访问,如:curl -x127.0.0.1:80 http://baidu.com 既可以访问到百度。
正向代理和反向代理的区别
两者区别
- 从用途上讲:
正向代理的典型用途是为在防火墙内的局域网客户端提供访问internet的途径。
反向代理的典型用途是将防火墙后面的服务器提供给internet用户访问。 - 从安全性上讲:
正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,所有必须采取安全措施以确保仅为经过授权的客户端提供服务。
反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
Nginx的rewrite规则
正则表达式
什么是正则表达式
正则表达式使用单个字符串来描述,匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索,替换那些符合某个模式的文本。
正则表达式的基本语法
一个正则表达式通常被称为一个模式。
选择
| 竖直分隔符表示选择,例如”boy|girl”可以匹配”boy”或者”girl”
数量限定
*,+,? 这些都是数量限定符,如果在一个模式中不加数量限定符则表示出现一次且仅出现一次
+ 表示前面的字符必须出现至少一次
? 表示前面的字符最多出现一次
* 表示前面的字符可以不出现,也可以出现一次或者多次
范围和优先级
()圆括号可以用来定义模式字符串的范围和优先级,如:“gr(a|e)y”等价于”gray|grey”
语法
\ 将下一个字符标记为一个特殊字符,或一个原义字符
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
匹配前面的子表达式零次或多次
+ 匹配前面的子表达式一次或多次
? 匹配前面的子表达式零次或一次
| 选择
[xyz] 匹配所包含的任意一个字符
[^xyz] 匹配未列出的任意字符
[a-z] 匹配指定范围内的任意字符
[^a-z] 匹配任何不在指定范围内的任意字符
rewrite规则的作用及应用场景
作用
作用:实现对URL的重写以及对url的重定向。
场景
- URL访问跳转,支持开发设计
a.页面跳转 b.兼容性支持 c.展示效果 - SEO优化
SEO:搜索引擎优化 - 维护
a.后台维护 b.流量转发 - 安全
伪静态页面
rewrite配置语法
配置语法
指令语法:rewrite [正则表达式 替换前的URL][替换后的URL][标识flag];
默认值default:无配置
应用context:server域/location域/if判断里
配置实例:rewrite ^(.*)$ /pages/maintain.html break; #把所有的请求都跳转至maintain.html页面,break是一个标识符
FLAG
flag是一个标识符,标识rewrite的类型
last:停止rewrite检测[如果没有匹配到,会继续向下匹配]
break:停止rewrite检测[如果没有匹配到,则不再向下匹配,直接返回404]
redirect:返回302临时重定向,地址栏会显示跳转后的地址
permanent:返回301永久重定向,地址栏会显示跳转后的地址
rewrite在location中的配置
if语句
首先申明nginx只有if语句做判断语句,没有else语句。
If语句的常用形式如下:
if(condition){
…;
}
计算指定的condition的值,如果为真,执行定义在大括号中的指令,并将if指令中的配置指定给请求。
配合相关实例理解
- 将http://zyk.net跳转至http://www.zyk.net
if($host=’http://zyk.net’) {
rewrite ^/(.*)$ http://www.zyk.net/$1 permanent;
}
#$host内置nginx变量,匹配用户访问的域名
#$1表示引用第一个括号的内容,是用户输入的内容 - 访问/zyk/test01/跳转至/newindex.html,浏览器地址不变
rewrite ^/zyk/test01/$ /newindex.html last; - 多域名跳转http://www.zyk.net
If($host!=’http://www.zyk.net’) {
rewrite ^/(.*)$ http://www.zyk.net/$1 permanent;
} - 目录对换/xxx/123456~~~~~/xxx?id=123456
\d+代表匹配数字,相当于[0-9]
rewrite ^/(.+)/(\d+) /$1?id=$2 last; - 禁止访问以.sh|.flv|.mps为文件后缀的文件
location ~.*\.(sh|flv|mp3)$ {
return 403;
}
Nginx的日志
Nginx的日志描述
通过访问日志,可以得到用户地域来源,跳转来源,使用终端,某个URL访问量等相关信息。
通过错误日志,可以得到系统某个服务或server的性能瓶颈。
Nginx的日志格式
打开nginx.conf配置文件:vim /usr/local/webserver/nginx/conf/nginx.conf
日志生成到nginx根目录logs/access.log的文件,默认使用”main”日志格式,也可以自定义格式
log_format指令:用来设置日志的格式
access_log指令:用来设置日志的路径
默认”mian”日志格式:
log_format main ‘$remote_addr - $remote_user [$time_local] “request” ‘
‘$status $body_bytes_sent ”$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for” ‘;
acess_log logs/access.log main;
参数解释
$remote_addr:代理服务器的ip地址
$remote_user:用于记录远程客户端的用户名称
$time_local:用于记录访问时间和时区
$request:用于记录请求的url以及请求方法
$status:响应状态码
$body_bytes_sent:给客户端发送的文件主体内容字节数
$http_referer:可以记录用户是从哪个链接访问过来的
$http_user_agent:用户所使用的代理
$http_x_forwarded_for:可以记录客户端IP
查看日志的命令:tail -f /usr/local/webserver/nginx/logs/access.log
Nginx的日志分隔
nginx的日志文件没有rotate功能。可以通过写一个nginx日志切割脚本来自动切割日志文件。
第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志。在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件。
第二步向nginx主进程发送USR1信号。
Nginx日志按每5分钟自动切割脚本如下:
新建shell脚本:vi /usr/local/webserver/nginx/nginx_log.sh
#!/bin/bash
#设置日志文件存放目录
LOG_HOME=”/usr/local/webserver/nginx/logs/”
#备份文件名称
LOG_PATH_BAK=”$(date -d yesterday +%Y%m%d%H%M)”.abc.access.log
#重命名日志文件
mv${LOG_HOME}/abc.access.log ${LOG_HOME}/${LOG_PATH_BAK}.log
#向nginx主进程发信号重新打开日志
kill -USR1 ‘cat /usr/local/webserver/nginx/logs/nginx.pid’
创建crontab设置作业
#设置日志文件存放目录crontab -e
*/5 * * * * sh /usr/local/webserver/nginx/nginx_log.sh
#在终端输入service crond stop可以停止crontab定时任务执行
Nginx的常见问题及解决方案
pid目录不存在的问题
目录不存在
第一种方法:重新创建
第二种方法:修改配置文件,放开pid注释后,新建logs目录即可
#pid logs/nginx.pid;
无效的pid
如果出现invalid无效pid的报错信息,可以通过nginx -c 指定配置文件
./nginx -c /usr/local/webserver/nginx/conf/nginx.conf
防火墙及端口问题
检查防火墙是否启动:firewall-cmd –state
开启防火墙:systemctl start firewalld
关闭防火墙:systemctl stop firewalld
重启防火墙:firewall-cmd –reload
开启端口号:firewall-cmd --zone=public --add-port=端口号/tcp --permanent
检查端口号是否生效:firewall-cmd --zone=public --query-port=端口号/tcp
lsof -i:端口号 查看端口号的进程情况
kill -9 进程号 强制杀死进程
状态码报错问题
错误404 Bad Request
原因:请求的Header过大。
解决方法:配置nginx_conf文件。
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
错误502 Bad Gateway
原因:后端服务器无法处理,业务中断。
解决方法:从后端日志获取错误原因,解决后端服务器问题。
proxy_next_upstream error timeout invalid_header http_500 http_503;
或者尝试设置:
large_client_header_buffers 4 32k;
错误499 Client Closed Request
原因:客户端在未等到服务器相应返回前就关闭了客户端描述符。一般出现在客户端设置超时后,主动关闭socket。
解决方法:根据实际nginx后端服务器的处理时间修改客户端超时时间。
错误504 Gateway Timeout
原因:后端服务器在超时时间内,未响应Nginx代理请求。
解决方法:根据后端服务器实际处理情况,调正后端请求超时时间。
proxy_read_timeout 90;
proxy_send_timeout 90;
错误413 Request Entity Too Large
原因:nginx默认上传文件大小为1M。
解决方法:修改client_max_body_size大小,位置可以是http/server/location。
Nginx常见异常
curl请求
错误:网站上线后,添加了https证书,浏览器访问正常,通过curl请求,请求被reset。
解决方案线路:
- 先通过curl请求同域名下http的url和同服务器下的https域名,验证80和443端口是否正常。
- 尝试加入兼容性更高的加密套件。
- 用tcpdump两边抓包,然后用wireshark分析,看是否是因为nginx的buffer不够用。
- 加入ssl_session_cache参数,进行builtin和shared中选择一种适合的。
注意:ssl_session_cache参数会影响到curl的请求。
小知识:tcpdump抓包可以,分析包还是得用wireshark
ECC证书要比RSA证书更小,加解密更快,推荐
upstream prematurely closed connection错误
请求uri出现的异常,是由于upstream还未返回应答给用户时用户断开连接造成的,对系统无影响,可以忽略。
recv() failed (104:Connection reset by peer)错误
- 服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉
- 客户关掉了浏览器,而浏览器还在给客户端发送数据
- 浏览器端按了stop
client intented to send too large body错误
用于设置允许接受的客户端请求内容的最大值,默认值是1M,client发送的body超过了设置值。
reopening logs异常
用户发送kill -USR1命令;类似的”gracefully shutting down”是用户发送kill -WINCH命令。
Nginx配置文件核心配置讲解
Nginx的配置文件结构
nginx的配置文件nginx.conf位于其安装目录的conf目录下
nginx.conf由多个块组成,最外面的块是main,main包含Events和HTTP,HTTP包含upstream和多个Server,Server又包含多个location
main块设置的指令将影响其他所有设置
server块设置的指令主要用于指定主机和端口
upstream指令主要用于负载均衡;设置一系列的后端服务器
location块用于匹配网页的位置
四个内容块之间的关系
server继承main,location继承server,upstream既不会继承其他设置也不会被继承。
Nginx配置文件实例讲解
CPU亲和性
什么是CPU亲和性
cpu的亲和性,进程要在某个给定的cpu上尽量长时间的运行而不被迁移到其他处理器的倾向性,进程迁移的频率小就意味着产生的负载小。
在多核运行的机器上,每个cpu本身自己会有缓存,在缓存中存着进程使用的数据,而没有绑定cpu的话,进程可能会被操作系统调度到其他cpu上,如此cpu cache命中率就低了,也就是说调到的cpu缓冲区没有这类数据,要先把内存或硬盘的数据载入缓存。而当缓存区绑定cpu后,程序就会一直在指定的cpu执行,不会被操作系统调度到其他cpu,性能上会有一定的提高。
另外一种使用cpu绑定考虑的是将关键的进程隔离开,对于部分实时进程调度优先级提高,可以将其绑定到一个指定的cpu核上,可以保证实时进程的调度,也可以避免其他cpu上进程被该实时进程干扰。
我们可以手动地为其分配cpu核,而不会过多的占用同一个cpu,所以设置cpu亲和性可以使某些程序提高性能。
linux操作系统的CPU亲和性特征
操作系统部分linux的调度程序同时提供“软CPU亲和性”和“硬CPU亲和性”。
软亲和性:进程要在指定的cpu上尽量长时间地运行而不被迁移到其他cpu。
linux内核进程调度器天生就具有被称为软CPU亲和性地特性。因此,Linux通过这种软的亲和性试图使某进程尽可能在同一个CPU上运行。
硬亲和性:将进程或者线程绑定到某一个指定的cpu核运行。
虽然linux尽力通过一种软的亲和性试图使进程尽量在同一个处理器上运行,但它也允许用户强制指定进程无论如何都必须在指定地处理器上运行。
linux操作系统中修改CPU亲和性地手段
在Linux内核中,所有的进程都有一个相关的数据结构,称为task_struct。这个结构非常重要,其中与亲和性相关度最高地是cpus_allowed位掩码。这个位掩码由n位组成,与系统中的n个逻辑处理器对应。具有4个物理cpu的系统可以有4位。如果这些CPU都启用了超线程,那么这个系统就有8个位掩码。如果为给定的进程设置了给定的位,那么这个进程就可以在相关CPU上运行。
- sched_set_affinity() 用来修改位掩码
- sched_get_affinity() 用来查看当前的位掩码
- cpus_allowed 用来控制进程可以在哪个处理器上运行
- sched_setaffinity 用于某个进程绑定到一个特定cpu