LVS Nginx Haproxy对比

基本概念:
(1)nginx是什么做什么事情
(2)反向代理
(3)负载均衡
(4)动静分离
2 nginx安装和命令,配置文件
linux系统安装
nginx常用命令
nginx配置文件
3 nginx配置实例
反向代理
4 nginx 配置实例
负载均衡
5 nginx 配置实例
动静分离
6 nginx高可用集群
7nginx原理

Nginx简介
什么是nginx?
是一个高性能的http服务器和反向代理web服务器
占有内存小,并发能力强
5w并发
做什么?
静态文件
反向代理
负载均衡

反向代理:

(1)正向代理:代理客户端发送请求,需要在客户端设置代理服务器,通过代理服务器访问
(2)反向代理:客户端对代理无感知,将请求发送到反向代理服务器,隐藏了真实服务器。

负载均衡:把负载分发到不同的服务器

动静分离:加快解析速度,把动态和静态资源放在不同的服务器。

Nginx安装
远程连接工具连接到192.168.1.106
相关素材安装,
安装pcre: wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz
进入解压之后的目录,执行命令 ./configure
使用make && make install 编译并安装
pcre-config --version 查看版本号

安装其他依赖
yum -y install make zlib zlib-devvel gcc-c++ libtool openssl openssl-devel
安装nginx
解压tar.gz文件tar -zxvf
进入nginx文件,./configure检查
make && make install编译安装
启动服务
cd /usr/local/nginx/sbin
启动脚本./nginx

查看开放的端口号: firewall-cmd --list-all
设置开放的端口号:firewall-cmd --add-service=http -permanent
firewall-cmd --add-port=80/tcp --permanent
重启防火墙:firewall-cmd --reload

Nginx 常用命令

进入nginx目录才能使用命令
cd /usr/local/nginx/sbin

1 查看nginx版本号 ./nginx -v

2 启动nginx ./nginx

3 停止nginx ./nginx -s stop

4 重新加载nginx ./nginx -s reload

Nginx的配置文件nginx.conf
cd /usr/local/nginx/conf/
配置文件中的内容

#user  nobody;
worker_processes  1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - r e m o t e u s e r [ remote_user [ time_local] “KaTeX parse error: Expected 'EOF', got '#' at position 23: …" '</span> #̲ …status b o d y b y t e s s e n t " body_bytes_sent " http_referer” ’
# ‘“ h t t p u s e r a g e n t " " 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;
}

#error_page 404 /404.html;

    # redirect server error pages to the <span class="token keyword">static</span> page <span class="token operator">/</span><span class="token number">50</span>x<span class="token punctuation">.</span>html
    #
    error_page   <span class="token number">500</span> <span class="token number">502</span> <span class="token number">503</span> <span class="token number">504</span>  <span class="token operator">/</span><span class="token number">50</span>x<span class="token punctuation">.</span>html<span class="token punctuation">;</span>
    location <span class="token operator">=</span> <span class="token operator">/</span><span class="token number">50</span>x<span class="token punctuation">.</span>html <span class="token punctuation">{</span>
        root   html<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    # proxy the PHP scripts to Apache listening on <span class="token number">127.0</span><span class="token number">.0</span><span class="token number">.1</span><span class="token operator">:</span><span class="token number">80</span>
    #
    #<span class="token punctuation">}</span>

    # pass the PHP scripts to FastCGI server listening on <span class="token number">127.0</span><span class="token number">.0</span><span class="token number">.1</span><span class="token operator">:</span><span class="token number">9000</span>
    #
    #location <span class="token operator">~</span> \<span class="token punctuation">.</span>php$ <span class="token punctuation">{</span>
    #    root           html<span class="token punctuation">;</span>
    #    fastcgi_pass   <span class="token number">127.0</span><span class="token number">.0</span><span class="token number">.1</span><span class="token operator">:</span><span class="token number">9000</span><span class="token punctuation">;</span>
    #    fastcgi_index  index<span class="token punctuation">.</span>php<span class="token punctuation">;</span>
    #    fastcgi_param  SCRIPT_FILENAME  <span class="token operator">/</span>scripts$fastcgi_script_name<span class="token punctuation">;</span>
    #    include        fastcgi_params<span class="token punctuation">;</span>
    #<span class="token punctuation">}</span>

    # deny access to <span class="token punctuation">.</span>htaccess files<span class="token punctuation">,</span> <span class="token keyword">if</span> Apache's document root
    # concurs with nginx's one
    #
    #location <span class="token operator">~</span> <span class="token operator">/</span>\<span class="token punctuation">.</span>ht <span class="token punctuation">{</span>
    #    deny  all<span class="token punctuation">;</span>
    #<span class="token punctuation">}</span>
<span class="token punctuation">}</span>


