>  기사  >  백엔드 개발  >  PHP에서 로드 밸런싱을 달성하는 방법은 무엇입니까? PHP 로드 밸런싱 예시(코드)

PHP에서 로드 밸런싱을 달성하는 방법은 무엇입니까? PHP 로드 밸런싱 예시(코드)

不言
不言원래의
2018-07-25 15:56:1713489검색

PHP에서 로드 밸런싱을 구현하는 방법은 다양합니다. 여기서는 PHP 로드 밸런싱을 소개하겠습니다. 이제 PHP 로드 밸런싱 구현을 직접 살펴보겠습니다.

1. PHP 파일

첫 번째 질문은, 소규모 서버가 많은 경우 PHP 파일을 모든 서버에 어떻게 업로드합니까? 참고할 수 있는 방법은 다음과 같습니다.

1. 모든 파일을 각 서버에 개별적으로 업로드합니다. 이 방법의 문제점은 20개의 서버가 있다고 가정하면 업로드 프로세스 중에 쉽게 오류가 발생할 수 있다는 것입니다. , 다른 서버에 다른 버전의 파일이 있을 가능성이 매우 높습니다.
2. 'rsync'(또는 유사한 소프트웨어)를 사용하세요. 이러한 도구는 로컬 디렉터리와 여러 원격 호스트 디렉터리에 있는 파일을 동기화할 수 있습니다.
3. 버전 제어 소프트웨어(예: Subversion)를 사용합니다. 이를 통해 코드를 매우 잘 유지 관리할 수 있으며 애플리케이션을 게시할 때 각 서버에서 svnupdate 명령을 실행하여 동기화할 수 있습니다. 또한 이 접근 방식을 사용하면 서버를 이전 버전의 코드로 전환하는 것이 더 쉬워집니다.
4. 파일 서버를 사용합니다(NFS가 이에 매우 적합할 수 있음). 물론 파일 서버가 다운되면 사이트가 모두 손상될 수 있습니다. 없는. 이때 복원하려면 더 많은 비용을 지출해야 합니다.

어떤 방법을 선택하느냐는 귀하의 필요와 귀하가 보유한 기술에 따라 다릅니다. 버전 제어 시스템을 사용하는 경우 업데이트 명령을 동시에 실행하여 모든 서버의 코드를 업데이트하는 방법을 계획할 수 있습니다. 그러나 파일 서버를 사용하는 경우 서버가 다운되는 경우 요청 실패를 방지하기 위해 일부 오류 복구 메커니즘을 구현해야 합니다.

2. 파일 업로드

서버가 하나만 있는 경우 파일 업로드는 문제가 되지 않습니다. 하지만 서버가 여러 개인 경우 업로드된 파일을 어떻게 저장해야 할까요? 파일 업로드 문제는 서버 간 PHP 파일 저장과 유사합니다. 가능한 해결 방법은 다음과 같습니다.
1. 파일을 데이터베이스에 저장합니다.

대부분의 데이터는 바이너리 데이터를 저장할 수 있습니다. 파일 다운로드를 요청하면 액세스 데이터는 바이너리 데이터와 해당 파일 이름 및 유형을 사용자에게 출력합니다. 이 솔루션을 사용하기 전에 데이터베이스가 파일을 저장하는 방법을 고려해야 합니다. 이 접근 방식의 문제점은 데이터베이스 서버가 다운되면 파일을 사용할 수 없게 된다는 것입니다.

2. 업로드된 파일을 파일 서버에 저장합니다.

앞서 소개와 마찬가지로 모든 웹 서버가 공유할 수 있는 파일 서버를 설치해야 하며, 업로드된 모든 파일은 여기에 업로드됩니다. 그것을 사용하십시오. 단, 파일 서버가 다운되면 이미지 파일 다운로드가 중단될 수 있습니다.

3. 각 서버에 파일을 전송하는 고유한 업로드 메커니즘을 설계하세요.

이 방법에는 단일 파일 서버나 데이터베이스 솔루션의 단점이 없지만 코드가 더 복잡해집니다. 예를 들어, 여러 서버에 업로드하는 동안 서버가 다운되면 어떻게 해야 합니까?

데이터베이스를 사용하여 업로드된 파일을 저장하지만 파일 캐싱 메커니즘을 설계하는 것이 좋은 솔루션입니다. 서버는 파일 다운로드 요청을 받으면 먼저 해당 파일이 캐시 시스템에 있는지 확인하고, 발견되면 캐시 시스템에서 해당 파일을 다운로드하여 파일 시스템에 캐시합니다.

3. Sessions

