当前位置:首页 > 技术文章 > 正文内容

Nginx一撸到底:从安装到负载均衡、双机主备、集群高可用!

arlanguage3个月前 (01-20)技术文章35

1 Nginx搭建

服务器相关搭建就省略了,直接上ng。

?服务器创建Nginx目录并进入:

[root@localhost]# mkdir /soft && mkdir /soft/nginx/  
[root@localhost]# cd /soft/nginx/  

?下载Nginx安装包

可以服务器远程工具上传已经下载好的压缩包,也用wget命令服务器在线下载压缩包:

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

wget命令的可通过yum命令安装:

不支持wget命令的,需要用yum命令安装wget支持:

[root@localhost]# yum -y install wget  

?命令解压Nginx压缩包:

[root@localhost]# tar -xvzf nginx-1.21.6.tar.gz  

?下载并安装Nginx所需的依赖库和包:

[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ gcc-c++  
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ pcre pcre-devel4  
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ zlib zlib-devel  
[root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ openssl openssl-devel 

也可yum命令一键安装:

[root@localhost]# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel  

然后用rpm命令依次构建每个依赖包;或用以下下指令一键安装全部依赖包:

[root@localhost]# rpm -ivh --nodeps *.rpm  

?cd到nginx目录,执行Nginx配置脚本,提前配置好环境便于后面安装,默认位于/usr/local/nginx/目录:

[root@localhost]# cd nginx-1.21.6  
[root@localhost]# ./configure --prefix=/soft/nginx/  

?执行命令编译并安装Nginx

[root@localhost]# make && make install  

?回到/soft/nginx/目录,用ls可看到安装nginx后生成的文件。

?修改安装后conf目录下的nginx.conf

[root@localhost]# vi conf/nginx.conf  
修改端口号:listen    80;  
修改IP地址:server_name  你当前机器的本地IP(线上配置域名);  

?制定Nginx配置文件并启动:

[root@localhost]# sbin/nginx -c conf/nginx.conf  
[root@localhost]# ps aux | grep nginx  

Nginx其他操作命令:

sbin/nginx -t -c conf/nginx.conf # 检测配置文件是否正常  
sbin/nginx -s reload -c conf/nginx.conf # 修改配置后平滑重启  
sbin/nginx -s quit # 优雅关闭Nginx,会在执行完当前的任务后再退出  
sbin/nginx -s stop # 强制终止Nginx,不管当前是否有任务在执行  

?放开80端口,刷新服务器防火墙:

[root@localhost]# firewall-cmd --zone=public --add-port=80/tcp --permanent  
[root@localhost]# firewall-cmd --reload  
[root@localhost]# firewall-cmd --zone=public --list-ports  

?浏览器输入Nginx配的IP或域名访问:

如果你看到了Nginx欢迎界面,那么恭喜你安装成功。


2 配置HTTPS SSL证书

安装SSL支持

cd到nginx的解压目录:/home/software/nginx-*。

原来的不动,新增ssl模块。

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi  \
--with-http_ssl_module

编译和安装。

make
make install

配置HTTPS SSL证书支持

把ssl证书 *.crt 及 私钥 *.key 复制到/usr/local/nginx/conf目录中。

修改server 配置,新增监听 443 端口:

server {
    listen       443;
    server_name  www.imoocdsp.com;
    # 开启ssl
    ssl     on;
    # 配置ssl证书
    ssl_certificate      1_www.imoocdsp.com_bundle.crt;
    # 配置证书秘钥
    ssl_certificate_key  2_www.imoocdsp.com.key;
    # ssl会话cache
    ssl_session_cache    shared:SSL:1m;
    # ssl会话超时时间
    ssl_session_timeout  5m;
    # 配置加密套件,写法遵循 openssl 标准
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    
    location / {
        proxy_pass http://tomcats/;
        index  index.html index.htm;
    }
}


3 upstream命令配置参数

slow_start:单位秒,权重在指定时间内从1上升到指定值,不适用于hash负载均衡、随机负载均衡; 如果在 upstream 中只有一台 server,则该参数失效
max_conns:限制最大同时连接数 1.11.5之前只能用于商业版
down:禁止访问
max_fails:表示失败几次,则标记server已宕机,剔除上游服务 默认值1
fail_timeout:表示失败的重试时间 默认值10
backup:备用机 只有在其他服务器无法访问的时候才能访问到 不适用于hash负载均衡、随机负载均衡

keepalived:保持连接数

upstream [proxyName] {
  server 192.168.110.110:8080 weight=1;
  server 192.168.110.111:8080 weight=10;

 	keepalive 50; #保持的连接数
}

server {
 listem 80;
 server_name www.tomcats.com;

 location / {
 proxy_pass http://tomcats;
 proxy_http_version 1.1; #连接的协议版本
 proxy_set_header Connection ""; 清空连接请求头
 }
}

浏览器缓存控制

server {
 listem 80;
 server_name www.tomcats.com;

 location / {
 proxy_pass http://tomcats;
 expires 10s; #浏览器缓存10秒钟
 #expires @22h30m #在晚上10点30的时候过期
 #expires -1h #缓存在一小时前时效
 #expires epoch #不设置缓存
 #expires off #缓存关闭,浏览器自己控制缓存
 #expires max #最大过期时间
 }
}

反向代理缓存

upstream [proxyName] {
 server 192.168.1.173:8080 weight=1;
 server 192.168.1.174:8080 weight=5;
 server 192.168.1.175:8080 weight=2;
}

#proxy_cache_path 设置缓存保存的目录的位置
#keys_zone设置共享内以及占用的空间大小
#mas_size 设置缓存最大空间
#inactive 缓存过期时间,错过此时间自动清理
#use_temp_path 关闭零时目录
proxy_cache_path /usr/local/nginx/upsteam_cache keys_zone=mycache:5m max_size=1g inactive=8h use_temp_path=off;

server {
 listem 80;
 server_name www.tomcats.com;
 #开启并使用缓存
 proxy_cache mycache;
 #针对200和304响应码的缓存过期时间
 proxy_cache_valid 200 304 8h; 

 location / {
 proxy_pass http://tomcats;
 }
}


4 配置反向代理

upstream配置

upstream [proxyName] {
    server 192.168.110.108:8080;
    server 192.168.110.110:8080;
}

server配置

server {
    listem  80;
    server_name www.baidu.com;

    location / {
        proxy_pass http://baidu;
    }
}


5 配置负载均衡

nginx默认的负载均衡是轮训。

加权轮询负载均衡

upstream [proxyName] {
    server 192.168.110.110:8080 weight=1;
    server 192.168.110.111:8080 weight=10; 
}

权重越高,轮询的几率越大。

hash负载均衡

upstream [proxyName] {
    ip_hash

    server 192.168.110.110:8080;
    server 192.168.110.111:8080; 
}

hash算法实际上只会计算 192.168.110这段做哈希

url hash负载均衡

upstream [proxyName] {
    hash $request_url;

    server 192.168.110.110:8080;
    server 192.168.110.111:8080; 
}

最小连接负载均衡

upstream [proxyName] {
    least_conn;
  
    server 192.168.110.110:8080;
    server 192.168.110.111:8080; 
}


6 HA NGINX(双机热备)

keepalived安装

下载。

https://www.keepalived.org/download.html

解压。

tar -zxvf keepalived-2.0.18.tar.gz

用configure命令配置安装目录与核心配置文件所在位置。

./configure --prefix=/usr/local/keepalived --sysconf=/etc
prefix:keepalived安装的位置sysconf:keepalived核心配置文件所在位置,固定位置,改成其他位置则keepalived启动不了,/var/log/messages中会报错

sysconf:keepalived核心配置文件所在位置,固定位置,改成其他位置则keepalived启动不了,/var/log/messages中会报错

配置中可能会出现警告信息,如下:

*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

# 安装libnl/libnl-3依赖
yum -y install libnl libnl-devel  

keepalived编译安装。

make && make install

配置文件位置: /etc/keepalived/keepalived.conf

也可以以用一下命令查看配置文件位置。

whereis keepalived

进入sbin目录,启动keepalived。

./keepalived

keepalived配置nginx自动重启

/etc/keepalived/下创建脚本check_nginx_alive_or_not

#!/bin/bash 

A=`ps -C nginx --no-header |wc -l` 
# 判断nginx是否宕机,如果宕机了,尝试重启 
if [ $A -eq 0 ];then 
    /usr/local/nginx/sbin/nginx 
    # 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机 
    sleep 3 
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 
            killall keepalived 
        fi 
fi

赋予运行权限

chmod +x /etc/keepalived/check_nginx_alive_or_not.sh

配置keepalived监听nginx脚本

vrrp_script check_nginx_alive { 
    script "/etc/keepalived/check_nginx_alive_or_not.sh" 
    interval 2 # 每隔两秒运行上一行脚本 
    weight 10 # 如果脚本运行失败,则升级权重+10 
}

在vrrp_instance中新增监控的脚本

track_script { 
    check_nginx_alive # 追踪 nginx 脚本
}

重启Keepalived使得配置文件生效

systemctl restart keepalived

keepalived 主机配置

vim keepalived.conf 编辑keepalived配置文件

global_defs { 
    # 路由id:当前安装keepalived的节点主机标识符,保证全局唯一 
    router_id keep_171 
} 

vrrp_instance VI_1 { 
    # 表示状态是MASTER主机还是备用机BACKUP 
    state MASTER 
    # 该实例绑定的网卡 
    interface ens33 
    # 保证主备节点一致即可 
    virtual_router_id 51 
    # 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选 
    priority 100 
    # 主备之间同步检查时间间隔,单位秒 
    advert_int 2 
    # 认证权限密码,防止非法节点进入 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    # 虚拟出来的ip,可以有多个(vip) 
    virtual_ipaddress { 
        192.168.1.161 
    }
}

查看网卡信息命令

ip addr

重启keepalived

查看进程

ps -ef|grep keepalived

查看vip(虚拟ip):网卡ens33下,多了一个192.168.110.110,这个就是虚拟ip

把keepalived注册为系统服务

拷贝配置文件

将keepalived目录下etc/init.d/keepalived拷贝到/etc/init.d/下
将keepalived目录下etc/sysconfig/keepalived拷贝到/etc/sysconfig/下

刷新systemctl

systemctl daemon-reload

启动、停止、重启keepalived命令

#启动
systemctl start keepalived.service
#停止
systemctl stop keepalived.service
#重启
systemctl restart keepalived.service

实现双机主备高可用

双机主备就是配置两台nginx,互相为主备,当主机宕机了,自动启用备机。

修改备机配置

global_defs { 
    router_id keep_172 
} 
vrrp_instance VI_1 { 
    # 备用机设置为BACKUP 
    state BACKUP 
    interface ens33 
    virtual_router_id 51 
    # 权重低于MASTER 
    priority 80 
    advert_int 2 
    authentication { 
        auth_type PASS auth_pass 1111 
    }
    virtual_ipaddress {
        # 注意:主备两台的vip都是一样的,绑定到同一个vip 
        192.168.110.110 
    } 
}

启动 Keepalived。

访问vip即可访问主机,当主机失效时访问vip就会访问到备机。

keepalived双主热备

配置DNS轮询,在同一个域名下配置两个ip。

第一台主机配置如下

global_defs {
    router_id keep_171 
} 
vrrp_instance VI_1 { 
    state MASTER i
    nterface ens33 
    virtual_router_id 51 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.110.110 
    } 
} 

vrrp_instance VI_2  {
    state BACKUP 
    interface ens33 
    virtual_router_id 52 
    priority 80 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.110.111 
    }
}

