Maison > Opération et maintenance > Nginx > le corps du texte

NGINX atteint la haute disponibilité sous Linux

angryTom
Libérer: 2019-11-25 16:01:53
original
3460 Les gens l'ont consulté

NGINX atteint la haute disponibilité sous Linux

1. Installez NGINX sous Linux

Sous Centos, la source yum ne fournit pas l'installation de nginx, vous pouvez changez-le Obtenez et installez en utilisant la méthode yum source. Vous pouvez également télécharger directement le package d'installation. Les commandes suivantes nécessitent les autorisations root pour s'exécuter : installez d'abord les bibliothèques nécessaires (le module gzip dans nginx nécessite la bibliothèque zlib, le module de réécriture nécessite la bibliothèque pcre et la fonction ssl nécessite la bibliothèque openssl. ). Sélectionnez /usr/local comme répertoire d'installation et les numéros de version spécifiques suivants changeront en fonction des conditions réelles.

1.1. Installer la bibliothèque PCRE

$ cd /usr/local/
$ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz
$ tar -zxvf pcre-8.36.tar.gz
$ cd pcre-8.36
$ ./configure
$ make
$ make install
Copier après la connexion

./configure error (apprentissage recommandé : tutoriel nginx )

configure: error: You need a C++ compile
r for C++ support.
Copier après la connexion

Solution : yum install -y gccgcc-c++

1.2 Installer la bibliothèque zlib

$ cd /usr/local/ 
$ wget http://zlib.net/zlib-1.2.8.tar.gz
$ tar -zxvf zlib-1.2.8.tar.gz
$ cd zlib-1.2.8
$ ./configure
$ make
$ make install
Copier après la connexion

1.3, installez SSL

$ cd /usr/local/
$ wget http://www.openssl.org/source/openssl-1.0.1j.tar.gz
$ tar -zxvf openssl-1.0.1j.tar.gz
$ ./config
$ make
$ make install
Copier après la connexion

1.3, installez NGINX

$ cd /usr/local/
$ wget http://nginx.org/download/nginx-1.8.0.tar.gz
$ tar -zxvf nginx-1.8.0.tar.gz
$ cd nginx-1.8.0  
$ ./configure --prefix=/usr/local/nginx
$ make
$ make install
Copier après la connexion

Erreurs courantes lors de l'installation :

L'invite de démarrage de Nginx ne trouve pas la solution libpcre.so.1

S'il s'agit d'un système 32 bits

[root@lee ~]#  ln -s /usr/local/lib/libpcre.so.1 /lib
Copier après la connexion

S'il s'agit d'un système 64 bits

[root@lee ~]#  ln -s /usr/local/lib/libpcre.so.1 /lib64
Copier après la connexion

Ensuite, démarrez nginx C'est OK

[root@lee ~]# /usr/local/webserver/nginx/sbin/nginx
Copier après la connexion

1.4. Démarrez NGINX

$ /usr/local/nginx/sbin/nginx
Copier après la connexion

Ouvrez le navigateur pour accéder à l'IP de cette machine Si le navigateur affiche Bienvenue sur nginx !, cela signifie que Nginx a été installé et exécuté avec succès.

2. Commandes communes de NGINX

重启:
$ /usr/local/nginx/sbin/nginx 启动命令
重启:
$ /usr/local/nginx/sbin/nginx –s reload
停止:
$ /usr/local/nginx/sbin/nginx –s stop
测试配置文件是否正常:
$ /usr/local/nginx/sbin/nginx –t 
强制关闭:
$ pkillnginx
Copier après la connexion

3. Démarrez Nginx + Keepalived

3.1. Keepalived

Keepalived est un logiciel gratuit et open source écrit en C similaire au mécanisme de commutation des couches 3, 4 et 7. Il a ce que nous appelons habituellement les fonctions de commutateurs de couche 3, de couche 4 et de couche 7. Il fournit principalement des fonctions de loadbalancing (équilibrage de charge) et de haute disponibilité (haute disponibilité). La mise en œuvre de l'équilibrage de charge nécessite le module de noyau de service virtuel (ipvs) de Linux, et la haute disponibilité. se fait via VRRP. Le protocole implémente des services de basculement entre plusieurs machines.

 

L'image ci-dessus est l'architecture fonctionnelle de Keepalived, qui est grossièrement divisée en deux couches : l'espace utilisateur et l'espace noyau.

