IT技术之家

首页 > 服务器

服务器

Nginx反向代理和负载均衡_加油少年 good

发布时间:2022-10-24 16:48:45 服务器 0次 标签:nginx 负载均衡 centos 运维 linux
说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道;此时就设计到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中的专卖店~客人到某达斯专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是某达斯厂家,目标角色就是用户。...

文章目录

Nginx负载均衡案例源码部署nginx设置weight权重ip_hash配置 动静分离nginx+tomcat部署tomcat
Nginx反向代理和负载均衡原文

Nginx负载均衡案例

主机Ip安装系统
Nginx192.168.40.99NginxRHEL8/CentOS8
Rs1192.168.100.100HttpdRHEL8/CentOS8
Rs2192.168.100.101Httpd TomcatRHEL8/CentOS8

关闭三台防火墙和selinux

# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@nginx ~]# getenforce 
Disabled

配置yum源配置yum源

cd /etc/yum.repos.d/
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm

源码部署nginx

创建nginx服务用户

[root@nginx ~]# useradd -r -M -s /sbin/nologin nginx
[root@nginx ~]# id nginx 
uid=975(nginx) gid=974(nginx) 组=974(nginx)

安装依赖环境

[root@nginx ~]# dnf -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make
[root@nginx ~]# dnf -y groups mark install 'Development Tools'
上次元数据过期检查:0:13:17 前,执行于 2022年10月09日 星期日 23时39分57秒。
依赖关系解决。
=============================================================================================================
 软件包                   架构                    版本                        仓库                      大小
=============================================================================================================
安装组:
 Development Tools                                                                                          

事务概要
=============================================================================================================

完毕!

创建日志存放目录

[root@nginx ~]# cd /var/log/
[root@nginx log]# mkdir nginx
[root@nginx log]# chown -R nginx.nginx /var/log/nginx/
[root@nginx log]# ll /var/log/ | grep nginx
drwxr-xr-x  2 nginx  nginx        6 10月  9 23:54 nginx

安装nginx

[root@nginx ~]# cd /usr/local/
[root@nginx local]# wget http://nginx.org/download/nginx-1.22.0.tar.gz
--2022-10-09 23:59:20--  http://nginx.org/download/nginx-1.22.0.tar.gz
正在解析主机 nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5702::6, ...
正在连接 nginx.org (nginx.org)|3.125.197.172|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1073322 (1.0M) [application/octet-stream]
正在保存至: “nginx-1.22.0.tar.gz”

nginx-1.22.0.tar.gz         100%[========================================>]   1.02M   401KB/s  用时 2.6s    

2022-10-09 23:59:24 (401 KB/s) - 已保存 “nginx-1.22.0.tar.gz” [1073322/1073322])
[root@nginx local]# tar xf nginx-1.22.0.tar.gz -C /usr/local/src/
[root@nginx local]# cd /usr/local/src/
[root@nginx src]# ls
nginx-1.22.0
[root@nginx src]# cd nginx-1.22.0/
[root@nginx nginx-1.22.0]# ./configure \
 --prefix=/usr/local/nginx \
 --user=nginx \
 --group=nginx \
 --with-debug \
 --with-http_ssl_module \
 --with-http_realip_module \
 --with-http_image_filter_module \
 --with-http_gunzip_module \
 --with-http_gzip_static_module \
 --with-http_stub_status_module \
 --http-log-path=/var/log/nginx/access.log \
 --error-log-path=/var/log/nginx/error.log
[root@nginx nginx-1.22.0]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install

配置环境变量