第二台主机配置如下

global_defs {
    router_id keep_172 
} 
vrrp_instance VI_1 { 
    state BACKUP 
    interface ens33 
    virtual_router_id 51 
    priority 80 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.110.110
    }
} 

vrrp_instance VI_2 {
    state MASTER 
    interface ens33 
    virtual_router_id 52 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.110.111 
    }
}

重启两台Keepalived

systemctl restart keepalived

4 LVS实现Nginx高可用负载均衡

LVS是Linux Virtual Server简称。

LVS+Nginx的好处

1、Nginx接收请求来回,LVS可以只接受不响应
2、lvs基于四层负载均衡,工作效率较Nginx的七层负载更高,使用LVS搭建Nginx集群,可以提高性能
3、四层负载均衡无法对信息处理,只能通过ip+端口的形式转发,所以需要七成负载进行数据的处理

LVS的三种模式

LVS-DR模式搭建

1、先关闭掉服务器上网络配置管理器,避免网络接口冲突

systemctl stop NetworkManager
systemctl disable NetworkManager

2、创建子接口(创建LVS的虚拟ip)

进入网卡配置目录/etc/sysconfig/network-scripts/,找到网卡配置文件,这里以ifcfg-ens33为例,拷贝并创建子接口

cp ifcfg-ens33 ifcfg-ens33:1