Espace noyau : comprend principalement deux parties : IPVS (serveur virtuel IP, utilisé pour réaliser l'équilibrage de charge des services réseau) et NETLINK (fournissant un routage avancé et d'autres fonctions réseau associées).

Espace utilisateur  :

  • WatchDog : vérificateurs de surveillance de la charge et état du processus VRRP
  • Pile VRRP : charge entre les équilibreurs de charge FailOver, VRRP n'est pas nécessaire si un seul égaliseur de charge est utilisé.
  • Vérificateurs : responsables de la vérification de l'état du serveur réel, qui est la fonction principale de keepalived. En d’autres termes, il ne peut y avoir de VRRP Stack, mais un contrôle de santé est indispensable.
  • Wrapper IPVS : l'utilisateur envoie les règles définies au code ipvs du noyau.
  • Netlink Reflector : utilisé pour définir l'adresse VIP de vrrp, etc.

Toutes les fonctions de Keepalived sont implémentées en configurant le fichier keepalived.conf.

3.2. Installer Keepalived

Télécharger l'adresse keepalived : http://www.keepalived.org/download.html

Décompresser et installer :

tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
yum install -yopensslopenssl-devel(需要安装一个软件包)
cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
make&& make install
Copier après la connexion

3.3. Installer Keepalived en tant que service système Linux

将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作:
首先创建文件夹,将keepalived配置文件进行复制:
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived/
然后复制keepalived脚本文件:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
可以设置开机启动:chkconfigkeepalived on,到此我们安装完毕!
Copier après la connexion

3.4 Commandes Keepalived communes

servicekeepalived start
servicekeepalived stop
Copier après la connexion

4. . Configuration Keepalived

4.1. Configurer les redémarrages automatiques actifs et de sauvegarde de NGINX

1. Modifier le fichier de configuration : vim /etc/ keepalived/keepalived.conf

1) Modifier la configuration NGINX principale

<span style="color: #000000;">! Configuration File for keepalived
global_defs {
    router_id bhz005 ##标识节点的字符串,通常为hostname
}
## keepalived会定时执行脚本并且对脚本的执行结果进行分析,动态调整vrrp_instance的优先级。这里的权重weight 是与下面的优先级priority有关,如果执行了一次检查脚本成功,则权重会-20,也就是由100 - 20 <br/>变成了80,Master 的优先级为80 就低于了Backup的优先级90,那么会进行自动的主备切换。
如果脚本执行结果为0并且weight配置的值大于0,则优先级会相应增加。
如果脚本执行结果不为0 并且weight配置的值小于0,则优先级会相应减少。
vrrp_scriptchk_nginx {
    script "/etc/keepalived/nginx_check.sh" ##执行脚本位置
    interval 2 ##检测时间间隔
    weight -20 ## 如果条件成立则权重减20(-20)
}
## 定义虚拟路由 VI_1为自定义标识。
vrrp_instance VI_1 {
state MASTER   ## 主节点为MASTER,备份节点为BACKUP
## 绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同(我这里是eth6)
interface eth6  
virtual_router_id 172  ## 虚拟路由ID号
mcast_src_ip 192.168.1.172  ## 本机ip地址
priority 100  ##优先级配置(0-254的值)
Nopreempt  ## 
advert_int 1 ## 组播信息发送间隔,俩个节点必须配置一致,默认1s
authentication {  
auth_type PASS
auth_passbhz ## 真实生产环境下对密码进行匹配
    }

track_script {
chk_nginx
    }

virtual_ipaddress {
        192.168.1.170 ## 虚拟ip(vip),可以指定多个
    }
}</span>
Copier après la connexion

2) Modifier la configuration NGINX de sauvegarde

! Configuration File for keepalived

global_defs {
router_id bhz006
}

vrrp_scriptchk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}

vrrp_instance VI_1 {
state BACKUP
interface eth7
virtual_router_id 173
mcast_src_ip 192.168.1.173
priority 90 ##优先级配置
advert_int 1
authentication {
auth_type PASS
auth_passbhz
    }

track_script {
chk_nginx
    }

virtual_ipaddress {
        192.168.1.170
    }
}
Copier après la connexion

3) Script 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
killallkeepalived
fi
fi
Copier après la connexion

