nginx 로드 밸런싱의 세션 공유 문제 해결
몇 가지 정보를 확인하고 다른 사람들이 작성한 문서를 읽었습니다. nginx 세션 공유를 구현하기 위해 요약하면 다음과 같습니다.
PHP 서버가 여러 개 있고 로드 밸런싱을 위해 nginx를 사용하므로 동일한 IP가 다른 서버에 할당될 수 있습니다. 세션이 동기화되지 않으면 가장 일반적인 로그인 상태와 같은 많은 문제가 발생합니다.
1. 세션을 사용하는 대신 쿠키를 사용합니다
세션은 서버 측에 저장되고, 쿠키는 클라이언트 측에 저장됩니다. 쿠키를 전송 스테이션으로 사용하는 쿠키입니다. 웹 서버 A를 방문하여 세션을 생성하고 이를 쿠키에 넣습니다. 요청이 서버 B에 할당되면 서버 B는 먼저 서버에 세션이 있는지 확인한 다음 클라이언트의 쿠키가 없는지 확인합니다. 이러한 세션은 해당 세션이 실제로 존재하지 않는다는 의미입니다. 쿠키에 세션이 있으면 해당 세션을 서버 B에 동기화해야 합니다.
참고: 이 방법은 구현이 간단하고 편리하며 데이터베이스에 부담을 주지 않습니다. 그러나 클라이언트가 쿠키를 비활성화하면 세션이 동기화되지 않아 웹사이트에 문제가 발생합니다. 손실, 쿠키의 보안은 높지 않지만 여전히 위조될 수 있습니다.
2. 세션은 데이터베이스(MySQL 등)에 저장됩니다.
PHP는 세션을 데이터베이스에 저장하도록 구성할 수 있습니다. 이 방법은 세션을 저장하는 테이블을 함께 두는 것입니다. mysql도 클러스터링된 경우 각 mysql 노드에 이 테이블이 있어야 하며, 이 세션 테이블의 데이터 테이블이 실시간으로 동기화되어야 합니다.
참고: 데이터베이스를 사용하여 세션을 동기화하면 데이터베이스의 IO가 증가하고 데이터베이스에 대한 부담이 늘어납니다. 게다가 데이터베이스 읽기 및 쓰기 속도가 느리기 때문에 세션을 적시에 동기화하는 데 도움이 되지 않습니다.
3. 세션은 memcache 또는 redis에 저장됩니다.
Memcache는 php 구성 파일에서 저장 방법을 memcache로 설정하므로 php 자체에서 세션 클러스터를 설정하고 Memcache에 세션 데이터를 저장합니다.
참고: 이러한 방식으로 세션을 동기화하면 데이터베이스에 대한 부담이 증가하지 않으며, 세션을 메모리에 넣는 것이 파일에서 읽는 것보다 훨씬 빠릅니다. 그러나 Memcache는 메모리를 여러 사양의 저장 블록으로 나누며 각 블록에는 크기가 있습니다. 이 방법은 Memcache가 메모리를 완전히 활용할 수 없으며 저장 블록이 충분하지 않으면 메모리 오버플로가 발생한다고 판단합니다.
4. nginx의 ip_hash 기술은 특정 IP의 요청을 동일한 백엔드로 보낼 수 있으므로 이 IP 아래의 특정 클라이언트와 특정 백엔드가 안정적인 세션을 설정할 수 있습니다. ip_hash는 업스트림에 정의되어 있습니다. 구성:
- stream nginx.example.com
- { 서버 192.168.74.235:80
- 서버 192.168.74.236:80
- ip_hash;
- }
- 서버
- {
- 듣기 8 0;
- 위치 /
- {
- 프록시 _pass
- http://nginx.example.com; }
- }
- ip_hash는 이해하기 쉽지만 백엔드 할당에는 IP 요소만 사용할 수 있기 때문에, ip_hash에 결함이 있어 일부 상황에서는 사용할 수 없습니다.
- 1.nginx는 프런트 엔드 서버가 아닙니다. ip_hash를 사용하려면 nginx가 프런트엔드 서버여야 합니다. 그렇지 않으면 nginx가 올바른 IP를 얻을 수 없고 IP를 기반으로 해시할 수 없습니다. 예를 들어 Squid를 프런트 엔드로 사용하는 경우 nginx는 IP를 가져올 때 Squid의 서버 IP 주소만 가져올 수 있습니다. 이 주소를 배포에 사용하는 것은 확실히 혼란스럽습니다. 2. nginx의 백엔드에는 다른 로드 밸런싱 방법도 있습니다.
nginx 백엔드에 다른 로드 밸런싱이 있고 요청이 다른 방식으로 전환되는 경우 특정 클라이언트의 요청은 동일한 세션 애플리케이션 서버에 위치하지 않습니다. 이를 계산하면 nginx 백엔드는 애플리케이션 서버를 직접 가리키거나 Squid를 빌드한 다음 애플리케이션 서버를 가리킬 수만 있습니다. 가장 좋은 방법은 위치를 전환으로 사용하고, 세션이 필요한 일부 요청을 ip_hash를 통해 전환하고, 나머지는 다른 백엔드로 이동하는 것입니다.
5. upstream_hash
ip_hash의 일부 문제를 해결하기 위해 타사 모듈 upstream_hash를 사용할 수 있습니다. 이 모듈은 대부분의 경우 url_hash로 사용되지만 사용을 방해하지는 않습니다. 세션 공유를 위해. 해본 적도 없고 정말 이해가 안 되네요
보충: memcached에 대한 간략한 소개
1. 개념
Memcached는 danga에서 개발한 세트입니다. com (LiveJournal을 운영하는 기술팀) 동적 시스템에서 데이터베이스 부하를 줄이고 성능을 향상시키는 데 사용되는 분산 메모리 개체 캐싱 시스템입니다.
2. 적용 가능한 경우
1. memcached 자체는 분산 시스템을 기반으로 하기 때문에 특히 대규모 분산 시스템에 적합합니다.
2. 데이터베이스 프런트엔드 캐시. 데이터베이스는 종종 웹사이트 시스템의 병목 현상이 됩니다. 데이터베이스에 대한 대규모 동시 액세스로 인해 웹 사이트 메모리가 오버플로되는 경우가 많습니다. 물론 우리는 Hibernate의 캐싱 메커니즘을 사용할 수도 있습니다. 그러나 Memcached는 배포 기반이며 웹사이트 애플리케이션 자체와 독립적일 수 있으므로 애플리케이션을 분할하는 대규모 웹사이트에 더 적합합니다.
3. 서버 간 데이터 공유. 예를 들어, 웹 사이트의 로그인 시스템과 쿼리 시스템을 두 개의 애플리케이션으로 분할하여 서로 다른 서버에 배치하고 클러스터링한 다음 사용자가 로그인한 후 로그인 정보가 로그인 시스템 서버에서 쿼리 시스템으로 어떻게 동기화됩니까? 서버요? 이때 로그인 시스템은 로그인 정보를 캐시하고 쿼리 시스템은 로컬 정보를 얻는 것처럼 로그인 정보를 얻을 수 있습니다.
3. 적용할 수 없는 경우
"배포"가 필요하지 않거나 공유가 필요하지 않거나 서버가 하나만 있을 정도로 작은 애플리케이션의 경우 memcached는 어떤 이점도 가져오지 않습니다. 반대로 네트워크 연결에도 리소스가 필요하기 때문에 시스템 효율성이 저하됩니다
해결 방법은 memcached를 세션 저장소로 사용하고 memcached 서버는 nginx와 동일한 Linux 호스트에 설정됩니다.
해결 과정,
두 Apache의 호스트 IP는 192.168.74.235192.168.74.236
Nginx 호스트 IP는 192.168.74.131
Memcached 호스트의 IP는 192.168.74.131
192.168.74.131에 memcached를 설치하고 시작합니다
192.168.74.236을 예로 들어 memcached에 php 및 php의 종속 라이브러리를 설치합니다. yuminstall memcached -devel .i686 libmemcached-devel.i686 php-pecl-memcache.i686
php.ini 구성
session.save_handler= memcache
session.save_path= "tcp: // 192.168.74.131:11211"
또는 (다음 두 가지는 시도되지 않았습니다)
1. 특정 디렉토리의 .htaccess:
php_value session.save_handler " memcache"
php_value session.save_path "tcp://IP:11211"
2. 특정 애플리케이션에서:
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://IP:11211")
동시에 다음을 주석 처리해야 합니다.session.save_path= "/var/lib /php/session"
동시에 Extension=memcache.so를 엽니다.
아파치를 다시 시작하고 phpinfo에서 "등록된 저장 핸들러"를 확인합니다. 이 세 가지 "files usermemcache"가 있습니다. 있는 경우
Memcached 서버 실행 및 결과
[root@Git ~]# memcached-tool127.0.0.1:11211
# Item_Size Max_age Pages Count Full Evicted Evict_Time OOM
236 머신에 다음 PHP 파일을 추가하세요
session_start();
if (!isset($_SESSION[' TEST'])) {
$_SESSION['TEST'] = time();
}
$_SESSION ['TEST3'] = 시간();
인쇄 $_SESSION['TEST'];
인쇄 "
";
인쇄 $_SESSION['TEST3'];
인쇄 "
";
session_id() 인쇄;
?>
그런 다음 memcached 서버로 이동하여
[root@Git ~]# memcached-tool127.0.0.1:11211
# Item_Size Max_age Pages Count Full Evicted Evict_Time OOM
1 80B 0s 1 0 Memcached 서버에 세션을 쓸 수 있어야 합니다. 요약하자면:1. 방화벽 문제, 방화벽으로 인해 LAN 서버 연결에 실패하는 경우가 많습니다
2. 종속성이 설치되지 않고, php-와 같은 확장 라이브러리를 설치하지 않았기 때문에 memcached가 항상 처음에 실패합니다. 멤캐시
위의 내용을 포함하여 nginx 로드 밸런싱의 세션 공유 문제를 해결하는 방법을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











MySQL은 설치가 간단하고 강력하며 데이터를 쉽게 관리하기 쉽기 때문에 초보자에게 적합합니다. 1. 다양한 운영 체제에 적합한 간단한 설치 및 구성. 2. 데이터베이스 및 테이블 작성, 삽입, 쿼리, 업데이트 및 삭제와 같은 기본 작업을 지원합니다. 3. 조인 작업 및 하위 쿼리와 같은 고급 기능을 제공합니다. 4. 인덱싱, 쿼리 최적화 및 테이블 파티셔닝을 통해 성능을 향상시킬 수 있습니다. 5. 데이터 보안 및 일관성을 보장하기위한 지원 백업, 복구 및 보안 조치.

Navicat Premium을 사용하여 데이터베이스 생성 : 데이터베이스 서버에 연결하고 연결 매개 변수를 입력하십시오. 서버를 마우스 오른쪽 버튼으로 클릭하고 데이터베이스 생성을 선택하십시오. 새 데이터베이스의 이름과 지정된 문자 세트 및 Collation의 이름을 입력하십시오. 새 데이터베이스에 연결하고 객체 브라우저에서 테이블을 만듭니다. 테이블을 마우스 오른쪽 버튼으로 클릭하고 데이터 삽입을 선택하여 데이터를 삽입하십시오.

MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) 데이터베이스 및 테이블 작성 : CreateAbase 및 CreateTable 명령을 사용하십시오. 2) 기본 작업 : 삽입, 업데이트, 삭제 및 선택. 3) 고급 운영 : 가입, 하위 쿼리 및 거래 처리. 4) 디버깅 기술 : 확인, 데이터 유형 및 권한을 확인하십시오. 5) 최적화 제안 : 인덱스 사용, 선택을 피하고 거래를 사용하십시오.