修改子接口配置如下

3、安装ipvsadm

centos已集成LVS,安装ipvsadm即可

ipvsadm是管理集群的工具,通过ipvs可以管理集群,查看集群等操作
yum install ipvsadm

4、配置服务器(RS)的虚拟ip

进入网卡配置目录/etc/sysconfig/network-scripts/,找到ifcfg-lo,拷贝并创建子接口

cp ifcfg-lo ifcfg-lo:1

修改子接口配置如下

DEVICE="lo:1"
IPADDR=192.168.110.110
NETMASK=255.255.255.255
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT="yes"
NAME=loopback

重启网络服务成功后,ip addr 查看一下,你会发现多了一个ip,也就是虚拟ip(vip)

5、为服务器(RS)配置arp

ARP响应级别与通告行为参数说明

arp-ignore:ARP响应级别(处理请求)
    0:只要本机配置了ip,就能响应请求
    1:请求的目标地址到达对应的网络接口,才会响应请求
arp-announce:ARP通告行为(返回响应)
    0:本机上任何网络接口都向外通告,所有的网卡都能接受到通告
    1:尽可能避免本网卡与不匹配的目标进行通告2:只在本网卡通告

打开sysctl.conf:

vim /etc/sysctl.con

配置所有网卡、默认网卡以及虚拟网卡的arp响应级别和通告行为,分别对应:all,default,lo

