Nginx + Redis 로 session 공유 의 균형 부하 구현

23005 단어 nginx
무 리 를 지어 짓다.
먼저 vmware 12 에 debain 3 대 를 설치 하고 debian 1, debian 2, debian 3 이 라 고 명명 합 니 다.묵인 하면 돼.
vmware 에 문제 가 있 습 니 다. 창 이 초점 을 맞 추 면 자동 으로 작은 키 보드 를 닫 아서 루트 비밀 번 호 를 설정 할 때 비어 있 습 니 다.나중에 나 는 su 명령 을 사용 하고 나 서 야 비밀번호 가 잘못 되 었 다 는 것 을 알 게 되 었 다. 빈 비밀 번 호 를 입력 하 는 것 처럼 잘못 되 었 고 비밀 번 호 를 찾 을 수 밖 에 없 었 다.
debian 에 대해 이렇게 변경 합 니 다. grub 인터페이스 커서 에서 시작 할 시스템 을 가리 키 고 e 키 를 누 르 면 편집 합 니 다. 그림 과 같 습 니 다.
quiet 뒤에 1 을 추가 하고 F10 을 누 르 면 명령 행 인터페이스 에 루트 로 들 어 갈 수 있 습 니 다.
이 럴 때 패스 워드 로 비밀 번 호 를 수정 하고 reboot 하면 됩 니 다.
드디어 열 렸 습 니 다. 네트워크 를 시도 해 보 려 고 했 는데 외부 네트워크 에 접근 할 수 없 음 을 발 견 했 습 니 다. 그러나 windows 호스트 는 가능 합 니 다. 기본 값 으로 하면 문제 가 발생 하지 말 아야 합 니 다. 백신 소프트웨어 가 vmware 의 서비스 프로 세 스 를 닫 았 을 가능성 이 가장 높 습 니 다 (360..).windows 에서 Vmware 의 DHCP 서 비 스 를 시작 합 니 다.
그리고 가상 컴퓨터 는 reboot 를 통 해 ip 을 가 져 옵 니 다.자, 이제 가상 컴퓨터 가 외부 네트워크 에 접근 할 수 있 습 니 다.
nginx 를 설치 해 보 니 연결 이 되 지 않 는 다 는 것 을 알 게 되 었 습 니 다. 딱 봐 도 노 미의 원천 이라는 것 을 알 게 되 었 습 니 다. 묵인 하 는 사고 일 것 입 니 다. 과 대원 으로 수정 되 었 습 니 다. (저 는 모교 가 자 랑스 럽 습 니 다. 하하)
vi /etc/apt/source.list

다음으로 변경:
deb http://mirrors.ustc.edu.cn/debian/ wheezy main non-free contrib
deb http://mirrors.ustc.edu.cn/debian/ wheezy-proposed-updates main non-free contrib
deb-src http://mirrors.ustc.edu.cn/debian/ wheezy main non-free contrib
deb-src http://mirrors.ustc.edu.cn/debian/ wheezy-proposed-updates main non-free contrib

deb http://mirrors.ustc.edu.cn/debian-security/ wheezy/updates main non-free contrib
deb-src http://mirrors.ustc.edu.cn/debian-security/ wheezy/updates main non-free contrib

그리고 이 명령 을 실행 하여 업데이트 합 니 다:  apt-get update
설치:  apt-get install nginx
시작:  /etc/init.d/nginx start임의의 가상 컴퓨터 로 브 라 우 저 를 켜 서 localhost 를 열 고 성공 적 으로 시작 합 니 다. 그림:
vi. 설치 에 익숙 하지 않 음 vim:  apt-get install vim  오류 보고:
The following packages have unmet dependencies:
 vim : Depends: vim-common (= 2:7.3.547-7) but 2:7.4.488-7 is to be installed
E: Unable to correct problems, you have held broken packages.

