Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点开发的,公开版本1.19.6发布于2020年12月15日。
其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。
Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力在同类型的网页服务器中表现较好。
BSD 是“Berkeley Software Distribution”的缩写,意思是“伯克利软件发行版”。显然,BSD 这个名称并不是我们现在所理解的操作系统,而且其原意也并非简单的操作系统,而是一整套软件发行版的统称。
什么是许可协议呢,要介绍什么是许可,当你为你的产品签发许可,你是在让出自己的权利,不过,你仍然拥有版权和专利(如果申请了的话),许可的目的是,向使用你产品的人提供一定的权限。
不管产品是免费向公众分发,还是出售,制定一份许可协议非常有用,否则,对于前者,你相当于放弃了自己所有的权利,任何人都没有义务表明你的原始作者身份,对于后者,你将不得不花费比开发更多的精力用来逐个处理用户的授权问题。
而开源许可协议使这些事情变得简单,开发者很容易向一个项目贡献自己的代码,它还可以保护你原始作者的身份,使你至少获得认可,开源许可协议还可以阻止其它人将某个产品据为己有。以下是开源界的 5 大许可协议:五大开源许可协议分别是 GPL、LGPL、BSD、MIT 和 Apache。
BSD 就是这五种开源协议之一。
代理模式
代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。代理本质上是一个服务器,可以类比为一个中介。为了 A 访问到 B,中间插入一个 C,C 就是代理。
常用的代理技术分为
- 正向代理
- 反向代理
- 透明代理
正向代理
正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端。正向代理的情况下,客户端必须要进行一些特殊的设置才能使用。
一般正向代理有如下使用场景:
- 科学上网,嗯,懂得都懂
- 加速访问服务器,玩过游戏的都会清楚
- Cache 缓存作用,会缓存请求信息,如果多次重复请求,不需要访问目标服务器
- 客户端访问授权,代理服务器可以设置客户端不能对某些服务器进行访问
- 隐藏访问者踪迹,你不知道我是谁,因为对服务器的请求都是代理服务器发出的
反向代理
反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。对于客户端来说,反向代理就相当于目标服务器,只需要将反向代理当作目标服务器一样发送请求就可以了,并且客户端不需要进行任何设置。
一般反向代理有如下应有场景:
- 负载均衡,嗯,很重要的一个话题,听我慢慢说
- 隐藏服务器真实IP地址,你不需要知道的太多
- 提高访问速度,还是负载的事情,众人拾柴火焰高
- 提高安全保障,可以将部分有害请求拦截
透明代理
透明代理(transparent proxy)的意思是客户端根本不需要知道有代理服务器的存在,它改变你的 request fields(报文),并会传送真实IP,多用于路由器的NAT转发中。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。
透明代理是一种拦截网络流量的代理方法,采用该方法可将用户所发出数据收集到代理服务器上进行处理,并向使用者发出相应的报文并将结果再发回去。透明代理也称为“隐式代理”(implicit proxy),是安装了代理软件的代理服务器,这种代理不会在客户端任何位置中显式地声明或提示,所有的网络访问请求都会在代理服务器上经过匹配集合(一种抽象的由实际字符串组成的数据集)。
- 透明代理服务器主要用于网络防火墙保护,这种形式的代理把真正的用户和客户端隐藏起来,并隔绝外部网络和服务器之间只能通过这种代理才能进行访问。
- 另外,透明代理也可以用于安全性控制,它可以让系统拥有有效的应用程序层访问控制和安全管理机制,能够阻止用户发起有恶意的网络访问,确保网络数据的安全传输。
- 此外,透明代理还用于实施数据流量控制,它可以在下行方向上做限速,从而能有效降低网络负载,确保系统的稳定性。
- 同时,透明代理也常用于内容过滤。由于代理服务器能够获取用户所发出的数据,根据网络安全政策可以过滤掉一些恶意或者非法的数据,从而确保网络安全性。
总而言之,透明代理是一种比较高效的代理方式,能够提高系统的安全性和性能,提高网络连接和访问的可靠性,因此受到企业和私人用户的青睐。
安装 Nginx
下面我们在 Linux 下安装 Nginx 软件。
安装前的准备
在安装 nginx 之前我们需要准备好安装 nginx 的安装环境,下面的安装环境根据个人系统环境而定,没有安装的要进行安装。
1. 安装 gcc
首先,安装 nginx 要有 gcc 的环境,先检查电脑是否安装了 gcc。
gcc -v
如果未安装可以使用以下命令进行安装。
yum install -y gcc
gcc 可以编译 C、C++、Ada、Object C和Java等语言(安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境)
2. 安装 pcre-devel
安装第三方库 pcre-devel,首先检查是否安装了 pcre-devel。
rpm -qa pcre
如果未安装,使用命令安装。
yum install -y pcre pcre-devel
PCRE(Perl Compatible Regular Expressions) 是一个 Perl 库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库。注: pcre-devel 是使用 pcre 开发的一个二次开发库。nginx 也需要此库。
3. 安装 zlib
zlib 也是一个第三方库,这个库提供了很多种压缩和解压缩方式。nginx 使用 zlib 对 http 包的内容进行 gzip,所以需要安装。
检查是否安装
yum list installed | grep zlib*
如果没有安装,也需要进行安装。
yum install -y zlib zlib-devel
安装好上面的环境我们就可以开始进行正式的 nginx 安装了。
下载 Nginx
- 可以在 nginx 的官网下载, 下载地址,下载后上传到虚拟机
- 也可以使用 wget 使用以下命令进行下载
解压 Nginx
这个没什么好说的,通过命令解压就行。
安装 Nginx
进入到 nginx 解压后的文件夹执行命令安装
./configure --prefix=/opt/soft/nginx/ // /opt/soft/nginx/ 指定的安装目录
编译 nginx
make && make install
Nginx 相关命令
进入到安装目录的 sbin 文件夹下
- 普通启动服务:./nginx
- 配置文件启动:./nginx -c ../conf/nginx.conf
- 暴力停止服务:./nginx -s stop
- 优雅停止服务:./nginx -s quit
- 检查配置文件:./nginx -t
- 重新加载配置:./nginx -s reload
- 查看相关进程:ps -ef | grep nginx
查看效果
Nginx 反向代理
我们已经在 Linux 中安装成功了,下来我们通过一些案例演示 Nginx 反向代理的效果。
基本代理
步骤一:修改Windows中的hosts域名映射
复制“C:\Windows\System32\drivers\etc\hosts”到桌面,右键记事本打开,在里边加上以下代码保存,然后再复制回去,不要直接修改,会不让保存!
步骤二:修改Nginx中的配置文件
条件跳转
使用 Nginx 反向代理,根据访问的路径跳转到不同端口的服务中。
配置文件
location /eat/ {
proxy_pass http://192.168.160.1:8083/; #必须以/结尾
}
location /sleep/ {
proxy_pass http://192.168.160.1:8082/;
}
项目启动
把一个 SpringBoot 项目分别启动两次,端口号分别是:8083 和 8082。
查看效果
Nginx 负载均衡
早期的网站流量和业务功能都比较简单,单台服务器足以满足基本的需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也跟着越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器进行性能的水平扩展及避免单点故障出现,那么如何将不同用户的请求流量分发到不同的服务器上呢?
这时候我们就要使用到负载均衡,负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如 Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
这里面涉及到两个重要的角色分别是“应用集群”和“负载均衡器”。
- 应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理并返回响应的数据。
- 负载均衡器:将用户访问的请求根据对应的负载均衡算法,分发到集群中的一台服务器进行处理。
负载均衡的实现
# 代理服务器
# 设置服务器组
upstream loadBalancing {
server localhost:8001;
server localhost:8002;
server localhost:8003;
}
server {
listen 80;
server_name dailyblue.com;
location / {
# loadBalancing 就是服务器组的名称
proxy_pass http://loadBalancing/;
}
}
- upstream:该指令是用来定义一组服务器,它们可以使监听不同端口的服务器,并且也可以是同时监听 TCP 和 Unix socket 的服务器。服务器可以指定不同的权重,默认为1。
- server:该指令用来指定后端服务器的名称和一些参数,可以使用域名、IP、端口或者 unix socket。
负载均衡的作用
- 解决服务器的高并发压力,提高应用程序的处理性能。
- 提供故障转移,实现高可用。
- 通过添加或减少服务器数量,增强网站的可扩展性。
- 在负载均衡器上进行过滤,可以提高系统的安全性。
负载均衡的状态
代理服务器在负责均衡调度中的状态有以下几个:
状态 | 概述 |
---|---|
down | 当前的server暂时不参与负载均衡。 |
backup | 预留的备份服务器。 |
max_fails | 允许请求失败的次数。 |
fail_timeout | 经过 max_fails 次失败后,服务暂停的时间。 |
max_conns | 限制最大的接收连接数。 |
down 状态
将该服务器标记为永久不可用,那么该代理服务器将不参与负载均衡。该状态一般会对需要停机维护的服务器进行设置。
upstream loadBalance{
server localhost:8001 down;
server localhost:8002;
server localhost:8003;
}
backup 状态
将该服务器标记为备份服务器,当主服务器不可用时,将用来传递请求。
upstream loadBalance {
server localhost:8001;
server localhost:8002;
# 8003 作为 8001,8002 的备份服务器
server localhost:8003 backup;
}
max_fails 状态
max_fails=numer:设置允许请求代理服务器失败的次数,默认为1。
fail_timeout 状态
fail_timeout=time:设置经过 max_fail 次失败后,服务暂停的时间,默认是10秒。
upstream loadBalance {
server localhost:8001;
server localhost:8002;
server localhost:8003 max_fails=3 fail_timeout=15;
}
max_conns 状态
max_conns=number:用来设置代理服务器同时活动链接的最大数量,默认为0,表示不限制,使用该配置可以根据后端服务器处理请求的并发量来进行设置,防止后端服务器被压垮。
负载均衡策略
Nginx 的 upstream 支持如下六种方式的分配算法,分别是:
算法名称 | 说明 | 案例 |
---|---|---|
轮询 | 默认方式。 | |
weight | 权重方式。 weight=number:用来设置服务器的权重,默认为1,权重数字越大,被分配到请求的几率越大。该权重值主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所有此策略比较适合服务器的硬件配置差别比较大的情况。 | server localhost:8001 weight=1; server localhost:8002 weight=1; server localhost:8003 weight=1; |
ip_hash | 依据 ip 分配方式。 当对后端的多台动态应用服务器做负载均衡时,ip_hash 指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。 | upstream loadBalance { ip_hash; server localhost:8001; server localhost:8002; server localhost:8003; } |
least_conn | 依据最少连接方式。把请求转发给连接数较少的后端服务器。 | upstream loadBalance { least_conn; server localhost:8001; server localhost:8002; server localhost:8003; } |
url_hash | 依据 URL 分配方式。 按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,要配合缓存命中来使用。 同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。 而使用 url_hash,可以使得同一个 url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。 | upstream loadBalance { hash $request_uri; server localhost:8001; server localhost:8002; server localhost:8003; } |
fair | 依据响应时间方式。fair 采用的不是内建负载均衡使用的均衡算法,而是可以根据页面大小、加载时间长短智能地进行负载均衡。 fair 属于第三方模块实现的负载均衡。需要添加 nginx-upstream-fair。 | upstream loadBalance { fair; server localhost:8001; server localhost:8002; server localhost:8003; } |
注意:使用 ip_hash 指令无法保证后端服务器的负载均衡,可能导致有些后端服务器接收到的请求多,有些后端服务器接受的请求少,而且设置后端服务器权重等方法将不起作用。