#
#server <span class="token punctuation">{</span>
#    listen       <span class="token number">8000</span><span class="token punctuation">;</span>
#    listen       somename<span class="token operator">:</span><span class="token number">8080</span><span class="token punctuation">;</span>
#    server_name  somename  alias  another<span class="token punctuation">.</span>alias<span class="token punctuation">;</span>

#    location <span class="token operator">/</span> <span class="token punctuation">{</span>
#        root   html<span class="token punctuation">;</span>
#        index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
#    <span class="token punctuation">}</span>
#<span class="token punctuation">}</span>


# HTTPS server
#
#server <span class="token punctuation">{</span>
#    listen       <span class="token number">443</span><span class="token punctuation">;</span>
#    server_name  localhost<span class="token punctuation">;</span>

#    ssl                  on<span class="token punctuation">;</span>
#    ssl_certificate      cert<span class="token punctuation">.</span>pem<span class="token punctuation">;</span>
#    ssl_certificate_key  cert<span class="token punctuation">.</span>key<span class="token punctuation">;</span>

#    ssl_session_timeout  <span class="token number">5</span>m<span class="token punctuation">;</span>

#    ssl_protocols  SSLv2 SSLv3 TLSv1<span class="token punctuation">;</span>
#    ssl_ciphers  HIGH<span class="token operator">:</span><span class="token operator">!</span>aNULL<span class="token operator">:</span><span class="token operator">!</span>MD5<span class="token punctuation">;</span>
#    ssl_prefer_server_ciphers   on<span class="token punctuation">;</span>

#    location <span class="token operator">/</span> <span class="token punctuation">{</span>
#        root   html<span class="token punctuation">;</span>
#        index  index<span class="token punctuation">.</span>html index<span class="token punctuation">.</span>htm<span class="token punctuation">;</span>
#    <span class="token punctuation">}</span>
#<span class="token punctuation">}</span>

}

1 全局块
配置服务器运行的配置指令
worker_processes并发数的配置

2 events块
影响Nginx服务器于用户的网络连接
worker_connections 1024;最大连接数1024

3 http 块
http全局块
http全局块配置的指令包括文件引入,MIME-TYPE定义,日志自定义,连接超时时间,但链接请求数上限

serverl块
这块于虚拟主机密切相关,每个http块可以分为多个server块
server块分为全局server块和location块

一个server块可以包含多个location块
这块主要基于http请求的url来进行匹配,对特定的请求进行处理

Nginx配置实例,反向代理
访问www.123.com 直接跳转到127.0.0.1:8080
实现代码:
安装启动tomat
解压tomcat,进入bin目录允许命令 ./startup.sh

打开对外开放端口8080
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all

在这里插入图片描述

在windows中配置hosts文件www.123.com转发到nginx,nginx转发到tomcat
第一步:host文件配置域名和ip对应
C:\Windows\System32\drivers\etc\hosts
加入 192.168.1.107 www.123.com

第二步:反向代理配置,找到nginx配置文件
  /usr/local/nginx/conf

