>운영 및 유지보수 >엔진스 >NGINX는 Linux에서 고가용성을 달성합니다.

NGINX는 Linux에서 고가용성을 달성합니다.

angryTom
angryTom원래의
2019-11-25 16:01:533523검색

NGINX는 Linux에서 고가용성을 달성합니다.

1. Linux에 NGINX 설치

Centos에서는 yum 소스가 nginx 설치를 제공하지 않습니다. yum 소스를 전환하여 설치를 얻을 수 있습니다. 설치 패키지를 직접 다운로드할 수도 있습니다. 다음 명령을 실행하려면 루트 권한이 필요합니다. 먼저 필요한 라이브러리를 설치합니다(nginx의 gzip 모듈에는 zlib 라이브러리가 필요하고, 다시 쓰기 모듈에는 pcre 라이브러리가 필요하며, ssl 함수에는 openssl 라이브러리가 필요합니다). ). 설치 디렉터리로 /usr/local을 선택하면 다음과 같은 특정 버전 번호가 실제 조건에 따라 변경됩니다.

1.1, 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

./configure error (권장 학습: nginx tutorial)

configure: error: You need a C++ compile
r for C++ support.

해결책: yum install -y gccgcc-c++

1.2 , zlib library

$ 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

1.3 설치, 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

1.3 설치, 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

설치 일반적인 설치 오류:

Nginx 시작 프롬프트에서 libpcre.so.1 솔루션을 찾을 수 없습니다

그렇다면 32비트 system

[root@lee ~]#  ln -s /usr/local/lib/libpcre.so.1 /lib

64비트 시스템인 경우

[root@lee ~]#  ln -s /usr/local/lib/libpcre.so.1 /lib64

그런 다음 nginx를 시작하면 괜찮습니다

[root@lee ~]# /usr/local/webserver/nginx/sbin/nginx

1.4, NGINX

$ /usr/local/nginx/sbin/nginx

를 시작하여 브라우저에 표시되면 이 컴퓨터의 IP에 액세스합니다. nginx에 오신 것을 환영합니다! 이는 Nginx가 성공적으로 설치되고 실행되었음을 의미합니다.

2. 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

3. Nginx + Keepalived

3.1 시작 스위칭 메커니즘 소프트웨어에는 우리가 일반적으로 이야기하는 레이어 3, 레이어 4 및 레이어 7 스위치의 기능이 있습니다. 주로 loadbalancing

(로드 밸런싱) 및

high-availability(고가용성) 기능을 제공합니다. 로드 밸런싱을 구현하려면 Linux 가상 서비스 커널 모듈(ipvs)을 사용해야 하며, 고가용성은 여러 시스템 간에 달성됩니다. VRRP 프로토콜.  

위 그림은 Keepalived의 기능적 아키텍처로, 크게 사용자 공간과 커널 공간의 두 가지 레이어로 나뉩니다.

커널 공간

: 주로 IPVS(네트워크 서비스의 로드 밸런싱을 구현하는 데 사용되는 IP 가상 서버)와 NETLINK(고급 라우팅 및 기타 관련 네트워크 기능 제공)의 두 부분으로 구성됩니다.

User Space

:

WatchDog: 로드 모니터링 체커 및 VRRP 프로세스 상태

    VRRP 스택: 로드 밸런서 간 FailOver 전환, 로드 밸런서를 하나만 사용하는 경우 VRRP는 필요하지 않습니다.
  • Checkers: Keepalived의 주요 기능인 실제 서버의 상태 확인을 담당합니다. 즉, VRRP가 있을 수 없습니다. 스택이지만 상태 확인은 필수입니다.
  • IPVS 래퍼: 사용자는 설정된 규칙을 커널 ipvs 코드로 보냅니다.
  • Netlink Reflector: vrrp 등의 VIP 주소를 설정하는 데 사용됩니다.
  • Keepalived의 모든 기능은 keepalived.conf 파일을 구성하여 구현됩니다.

3.2 Keepalived 설치

Keepalived 주소 다운로드: http://www.keepalived.org/download.html

압축 해제 및 설치:

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

3.3 Keepalived를 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,到此我们安装完毕!
3.4. 일반적인 Keepalived 명령

servicekeepalived start
servicekeepalived stop
4. Keepalived 구성


4.1 NGINX의 활성 및 백업 자동 재시작 구성

1 구성 파일 수정: vim /etc/keepalived/keepalived.conf

1) 마스터 NGINX 구성 수정

<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>
2) 백업 NGINX 구성 수정

! 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
    }
}
3) 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
4) 그런 다음 마스터의 연결 유지 구성 파일을 마스터 머신의 /etc/에 복사합니다( 172) keepalived/ 폴더에서 백업 keepalived 구성 파일을 백업 머신(173)의 /etc/keepalived/ 폴더에 복사하고 마지막으로 nginx_check.sh 스크립트를 두 머신의 /etc/keepalived/ 폴더에 복사합니다. .

5) nginx_check.sh 스크립트 인증. 실행 권한 부여: chmod +x /etc/keepalived/nginx_check.sh

6) 2대의 머신에서 nginx를 시작한 후. 두 머신 모두에서 keepalived를 시작합니다

/usr/local/nginx/sbin/nginx
servicekeepalived start
ps -ef | grepnginx
ps -ef | grepkeepalived
7) 두 머신의 IP 주소를 살펴보면 a 명령 아래에 가상 IP가 나타납니다. Keepalived를 닫지 않고 테스트하고 NGINX를 종료한 다음 다시 시작되는지 관찰합니다. Keepalived를 끄고 NGINX를 종료한 다음 다시 시작되는지 확인하세요.


5. 클러스터 내 세션 공유 솔루션

5.1. 클러스터에서 세션이 발생하는 원인은 무엇입니까?

세션이 서버 측에 저장되므로 클러스터 내 사용자가 다른 서버에 액세스할 수 있습니다. 세션을 공유할 수 없습니다.

5.2, 세션 공유 솔루션

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

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

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

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

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

949a265f4ecf2de05455fc66d0b4c6e4
b4b38e33757a6497aa8690936b905cc1 
    05a8acc5c31084a4f61ade01873802caorg.springframework.boot192ca2f7b8c770b01c8f81e6bdd5b947
    9bc4cbb67f66e148869423c0d27e5f90spring-boot-starter-redisb68fb17cb904a46b73e6272850323873
    09a0e22e5aaafd848ae04665be625b91
    706be6ab47249fb2329193d8a72593e2
    b4b38e33757a6497aa8690936b905cc1  
    05a8acc5c31084a4f61ade01873802caorg.springframework.session192ca2f7b8c770b01c8f81e6bdd5b947  
    9bc4cbb67f66e148869423c0d27e5f90spring-session-data-redisb68fb17cb904a46b73e6272850323873
09a0e22e5aaafd848ae04665be625b91

创建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;
    }
}

初始化Session

//初始化Session配置Public class SessionInitializer extends AbstractHttpSessionApplicationInitializer{
  Public SessionInitializer() {
    super(SessionConfig.class);
    }
}

控制层代码

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;
    }

}

 六、高并发解决方案

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

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

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

  系统环境 -》 JVM调优

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

  动态资源和静态资源分离

  CDN加速

  服务分布式部署

위 내용은 NGINX는 Linux에서 고가용성을 달성합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.