Nginx 反向代理,负载平衡及搭建高可用集群
前提筹备
首先是对于 linux
环境下的装置 (本地机器是 Windows 版本,大家能够应用Vmware
, 然而须要配置网络连接等,这里就不再展现虚拟机上的演示。这里应用到集体的 阿里云云服务器 搭配上 xftp 与xshell来进行文件的上传与连贯命令行的输出)
留神:以下命令皆为 CentOS7 所应用。
上面开始进行系列依赖的装置:
<div align = “center”><img src= “http://maycope.cn/images/image-20200807092205021.png”></div>
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
若是没有进行端口的开发能够应用如下命令进行端口的凋谢:
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 地址的拜访)
配置文件解说:
首先是配置文件地址:/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 端口
实例二
在下面的案例中咱们拜访的还是默认的 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;
}
}
这个时候咱们就能够拜访如下网址:能够发现如下的 3308(本人测试时候要提前开启端口)端口搭配上 edu 门路和对应的 index.html 就能够拜访到咱们tomact
服务器上面的对应的页面信息。
负载平衡
概念
负载平衡即是将负载摊派到不同的服务单元,既保证服务的可用性,又保障响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载平衡产品,很多业余的负载平衡硬件提供了很好的性能,但却价格不菲,这使得负载平衡软件大受欢迎,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
负载平衡, 同时,这部分的具体实现的信息也在我的集体github
github 我的项目地址账户上有所体现。
无论是 nginx 集群的创立,还是负载平衡的实现上,对于 docker
来说都为咱们提供了很大的遍历,过后的 docker 配置上夹杂了一些其余的配置,可能把这部分宰割进去还是须要点工夫去了解,这里就独自进行剖析与学习。
实例
对于具体的逻辑信息,在我如上的 基于 Mysql 与 Redis 集群上我的项目负载平衡 ,次要就是说:为了避免只有一个nginx
导致问题的呈现的问题,而后增加两个 nginx
进行轮询,然而这个轮询的工作不须要咱们自行实现,而是借助第三方的工具Keepalived
,帮忙咱们实现系列的工作, 见下图:利用心跳检测,来具体检测出故障的机器,并且进行 ip 的虚拟化,只须要记录一个 ip 信息,而后前面的操作
<img src=”https://img-blog.csdnimg.cn/20200501081514734.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDAxNTA0Mw==,size_16,color_FFFFFF,t_70″>
-
首先是有两台服务器,而后在其上都进行
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
服务器上, 这样就保障了在一个服务器呈现故障时候,另外一个还可能失常的工作。