# configration for lvs 
net.ipv4.conf.all.arp_ignore = 1 
net.ipv4.conf.default.arp_ignore = 1 
net.ipv4.conf.lo.arp_ignore = 1 

net.ipv4.conf.all.arp_announce = 2 
net.ipv4.conf.default.arp_announce = 2 
net.ipv4.conf.lo.arp_announce = 2

刷新配置文件

sysctl -p

增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理

route add -host 192.168.110.110 dev lo:1

将网关添加至开机启动

echo "route add -host 192.168.110.110 dev lo:1" >> /etc/rc.local

6、使用ipvsadm配置集群规则

创建LVS节点,用户访问的集群调度者

ipvsadm -A -t 192.168.110.110:80 -s rr -p 5
-A:添加集群
-t:tcp协议ip地址:设定集群的访问
ip:也就是LVS的虚拟ip
-s:设置负载均衡的算法,
rr:表示轮询
-p:设置连接持久化的时间,在指定时间内同一个用户的请求会访问到同一个服务器中

创建多台RS真实服务器

ipvsadm -a -t 192.168.110.110:80 -r 192.168.110.111:80 -g 
ipvsadm -a -t 192.168.110.110:80 -r 192.168.110.111:80 -g
-a:添加真实服务器
-t:tcp协议
-r:真实服务器的ip地址
-g:设定DR模式

保存到规则库,否则重启失效

ipvsadm -S

检查集群

#查看集群列表
ipvsadm -Ln
#查看集群状态
ipvsadm -Ln --stats

一些其他命令

 # 重启ipvsadm,重启后需要重新配置 
 service ipvsadm restart 
 # 查看持久化连接 
 ipvsadm -Ln --persistent-conn 
 # 查看连接请求过期时间以及请求源ip和目标ip 
 ipvsadm -Lnc 
 # 设置tcp tcpfin udp 的过期时间(一般保持默认) 
 ipvsadm --set 1 1 1 
 # 查看过期时间 
 ipvsadm -Ln --timeout

7、访问虚拟ip,完成LVS搭建

LVS的负载均衡算法


4 Keepalived+Lvs+Nginx实现高可用集群负载均衡搭建

服务器配置了LVS+Nginx,要清空ipvsadm配置

ipvsadm -C

服务器配置了Keepalived+Nginx双主集群,要除掉Keepalived中原先的配置。

keepalived配置Master LVS

修改keepalived的配置

global_defs {
    router_id keep_151 
} 
vrrp_instance VI_1 { 
    state MASTER 
    interface ens33 
    virtual_router_id 41 
    priority 100 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.110.110
    }
} 

