HTTP 500 문제를 해결하는 방법: 실제 프로젝트에서 php+redis 관련 내부 서버 오류
사용자 수가 급격히 늘어나고, 빠른 시간 내에 방문 횟수도 두 배로 늘어났습니다. 초기 용량 계획이 좋았기 때문에 하드웨어 자원으로는 지원할 수 있지만 소프트웨어 시스템에는 큰 문제가 있습니다: 40. 요청 중 %가 HTTP 500을 반환합니다: 내부 서버 오류
문제 설명
사용자 수가 빠르게 증가하고 있으며, 초기 용량 계획이 잘 되어 있어 방문 횟수가 단기간에 두 배로 늘어났습니다. 하드웨어 리소스에서는 지원할 수 있지만 소프트웨어 시스템에는 큰 문제가 있습니다.
요청의 40%가 Return HTTP 500: Internal Server Error
로그를 확인해보니 해당 오류가 PHP의 연결 처리에 있는 것으로 나타났습니다. <-> Redis
디버깅 처리
처음
처음에는 근본 원인을 찾을 수 없었으나, 다음과 같은 다양한 오류 관련 방법을 시도해 볼 수 있습니다.
PHP 연결 수를 늘리고 시간 제한을 500ms에서 2.5초로 늘립니다.
PHP 설정에서 default_socket_timeout을 비활성화합니다.
호스트 시스템에서 SYN 쿠키를 비활성화합니다.
Redis 및 웹 서버 확인 파일 설명자 수를 확인합니다. 호스트 시스템의 mbbuffer를 늘립니다.
TCP 백로그 수를 조정합니다
.. .
두 번째이 문제를 시험판 환경에서 재현하고 싶지만 안타깝게도 여전히 실패했습니다. 아마도 트래픽이 재현할 만큼 크지 않기 때문일 것입니다
세 번째 코드에서 Redis 연결이 닫히지 않은 것은 아닐까요?
일반적으로 PHP는 실행이 끝나면 자동으로 리소스 연결을 닫지만 이전 버전에서는 메모리 누수가 발생할 수 있습니다. 안전을 위해 코드를 수정하고 연결을 수동으로 닫으세요
결과는 여전히 유효하지 않습니다
4번째 의심 대상: phpredis 클라이언트 라이브러리
A/B 테스트를 하고, predis 라이브러리를 교체하고, 데이터센터 사용자의 20%에게 배포합니다.
코드 구조가 좋아서 교체 작업이 완료되었습니다. 빨리
결과가 나왔습니다. 아직은 유효하지 않지만 좋은 면이 있습니다. phpredis
5번째Redis 버전을 확인해 보니 v2.6이더군요. 당시 버전은 v2.8.9
Redis를 업그레이드하고 시도해 보세요. 업그레이드 후에도 여전히 작동하지 않습니다
괜찮아요. 낙관적으로 생각하세요. Redis 버전을 최신 버전으로 업그레이드하는 방법은 아닙니다
6번째문서를 많이 검색해서 공식 문서인 Redis Software Watchdog에서 좋은 디버깅 방법을 찾았고, 개봉 후 실행:
$ redis-cli --latency -p 6380 -h 1.2.3.4 min: 0, max: 463, avg: 2.03 (19443 samples)
... [20398] 22 May 09:20:55.351 * 10000 changes in 60 seconds. Saving... [20398] 22 May 09:20:55.759 * Background saving started by pid 41941 [41941] 22 May 09:22:48.197 * DB saved on disk [20398] 22 May 09:22:49.321 * Background saving terminated with success [20398] 22 May 09:25:23.299 * 10000 changes in 60 seconds. Saving... [20398] 22 May 09:25:23.644 * Background saving started by pid 42027 ...
몇 분마다 데이터를 하드 디스크에 저장합니다. 백그라운드 저장소를 분기하는 데 약 400ms가 걸리는 이유는 무엇입니까? (위 로그에서 첫 번째 및 두 번째 항목의 시간을 볼 수 있습니다.)
7번째
가능한 문제 해결 Redis의 느린 쿼리를 차단하면 어딘가에 * 키가 사용되는 것으로 나타났기 때문입니다. Redis에 점점 더 많은 데이터가 있으면 이 명령은 자연스럽게 심각한 차단을 발생시킵니다.
8번째
이전 조정 후 문제는 다음 달에도 해결되었습니다. 트래픽이 계속 증가하면 견딜 수 있었습니다
그러나 그들은 새로운 문제를 깨달았습니다.
현재 방법은 요청이 오면 Redis 연결을 만들고 여러 명령을 실행한 다음 요청 볼륨이 끊어지면 연결을 끊는 것입니다. 규모가 크므로 이 방법은 심각한 성능 낭비를 초래합니다. 명령의 절반 이상이 연결 작업을 처리하는 데 사용되어 비즈니스 논리 처리를 초과하고 Redis도 느려지게 합니다.
해결책: Twitter의 twemproxy를 도입했습니다. 각 웹 서버에 프록시만 설치하면 됩니다. twemproxy는 Redis 인스턴스와의 지속적인 연결을 담당하므로 연결 작업이 크게 줄어듭니다. 키, 플러시올 등의 명령효과는 자연스럽게 완벽하여 더 이상 이전 연결 오류에 대해 걱정할 필요가 없습니다
일관된 해시 동일한 컨텍스트에서 데이터 샤딩
효과: 각 머신의 요청 및 부하 감소 캐시 신뢰성 향상 안전성, 노드 장애에 대해 걱정할 필요 없음
위 내용은 이 기사의 전체 내용이므로 도움이 되기를 바랍니다. 모두의 배움에.
관련 권장 사항:
redis
method
에 존재하지 않는 6자리 난수를 얻는 PHP 방법
redis메시지 대기열 게시 Weibo 방식의 PHP 구현
CI 프레임워크(CodeIgniter) 작업 redis단계 분석
위 내용은 HTTP 500 문제를 해결하는 방법: 실제 프로젝트에서 php+redis 관련 내부 서버 오류의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

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

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

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

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

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

