什么是Nginx?

Nginx同Apache一样都是WEB服务器,不过Nginx更加轻量级,它的内存占用更少,启动极快,高并发能力强。并且Nginx可以作为反向代理服务器使用,支持IMAP/POP3/SMTP服务

Nginx的特点是哪些?

1. 内存占用非常少︰一般情况下,10000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础。

2.高并发: 单机支持10万以上的并发连接

3.跨平台: 可以运行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系统上。

4.扩展性好∶ 第三方插件非常多!

5.安装使用简单: 对于简单的应用场景,我们很快就能够上手使用。

6.稳定性好: bug 少,不会遇到各种奇葩的问题。

7.免费: 开源软件,免费使用。

.….

Nginx能用来做什么?

静态资源服务器

Nginx可以将服务器上的静态文件(如HTML、CSS、JS、图片)缓存下来,通过HTP协议展现给客户端。因此,我们可以使用 Nginx搭建静态资源Web服务器缓存服务器。不过,要记得使用gzip 压缩静态资源来减少网络传输。

当客户端第一次请求静态资源的时候,会从服务器直接返回,Nginx 同时也会缓存一份静态资源。如果后续客户端请求相同的静态资源,只要对应的缓存未被清理且没有过期,就可以直接从Nginx缓存中取出返回给客户端了。

想要正确理解正向代理和反向代理,你要关注的是代理对象,正向代理“代理”的是客户端,反向代理“代理”的是目标服务器

反向代理

客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,获取数据后再返回给客户端。对外暴露的是反向代理服务器地址,隐藏了真实服务器IP地址。反向代理“代理”的是目标服务器,这一个过程对于客户端而言是透明的。

举个例子: 公司内网部署了3台服务器,客户端请求直接经过代理服务器,由代理服务器将请求转发到内网服务器并最终决定哪一台服务器处理客户端请求。

反向代理隐藏了真实的服务器,为服务器收发请求,使得真实服务器对客户端不可见,一般在处理跨域请求的时候比较常用,现在基本上所有的大型网站都设置了反向代理。

Nginx支持配置反向代理,通过反向代理实现网站的负载均衡

正向代理

客户端通过正向代理服务器访问目标服务器,正向代理“代理”的目标是客户端,目标服务器不知道客户端是谁,也就是说客户端对目标服务器这次访问是透明的

为实现正向代理,客户端需要设置正向代理服务器的IP地址以及代理程序的端口

最常见的例子就是VPN

你可以将正向代理看做是一个位于客户端和目标服务器之间的代理服务器,其主要作用就是转达客户端请求从目标服务器上获取指定的内容

负载均衡

如果一台服务器处理用户请求处理不过来的话,一个简单的办法就是增加多台服务器(服务器集群)部署相同的服务来处理用户请求

Nginx可以将接收到的客户端请求以一定的规则(负载均衡策略)均匀地分配到这个服务器集群中所有的服务器上,这个就叫做负载均衡。

可以看出,Nginx在其中充当的就是反向代理服务器的作用,负载均衡正是Nginx作为反向代理服务器最常见的一个应用。

除此之外,Nginx还带有健康检查〈服务器心跳检查)功能,会定期轮询向集群里的所有服务器发送健康检查请求,来检查集群中是否有服务器处于异常状态。

Nginx为什么适合做负载均衡

Nginx工作在网络的第七层(应用层),可以针对HTTP应用本身来做分流策略,支持HTTP、HTTPS协议的负载均衡。在工作中,我们通常会使用Nginx来做七层负载均衡。

属于软件负载均衡,相比硬件负载均衡来说,价格更低,性价比高

使用简单,上手快

基于C语言实现,性能好

自带健康检查,会定期轮询向集群里的所有服务器发送健康检查请求,来检查集群中是否有服务器处于异常状态

支持热部署,这对服务器的高可用具有重大意义

支持多种负载均衡策略,比如:轮询,IP哈希,最小连接数

Nginx有哪些负载均衡策略?

轮询(Round Robin ,默认)

轮询为负载均衡中较为基础也较为简单的算法

如果没有配置权重的话,每个请求按时间顺序逐一分配到不同的服务器处理