vim nginx.conf

    server {
	 listen       80;
    server_name  192.168.1.107;
    #charset koi8-r;
    #access_log  logs/host.access.log  main;

    location / {
        root   html;
       proxy_pass http://192.168.1.107:8080;
        index  index.html index.htm;
    }

需要重新启动nginx,./nginx -s reload
在这里插入图片描述
反向代理实例二
使用nginx反向代理,根据访问路径跳转到不同的服务中,nginx监听端口为9001

访问192.168.1.107:9001/edu/ 直接跳转127.0.0.1:8080
访问192.168.1.107:9001/vod/ 直接跳转127.0.0.1:8081

准备两个tomcat,一个8080端口,一个8081端口
启动两个tomcat
修改一个tomcat端口号
创建文件夹和测试页面
8080文件下在webapps下面创建edu文件夹,创建a.html页面
8081文件下webapps下面创建vod文件夹,创建a.html

配置nginx

server{
	listen   9091;
	server_name 192.168.1.107;
	location ~ /edu/ {
		proxy_pass http://127.0.0.1:8080;
	}
	location ~ /vod/{
		proxy_pass http://127.0.0.1:8081;
	}
}

  
  

重新启动nginx
在这里插入图片描述
在这里插入图片描述
location配置说明:
1.= 用于b不含正则表达式的uri前,严格匹配
2. ~ 用于表示uri的正则表达式,并且区分大小写
3. ~* 用于表示uri的正则表达式,不区分大小写
4. ^~ 用于不包含正则的uri

负载均衡配置
通过浏览器输入http://192.168.1.107/edu/a.html平均分配到不同的tomcat中

在这里插入图片描述
在这里插入图片描述
负载均衡策略
1轮询 默认
2 weight 权重,按权重比例轮询
3 ip_hash 每个请求访问ip的hash结果分配,这样访客固定访问一个后端服务器。可以解决session问题。
在这里插入图片描述
4 fail 按后端的响应时间来分配请求,响应时间最短先分配
在这里插入图片描述
Nginx实例,动静分离

使用nginx处理静态页面,使用tomcat处理动态页面
静态资源部署到单独的服务器

nginx进行配置
在这里插入图片描述

Nginx高可用集群

在这里插入图片描述
准备两台服务器192.168.1.107和192.168.1.108都安装nginx,安装keepalived
使用yum安装keepalived
yum install keepalived -y
查看keppalived是否安装成功rpm -qa |grep keepalived
cd /etc/keepalived里面有一个配置文件keepalived.conf
完成高可用配置(主从配置)
更改keepalived.conf文件

! Configuration File for keepalived     #全局定义

global_defs {
notification_email { #指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱
ops@wangshibo.cn #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
tech@wangshibo.cn
}

notification_email_from ops@wangshibo.cn #keepalived在发生诸如切换操作时需要发送email通知地址
smtp_server 127.0.0.1 #指定发送email的smtp服务器
smtp_connect_timeout 30 #设置连接smtp server的超时时间
router_id master-node #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
}

vrrp_script chk_http_port { #检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等
script “/opt/chk_nginx.sh” #这里通过脚本监测
interval 2 #脚本执行间隔,每2s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 { #keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管
state MASTER #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER
interface em1 #指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
mcast_src_ip 103.110.98.14 # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在哪个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
virtual_router_id 51 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
priority 101 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
advert_int 1 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
authentication { #设置验证类型和密码。主从必须一样
auth_type PASS #设置vrrp验证类型,主要有PASS和AH两种
auth_pass 1111 #设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
}
virtual_ipaddress { #VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
192.168.17.20
}

track_script { #执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
chk_http_port #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
}
}

在/usr/local/src下建立脚本nginx_check.sh

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

  
  

启动两台服务器的nginx和keepalived
启动keepalived systemctl start keepalived.service
查看是否启动 ps -ef | grep keepalived

使用虚拟主机ip访问192.168.17.20

停掉主服务的nginx和keepalived
停止keepalived服务systemctl stop keepalived.service
停止nginx:./nginx -s stop

在访问192.168.17.20还可以正常访问,证明切换到从服务器

猜你喜欢

转载自blog.csdn.net/weixin_45537987/article/details/106803876