>  기사  >  백엔드 개발  >  nginx 로드 밸런싱의 세션 공유 문제 해결

nginx 로드 밸런싱의 세션 공유 문제 해결

WBOY
WBOY원래의
2016-07-29 09:15:43848검색

몇 가지 정보를 확인하고 다른 사람들이 작성한 문서를 읽었습니다. 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는 업스트림에 정의되어 있습니다. 구성:

  1. stream nginx.example.com
  2. { 서버 192.168.74.235:80
  3. 서버 192.168.74.236:80
  4. ip_hash;
  5. 서버 
  6.  { 
  7.  듣기 8 0;
  8. 위치 /
  9. {
  10. 프록시 _pass
  11. http://nginx.example.com;
  12. }
  13. }
  14. ip_hash는 이해하기 쉽지만 백엔드 할당에는 IP 요소만 사용할 수 있기 때문에, ip_hash에 결함이 있어 일부 상황에서는 사용할 수 없습니다.
  15. 1.nginx는 프런트 엔드 서버가 아닙니다. ip_hash를 사용하려면 nginx가 프런트엔드 서버여야 합니다. 그렇지 않으면 nginx가 올바른 IP를 얻을 수 없고 IP를 기반으로 해시할 수 없습니다. 예를 들어 Squid를 프런트 엔드로 사용하는 경우 nginx는 IP를 가져올 때 Squid의 서버 IP 주소만 가져올 수 있습니다. 이 주소를 배포에 사용하는 것은 확실히 혼란스럽습니다.
  16. 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 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

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