[root@nginx ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile
[root@nginx ~]# . /etc/profile

服务控制方式,使用nginx命令
    -t  //检查配置文件语法
    -v  //输出nginx的版本
    -c  //指定配置文件的路径
    -s  //发送服务控制信号,可选值有{stop|quit|reopen|reload

启动服务

[root@nginx ~]# nginx 
[root@nginx ~]# ss -antlp
State         Recv-Q        Send-Q               Local Address:Port                 Peer Address:Port        Process                                                                                                      
LISTEN        0             128                        0.0.0.0:111                       0.0.0.0:*            users:(("rpcbind",pid=904,fd=4),("systemd",pid=1,fd=35))                                                    
LISTEN        0             128                        0.0.0.0:80                        0.0.0.0:*            users:(("nginx",pid=25434,fd=9),("nginx",pid=25433,fd=9))                                                   
LISTEN        0             32                   192.168.122.1:53                        0.0.0.0:*            users:(("dnsmasq",pid=1790,fd=6))                                                                           
LISTEN        0             128                        0.0.0.0:22                        0.0.0.0:*            users:(("sshd",pid=983,fd=4))                                                                               
LISTEN        0             5                        127.0.0.1:631                       0.0.0.0:*            users:(("cupsd",pid=1132,fd=10))                                                                            
LISTEN        0             128                           [::]:111                          [::]:*            users:(("rpcbind",pid=904,fd=6),("systemd",pid=1,fd=37))                                                    
LISTEN        0             128                           [::]:22                           [::]:*            users:(("sshd",pid=983,fd=6))                                                                               
LISTEN        0             5                            [::1]:631                          [::]:*            users:(("cupsd",pid=1132,fd=9))                                                                             

rs1主机上,安装httpd,然后添加一个测试网页

[root@rs1 ~]# yum -y install httpd
[root@rs1 ~]# echo "hello niuma rs1 " >  /var/www/html/index.html
[root@rs1 ~]# systemctl restart httpd
[root@rs1 ~]# systemctl enable httpd

rs2主机上,安装httpd,然后添加一个测试网页

[root@rs2 ~]# yum -y install httpd
[root@rs2 ~]# echo "hello niuma rs2" > /var/www/html/index.html
[root@rs2 ~]# systemctl restart httpd
[root@rs2 ~]# systemctl enable httpd

在nginx主机上,修改配置文件,设置负载均衡

[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
//在http{}中配置upstream
.....
    upstream hehe {
        server 192.168.40.100;
        server 192.168.40.101;
    }

server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://hehe;
        }

测试配置文件是否正确,然后重载nginx

[root@nginx ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@nginx ~]# nginx -s reload

测试访问

设置weight权重

设置权重,如果想其中一台后端真实服务器,多承担一些访问量,可以去设置weight权重

 upstream hehe {
        server 192.168.40.100;
        server 192.168.40.101 weight=2;
    }
 [root@nginx ~]# nginx -s reload

重载nginx并测试访问,此时会发现主机(rs2),访问时,访问的2次后,才轮询到rs1中



此时,我们发现三台主机都是使用80端口,所以,在nginx配置文件中的upstream中,对应的真实后端服务器,我们并没有设置端口。如果其中某台后端服务器使用8080端口呢?我们如何进行设置,rs1为8080端口,rs2为80端口
首先修改rs1的httpd服务,侦听8080端口,并重启httpd服务

[root@rs1 ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080
[root@rs1 ~]# systemctl restart httpd

在nginx中

upstream hehe {
        server 192.168.40.100:8080;
        server 192.168.40.101:80 weight=2;
    }
[root@nginx ~]# nginx  -s reload

测试访问


ip_hash配置

upstream hehe {
        ip_hash;
        server 192.168.40.100:8080;
        server 192.168.40.101:80 weight=2;
    }
[root@nginx ~]# nginx  -s reload


此时不管如何刷新,都是访问rs2.因为你客户端的ip进过ip_hash和rs2进行了绑定
ip_hash: 只对IP的前三段进行哈希,如192.168.40.99------>10.20.5.99

ip_hash这种负载均衡模式根据个人理解就是:例如多个用户通过nginx访问到了后端的httpd集群中,这个时候因为有不同用户,所以ip也不同,ip+hash算法计算的hash值都传到了httpd,nginx就记录了这个ip和hash值,那么下次同一个ip过来还是会分配到这个httpd的。
如果在集群中的某台服务器出现故障,我们想要从nginx的集群配置中移除掉,我们不可以直接的将那一行删掉,比如server 192.168.40.101:80 weight=2;删掉,如果直接删掉会导致nginx的hash算法重新计算,那么用户的会话或者说缓存都会失效掉,所以这里如果不用这台服务器,直接比较为down即可,也就是 server 192.168.40.101:80 down
这么做就可以了。

动静分离nginx+tomcat

部署tomcat

关闭防火墙和selinux

[root@RS1 ~]# systemctl stop firewalld
[root@RS1 ~]# systemctl disable firewalld
[root@RS1 ~]# cat /etc/sysconfig/selinux 
SELINUX=disabled

安装java

[root@RS1 ~]# dnf -y install java-11-openjdk

解压tomcat到/usr/local/目录下

[root@RS1 ~]# rz -E
rz waiting to receive.
[root@RS1 ~]# ls
公共  视频  文档  音乐  anaconda-ks.cfg               initial-setup-ks.cfg
模板  图片  下载  桌面  apache-tomcat-10.0.23.tar.gz
[root@RS1 ~]# tar xf apache-tomcat-10.0.23.tar.gz -C /usr/local/

自定义一个Hello World的 java的测试网页

[root@RS1 ~]# cd /usr/local/
[root@RS1 local]# ln -s apache-tomcat-10.0.23/  tomcat
[root@RS1 local]# mkdir /usr/local/tomcat/webapps/hehe
[root@RS1 local]# cd /usr/local/tomcat/webapps/
[root@RS1 webapps]# cd hehe/
[root@RS1 hehe]# vim  index.jsp
<html>
<head>
	<title>test page</title>
</head>
<body>
	<%
		out.println("Hello World");
	%>
</body>
</html>

启动tomcat

[root@RS1 tomcat]# cd bin/
[root@RS1 bin]# ls
bootstrap.jar                 configtest.bat  migrate.sh        tomcat-native.tar.gz
catalina.bat                  configtest.sh   setclasspath.bat  tool-wrapper.bat
catalina.sh                   daemon.sh       setclasspath.sh   tool-wrapper.sh
catalina-tasks.xml            digest.bat      shutdown.bat      version.bat
ciphers.bat                   digest.sh       shutdown.sh       version.sh
ciphers.sh                    makebase.bat    startup.bat
commons-daemon.jar            makebase.sh     startup.sh
commons-daemon-native.tar.gz  migrate.bat     tomcat-juli.jar
[root@RS1 bin]# cd ..
[root@RS1 tomcat]# bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.
[root@RS1 tomcat]# 

默认端口为8080
通过ps -ef | grep tomcat 可以查看到有java和tomcat的进程,说明服务已经启动成功

测试访问
访问tomcat首页:http://192.168.40.99:8080
访问hello world测试页:http://192.168.40.99:8080/hehe/

配置nginx,设置动静分离

   upstream niuma {
        server 192.168.40.100:80;
        server 192.168.40.101:80;
    }
    upstream haha {
        server 192.168.40.101:8080;
    }
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
                 proxy_pass http://niuma;
        }
        location /hehe {
                 proxy_pass http://haha;
        }
[root@nginx ~]# nginx  -s reload

测试访问