이 글의 내용은 PHP 면접 질문 7번에서 nginx의 로드 밸런싱을 구성하는 방법에 대한 것입니다. 특정 참고 값이 있습니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다.
로드 밸런싱
nginx 로드 밸런싱에는 4가지 모드가 있습니다:
1), Polling(기본값)
각 요청은 시간순으로 하나씩 다른 백엔드 서버에 할당됩니다. 백엔드 서버가 다운되면 자동으로 제거될 수 있습니다.
2)、체중
폴링 확률을 지정하며 가중치는 접속률에 비례하며 백엔드 서버 성능이 고르지 않을 때 사용됩니다.
2), ip_hash
각 요청은 액세스 IP의 해시 결과에 따라 할당되므로 각 방문자는 백엔드 서버에 대한 고정 액세스 권한을 갖게 되어 세션 문제를 해결할 수 있습니다.
3), fair(제3자)
백엔드 서버의 응답 시간에 따라 요청을 할당하고, 응답 시간이 짧은 요청부터 먼저 할당합니다.
4), url_hash(타사)
구성 방법:
Open nginx.cnf 파일
http 노드 아래에 업스트림 노드 추가:
upstream webname { server 192.168.0.1:8080; server 192.168.0.2:8080; }
여기서 webname은 선택한 이름이며 마지막으로 이 이름이 사용됩니다. in 위의 예시처럼 URL에서 접속할 경우, 아무것도 추가하지 않는 것이 기본 폴링입니다. 첫 번째 요청은 첫 번째 서버에 액세스하고, 두 번째 요청은 두 번째 서버에 액세스합니다. 차례로 오세요.
upstream webname { server 192.168.0.1:8080 weight 2; server 192.168.0.2:8080 weight 1; }
이 가중치도 이해하기 쉽습니다. 위의 예에서는 server1이 두 번 액세스되고 server2가 한 번 액세스됩니다. 이렇게 하면 동일한 IP에서 오는 모든 사람이 동일한 서버로 이동합니다
그런 다음 서버 노드에서 구성합니다.
upstream webname { ip_hash; server 192.168.0.1:8080; server 192.168.0.2:8080; }
proxy_pass는 원래 IP 주소를 위에서 구성한 웹 이름으로 바꿉니다.
이렇게 하면 기본적으로 로드 밸런싱 구성이 완료됩니다.
다음은 활성 및 백업 구성입니다.
아직 업스트림에 있습니다
location /name { proxy_pass http://webname/name/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }
특정 노드를 백업으로 설정하면 일반적으로 모든 요청은 server1에 액세스합니다.
upstream webname { server 192.168.0.1:8080; server 192.168.0.2:8080 backup; }노드를 다운으로 설정하면 이 서버는 로드에 참여하지 않습니다. 구현 예로드 밸런싱은 트래픽이 많은 우리 웹 사이트에서 수행해야 할 작업입니다. 이제 Nginx 서버의 로드 밸런싱 구성 방법이 필요한 학생들에게 도움이 되길 바랍니다. 로드 밸런싱먼저 로드 밸런싱이 무엇인지 간단히 알아보겠습니다. 문자 그대로 이해하면 N개의 서버가 로드를 균등하게 공유하며, 특정 서버의 로드가 높아서 특정 서버가 유휴 상태가 되지 않는다는 의미로 설명할 수 있습니다. . 상태. 그러면 로드 밸런싱의 전제는 여러 서버에서 달성할 수 있다는 것입니다. 즉, 두 대 이상의 서버이면 충분합니다. 테스트 환경
서버가 없으므로 지정된 도메인 이름을 직접 호스팅한 후 VMware에 CentOS 3개를 설치하는 테스트입니다.
테스트 도메인 이름: a.com
A 서버를 메인 서버, 도메인 이름은 서버 A(192.168.5.149)로 직접 확인되고, 서버 A는 서버 B(192.168.5.27)와 서버 C(192.168.5.126)로 로드 밸런싱됩니다.
도메인 이름 확인
끝에 C:WindowsSystem32driversetchosts
upstream webname { server 192.168.0.1:8080; server 192.168.0.2:8080 down; }를 추가하여 저장하고 종료한 다음 명령 모드를 시작하고 ping을 실행하여 설정이 성공했는지 확인하세요스크린샷에서 a.com이 192.168.5.149로 성공적으로 확인되었습니다. IPA 서버 nginx.conf 설정
nginx.conf를 엽니다. 파일 위치는 nginx 설치 디렉터리의 conf 디렉터리에 있습니다.
http 섹션에 다음 코드를 추가하세요
192.168.5.149 a.comnginx를 저장하고 다시 시작하세요B 및 C 서버 nginx.conf 설정
nginx.confi를 열고 http 섹션에 다음 코드를 추가하세요
upstream a.com { server 192.168.5.126:80; server 192.168.5.27:80; } server{ listen 80; server_name a.com; location / { proxy_pass http://a.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
nginx를 저장하고 다시 시작하세요
a.com 접속 시 어떤 서버로 리다이렉트되어 처리되는지 구분하기 위해 서버 B와 C 각각에 내용이 다른 index.html 파일을 작성하여 구분했습니다.
브라우저를 열고 a.com을 방문하여 새로고침하면 모든 요청이 메인 서버(192.168.5.149)에 의해 서버 B(192.168.5.27)와 서버 C(192.168.5.126)에 할당되어 로드 밸런싱이 이루어지는 것을 확인할 수 있습니다. . 효과.
특정 서버가 다운되면 접속에 영향이 있나요?
먼저 예시를 살펴보겠습니다. 위의 예시를 바탕으로 머신 C 서버 192.168.5.126이 다운되었다고 가정하고 (다운타임 시뮬레이션이 불가능해서 C 서버를 종료했습니다) 방문해보세요. 다시.
如果b.com也要设置负载均衡怎么办?
很简单,跟a.com设置一样。如下:
假设b.com的主服务器IP是192.168.5.149,负载均衡到192.168.5.150和192.168.5.151机器上
现将域名b.com解析到192.168.5.149IP上。
在主服务器(192.168.5.149)的nginx.conf加入以下代码:
upstream b.com { server 192.168.5.150:80; server 192.168.5.151:80; } server{ listen 80; server_name b.com; location / { proxy_pass http://b.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
保存重启nginx
在192.168.5.150与192.168.5.151机器上设置nginx,打开nginx.conf在末尾添加以下代码:
server{ listen 80; server_name b.com; index index.html; root /data0/htdocs/www; }
保存重启nginx
完成以后步骤后即可实现b.com的负载均衡配置。
主服务器不能提供服务吗?
以上例子中,我们都是应用到了主服务器负载均衡到其它服务器上,那么主服务器本身能不能也加在服务器列表中,这样就不会白白浪费拿一台服务器纯当做转发功能,而是也参与到提供服务中来。
如以上案例三台服务器:
A服务器IP :192.168.5.149 (主)
B服务器IP :192.168.5.27
C服务器IP :192.168.5.126
我们把域名解析到A服务器,然后由A服务器转发到B服务器与C服务器,那么A服务器只做一个转发功能,现在我们让A服务器也提供站点服务。
我们先来分析一下,如果添加主服务器到upstream中,那么可能会有以下两种情况发生:
1、主服务器转发到了其它IP上,其它IP服务器正常处理;
2、主服务器转发到了自己IP上,然后又进到主服务器分配IP那里,假如一直分配到本机,则会造成一个死循环。
怎么解决这个问题呢?因为80端口已经用来监听负载均衡的处理,那么本服务器上就不能再使用80端口来处理a.com的访问请求,得用一个新的。于是我们把主服务器的nginx.conf加入以下一段代码:
server{ listen 8080; server_name a.com; index index.html; root /data0/htdocs/www; }
重启nginx,在浏览器输入a.com:8080试试看能不能访问。结果可以正常访问
既然能正常访问,那么我们就可以把主服务器添加到upstream中,但是端口要改一下,如下代码:
upstream a.com { server 192.168.5.126:80; server 192.168.5.27:80; server 127.0.0.1:8080; }
由于这里可以添加主服务器IP192.168.5.149或者127.0.0.1均可以,都表示访问自己。
重启Nginx,然后再来访问a.com看看会不会分配到主服务器上。
主服务器也能正常加入服务了。
最后
一、负载均衡不是nginx独有,著名鼎鼎的apache也有,但性能可能不如nginx。
二、多台服务器提供服务,但域名只解析到主服务器,而真正的服务器IP不会被ping下即可获得,增加一定安全性。
三、upstream里的IP不一定是内网,外网IP也可以。不过经典的案例是,局域网中某台IP暴露在外网下,域名直接解析到此IP。然后又这台主服务器转发到内网服务器IP中。
四、某台服务器宕机、不会影响网站正常运行,Nginx不会把请求转发到已宕机的IP上
相关推荐:
php面试题五之nginx如何调用php和php-fpm的作用和工作原理
위 내용은 PHP 인터뷰 질문 7: nginx 로드 밸런싱을 구성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

phpsession 실패 이유에는 구성 오류, 쿠키 문제 및 세션 만료가 포함됩니다. 1. 구성 오류 : 올바른 세션을 확인하고 설정합니다. 2. 쿠키 문제 : 쿠키가 올바르게 설정되어 있는지 확인하십시오. 3. 세션 만료 : 세션 시간을 연장하기 위해 세션을 조정합니다 .GC_MAXLIFETIME 값을 조정하십시오.

PHP에서 세션 문제를 디버그하는 방법 : 1. 세션이 올바르게 시작되었는지 확인하십시오. 2. 세션 ID의 전달을 확인하십시오. 3. 세션 데이터의 저장 및 읽기를 확인하십시오. 4. 서버 구성을 확인하십시오. 세션 ID 및 데이터를 출력, 세션 파일 컨텐츠보기 등을 통해 세션 관련 문제를 효과적으로 진단하고 해결할 수 있습니다.

Session_Start ()로 여러 통화를하면 경고 메시지와 가능한 데이터 덮어 쓰기가 발생합니다. 1) PHP는 세션이 시작되었다는 경고를 발행합니다. 2) 세션 데이터의 예상치 못한 덮어 쓰기를 유발할 수 있습니다. 3) Session_status ()를 사용하여 반복 통화를 피하기 위해 세션 상태를 확인하십시오.

SESSION.GC_MAXLIFETIME 및 SESSION.COOKIE_LIFETIME을 설정하여 PHP에서 세션 수명을 구성 할 수 있습니다. 1) SESSION.GC_MAXLIFETIME 서버 측 세션 데이터의 생존 시간을 제어합니다. 2) 세션 .Cookie_Lifetime 클라이언트 쿠키의 수명주기를 제어합니다. 0으로 설정하면 브라우저가 닫히면 쿠키가 만료됩니다.

