Nginx 反向代理+负载均衡

2023-05-16


一、Nginx 的引入背景

● 公司产品出现瓶颈?

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

  • 用户少,并发量少:

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

  • 用户多,并发量增大:

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

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

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



二、nginx 和 tomcat的关系:

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



三、什么是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

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

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

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

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


(2) 反向代理:

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

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


2、负载均衡:

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

■ 轮询

  • 循环的意思


■ 加权轮询


■ iphash

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

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

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


3、动静分离

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

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

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



五、Nginx的安装

1、windows下安装

(1) 下载nginx:

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


(2) 启动nginx:

有很多种方法启动nginx

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

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


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

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


(4) 配置监听:

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


★ 修改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服务

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

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

若是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、实现反向代理、负载均衡


2、nginx的配置文件 nginx.conf

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

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


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

  • 默认是连接1024个线程


(3) http:

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

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


小结 http

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


  • 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,)



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



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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx 反向代理+负载均衡 的相关文章

  • virt-install工具创建虚拟机命令介绍(详细)

    virt install介绍 virt span class token operator span install是一个命令行工具 xff0c 它能够为 span class token constant KVM span Xen或其它支
  • 什么是状态机?用C语言实现进程5状态模型

    前言 状态机在实际工作开发中应用非常广泛 xff0c 在刚进入公司的时候 xff0c 根据公司产品做流程图的时候 xff0c 发现自己经常会漏了这样或那样的状态 xff0c 导致整体流程会有问题 xff0c 后来知道了状态机这样的东西 xf
  • 希腊字母与对应的Unicode码

    希腊字母 xff08 大小写各24个 xff09 xff1a 大写 xff1a xff08 对应Unicode码为 xff1a 913 937 xff0c 无930 xff09 小写 xff1a xff08 对应Unicode码为 xff1
  • Debian OS本地及局域网apt源搭建

    Debian OS本地及局域网apt源搭建 一 本地apt源搭建1 1 上传ISO镜像到本地OS1 2 挂载ISO镜像1 3 编辑apt配置文件1 4 验证apt源 二 局域网apt源搭建2 3 编辑本地apt配置文件2 4 验证apt源
  • 使用conda时出现Solving environment: failed错误

    一 问题 win10系统下 xff0c 在安装anaconda后 xff0c 执行conda install mingw libpython时报错如图 D anaconda Scripts gt conda install mingw li
  • 政务外网后端接口PUT和DELETE不通

    政务外网后端接口PUT和DELETE不通 错误信息 解决思路 1 xff0c 首先排查政务内网环境下接口是否能通 2 查看nginx反向代理问题 3 查看接口是否调通后端 xff0c 后端是否有相应信息 4 排查端口是否对外开放 5 关闭防
  • 安装Anaconda3后缺失大量文件的解决方法:安装旧的版本再升级

    项目场景 xff1a 安装Anaconda3 项目场景 xff1a 安装Anaconda3后缺失大量文件 问题描述 安装Anaconda3后缺失大量文件 正确安装后的样子 xff1a 原因分析 xff1a 找了很多帖子 xff0c 也尝试了
  • IOS开发 汉化

    UIImagePicker TZImagePicker选择图片时默认是英文 只需要修改xcode本地设置即可 xff0c 具体操作如图示 1 选择info 2 添加Localizations 3 将English改成Chinese 2 iO
  • WSL2 Linux搭建xfce4桌面和使用xrdp远程连接

    基于Ubuntu20 04测试 1 安装 span class token function sudo span apt span class token function install span xfce4 xrdp y 如果遇到下面页
  • 修改 WSL2 可用内存大小和交换分区大小

    WSL2默认可以使用的内存大小为主机的80 对于Linux而言即使装了桌面 一般的开发也没必要给这么多内存 分多了 反而有可能卡主机的Windows 操作 1 打开Windows资源管理器 地址栏输入 UserProfile 回车 在该目录
  • C++代码: Linux下获取基本设备信息

    测试环境 基于C 43 43 20构建测试 g 43 43 10 2 1 CMakeLists txt 设置用于构建该项目的最低cmake版本 cmake minimum required VERSION 3 1 设置项目名称和编程语言 p
  • VMware虚拟机Ubuntu无法使用摄像头的问题

    注 之前我在使用Ubuntu的虚拟机中 搞OpenCV开发 需要使用摄像头 遇到了摄像头无法使用的问题 后面折腾了很久才发现 USB3 1 兼容设置的问题 刚才又用新的虚拟机配置环境 又遇到了之前的问题 因此做个记录 1 摄像头未连接到虚拟
  • 一文搞懂光纤的方方面面

    光纤 一直以为光纤模块会非常贵 xff0c 呃 xff0c 只能说没有想象中的贵 xff0c 相比网线还是贵上不少 一个常见的光纤系统通常会包括收发器 xff0c 光电转换器还有光纤收发器 通常简单的入门级一套下来可能也在200 300左右
  • msys2配置cmake构建环境

    注 本人主要在Linux下搞开发 使用msys2是为了方便移植部分程序到Windows下 做以下纪录方便环境配置 1 换源 span class token comment 更新本地软件数据库 span pacman Sy 2 安装开发工具
  • Windows 10安装 WSL2 (Ubuntu 20.04)

    条件 对于 x64 系统 xff1a 版本 1903 或更高版本 xff0c 采用 内部版本 18362 或更高版本 对于 ARM64 系统 xff1a 版本 2004 或更高版本 xff0c 采用 内部版本 19041 或更高版本 低于
  • Ubuntu 20.04 server 切换中文语言

    1 安装区域设置 locales Ubuntu 一般是预装了的 Kali Linux 和 Debian可能没有 就需要安装 更新索引 sudo apt update span class token comment 安装locales sp
  • 全新安装的Termux配置Ubuntu环境

    基于 Termux 0 101 测试 换国内源 默认官方源在国外速度慢 有梯子的话也可以不换 这里换清华源为例 更多 执行命令 span class token function sed span i span class token st
  • 1g 路由器使用

    前言 xff08 1 xff09 首次使用以及断网后配置都可参看本文 xff08 2 xff09 简谈 xff0c 创翼实际登录拨号的账号其实并不是 电话 64 cqit xff0c 而是在这个账号前面根据拨号时间生成一个随机字符串 xff
  • 基于随机森林的手写数字识别 (OpenCV)

    OpenCV 4 5 1 C 43 43 20 Ubuntu 20 04 素材 来源 基于 K近邻博文 中原5000个手写数字得到的按行排列的手写数字数据以及对应行的标签 保存为图片后直接放到这里使用 避免重复数据处理 右键图片另存为 行数
  • 使用支持向量机分类 (OpenCV)

    OpenCV 4 5 1 C 43 43 20 Ubuntu 20 04 素材 像素点和分类标签 组态档 设置用于构建该项目的最低cmake版本 cmake minimum required VERSION 3 1 设置项目名称和编程语言

随机推荐