Nginx 反向代理,负载均衡及搭建高可用集群
![Nginx 反向代理,负载均衡及搭建高可用集群](https://www.isolves.com/d/file/p/2020/08-10/30a5167d8a8c9b4eb6042713f0c18435.jpg)
Nginx
前提准备
首先是对于linux环境下的安装(本地机器是windows版本,大家可以使用Vmware,但是需要配置网络连接等,这里就不在展示虚拟机上的演示。这里使用到个人的阿里云云服务器搭配上xftp与xshell来进行文件的上传与连接命令行的输入)
![Nginx 反向代理,负载均衡及搭建高可用集群](https://www.isolves.com/d/file/p/2020/08-10/235245745e0e609a1a62e3ab8151bb14.jpg)
注意:以下命令皆为centos7所使用。
下面开始进行系列依赖的安装:
![Nginx 反向代理,负载均衡及搭建高可用集群](https://www.isolves.com/d/file/p/2020/08-10/235245745e0e609a1a62e3ab8151bb14.jpg)
gcc 安装:
yum -y install gcc automake autoconf libtool make
yum install gcc gcc-c++
复制代码
pcre 安装
cd /usr/local/src
wget https://netix.dl.sourceforge.net/project/pcre/pcre/8.40/pcre-8.40.tar.gz
tar -zxvf pcre-8.40.tar.gz
cd pcre-8.40
./configure
make && make install
复制代码
zlib 安装
cd /usr/local/src
wget http://zlib.net/zlib-1.2.11.tar.gz wget http://www.zlib.net/zlib-1.2.11.tar.gz
tar -zxvf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure
make && make install
yum install -y zlib zlib-devel
复制代码
openssl 安装
cd /user/local/scr
wget https://www.openssl.org/source/openssl-1.0.1t.tar.gz
tar -zxvf openssl-1.0.1t.tar.gz
复制代码
nginx 安装
cd /user/local/scr
wget http://nginx.org/download/nginx-1.1.10.tar.gz
tar zxvf nginx-1.1.10.tar.gz
cd nginx-1.1.10
./configure
make && make install
启动nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
复制代码
完成之后可以先行查看自己的自己的服务器开放了哪些的端口:
firewall-cmd --list-all
复制代码
![Nginx 反向代理,负载均衡及搭建高可用集群](https://www.isolves.com/d/file/p/2020/08-10/9c2c27ab68e7bf9afa0131368d73ea14.jpg)
若是没有进行端口的开发可以使用如下命令进行端口的开放:
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 其中80 可以进行修改为自己想要开放的端口,当然前提下是你要打开了防火墙。
复制代码
防火墙设置
systemctl status firewalld.service # 查看防火墙状态
systemctl stop firewalld.service # 关闭防火墙
systemctl start firewalld.service # 打开防火墙
复制代码
nginx基础命令
- 再完成以上的基础准备之后,已经对nginx进行了启动,查看当前的nginx情况:
ps -ef | grep nginx
复制代码
- 对nginx进行启动,停止与重启。
cd /usr/local/sbin # 注意要进入到安装的nginx对应的相关的目录下才能够执行相关联的语句。
./nginx # 表示启动nginx
./nginx -s stop # 表示对nginx 进行停止。
./nginx - s reload # 表示重启,一般在配置文件进行修改之后使用。
复制代码
在启动完成之后就可以进行ip地址的访问(因为对于nginx来说默认是启动在80 端口,所以可直接进行ip地址的访问)
![Nginx 反向代理,负载均衡及搭建高可用集群](https://www.isolves.com/d/file/p/2020/08-10/34fbaf12de119b5b19168f871ea0467a.jpg)
配置文件讲解:
首先是配置文件地址:/usr/local/nginx/conf/nginx.conf。
对于nginx配置文件来说分为三大块:
全局快
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
比如下面第一行配置的:
worker_processes 1;
复制代码
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约
events 块
events {
worker_connections 1024;
}
复制代码
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
上述例子就表示每个 work process 支持的最大连接数为 1024. 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
http 块
http {
include mime.types;
default_type Application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
…………………………
复制代码
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括http 全局块,server块
http 全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
1, 全局server块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
2,location块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
反向代理
何为反向代理:
在了解反向代理之前,先了解正向代理:
正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。简而言之就是起到一个帮助到达目标网络的作用。
反向代理:反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
举个例子:我们在本地环境上安装一个Tomcat 服务器,对于tomact来说默认访问是8080端口,但是我们不想输入80端口就可以直接进行访问,就需要我们直接访问80 端口 表示访问到nginx服务器,然后进行配置文件的配置,将请求转发到我们的tomcat服务器上。
我们可以进行如下配置:
在http模块中 进行如下配置:
server {
listen 80;
# server_name localhost;
server_name 121.*.*.34;# 表示监听的服务的名称是 如下地址
location / {
root html;
proxy_pass http://127.0.0.1:8080; # 表示进行转发的地址,首先需要在本机安装tomact 并启动 自行官网下载即可
index index.html index.htm;
}
}
复制代码
完成配置之后记得重启服务:即可看到如下展示:表示从80端口跳转到8080端口
![Nginx 反向代理,负载均衡及搭建高可用集群](https://www.isolves.com/d/file/p/2020/08-10/7c230825edcc6405b0469d89d492ad97.jpg)
实例二
在上面的案例中我们访问的还是默认的80端口,若是我们想要更换端口去访问呢,我们若是想要访问其他的端口,或者说是访问带路径的信息呢,该如何进行操作,这个时候就可以添加一个server,因为一个server监听一个唯一的端口,这里我们可以再创建一个server 选中我们监听的端口信息。在location中进行配置即可。
server {
listen 3308; # 我们监听不同的端口信息
server_name localhost;
location ~ /edu/ {
# 在tomcat 下的webpage下创建对应的目录,下添加一个index.html 页面。
proxy_pass http://127.0.0.1:8080;
}
}
复制代码
![Nginx 反向代理,负载均衡及搭建高可用集群](https://www.isolves.com/d/file/p/2020/08-10/0b0aea1e317b16aef8733edd363976b4.jpg)
这个时候我们就可以访问如下网址:可以发现如下的3308(自己测试时候要提前开启端口)端口搭配上edu路径和对应的index.html 就可以访问到我们tomact 服务器下面的对应的页面信息。
![Nginx 反向代理,负载均衡及搭建高可用集群](https://www.isolves.com/d/file/p/2020/08-10/bc917a383967234ef38db3ac851bcaee.jpg)
负载均衡
概念
负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎, nginx 就是其中的一个,在 linux 下有 Nginx、LVS、Haproxy 等等服务可以提供负载均衡服务,而且 Nginx 提供了几种分配方式(策略):
- 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
- weight weight 代表权,重默认为 1,权重越高被分配的客户端越多 指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如: upstream server_pool { server 121.111.2.34 weight = 10; server 121.111.2.35 weight = 10; } 复制代码
- ip_hash 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。 upstream server_pool{ ip_hash; server 121.111.2.34 weight = 10; server 121.111.2.35 weight = 10; } 复制代码
- fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server_pool{
fair;
server 121.111.2.34 weight = 10;
server 121.111.2.35 weight = 10;
}
复制代码
实例
在http中添加upstream关键字:
http{
……
upstream myserver{
# 拥有两台服务器
fair # 表示 按照相应的时间进行分配哪个服务来相应当前的请求 。
server 121.111.2.34:8080;
server 121.111.2.35:8080;
# 注意 这里是模拟两台服务器,对于没有两台真实的服务器的,可以开两个tomcat 服务 配置不同的端口
server 121.111.2.34:8080;
server 121.111.2.34:8081;
}
server{
listen 80;
server_name 121.111.2.34;
……
location /{
proxy_pass http://myserver
# myserver 和上面自己所起的upstream 相对应
……
}
}
复制代码
这样就可以在访问到本机的80端口时候进行数据的转发处理,选择一个特定的主机进行服务的相应接收
高可用
简介
关于这部分知识,之前在学习基于MySQL与redis集群上项目负载均衡时候有使用的到Docker 来搭建后端的nginx负载均衡,同时,这部分的具体完成的信息也在我的个人githubgithub项目地址账户上有所体现。
无论是nginx集群的创建,还是负载均衡的完成上,对于docker 来说都为我们提供了很大的便利,当时的docker配置上夹杂了一些其他的配置,可能把这部分分割出来还是需要点时间去理解,这里就单独进行分析与学习。
实例
关于具体的逻辑信息,在我如上的基于Mysql与Redis集群上项目负载均衡,主要就是说:为了防止只有一个nginx导致问题的出现的问题,然后添加两个nginx进行轮询,但是这个轮询的工作不需要我们自行完成,而是借助第三方的工具Keepalived,帮助我们完成系列的工作,见下图:利用心跳检测,来具体检测出故障的机器,并且进行ip的虚拟化,只需要记录一个ip信息,然后后面的操作
![Nginx 反向代理,负载均衡及搭建高可用集群](https://www.isolves.com/d/file/p/2020/08-10/f8c3f35777503c0415b1b70b5877d3de.jpg)
- 首先是有两台服务器,然后在其上都进行keepalived的安装 yum install keepalived -y # 安装 rpm -q -a keepalived # 查看安装的情况 cd /etc/keepalived vi keepalived.conf 复制代码
- 然后修改两台keepalived中的文件的配置信息:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 121.111.2.34
smtp_connect_timeout 30
router_id LVS_DEVEL #唯一
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)2 s执行一次
weight 2 # 脚本成立 权重增加2。
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER(主) 改为 BACKUP
interface ens33 # 网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 进行心跳检测 每隔一秒 发送检测信息 查看是否存活
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
121.111.2.20 # 虚拟地址
}
}
复制代码
- 脚本文件的编写,不同于使用docker 的方式,如下是使用到dcoker 的解决方案,配置文件的不同。
如下我们编写具体的信息查看nginx是否存活。存放的目录是/usr/local/src/。
#!/bin/bash
A = `ps -C nginx –no-header |wc -l`
if [$A - eq 0]; then
/ usr / local / nginx / sbin / nginx
# 查看nginx 是否还存活
sleep 2
if [`ps -C nginx --no-header |wc -l` - eq 0]; then killall keepalived
fi
fi
复制代码
- 完成之后对nginx和keepalived 进行启动即可keepalived 启动命令:systemctl start keepalived
这个时候我们访问虚拟地址:121.111.2.20,然后两个keepalived会抢占这个虚拟ip,同时将服务请求发送到不同对应的nginx服务器上,这样就保证了在一个服务器出现故障时候,另外一个还能够正常的工作。
链接:https://juejin.im/post/6858430406736216072