4) Copiez ensuite le fichier de configuration keepalived du maître dans le dossier /etc/keepalived/ de la machine maître (172), puis copiez le fichier de configuration keepalived de la sauvegarde dans le /etc/keepalived/ de la machine de sauvegarde (173) ., et enfin copiez le script nginx_check.sh dans le dossier /etc/keepalived/ des deux machines.

5) Autorisation du script nginx_check.sh. Accordez les autorisations exécutables : chmod +x /etc/keepalived/nginx_check.sh

6) Après avoir démarré nginx sur 2 machines. On commence à keepalived sur les deux machines

/usr/local/nginx/sbin/nginx
servicekeepalived start
ps -ef | grepnginx
ps -ef | grepkeepalived
Copier après la connexion

7) Jetez un oeil aux adresses IP des deux machines Une IP virtuelle apparaîtra sous la commande a. Testez sans fermer Keepalived, tuez NGINX, puis observez s'il redémarre. Désactivez Keepalived, tuez NGINX, puis vérifiez s'il redémarre.

5. Solution de partage de session en situation de cluster

5.1. Quelles sont les causes de la session en situation de cluster ?

En raison du stockage de session sur le Côté serveur, les utilisateurs du cluster peuvent accéder à différents serveurs, les sessions ne peuvent donc pas être partagées.

5.2, Solution de partage de session

1)NGINX做的负载均衡可以绑定ip_hash,从而使同一个IP访问同一个服务器 ------------------该方案使得集群失去意义。

2)利用数据库同步session----------------------太过复杂

3)利用cookie同步session(保存一个session到本地,再次访问将其带到服务器端)----------------------安全性差、http请求都需要带参数增加了带宽消耗

4)使用session集群,存放到redis中(spring-session)

5.3、spring-session项目,解决session共享问题

<!--spring boot 与redis应用基本环境配置 -->
<dependency> 
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
    </dependency>
    <!--spring session 与redis应用基本环境配置,需要开启redis后才可以使用,不然启动Spring boot会报错 -->
    <dependency>  
    <groupId>org.springframework.session</groupId>  
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
Copier après la connexion

创建SessionConfig

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
//这个类用配置redis服务器的连接
//maxInactiveIntervalInSeconds为SpringSession的过期时间(单位:秒)
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
Public class SessionConfig {    
// 冒号后的值为没有配置文件时,制动装载的默认值
    @Value("${redis.hostname:localhost}")
    String HostName;
    @Value("${redis.port:6379}")    int Port;
    @Bean
    Public JedisConnectionFactory connectionFactory() {
        JedisConnectionFactory connection = new JedisConnectionFactory();
        connection.setPort(Port);
        connection.setHostName(HostName);        return connection;
    }
}
Copier après la connexion

初始化Session

//初始化Session配置Public class SessionInitializer extends AbstractHttpSessionApplicationInitializer{
  Public SessionInitializer() {
    super(SessionConfig.class);
    }
}
Copier après la connexion

控制层代码

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestControllerpublic class SessionController {

    @Value("${server.port}")    
    private String PORT;

    @RequestMapping("/index")    
    public String index() {        
        return "index:" + PORT;
    }    
    /**
     * @methodDesc: 功能描述:(往session存放值)     
     */
    @RequestMapping("/setSession")    
    public String setSession(HttpServletRequest request, String sessionKey, String sessionValue) {
        HttpSession session = request.getSession(true);
        session.setAttribute(sessionKey, sessionValue);        
        return "success,port:" + PORT;
    }    
    /**
     * @methodDesc: 功能描述:(从Session获取值)     
     */
    @RequestMapping("/getSession")    
    public String getSession(HttpServletRequest request, String sessionKey) {
        HttpSession session =null;        
        try {
         session = request.getSession(false);
        } catch (Exception e) {
        e.printStackTrace();
        }
        String value=null;        
        if(session!=null){
            value = (String) session.getAttribute(sessionKey);
        }        
        return "sessionValue:" + value + ",port:" + PORT;
    }

}
Copier après la connexion

 六、高并发解决方案

   业务数据库  -》 数据水平分割(分区分表分库)、读写分离

  业务应用 -》 逻辑代码优化(算法优化)、公共数据缓存

  应用服务器 -》 反向静态代理、配置优化、负载均衡(apache分发,多tomcat实例)

  系统环境 -》 JVM调优

  页面优化 -》 减少页面连接数、页面尺寸瘦身

  动态资源和静态资源分离

  CDN加速

  服务分布式部署

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!