데이터베이스 스토리지 세션 사용의 주요 장점에는 지속성, 확장 성 및 보안이 포함됩니다. 1. 지속성 : 서버가 다시 시작 되더라도 세션 데이터는 변경되지 않아도됩니다. 2. 확장 성 : 분산 시스템에 적용하여 세션 데이터가 여러 서버간에 동기화되도록합니다. 3. 보안 : 데이터베이스는 민감한 정보를 보호하기 위해 암호화 된 스토리지를 제공합니다.

SessionHandlerInterface 인터페이스를 구현하여 PHP에서 사용자 정의 세션 처리 구현을 수행 할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 1) CustomsessionHandler와 같은 SessionHandlerInterface를 구현하는 클래스 만들기; 2) 인터페이스의 방법 (예 : Open, Close, Read, Write, Despare, GC)의 수명주기 및 세션 데이터의 저장 방법을 정의하기 위해 방법을 다시 작성합니다. 3) PHP 스크립트에 사용자 정의 세션 프로세서를 등록하고 세션을 시작하십시오. 이를 통해 MySQL 및 Redis와 같은 미디어에 데이터를 저장하여 성능, 보안 및 확장 성을 향상시킬 수 있습니다.

SessionId는 웹 애플리케이션에 사용되는 메커니즘으로 사용자 세션 상태를 추적합니다. 1. 사용자와 서버 간의 여러 상호 작용 중에 사용자의 신원 정보를 유지하는 데 사용되는 무작위로 생성 된 문자열입니다. 2. 서버는 쿠키 또는 URL 매개 변수를 통해 클라이언트로 생성하여 보낸다. 3. 생성은 일반적으로 임의의 알고리즘을 사용하여 독창성과 예측 불가능 성을 보장합니다. 4. 실제 개발에서 Redis와 같은 메모리 내 데이터베이스를 사용하여 세션 데이터를 저장하여 성능 및 보안을 향상시킬 수 있습니다.

JWT 또는 쿠키를 사용하여 API와 같은 무국적 환경에서 세션을 관리 할 수 있습니다. 1. JWT는 무국적자 및 확장 성에 적합하지만 빅 데이터와 관련하여 크기가 크다. 2. 쿠키는보다 전통적이고 구현하기 쉽지만 보안을 보장하기 위해주의해서 구성해야합니다.


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Dreamweaver Mac版
시각적 웹 개발 도구

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

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

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