#配置集群访问的ip+端口,端口和nginx保持一致
virtual_server 192.168.110.110 80{
    #健康检查的时间,单位:秒
    delay_loop 6
    #配置负载均衡的算法,默认的轮询
    lb_algo rr
    #设置LVS的模式 NAT|TUN|DR
    lb-kind DR
    #设置会话持久化的时间
    persistence_timeout 5
    #协议
    protocol TCP
    
    #配置负载均衡的真实服务器,也就是nginx节点的具体的ip地址
    real_server 192.168.110.111 80{
        #轮询权重配比
        weight 1
        #设置健康检查
        TCP_CHECK {
            #检查80端口
            connect_port 80
            #超时时间
            connect_timeout 2
            #重试次数
            nb_get_retry 2
            #重试间隔时间
            delay_before_retry 3
        }
    }
    real_server 192.168.110.111 80{
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 3
        }
    }
}

启动/重启keepalived

systemctl restart keepalived

keepalived配置Backup LVS

在备用机上如下配置

global_defs {
    router_id keep_152 
} 
vrrp_instance VI_1 { 
    state  BACKUP
    interface ens33 
    virtual_router_id 41 
    priority 50 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass 1111 
    } 
    virtual_ipaddress { 
        192.168.110.110
    }
} 

#配置集群访问的ip+端口,端口和nginx保持一致
virtual_server 192.168.110.110 80{
    #健康检查的时间,单位:秒
    delay_loop 6
    #配置负载均衡的算法,默认的轮询
    lb_algo rr
    #设置LVS的模式 NAT|TUN|DR
    lb-kind DR
    #设置会话持久化的时间
    persistence_timeout 5
    #协议
    protocol TCP
    
    #配置负载均衡的真实服务器,也就是nginx节点的具体的ip地址
    real_server 192.168.110.111 80{
        #轮询权重配比
        weight 1
        #设置健康检查
        TCP_CHECK {
            #检查80端口
            connect_port 80
            #超时时间
            connect_timeout 2
            #重试次数
            nb_get_retry 2
            #重试间隔时间
            delay_before_retry 3
        }
    }
    real_server 192.168.110.111 80{
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 2
            nb_get_retry 2
            delay_before_retry 3
        }
    }
}

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/988.html

标签: nginx 多php
分享给朋友:

“Nginx一撸到底:从安装到负载均衡、双机主备、集群高可用!” 的相关文章

Nginx日志切割方法(包含docker容器中nginx日志的切割)

logrotate软件简介logrotate 是一个 Bash 的 SHELL 脚本,可对日志文件进行切分,并将切分后的日志放在统一目录。logrotate 要求 GNU bash、GNU gzip 和 GNU date。logrotate 实用程序旨在简化在生成大量日志文件的系统上对日志文件的管理...

只想简单操作 Kubernetes 资源?用 Go 一招搞定,快试试 kom!

当你在使用代码操作k8s时,有没有觉得总要写很多代码,才能获取到一个资源,并且要处理底层的集群连接、client等一系列的东西。那么有没有一种简单的办法,毕竟我只是想读取一下集群内的Pod或者什么其他资源而已啊。为了解决这个问题,我们使用 kom https://github.com/weibaoh...

windows下的nginx安装和使用

.1 去官网下载相应的安装包:http://nginx.org/en/download.html1.2 解压后进入PowerShell(按住“shift”+“鼠标右键”)窗口,进入到nginx目录,输入start nginx.exe 进行nginx的安装安装成功后,在“任务管理器”中会显示“ngin...

技巧:PHP版本怎样隐藏在Linux服务器

通常情况下,大多数安装web服务器软件的默认设置存在信息泄露,这些软件其中之一就是PHP。PHP是如今最流行的服务端html嵌入式语言之一。而在如今这个充满挑战的时代,有许多黑客会尝试发现你服务端的漏洞。因此,ehowstuff网站一篇简单描述如何在Linux服务器中隐藏PHP信息值得关注。(图片来...

docker安装php

本节将介绍在线使用Docker安装PHP解析器的步骤。通过本节的实操,您可以掌握从Docker环境的使用,PHP镜像以及Nginx服务器的拉取、导入、容器的启动的全部过程,从而具备使用Docker安装并部署PHP与ngninx的能力。本节要求您具备的基本能力有Linux,Docker,以及nginx...

网站加载慢?让你的网站腾飞起来,LiteSpeed部署

说起LiteSpeed 还得说起我的小站,<开心洋葱网>,虽然流量不大,但是访问是真的慢,无奈经费有限,那就只能在服务器加速上动起心思来。之前一直听说 QUIC 访问网站的速度会让你感觉飞起来,那就搞下吧。我们先来看下 QUIC 、LiteSpeed都是些做什么的?QUIC(Quick...