PHP의 세션 처리에 익숙하신 분이라면 기본적으로 세션 데이터를 서버의 임시 파일에 저장한다는 사실을 아실 것입니다. 또한 이 파일은 요청한 서버에만 있지만 후속 요청은 다른 서버에서 처리될 수 있으며 이로 인해 다른 서버에서 새 세션이 생성됩니다. 이로 인해 로그인한 사용자에게 항상 다시 로그인하라는 메시지가 표시되는 등 세션이 자주 인식되지 않습니다.

제가 추천하는 해결책은 PHP에 내장된 세션 처리 메커니즘을 재사용하여 세션 데이터를 데이터베이스에 저장하거나 자체 메커니즘을 구현하여 사용자의 요청이 동일한 서버로 전송되도록 하는 것입니다.

4. 구성

이 주제는 특별히 PHP와 관련이 없지만 언급할 필요가 있다고 생각합니다. 클러스터된 서버를 실행할 때 서버 간에 구성 파일을 동기화 상태로 유지하는 방법을 갖는 것이 좋습니다. 구성 파일이 일관되지 않으면 문제 해결이 어려울 수 있는 매우 이상하고 간헐적인 동작이 발생할 수 있습니다.

버전 관리 시스템을 이용하여 개별적으로 관리하는 것을 권장합니다. 이렇게 하면 다양한 프로젝트 설치에 대해 다양한 PHP 구성 파일을 저장할 수 있고 모든 서버 구성 파일을 동기화 상태로 유지할 수도 있습니다.

5. 로깅

구성 문제와 마찬가지로 로깅도 PHP에만 관련된 것이 아닙니다. 하지만 서버를 건강하게 유지하는 것은 여전히 ​​매우 중요합니다. 적절한 로깅 시스템이 없으면 PHP 코드가 오류를 생성하기 시작하는지 어떻게 알 수 있습니까? (시스템이 공식적으로 실행될 때 항상 display_errors 설정을 끄지 않습니까?)

로깅을 구현할 수 있는 몇 가지 방법이 있습니다:

1. 각 서버에 로그를 기록합니다. 이것이 가장 간단한 방법입니다. 각 시스템은 하나의 파일만 기록합니다. 장점은 간단하고 구성이 거의 필요하지 않다는 것입니다. 그러나 서버 수가 증가함에 따라 각 서버의 로그 파일을 모니터링하는 것이 매우 어려워집니다.
2. 공유에 로그 이 접근 방식은 각 서버에 로그 파일을 유지하지만 공유 메커니즘을 통해 중앙 파일 서버에 저장되므로 로그 모니터링이 훨씬 간단해집니다. 이 솔루션의 문제점은 파일 서버를 사용할 수 없는 경우 간단한 로그 쓰기 문제로 인해 결국 전체 애플리케이션이 중단된다는 것입니다.
3. 로그를 로깅 서버에 기록합니다. syslog와 같은 로깅 소프트웨어를 사용하여 모든 로그를 중앙 서버에 기록할 수 있습니다. 이 방법에는 더 많은 구성이 필요하지만 가장 강력한 솔루션도 제공합니다.

php 로드 밸런싱 인스턴스

로드 밸런싱을 사용하려면 구성 http 노드를 다음과 같이 수정하면 됩니다.

#设定http服务器,利用它的反向代理功能提供负载均衡支持
            http {
            #设定mime类型,类型由mime.type文件定义
            include       /etc/nginx/mime.types;
            default_type  application/octet-stream;
            #设定日志格式
            access_log    /var/log/nginx/access.log;
#省略上文有的一些配置节点
#。。。。。。。。。。
#设定负载均衡的服务器列表
            upstream mysvr {
            #weigth参数表示权值,权值越高被分配到的几率越大
            server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口
            server 192.168.8.2x:80  weight=1;
            server 192.168.8.3x:80  weight=6;
            }
upstream mysvr2 {
            #weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.8.x:80  weight=1;
            server 192.168.8.x:80  weight=6;
            }
#第一个虚拟服务器
            server {
            #侦听192.168.8.x的80端口
            listen       80;
            server_name  192.168.8.x;
#对aspx后缀的进行负载均衡请求
            location ~ .*\.aspx$ {
root   /root;      #定义服务器的默认网站根目录位置
            index index.php index.html index.htm;   #定义首页索引文件的名称
proxy_pass  http://mysvr ;#请求转向mysvr 定义的服务器列表
#以下是一些反向代理的配置可删除.
proxy_redirect off;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size 10m;    #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;  #缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90;  #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;        #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;         #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;             #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;  #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
}

관련 권장 사항:

PHP 로드 밸런싱에서 세션 공유 사례에 대한 자세한 설명(코드 포함)

위 내용은 PHP에서 로드 밸런싱을 달성하는 방법은 무엇입니까? PHP 로드 밸런싱 예시(코드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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