如果配置了权重,权重越高的服务器被访问的概率就越大

未加权重的轮询算法适合服务器性能相近的集群,其中每个服务器承载相同的负载。加权轮询算法适合服务器性能不等的集群,权重的存在可以使请求分配更加合理化。

IP 哈希(ip_hash)

根据发出请求和客户端ip的hash值来分配服务器,可以保证同IP发出的请求映射到同一服务器,或者具有相同hash值的不同IP映射到同一服务器。

跟轮询一样,IP哈希也可以配置权重,如果有两个活动连接数相同的服务器,权重大的访问概率越高

该算法在一定程度下解决了集群部署环境下Session不共享的问题

最小连接数 (least_conn)

当有新的请求出现时,遍历服务器结点列表并选取其中活动连接数最小的一台服务器来响应当前请求。

活动连接数可以理解为当前正在处理的请求数

Nginx常用命令有哪些?

·启动 nginx 。

·停止 nginx -s stop或nginx -s quit。

·重载配置 ./sbin/nginx -s reload(平滑重启)或service nginx reload.

·重载指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf。

·查看nginx版本 nginx -v。

·检查配置文件是否正确 nginx -t。

·显示帮助信息 nginx -h。

Nginx性能优化的常见方法

·设置Nginx运行工作进程个数︰一般设置CPU的核心数或者核心数×2;

·开启Gzip压缩︰这样可以使网站的图片、CSS、JS等文件在传输时进行压缩,提高访问速度,优化Nginx性能。

·设置单个worker进程允许客户端最大连接数︰一般设置为65535就足够了;

·连接超时时间设置:避免在建立无用连接上消耗太多资源;

·设置缓存∶像图片、CSS、IS等这类一般不会经常修改的文件,我们完全可以设置图片在浏览器本地缓存,提高访问速度,优化Nginx性能。

...….

LVS、Nginx、HAproxy有什么区别?

LVS、Nginx、HAproxy是目前使用最为广泛的三种负载均衡软件

·LVS是Linux Virtual Server的简称,也就是Linux 虚拟服务器。LVS是四层负载均衡,建立在OSI模型的第四层(传输层)之上,性能非常强大。

·HAProxy可以工作在四层和七层(传输层和应用层),是专门用来做代理服务器的。

·Nginx负载均衡主要是对七层网络通信模型中的第七层应用层上的HTTP、HTTPS进行支持。Nginx是以反向代理的方式进行负载均衡的。

Nginx如何实现后端服务健康检查?

第三方模块 upstream_check_module 来检测后端服务的健康状态,如果后端服务器不可用,所有的请求都不转发到这台服务器

如何保证Nginx服务的高可用?

Nginx可以结合Keeplived来实现高可用

简单介绍下Keeplived+Nginx实现高可用的常见方法:

1.准备2台Nginx服务器,一台作为主服务,一台作为备用服务;

2.在两台Nginx服务器上安装并配置Keepalived;

3.为两台Nginx服务器绑定同一个虚拟IP;

4.编写Nginx检测脚本用于通过Keepalived检测Nginx主服务器的状态是否正常;

如果Nginx主服务器宕机的话,会自动进行故障转移,备用Nginx主服务器升级为主服务。并且这个切换对外是透明的。

Nginx总体架构了解吗?

对于传统的HTTP和反向代理服务器而言,在处理并发请求的时候会使用单进程或线程的模式处理,同时会止网络或输入/输出操作.

这种方式会消耗大量的内存和CPU资源。因为每产生一个单独的进程或线程需要准备一套新的运行时环境,包括分配堆和堆栈内存.

以及创建新的执行上下文。

可以想象在处理多请求时会生成对应数目的线程或进程,导致由于线程在不断上下文切换上耗费大量资源。

由于上面的原因,Nginx在设计之初就使用了模块化、事件驱动、异步处理,非阻塞的架构。

Nginx进程模型了解么?

Nginx启动后,会生成一个master的主进程,主进程执行一系列的工作后会产生一个或者多个工作进程worker进程。master进程用来管理worker进程,worker进程负责处理网络请求,也就是说Nginx采用的是经典的master-worker模型的多进程模型

青い空