충돌 을 볼 수 있 습 니 다. 해결 방법:
선행 실행  apt-get remove vim-common vim - common 마 운 트 해제
다시 설치 vim, 실행  apt-get install vim
nginx 의 루트 디 렉 터 리 를 찾 아 보 세 요. 설정 파일 을 엽 니 다. (아파 치 와 마찬가지 로 설정 파일 이 모듈 화 되 어 있 습 니 다. 하나의 nginx. conf 가 아 닙 니 다.)
vim /etc/nginx/sites-enabled/default  

가운데 줄 이 있어 요.
root /usr/share/nginx/www;

이것 이 바로 루트 디 렉 터 리 입 니 다.
index. html 를 수정 하여 세 대의 호스트 를 구분 합 니 다.
ipconfig 로 각각 ip 주 소 를 얻 고 windows 에 접근 합 니 다.
debian1  http://192.168.182.128/

debian2  http://192.168.182.129/

debian3  http://192.168.182.130/

기초 시험
균형 부하 에 대해 직관 적 인 느낌 을 줄 수 있 도록 작은 예 를 들 어 보 자.
저 희 는 debian 1 을 메 인 서버 로 서 배포 요청 임 무 를 맡 고 있 습 니 다. 즉, 외부 방문 은 debian 1 입 니 다. 그리고 debian 1 은 debian 2 나 debain 3 에 요청 을 보 냅 니 다. 다음 그림 과 같 습 니 다.
debian 1 에서 프로필 수정: vim /etc/nginx/nginx.conf  http 설정 항목 에 다음 과 같이 추가 합 니 다.
upstream site { 
      server  192.168.182.129:80; 
      server  192.168.182.130:80; 
} 
  
server{ 
    listen 80;  
    location / { 
        proxy_pass         http://site;
    } 
}