뜨거운 주제











HTTP 상태 코드 520은 서버가 요청을 처리하는 동안 알 수 없는 오류가 발생하여 더 구체적인 정보를 제공할 수 없음을 의미합니다. 서버가 요청을 처리하는 동안 알 수 없는 오류가 발생했음을 나타내는 데 사용됩니다. 이는 서버 구성 문제, 네트워크 문제 또는 기타 알 수 없는 이유로 인해 발생할 수 있습니다. 이는 일반적으로 서버 구성 문제, 네트워크 문제, 서버 과부하 또는 코딩 오류로 인해 발생합니다. 상태 코드 520 오류가 발생하면 웹사이트 관리자나 기술 지원팀에 문의하여 자세한 정보와 지원을 받는 것이 가장 좋습니다.

HTTP 상태 코드 403은 서버가 클라이언트의 요청을 거부했음을 의미합니다. http 상태 코드 403에 대한 해결 방법은 다음과 같습니다. 1. 서버에 인증이 필요한 경우 올바른 자격 증명이 제공되었는지 확인합니다. 2. 서버가 IP 주소를 제한한 경우 클라이언트의 IP 주소가 제한되어 있거나 블랙리스트에 없습니다. 3. 파일 권한 설정을 확인하십시오. 403 상태 코드가 파일 또는 디렉토리의 권한 설정과 관련되어 있으면 클라이언트가 해당 파일 또는 디렉토리에 액세스할 수 있는 권한이 있는지 확인하십시오. 등.