응용 프로그램을 열고 새로운 연결 (Ctrl n)을 선택하여 Navicat에서 새로운 MySQL 연결을 만들 수 있습니다. "MySQL"을 연결 유형으로 선택하십시오. 호스트 이름/IP 주소, 포트, 사용자 이름 및 비밀번호를 입력하십시오. (선택 사항) 고급 옵션을 구성합니다. 연결을 저장하고 연결 이름을 입력하십시오.

MySQL 및 SQL은 개발자에게 필수적인 기술입니다. 1.MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템이며 SQL은 데이터베이스를 관리하고 작동하는 데 사용되는 표준 언어입니다. 2.MYSQL은 효율적인 데이터 저장 및 검색 기능을 통해 여러 스토리지 엔진을 지원하며 SQL은 간단한 문을 통해 복잡한 데이터 작업을 완료합니다. 3. 사용의 예에는 기본 쿼리 및 조건 별 필터링 및 정렬과 같은 고급 쿼리가 포함됩니다. 4. 일반적인 오류에는 구문 오류 및 성능 문제가 포함되며 SQL 문을 확인하고 설명 명령을 사용하여 최적화 할 수 있습니다. 5. 성능 최적화 기술에는 인덱스 사용, 전체 테이블 스캔 피하기, 조인 작업 최적화 및 코드 가독성 향상이 포함됩니다.

