一、Nginx 的引入背景

● 公司产品出现瓶颈?

我们公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。

  • 用户少,并发量少:

Nginx 反向代理+负载均衡_nginx

但是慢慢的,使用我们平台的用户越来越多了,并发量慢慢增大了,这时候一台服务器满足不了我们的需求了。

  • 用户多,并发量增大:

Nginx 反向代理+负载均衡_服务器_02

于是我们横向扩展,又增加了服务器。这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求。

  • 横向扩展,增加服务器:

Nginx 反向代理+负载均衡_服务器_03

我们希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,我们还希望他可以按照服务器的性能提供不同的权重选择。保证最佳体验!所以我们使用了Nginx。


二、nginx 和 tomcat的关系:

  • 反向代理:当我们的网站访问量越来越大,一台tomcat 服务器已经无法满足服务需求,需要加服务器,但是服务器直接无法实现session共享,需要加一层(nginx),来转发控制,反向代理到三台服务器中某台,实现数据共享。
  • 负载均衡:给服务器性能好的访问权重分配大,给服务性能差的分配流量少。

Nginx 反向代理+负载均衡_代理服务器_04


三、什么是Nginx?

(1) Nginx 是什么?

Nginx (engine x) 是一个​高性能的HTTP和反向代理web服务器​,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx 1.0.4发布。

(2) Nginx 特点:

占有内存少,处理并发能力强​,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。

Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。

Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应


四、Nginx作用?

1、​​反向代理​​:

  • Http代理,包含正向代理和反向代理,作为web服务器最常用的功能之一,尤其是反向代理。


(1) 正向代理:

  • 当我们的服务器直接访问外网(举例:美国服务器)的时候特别慢,使用vpn代理,通过vpn提供的代理服务器(举例:香港服务器)。
    我们请求代理服务器(香港服务器) --> 代理服务器请求外网(美国服务器);然后外网响应给代理服务器,代理服务器再把数据响应给我们的客户端服务器。


▪​正向代理:代理的是客户端,安装在客户端本机上

  • 正向代理类似一个跳板机,代理访问外部资源。

 正向代理的用途:

① 访问原来无法访问的资源,如google

② 可以做缓存,加速访问资源

③ 对客户端访问授权,上网进行认证

④ 代理记录用户访问记录(上网行为管理),也可以对外网隐藏用户信息。

【从外网的角度,只有代理服务器获取资源的时候有一次记录,当代理告服务器不告诉网站时,外网就不知道这个请求的用户信息】


Nginx 反向代理+负载均衡_代理服务器_05


(2) 反向代理:


▪​反向代理:代理的是服务端,让用户无感知地浏览服务器资源(无论动容增加了多少台服务器,用户都无法感知,用户访问的永远是域名)​,并且让服务器更好的部署上线。

  • 客户端是无感知代理服务器的存在的,访问者者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问


Nginx 反向代理+负载均衡_Nginx 反向代理+负载均衡_06


2、​​负载均衡​​:

  • Nginx提供的负载均衡策略有2种:内置策略和扩展策略
  • 内置策略为轮询,加权轮询,Ip hash。
  • 扩展策略,就天马行空,只有你想不到的没有他做不到的。


■ 轮询

  • 循环的意思

Nginx 反向代理+负载均衡_Nginx 反向代理+负载均衡_07


■ 加权轮询

Nginx 反向代理+负载均衡_Nginx 反向代理+负载均衡_08


■ iphash

  • 对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。


有n台 tomcat 服务器,则有n个 session,如何实现session共享?【实际开发使用的是redis】

  • nginx 提供的方法是:ip进行hash运行,从而固定的ip访问固定的某台服务器。



Nginx 反向代理+负载均衡_代理服务器_09


3、动静分离


▪ 动静分离,在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。

▪ 让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。


Nginx 反向代理+负载均衡_Nginx 反向代理+负载均衡_10

目前,通过使用Nginx大大提高了我们网站的响应速度,优化了用户体验,让网站的健壮性更上一层楼!


五、Nginx的安装

1、windows下安装

(1) 下载nginx:

​http://nginx.org/en/download.html​​​ 下载稳定版本。
以nginx/Windows-1.18.0为例,直接下载 nginx-1.18.0.zip。
下载后解压,解压后如下:

Nginx 反向代理+负载均衡_服务器_11


(2) 启动nginx:

有很多种方法启动nginx

