nginx负载均衡

一、负载均衡

负载均衡是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。

二、负载均衡原理

负载均衡NAT(Network Address Translation网络地址转换)简单地说就是将一个IP地址转换为另一个IP地址,一般用于未经注册的内部地址与合法的、已获注册的Internet IP地址间进行转换。适用于解决Internet IP地址紧张、不想让网络外部知道内部网络结构等的场合下。

系统的扩展可以分为纵向扩展和横向扩展。

纵向扩展:从单机的角度出发,通过增加系统的硬件处理能力来提升服务器的处理能力;

横向扩展:通过添加机器来满足大型网站服务的处理能力。

(1)应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理并返回响应的数据。

(2)负载均衡器:将用户访问的请求根据对应的负载均衡算法,分发到集群中的一台服务器进行处理

三、负载均衡的作用

解决服务器的高并发压力,提高应用程序的处理性能;

提供故障转移,实现高可用;

通过添加或减少服务器数量,增强网站的可扩展性;

在负载均衡器上进行过滤,可以提高系统的安全性;

四、负载均衡常用处理方式

负载均衡分为四层负载均衡和七层负载均衡

  1. 四层负载均衡是工作在 OSI 七层协议的第四层------传输层,基于IP+PORT的负载均衡,主要工作是转发。

  2. 它在接收到客户端的流量以后通过修改数据包的地址信息(目标地址和端口和源地址)将流量转发到应用服务器。

  3. 实现四层负载均衡的方式:

硬件:F5、BIG-IP、Radware等;

软件:LVS、Nginx、Haproxy等

  1. 七层负载均衡是工作在七层协议的第七层-应用层,基于虚拟的URL或主机IP的负载均衡,主要工作是代理。

  2. 它首先会与客户端建立一条完整的连接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器建立另外一条连接将请求发送过去。

  3. 实现七层负载均衡的方式:

软件:Nginx、Hayproxy等。

五、nginx 七层负载均衡

[root@server]# vim /usr/local/nginx/conf/nginx.conf

worker_processes 1;

event {

worker_connections 1024;

}

http { # 七层负载均衡支持http、ftp协议

include mime.types;

default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

upstream qicengzu { # 服务器组,组名qingcengzu

server 192.168.33.11:8080; # 组内服务器1

server 192.168.33.22:8080; # 组内服务器2

}

server { # 虚拟服务器

listen 80; # 虚拟服务器端口

server_name localhost; # 虚拟服务器名

location { # 虚拟服务器的url跳转

proxy_pass http://qicengzu;

当访问本机的80端口时,跳转到服务器组

}

}

}

2、负载均衡状态

[root@server]# vim /usr/local/nginx/conf/nginx.conf

......省略部分内容......

upstream qicengzu { # 服务器组,组名qingcengzu

server 192.168.33.11:8080 down; # 停止此服务器负载均衡

server 192.168.33.22:8080 backup; # 该服务器作为其他组内服务器的备份服务器

server 192.168.....

}

3、负载均衡策略

基于域名的虚拟主机

[root@server2 ~]# ps -au|grep nginx //查看进程