백업 또는 트랜잭션 롤백 메커니즘이없는 한 데이터베이스에서 직접 삭제 된 행 복구는 일반적으로 불가능합니다. 키 포인트 : 거래 롤백 : 트랜잭션이 데이터를 복구하기 전에 롤백을 실행합니다. 백업 : 데이터베이스의 일반 백업을 사용하여 데이터를 신속하게 복원 할 수 있습니다. 데이터베이스 스냅 샷 : 데이터베이스의 읽기 전용 사본을 작성하고 데이터를 실수로 삭제 한 후 데이터를 복원 할 수 있습니다. 주의해서 삭제 명령문을 사용하십시오. 실수로 데이터를 삭제하지 않도록 조건을주의 깊게 점검하십시오. WHERE 절을 사용하십시오 : 삭제할 데이터를 명시 적으로 지정하십시오. 테스트 환경 사용 : 삭제 작업을 수행하기 전에 테스트하십시오.

Navicat에서 데이터베이스를 가져 오는 단계에는 다음이 포함됩니다. 데이터베이스 서버에 연결하십시오. 데이터베이스 이름을 마우스 오른쪽 버튼으로 클릭하고 마법사 가져 오기를 선택하십시오. 데이터 소스 유형을 선택하십시오. 데이터 소스 설정을 지정하십시오. 데이터 파일 형식을 선택하십시오. 찾아보고 데이터 파일을 선택하십시오. 가져 오기 옵션 구성 (테이블 맵, 문자 세트, 데이터 유형). 수입 및 모니터링 진행 상황을 수행하십시오.

Navicat을 사용하여 로컬 MySQL 데이터베이스에 연결하려면 : 연결을 만들고 연결 이름, 호스트, 포트, 사용자 이름 및 비밀번호를 설정하십시오. 연결을 테스트하여 매개 변수가 올바른지 확인하십시오. 연결을 저장하십시오. 연결 목록에서 새 연결을 선택하십시오. 연결하려는 데이터베이스를 두 번 클릭하십시오.
