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 에 할당 되면 어떻게 합 니까?분명히 사용 자 를 다시 로그 인하 게 할 수 없다.그래서 세 션 공 유 를 실현 해 야 합 니 다.일반적으로 몇 가지 해결 방법 이 있다.
저 는 방안 4, 즉 debian 1 을 배포 서버 로 하고 session 서버 (redis 로 구현) 로 서 부하 서버 는 매번 배포 서버 에 사용자 의 session 에 대응 하 는 세 션 상 태 를 요청 하여 응답 방식 을 결정 하려 고 합 니 다.
php 환경 구축
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 환경 구축
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 열기redis 서버 다시 시작:
./src/redis-cli -h 127.0.0.1 -p 6379 shutdown #
./src/redis-server redis.conf
이 때 redis 클 라 이언 트 로 직접 방문 하면 비밀 번 호 를 입력 한 후에 정상적으로 사용 할 수 있다 는 것 을 알 게 될 것 입 니 다. 그림:
명령:
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 를 클 라 이언 트 에 게 되 돌려 줍 니 다.이것 은 대략적인 논리 적 윤곽 이 므 로 세부 사항 은 토론 하지 않 고 다음 과 같이 실현 한다.
//
$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();
?>
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 안의 시스템 으로 이 컴퓨터 의 루트 비밀 번 호 를 수정 하 는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단! Certbot을 사용하여 웹 사이트를 SSL(HTTPS)화하는 방법초보자가 인프라 주위를 정돈하는 것은 매우 어렵습니다. 이번은 사이트를 간단하게 SSL화(HTTP에서 HTTPS통신)로 변경하는 방법을 소개합니다! 이번에는 소프트웨어 시스템 Nginx CentOS7 의 환경에서 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.