文章目录
1、nginx简介
1.1 nginx是什么?
nginx 是一个高性能的 HTTP 和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。特点是内存小,并发能力强。
nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。
1.2 反向代理
正向代理:在客户端配置代理服务器,通过代理服务器进行互联网访问
反向代理:反向代理对于客户来说,不需要配置就可以访问。我们需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端。
此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏真实服务器的IP地址。
1.3 负载均衡
当单个服务解决不了问题的时候,就增加服务器的数量,然后将请求分发到各个服务器上。
将原先的请求集中到单个服务器上的情况改为请求分发到多个服务器上,将负载分发到不同的服务器上,即负载均衡。
nginx负载均衡的分配策略
1)轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)weight
weight代表权重,权重越高被分配的客户端也就越多。
weight和访问比率成正比,用于后端服务器性能不均的情况。
3)ip_hash
每个访问请求按访问ip的hash结果分配,这样每个客户端就固定访问一个后台服务器,可以解决session的问题。
4)fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
// redis.conf文件中负载均衡的配置
// 下面的策略任选其一,默认是轮询
upstream{
//ip_hash
server 192.168.17.21:8080 // weight=1;
server 192.168.17.22:8081 // weight=2;
// fair;
}
1.4 动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低单个服务器的压力。
2、nginx常用命令
nginx启动路径:/usr/local/nginx/sbin/
// 启动nginx
./nginx
// 查看nginx进程
ps aux | grep nginx
// 停止nginx
./nginx -s stop
// nginx热加载部署
./nginx -s reload
查看进程
3、nginx原理分析
nginx在启动之后,在linux系统会默认以守护进程的(daemon)的方式运行在后台,后台进程包含一个master进程和多个worker进程,worker进程的数量可以在“nginx.conf”文件中配置。
- master进程主要管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号、监控worker进程的运行状态、异常导致worker进程退出,会自动重启worker进程
- worker进程来处理网络事件,例如TCP的连接,多个worker竞争来自客户端的请求。
- worker进程的个数一般与CPU核数一样
Master-worker模式
从图中看出,4个worker进程的父进程都是master进程,表明worker进程都是父进程fork出来的,且父进程的ppid为1, 表示其为daemon进程
Master进程的作用
读取且验证配置文件nginx.conf;管理worker进程
worker进程的作用
每一个worker进程都维护一个线程(避免线程切换),处理连接和请求。
4、nginx常见问题
4.1 nginx如何做到热部署?
1)修改配置文件nginx.conf 之后,主进程master负责推送给worker进程更新配置信息,worker进程收到修改信息后,更新进程内部的线程信息。
2)修改配置文件nginx.conf文件之后,重新生成新的worker进程,当然会以新的配置进行处理请求,而且新的请求必须交给新的worker进程,至于老的进程,将以前的请求处理完毕之后,kill掉即可。(nginx采用此方法达到热部署)
4.2 nginx如何做到高并发下的高效处理?
nginx采用了linux的epoll的模型,epoll模型基于事件驱动机制,它可以同时监控多个事件是否准备完毕,准备OK,那么将其放到epoll队列中,这个过程是异步的。worker只需要从epoll队列循环处理即可。
4.3 nginx挂了怎么办?
解决方案:Keepalived + nginx实现高可用
- 请求不要直接打到nginx上,应该通过Keepalived,即虚拟IP
- Keepalived应该能监控nginx的声明周期。定期检查进程状态,进程权重变更,从而实现nginx故障切换
4.4 nginx封装TCP
- nginx启动时,先解析配置文件,进而启动master进程,在master进程当中,初始化tcp侦听套接字,绑定地址信息,调用listen函数(现在可以接收tcp的连接请求了)
- master进程fork多个子进程(worker进程),子进程调用accept函数竞争来自客户端的tcp连接
- 客户端发起一个tcp连接,三次握手成功建立,nginx某一个子进程accpet成功,此时tcp从已完成的队列中拿走该连接,其他worker进程无法获取这个tcp连接
- 当客户端和连接的进程数据交换完毕,当nginx或客户端主动关闭连接,连接即结束。
5、nginx的配置文件块
位置:/usr/local/nginx/conf/nginx.conf
1)全局块(main块)
配置影响nginx全局的指令。一般运行nginx的服务的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等(worker_precesses值越大,可以支持更多并发处理量也越多,但是会受到硬件、软件设备的制约)。
2)events块
配置影响nginx服务器与用户的网络连接。每个进程的最大连接数worker_connections(默认1024),是否允许同时接受多个网络连接等。
3)http块
可以镶嵌多个server,配置代理,缓存,日志定义等绝大多数功能和第三方块的配置文件都在这里。
① http全局块
http全局块配置的指令包括文件引入、MIME-TYPE定义、日志定义、链接超时定义、单链接请求数上限。
② server块
配置虚拟主机相关参数,一个http中可以有多个server,每个server也可以同时包含多个location块。
③ location块
配置请求的路由,以及允许根据用户请求的URL来匹配指定的各location进行访问配置。
6、为什么选用nginx
1)高并发性能的并发模型:性能好、占用内存少、稳定
nginx的并发请求模型中最好配置worker进程与CPU核心数量相同。一个worker进程绑定一个CPU核心,让nginx充分发挥CPU的计算能力处理请求。
一个worker进程可以处理多个请求,可以大大减少进程/线程数量,减少重复的数据,所以内存效率高,占用资源少,同时减少CPU调度和上下文转换次数。
使用IO复用机制避免阻塞,可以处理更多的任务。
多个worker进程之间互不影响,不想多线程,一个线程出问题导致整个进程内其他线程全部崩溃,所以nginx稳定,健壮性好。
2)高扩展性
nginx的模块化设计极具扩展性,它完全由多个不同功能、不同层次、不同类型且耦合度极地的模块组成。因此,对一个模块修复Bug或者升级时,专注于模块自身,不考虑其他模块。
3)功能强大
nginx提供大量的功能模块,支持诸多特性,应用场景多。
作为web服务器:相比Apache,nginx使用更少的资源,支持更多的并发连接,体现更高的效率,能够支持高达50000qps。
作为负载均衡器:nginxnginx不论是系统开销还是CPU使用效率都比Perbal好的多。
nginx启动容易,可以做到7*24小时不间断运行,即使数个月也不需要重新启动。还可以在不间断的情况下进行软件版本的升级。