이것 은 선택 한 폴 링 모드 입 니 다. 다시 시작 nginx 를 저장 합 니 다.
현재 windows 에서 debian 1 에 접근 하고 있 습 니 다.http://192.168.182.128/。여러 번 새로 고침 하면 다음 두 그림 이 순서대로 나타 납 니 다.
debian 1 에 보 내 는 요청 이 debian 2 와 debian 3 에 고 르 게 배 치 된 것 임 을 설명 합 니 다. 즉, 폴 링 입 니 다.
session 공유
위의 예 는 실 용적 가치 가 없 을 정도 로 간단 하 다 고 할 수 있다. 대형 사 이 트 는 보통 정적 일 수 없고 보통 사용자 의 로그 인 문제 와 관련된다. 그러면 session 문제 와 관련된다.당신 은 사용자 가 A 에 로그 인 했다 고 생각 합 니 다. A 는 사용자 의 로그 인 상 태 를 기억 하고 있 습 니 다. 그러나 다음 사용자 의 요청 이 B 에 할당 되면 어떻게 합 니까?분명히 사용 자 를 다시 로그 인하 게 할 수 없다.그래서 세 션 공 유 를 실현 해 야 합 니 다.일반적으로 몇 가지 해결 방법 이 있다.
  • iphash 는 특정 ip 을 특정 호스트 에 보 내 면 session 문제 가 존재 하지 않 습 니 다. 한 사용자 가 호스트 에 대응 하기 때 문 입 니 다.그러나 어느 순간 특정한 IP 주소 에서 온 요청 이 매우 많 으 면 특정한 부하 서버 의 압력 이 매우 클 수 있 고 다른 부하 서버 는 남 아 있 는 불 균형 상황 을 초래 할 수 있다. 이것 은 우리 의 부하 균형 의 취지 에 어 긋 난다.
  • redis 클 러 스 터 나 memcached 클 러 스 터 를 구축 하고 클 러 스 터 자체 의 동기 화 방법 으로 서로 다른 호스트 에서 session 을 동기 화 하 는 것 을 도와 준다. 그러면 원래 의 session 을 N 분 session (낭비, 하하) 으로 바 꾸 는 셈 이다. session 의 동기 화 는 NoSql 클 러 스 터 의 동기 화 에 의존한다.
  • session 을 사용 하지 않 고 쿠키 로 바 꿉 니 다.그러나 방어 적 프로 그래 밍 의 원칙 을 계승 하여 우 리 는 사용자 의 입력 을 믿 을 수 없습니다. 왜냐하면 쿠키 가 비활성화 되 고 심지어 변 경 될 수 있 기 때 문 입 니 다.
  • 세 션 서버 를 따로 설정 하고 부하 서버 에서 sessionid 를 받 은 후 세 션 서버 에 가서 세 션 상 태 를 얻 은 다음 상태 에 따라 사용자 의 요청 에 응답 합 니 다. 세 션 상태 가 비어 있 으 면 세 션 서버 에 세 션 상 태 를 설정 하고 sessionid 를 되 돌려 줍 니 다.

  • 저 는 방안 4, 즉 debian 1 을 배포 서버 로 하고 session 서버 (redis 로 구현) 로 서 부하 서버 는 매번 배포 서버 에 사용자 의 session 에 대응 하 는 세 션 상 태 를 요청 하여 응답 방식 을 결정 하려 고 합 니 다.
    php 환경 구축
  • debain 2, 3 에 phop 환경 구축
  • 먼저 2 에서 명령 을 수정 합 니 다:
    apt-get update    #   
    apt-get install php5        #  php5
    apt-get install php5-cli        #  php5      
    apt-get install php5-fpm
    

    마지막 한 마디 가 틀 렸 다.
    The following packages have unmet dependencies:
     gnupg : Depends: libreadline6 (>= 6.0) but it is not going to be installed
       Recommends: gnupg-curl but it is not going to be installed
         php5-fpm : Depends: libssl1.0.0 (>= 1.0.0) but it is not going to be installed
         Depends: php5-common (= 5.4.45-0+deb7u2) but it is not going to be installed
         Depends: ucf but it is not going to be installed
         Depends: tzdata but it is not going to be installed
          PreDepends: dpkg (>= 1.16.1~) but it is not going to be installed
    

    오랫동안 해 봤 지만 해결 되 지 않 았 으 니 fastcgi 관리 도 구 를 바 꾸 세 요.
    apt-get install spawn-fcgi
    

    spawn - fcgi 시작:
    /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-cgi
    

    설명:
    -a : PHP FastCGI   IP  
    
    -p : PHP FastCGI     
    
    -u : PHP FastCGI    
    
    -g : PHP FastCGI    
    
    -f :    PHP5 fastcgi
    

    달리
    `vim /etc/rc.local`
    

    상기 명령 에 가입 하여 자동 으로 작 동 하도록 합 니 다.
    nginx 의 php 옵션 설정 (홈 페이지 를 보 는 것 이 좋 습 니 다. 여기저기 검색 하지 마 십시오):
    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }
    
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
    

    재 부팅: / etc / init. d / nginx restart
    루트 디 렉 터 리 에 1. php 추가
    
    phpinfo();
    ?>
    

    방문, 마침내 성공, 눈물 의 질주
    다음은 debain 3 를 법 대로 만 들 겠 습 니 다.드디어 이 일 을 끝 냈 다.
    redis 환경 구축
  • debain 1 에 redis 서버 구축
  • 명령:
        wget http://download.redis.io/releases/redis-2.8.12.tar.gz
        tar xzf redis-2.8.12.tar.gz
        cd redis-2.8.12
        make
    

    컴 파일 성공, 실행:  ./src/redis-server redis.conf설정 수정 redis. conf 열기
  • bind 127.0.0.1 을 bind 0.0.0.0 으로 수정 하면 임의의 호스트 가 접근 할 수 있 습 니 다
  • "requirepass" 필드 를 찾 아 뒤에 비밀번호 password
  • 를 추가 합 니 다.
    redis 서버 다시 시작:
        ./src/redis-cli -h 127.0.0.1 -p 6379 shutdown #  
        ./src/redis-server redis.conf   
    

    이 때 redis 클 라 이언 트 로 직접 방문 하면 비밀 번 호 를 입력 한 후에 정상적으로 사용 할 수 있다 는 것 을 알 게 될 것 입 니 다. 그림:
  • debain 2, 3 에 phopredis
  • 를 설정 합 니 다.
    명령:
    
        apt-get install php5-dev #php     ,      
        wget https://github.com/nicolasff/phpredis/archive/master.tar.gz
        tar xvf master.tar.gz
        cd phpredis-master/
        phpize
        ./configure --enable-redis
        make && make install
    

    그리고 설정 수정:
    
    vim /etc/php5/cgi/php.ini 
    

    Dynamic Extensions 뒤에 extension = redis. so 추가
    서비스 재 개: 정말 성숙 한 해결 방법 을 찾 지 못 했 습 니 다. 어 리 석 은 방법 을 취 할 수 밖 에 없습니다.
    
    lsof -i :9000  #         ,  PID
    kill -9 pid  #          pid    
    /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-cgi  #  
    
    
    

    테스트: debian 3 의 nginx 루트 디 렉 터 리 에 1. phop 코드 를 다음 과 같이 추가 합 니 다.
    
     $redis_host = '192.168.182.128';
     $redis_port = 6379;
     $redis_psw = 'password';
    
     $redis = new Redis ();
     $redis->connect ( $redis_host, $redis_port );
     $redis->auth ( $redis_psw );
     $redis->set('a',1);
     echo $redis->get('a');
    
    ?>
    

    결 과 는 다음 과 같다.
    성공 한 것 을 알 수 있 습 니 다. debian 2 에 대해 서 는 법 대로 만 들 었 습 니 다. 효과 가 같 습 니 다.
    논리 적 실현
    부하 서버 는 클 라 이언 트 가 sessionid 라 는 인 자 를 가지 고 있 는 지 확인 합 니 다. 있 으 면 session 서버 에 가서 세 션 상 태 를 가 져 오고 결 과 를 되 돌려 줍 니 다. 그렇지 않 으 면 session 과 세 션 상태 가 session 서버 에 저장 되 고 sessionid 를 클 라 이언 트 에 게 되 돌려 줍 니 다.이것 은 대략적인 논리 적 윤곽 이 므 로 세부 사항 은 토론 하지 않 고 다음 과 같이 실현 한다.
  • debian 2, 3 의 nginx 설정 파일 을 수정 하여 기본 경 로 는 index. php 가 아니 라 index. html 입 니 다. 또한 기 존의 index. html 를 삭제 하고 index. php 를 추가 합 니 다.다시 시작 하 다.
  • index. php 코드 는 다음 과 같다.
       
       //     
       $redis_host = '192.168.182.128';
       $redis_port = 6379;
       $redis_psw = 'password';
       $redis = new Redis ();
       $redis->connect ( $redis_host, $redis_port );
       $redis->auth ( $redis_psw );
       $sessionid = ceil($_GET['sessionid']);
       $hostname = 'debian2';//debian3    debian3
       
       if(empty($sessionid)){//  sessionid
           $sessionid = rand(10000000,99999999);//      8       id
           $status = '    ,  '.$hostname.'   session';
           $redis->set($sessionid,$status);//  
           $data = array('    '=>$hostname,'sessionid'=>$sessionid,'info'=>'        ');
           echo json_encode($data,JSON_UNESCAPED_UNICODE);
           exit();
       }
       
       $status = $redis->get($sessionid);
       
       if(empty($status)){//sessionid  
           $sessionid = rand(10000000,99999999);//      8       id
           $status = '    ,  '.$hostname.'   session';
           $redis->set($sessionid,$status);
           $data = array('    '=>$hostname,'sessionid'=>$sessionid,'info'=>'        ');
           echo json_encode($data,JSON_UNESCAPED_UNICODE);
           exit();
       }
       
       $data = array('    '=>$hostname,'sessionid'=>$sessionid,'info'=>$status);
       echo json_encode($data,JSON_UNESCAPED_UNICODE);
       exit();
       
       ?>
    
  • 테스트
  • 첫 방문 debian 1
    debain 1 을 다시 방문 하면 문제 가 생 겼 습 니 다. 왠 지 debian 2 까지 보 내 고 여러 번 시도 해 보 았 습 니 다. debian 3 에 요청 한 적 이 한 번 도 없 었 습 니 다. 문의 가 없 었 습 니 다.그런데 몇 분 이 지나 서 debian 1 을 다시 찾 아 왔어요.
    요청 은 debian 3 로 보 냈 습 니 다. phop 을 사용 한 후에 nginx 는 짧 은 시간 동안 같은 호스트 에 요청 을 보 냈 을 것 입 니 다. 그러나 한동안 윤 문 했 습 니 다.
    그러나 나 는 브 라 우 저 를 바 꾼 후 매번 문의 하 는 것 으로 바 뀌 었 다.땀 이... 그래서 이게 브 라 우 저 와 관련 된 거 예요?(잠시 정 해 지지 않 았 습 니 다. 나중에 보 겠 습 니 다. 브 라 우 저 를 바 꾸 세 요)
    첫 방문 debian 1
    debian 1 재 방문
    sessionid 를 가지 고 debian 1 에 처음 방문 합 니 다.
    sessionid 를 가지 고 debian 1 에 다시 방문 합 니 다.
    균형 부하 와 세 션 공유 의 목적 을 달성 한 것 임 을 알 수 있다.
    총결산
    이 글 을 쓰 는 데 정말 힘 이 들 었 다. 중간 에 많은 실 수 를 했 지만 하나씩 인내심 을 가지 고 해결 해 냈 고 마지막 에 나 온 결 과 는 매우 성취 감 을 느 꼈 다.어쨌든 마음속 의 큰 돌 하 나 는 떨 어 진 셈 이다.나중에 시간 나 면 다른 몇 가지 방법 을 다시 시도 해 보 세 요.
    PS: 프로필 을 수정 할 때 는 반드시 백업 을 하고 수정 해 야 합 니 다. 그렇지 않 으 면 문제 가 생 겨 도 복구 할 수 없습니다.
    업데이트
    오랫동안 뜯 어 먹다 가 마침내 빵 의존 문 제 를 찾 았 다.모두 소스 가 일 으 킨 사고 입 니 다. 저 는 그 당시 에 코드 를 찾 아 source. list 에 넣 었 습 니 다. 사실은 wheezy 를 모두 제시 로 바 꾸 면 됩 니 다. 제 debian 은 8.3 이 고 wheezy 는 debian 7 을 대표 하기 때 문 입 니 다.
    잘못된 소스 를 사용 하면 많은 호환성 문 제 를 일 으 킬 수 있 으 니 빨리 바 꿔 라.바 뀌 면 phop 관련 구성 요 소 를 설치 하 는 데 문제 가 없습니다.
    업데이트
    위 에서 루트 비밀 번 호 를 수정 하 는 방법 을 나 는 나중에 다시 시도 해 보 았 지만 성공 하지 못 했다. 원래 성공 한 이 유 는 원래 나의 루트 비밀번호 가 비어 있 었 기 때문에 단일 사용자 모드 에 들 어 갈 때 비밀 번 호 를 입력 할 필요 가 없 었 기 때문이다.나중에 제 비밀 번 호 는 비어 있 지 않 았 습 니 다. 단일 사용자 모드 에 들 어 가 는 것 처럼 루트 비밀 번 호 를 입력 하려 면 비밀 번 호 를 찾 는 목적 에 이 르 지 못 했 습 니 다.가장 좋 은 것 은 USB 로 시작 해서 USB 안의 시스템 으로 이 컴퓨터 의 루트 비밀 번 호 를 수정 하 는 것 이다.

    좋은 웹페이지 즐겨찾기