HTTP 301 상태 코드의 의미 이해: 웹 페이지 리디렉션의 일반적인 응용 시나리오 인터넷의 급속한 발전으로 인해 사람들은 웹 페이지 상호 작용에 대한 요구 사항이 점점 더 높아지고 있습니다. 웹 디자인 분야에서 웹 페이지 리디렉션은 HTTP 301 상태 코드를 통해 구현되는 일반적이고 중요한 기술입니다. 이 기사에서는 HTTP 301 상태 코드의 의미와 웹 페이지 리디렉션의 일반적인 응용 프로그램 시나리오를 살펴봅니다. HTTP301 상태 코드는 영구 리디렉션(PermanentRedirect)을 나타냅니다. 서버가 클라이언트의 정보를 받을 때

NginxProxyManager를 사용하여 HTTP에서 HTTPS로의 자동 점프를 구현하는 방법 인터넷이 발전하면서 점점 더 많은 웹사이트가 HTTPS 프로토콜을 사용하여 데이터 전송을 암호화하여 데이터 보안과 사용자 개인 정보 보호를 향상시키기 시작했습니다. HTTPS 프로토콜에는 SSL 인증서 지원이 필요하므로 HTTPS 프로토콜 배포 시 특정 기술 지원이 필요합니다. Nginx는 강력하고 일반적으로 사용되는 HTTP 서버 및 역방향 프록시 서버이며 NginxProxy

HTTP 상태 코드 200: 성공적인 응답의 의미와 목적 탐색 HTTP 상태 코드는 서버 응답 상태를 나타내는 데 사용되는 숫자 코드입니다. 그 중 상태 코드 200은 요청이 서버에 의해 성공적으로 처리되었음을 나타냅니다. 이 기사에서는 HTTP 상태 코드 200의 구체적인 의미와 사용법을 살펴보겠습니다. 먼저 HTTP 상태 코드의 분류를 이해해 보겠습니다. 상태 코드는 1xx, 2xx, 3xx, 4xx 및 5xx의 다섯 가지 범주로 나뉩니다. 그 중 2xx는 성공적인 응답을 나타냅니다. 그리고 200은 2xx에서 가장 일반적인 상태 코드입니다.

http.PostForm 함수를 사용하여 양식 데이터와 함께 POST 요청을 보낼 수 있습니다. Go 언어의 http 패키지에서는 http.PostForm 함수를 사용하여 양식 데이터와 함께 POST 요청을 보낼 수 있습니다. http.PostForm 함수의 프로토타입은 다음과 같습니다: funcPostForm(urlstring,dataurl.Values)(resp*http.Response,errerror)where, u

빠른 적용: PHP의 실제 개발 사례 분석 여러 파일의 비동기 HTTP 다운로드 인터넷의 발전으로 파일 다운로드 기능은 많은 웹 사이트와 응용 프로그램의 기본 요구 사항 중 하나가 되었습니다. 여러 파일을 동시에 다운로드해야 하는 시나리오의 경우 기존 동기 다운로드 방법은 비효율적이고 시간이 많이 걸리는 경우가 많습니다. 이러한 이유로 PHP를 사용하여 HTTP를 통해 여러 파일을 비동기적으로 다운로드하는 것이 점점 더 일반적인 솔루션이 되었습니다. 본 글에서는 실제 개발 사례를 통해 PHP 비동기 HTTP를 활용하는 방법을 자세히 분석해 보겠습니다.

C#의 일반적인 네트워크 통신 및 보안 문제와 해결 방법 오늘날 인터넷 시대에 네트워크 통신은 소프트웨어 개발에 없어서는 안 될 부분이 되었습니다. C#에서는 일반적으로 데이터 전송 보안, 네트워크 연결 안정성 등과 같은 일부 네트워크 통신 문제가 발생합니다. 이 문서에서는 C#의 일반적인 네트워크 통신 및 보안 문제에 대해 자세히 설명하고 해당 솔루션과 코드 예제를 제공합니다. 1. 네트워크 통신 문제 네트워크 연결 중단: 네트워크 통신 과정에서 네트워크 연결이 중단될 수 있으며, 이로 인해