(1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过

(2)打开cmd命令窗口,切换到nginx解压目录下,输入命令 ​​nginx.exe​​ ,回车即可


(3) 检查nginx是否启动成功:

直接在浏览器地址栏输入网址 ​​http://localhost:80​​ 回车,出现以下页面说明启动成功!

Nginx 反向代理+负载均衡_服务器_12


(4) 配置监听:

nginx的配置文件是conf目录下的nginx.conf,默认配置的nginx监听的端口为80,如果80端口被占用可以修改为未被占用的端口即可。

Nginx 反向代理+负载均衡_服务器_13


★ 修改nginx的配置文件不需要重启,只需重新加载

当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx,只需要执行命令 nginx -s reload 即可让改动生效


(5) 关闭nginx:

如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx

① 输入nginx命令 ​​nginx -s stop​​​(快速停止nginx) 或 ​​nginx -s quit​​ (完整有序的停止nginx)

② 使用taskkill ​​taskkill /f /t /im nginx.exe​

taskkill是用来终止进程的,
/f是强制终止 .
/t终止指定的进程和任何由此启动的子进程。
/im示指定的进程名称 .


2、linux下安装

yum install gcc-c++
# 验证是否安装成功
gcc -v

# 解压安装包
cd nginx-1.18.0
# 先安装PCRE
yum install -y pcre pcre-devel
# 再安装zlib
yum install -y zlib zlib-devel
# 安装openssl
yum install -y openssl openssl-devel

# 执行配置
./configure

make
make install

# 查找nginx位置
[root@iZwz9535z41cmgcpkm7i81Z nginx-1.18.0]# whereis nginx
nginx: /usr/local/nginx


(1) 安装gcc:

安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:

  • 因为Nginx代码完全用C语言从头写成。

yum install gcc-c++
# 验证是否安装成功
gcc -v

(2) PCRE pcre-devel 安装:

PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:

yum install -y pcre pcre-devel

3、zlib 安装

zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

yum install -y zlib zlib-devel

4、OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

yum install -y openssl openssl-devel


5、配置

使用默认配置,在nginx根目录下执行

./configure
make
make install

查找安装路径: ​​whereis nginx​

Nginx 反向代理+负载均衡_服务器_14



开启nginx服务


# 在nginx的根目录下
cd /usr/local/nginx
cd sbin
# 开启nginx服务
./nginx

# 在宿主机的浏览器进行访问
http://服务器ip:80
# 访问失败,考虑远程服务的安全组/防火墙 端口80(nginx默认端口号)是否打开【轻应用服务器是防火墙,云服务器ESC是安全组】
# 系统的防火墙是否打开端口80

  • 云服务器(防火墙):

Nginx 反向代理+负载均衡_nginx_15


若是docker 容器的话,使用了端口映射的话,只需要到云服务器(阿里云服务器)的防火墙打开映射后的端口,不用再开启服务器系统(centos)的防火墙的端口.


  • 服务器系统(centos)的防火墙:

● 开启防火墙: systemctl start firewalld
● 关闭防火墙:systemctl stop firewalld

# 查看防火墙状态
systemctl staus firewalld
# 查看防火墙的端口信息
firewall-cmd --list-ports
# 添加端口80
firewall-cmd --add-port=80 --zone=public --permanent
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload



六、Nginx常用命令

cd /usr/local/nginx/sbin/
./nginx 启动
./nginx -s stop 停止
./nginx -s quit 安全退出
./nginx -s reload 重新加载配置文件

----------------------------------------------------------------
-s:signal,向主进程发送信号(停止,退出,重新打开,重新加载)


ps -aux|grep nginx 查看nginx进程


七、nginx 实战

1、实现反向代理、负载均衡

Nginx 反向代理+负载均衡_nginx_16


2、nginx的配置文件 nginx.conf

(1) 全局配置:可以实现​​性能优化​

  • 可以指定用户、日志、进程等性能优化

Nginx 反向代理+负载均衡_代理服务器_17


(2) 事件 events:最大连接数、监听的事件

  • 默认是连接1024个线程

Nginx 反向代理+负载均衡_Nginx 反向代理+负载均衡_18


(3) http:

  • http的全局配置:可以对​静态资源进行配置​等

Nginx 反向代理+负载均衡_Nginx 反向代理+负载均衡_19

  • htt的server: 可以配置不同的服务:

Nginx 反向代理+负载均衡_服务器_20


小结 http

  • 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  • 2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • 4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
  • 5、location块配置请求的路由,以及各种页面的处理情况。


Nginx 反向代理+负载均衡_服务器_21


  • nginx通过proxy_pass 配置代理站点,upstream实现负载均衡。
http {
upstream kuangstudy{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://kuangstudy;
}
}
}
  • 配置负载均衡和代理:


配置之后,分别开启端口8080、8081的服务器(springboot项目的jar,)



Nginx 反向代理+负载均衡_nginx_22


☺ 参考来源:
狂神的B站视频《【狂神说】Nginx最新教程通俗易懂,40分钟搞定!》 ​​​https://www.bilibili.com/video/BV1F5411J7vK​


如果本文对你有帮助的话记得给一乐点个赞哦,感谢!

作者:一乐乐