修改Nginx服务配置,添加相关虚拟主机配置如下

  1. [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf

  2. .. ..

  3. server {

  4. listen 80; //端口

  5. server_name www.a.com; //域名

  6. auth_basic "Input Password:"; //认证提示符

  7. auth_basic_user_file "/usr/local/nginx/pass"; //认证密码文件

  8. location / {

  9. root html; //指定网站根路径

  10. index index.html index.htm;

  11. }

  12. }

  13. ... ...

  14. server {

  15. listen 80; //端口

  16. server_name www.b.com; //域名

  17. location / {

  18. root web; //指定网站根路径

  19. index index.html index.htm;

  20. }

[root@localhost ~]# mkdir /usr/local/nginx/web //创建网页根目录

[root@localhost ~]# echo "web" > /usr/local/nginx/web/index.html //写测试页面

[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload //重新加载

客户机测试:

[root@localhost ~]# vim /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.1.134 www.a.com www.b.com

六、nginx反向代理配置

⽤户直接访问反向代理服务器就可以获得⽬标服务器(后端服务器)的资源。

1、修改配置

在配置⽂件中添加⼀⾏反向代理块指令(proxy_pass),表示当访问本机地址 192.168.1.125的 80 端⼝时即可跳转到后端服务器 192.168.1.100 的 80 端⼝上。

[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf

server {

listen 80;

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

root html;

index index.html index.htm;

proxy_pass http://192.168.1.100:80;

}

[root@server2 ~]# /usr/local/nginx/sbin/nginx -s reload

2.建立后端服务器

去server1:

也安装了nginx

[root@server1 ~]# vim /usr/local/nginx/html/index.html

这里是192.168.1.100

3.访问测试

浏览器测试,输入server2的地址192.168.1.125

七、nginx访问IP黑名单

1、修改配置

[root@server2 ~]# vim /usr/local/nginx/conf/nginx.conf

server {

listen 80;

server_name localhost;

allow 192.168.1.225; //允许192.168.1.225用户访问

deny 192.168.1.0/24; //拒绝1.0网段的用户访问

deny all; //拒绝所有,哪条在前哪条优先级高

#charset koi8-r;

#access_log logs/host.access.log main;

location / {

root html;

index index.html index.htm;

proxy_pass http://192.168.1.100:80;

}

[root@server2 ~]# /usr/local/nginx/sbin/nginx -s reload

2、真机浏览器访问;

因为当前服务器拒绝了 1.0 ⽹段的⽤户访问,⽽本机浏览器正是通过 1.254 ⽹关与服务器建⽴连接,所以浏览器被拒绝访问了,显示 403 错误信息。

3、另找一台虚拟机(192.168.1.225)访问

[root@web ~]# curl 192.168.1.125

我是192.168.1.100 //访问成功

轮询

wget https://nginx.org/download/nginx-1.26.1.tar.gz

tar -zxvf nginx-1.26.1.tar.gz

yum -y install gcc gcc-c++

yum -y install make

yum -y install openssl-devel

yum -y install pcre-devel

cd nginx-1.26.1/

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-stream

make && make install

useradd -s /bin/nologin -M nginx

/usr/local/nginx/sbin/nginx

static主机

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

upstream server_group_name {

server 192.168.1.31:80;

server 192.168.1.32:80;

server 192.168.1.33:80;

}

server {

listen 80;

server_name localhost;

location / {

root html;

index index.html index.htm;

proxy_pass http://server_group_name;

}

[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload

浏览器访问192.168.1.30:其余三台交替提供服务

(2)weight 加权

upstream backend {

server 192.168.33.11:8080 weight=5;

server 192.168.33.22:8080 weight=2; # 权重默认为1,谁权重大,谁优先处理请求

}

(3)ip_hash

当对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上

upstream backend {

ip_hash; # ip_hash算法

server 192.168.33.11:8080;

server 192.168.33.22:8080;

}

(4)least_conn

least_conn:最少连接,把请求转发给连接数较少的后端服务器。

upstream backend {

least_conn; # 将请求转发给连接数较少的后端服务器

server 192.168.33.11:8080;

server 192.168.33.22:8080;

}

(5)url_hash

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。

upstream backend {

hash $request_uri;

server 192.168.33.11:8080;

server 192.168.33.22:8080;

}

八、nginx软件平滑升级

kill 信号 进程编号

-USR2 平滑启动一个进程,平滑升级

-WINCH 优雅关闭子进程

-QUIT 优雅关闭主进程

下载编译1.27新版本

[root@localhost nginx-1.27.0]# wget https://nginx.org/download/nginx-1.27.0.tar.gz

[root@localhost nginx-1.27.0]# tar -vxzf nginx-1.27.0.tar.gz

[root@localhost nginx-1.27.0]# cd nginx-1.27.0

[root@localhost nginx-1.27.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-stream

[root@localhost nginx-1.27.0]# make && make install

[root@localhost nginx-1.27.0]# /usr/local/nginx/sbin/nginx -v

nginx version: nginx/1.27.0

[root@localhost nginx-1.27.0]# /usr/local/nginx/sbin/nginx.old -v

nginx version: nginx/1.26.1

[root@localhost nginx-1.27.0]# ps -aux | grep nginx

root 4567 0.0 0.0 46220 1992 ? Ss 15:07 0:00 nginx: master process /usr/local/nginx/sbin/nginx

nginx 4576 0.0 0.0 46672 2284 ? S 15:23 0:00 nginx: worker process

root 19652 0.0 0.0 112720 980 pts/0 S+ 16:35 0:00 grep --color=auto nginx

[root@localhost nginx-1.27.0]# kill -USR2 4567

[root@localhost nginx-1.27.0]# ps -aux | grep nginx

root 4567 0.0 0.0 46220 1992 ? Ss 15:07 0:00 nginx: master process /usr/local/nginx/sbin/nginx

nginx 4576 0.0 0.0 46672 2284 ? S 15:23 0:00 nginx: worker process

root 19653 0.0 0.0 46100 3344 ? S 16:37 0:00 nginx: master process /usr/local/nginx/sbin/nginx

nginx 19654 0.0 0.0 46556 1920 ? S 16:37 0:00 nginx: worker process

root 19656 0.0 0.0 112720 980 pts/0 S+ 16:37 0:00 grep --color=auto nginx

[root@localhost nginx-1.27.0]# kill -WINCH 4576

[root@localhost nginx-1.27.0]# ps -aux | grep nginx

root 4567 0.0 0.0 46220 1992 ? Ss 15:07 0:00 nginx: master process /usr/local/nginx/sbin/nginx

root 19653 0.0 0.0 46100 3344 ? S 16:37 0:00 nginx: master process /usr/local/nginx/sbin/nginx

nginx 19654 0.0 0.0 46556 1920 ? S 16:37 0:00 nginx: worker process

nginx 19659 0.0 0.0 46672 2040 ? S 16:40 0:00 nginx: worker process

root 19661 0.0 0.0 112720 980 pts/0 S+ 16:40 0:00 grep --color=auto nginx

[root@localhost nginx-1.27.0]# kill -QUIT 4567

[root@localhost nginx-1.27.0]# ps -aux | grep nginx

root 19653 0.0 0.0 46100 3344 ? S 16:37 0:00 nginx: master process /usr/local/nginx/sbin/nginx

nginx 19654 0.0 0.0 46556 1920 ? S 16:37 0:00 nginx: worker process

root 19663 0.0 0.0 112720 984 pts/0 R+ 16:41 0:00 grep --color=auto nginx

[root@localhost nginx-1.27.0]# curl -I localhost

HTTP/1.1 200 OK

Server: nginx/1.27.0

九、nginx 四层负载均衡

配置tomcat部分代码

[root@localhost ~]# tar -zxvf jdk22.tar.gz

[root@localhost ~]# mv jdk-22.0.2/ /usr/local/jdk22/

[root@localhost ~]# cd /usr/local/jdk22/

[root@localhost jdk22]# sed -i '$aexport JAVA_HOME=/usr/local/jdk22/' /etc/profile

[root@localhost jdk22]# sed -i 'aPATH=JAVA_HOME/bin:$PATH' /etc/profile

[root@localhost jdk22]# source /etc/profile

[root@localhost jdk22]# java

[root@localhost jdk22]# java -version

相关推荐
海阔天空_20134 分钟前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
桥田智能6 分钟前
气爪在自动化装配线中是如何应用的?
运维·自动化
€☞扫地僧☜€2 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
hjjdebug2 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
其乐无涯2 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流2 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos
写bug的小屁孩2 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
斑布斑布2 小时前
【linux学习2】linux基本命令行操作总结
linux·运维·服务器·学习
紅色彼岸花2 小时前
第六章:DNS域名解析服务器
运维·服务器
Spring_java_gg2 小时前
如何抵御 Linux 服务器黑客威胁和攻击
linux·服务器·网络·安全·web安全