Apache에서 동시 연결을 늘리는 방법

오늘 저는 세계에서 가장 많이 사용되는 웹 서비스 중 하나 인 웹 서버에 대해 다시 한 번 말씀 드리겠습니다. Apache2.

여러 번 언급 된 주제이지만 이제는이 서비스에서 고려해야 할 또 다른 기능에 대해 알려 드리겠습니다. 동시 연결 제한. i7 프로세서와 32GB의 램을 갖춘 매우 기본적인 우주선이든 우주선이든 상관 없습니다.

동시 연결 제한은 적절한 조치를 취하지 않는 한 항상 동일합니다. 즉, 동시에 많은 사람을 연결하려면 좋은 하드웨어뿐만 아니라 좋은 구성도 필요합니다.

이 경우 아무것도 설치할 필요가 없으며 모든 것은 아파치를 구성하기 위해 고려해야하는 간단한 개념을 기반으로합니다. 변경하기 전에 매우 명확해야하는 개념입니다.

아파치2_로고

가장 먼저 고려해야 할 사항은 다음과 같습니다. 우리 팀의 역량은 얼마입니까? 가능한 한 강제로 사용하면 내 장비가 몇 개의 동시 연결을 지원할 수 있습니까? 이 모든 것은 단일 요인에 달려 있습니다. RAM (랜덤 액세스 메모리).

RAM이 클수록 연결 수가 많아 지지만 고정 된 값 (즉, 각 X RAM에 대한 X 클라이언트)이 없기 때문에 먼저 웹 서버에서 몇 가지 작은 계산을 수행하는 것이 중요합니다. 우리의 한계를 알기 위해.

가장 먼저 알아야 할 것은 Apache에 대한 각 연결이 평균적으로 얼마나 많은 RAM을 소비하는지입니다. 각 연결이 시스템에서 특정 RAM을 소비한다고 가정하기 때문입니다 ... 분명히 모든 연결이 동일한 RAM을 소비하는 것은 아닙니다. 미디어 ...이 모든 것은 다음 명령으로 얻을 수 있습니다.

ps -ylC apache2-정렬 : rss | awk '{SUM + = $ 8; I + = 1} END {print SUM / I / 1024} '

얻은 결과는 메가 바이트로 표시되며 활성 연결 수, 액세스 된 페이지 유형 등에 따라 달라질 수 있습니다. 따라서 다른 탭을 열어 테스트를 수행하는 것이 좋습니다. 가능한 경우 각각 다른 내용을 보여줍니다. 예를 들어, 제 경우에는 결과가 9.5458이었는데,이를 맨 위로 반올림하면 10 MB 연결 당 평균 소비 된 RAM.

웹 서비스가 운영 체제에서 실행되는 유일한 서비스가 아니기 때문에 시스템에서 활성 상태 인 나머지 프로세스가 얼마나 많은 RAM을 소비하는지 아는 것도 중요합니다. 나머지 작업을 실행할 수 있습니다. 이것은 아래에 표시된 명령으로 얻을 수 있습니다.

ps -N -ylC apache2-정렬 : rss | awk '{SUM + = $ 8} END {print SUM / 1024}'

얻은 결과는 메가 바이트 단위로도 표시되며 나머지 프로세스에서 소비하는 RAM의 양을 매우 정확하게 보여줍니다. 나의 경우에는 800 MB. 이 정보를 사용하여 우리가 가질 수있는 동시 연결 수를 일반 계산할 수 있습니다. 나는 우리가 아주 간단한 조작으로 얻을 것이라고 계산한다.

(RAMTOTAL-RAM_RESTOPROCESOS) / RAM_POR_CONNEXIÓN

이 공식을 사용하여 4GB RAM, 즉 4096MB의 컴퓨터가 있고 컴퓨터가 앞서 언급 한 결과를 보여 주었다고 가정 해 봅시다. 계산은 다음과 같습니다.

(4096-800) / 10 = 329 동시 연결

이 계산의 문제는 하나가 모든 RAM을 소비하고 (서버가 스왑을 소비하게 함) 너무 극단적이라는 것입니다. 또한 MySQL이나 다른 데이터베이스가있는 경우 연결도 소비하게됩니다. 그래서 얻은 숫자는 유토피아 숫자로 한정 될 수 있습니다. 따라서 가능한 추가 프로세스를 위해 메모리를 확보하고 데이터베이스에 대한 연결이 실행될 가능성도 고려하기 위해 연결 수를 줄입니다. 250.

이제 최대 동시 연결 수를 얻었으므로이 호출의 구성 파일에서 수행되는이 수를 수신 할 수 있도록 Apache를 준비해야합니다. apache2.conf에서 호스팅됩니다. / etc / apache2.

문제의 파일은 다음을 기반으로 한 구조를 따릅니다. 모듈, 각각 해당 이름이 있지만 이름이 다음 중 하나에 만 관심이 있습니다.  mpm_prefork_module. 문제의 모듈에는 기본적으로 다음 데이터가 있습니다.

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0

이 모듈에는 매우 중요한 일련의 매개 변수가 있지만 특히 관심을 가질만한 매개 변수 중 하나가 있습니다. MaxClients 지시어. 이 매개 변수는 최대 동시 연결 수를 지정하며 다음과 같이 수정해야합니다. 250.

고려해야 할 한 가지 세부 사항은 해당 매개 변수에 기본값 이외의 값이 지정 될 때이 매개 변수 바로 앞에 다른 값을 추가해야한다는 것입니다. 이 매개 변수는 ServerLimit 한계를 벗어난 경우에도 서버가 "유지"할 수있는 연결 한계를 설정합니다.

ServerLimit 매개 변수는 항상 MaxClients보다 약간 높아야합니다. 여기에서는 조작 할 여지가 거의 없기 때문에 270. 그러면 모듈이 다음과 같이 표시됩니다.

StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 270 MaxClients 250 MaxRequestsPerChild 0

이제 다음 명령을 사용하여 Apache 서비스를 다시 시작하기 만하면됩니다. 

/etc/init.d/apache2 다시 시작

이것으로 우리는 이미 최적화 된 웹 서버를 즐길 수있었습니다.

인사말.


기사의 내용은 우리의 원칙을 준수합니다. 편집 윤리. 오류를보고하려면 여기에.

21 코멘트, 당신의 것을 남겨주세요

코멘트를 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필수 필드가 표시되어 있습니다 *

*

*

  1. 데이터 책임자 : Miguel Ángel Gatón
  2. 데이터의 목적 : 스팸 제어, 댓글 관리.
  3. 합법성 : 귀하의 동의
  4. 데이터 전달 : 법적 의무에 의한 경우를 제외하고 데이터는 제 XNUMX 자에게 전달되지 않습니다.
  5. 데이터 저장소 : Occentus Networks (EU)에서 호스팅하는 데이터베이스
  6. 권리 : 귀하는 언제든지 귀하의 정보를 제한, 복구 및 삭제할 수 있습니다.

  1.   제타 티노

    게시물 주셔서 감사합니다!

    1.    드라 실

      유용하다고 생각해서 다행입니다.

      인사말.

  2.   미구엘 엔젤

    Apache와 두 대의 서버로 클러스터링하는 방법이 있습니다. 어떻게 작동하는지 설명해 주시겠습니까?

    1.    드라 실

      나는 그것에 대한 이론을 읽었지만 그것을 실천에 적용한 적이 없습니다. 그래도이 기사는이 점에 대해 몇 가지 지침을 제공 할 수 있습니다. 비록 제가 그것을 실제로 적용 할 기회가 없었 음을 반복합니다.

      http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/

    2.    에두아르도 잘릴

      해결하지 않았다면 오랫동안 요청했습니다. 파일 시스템 역할을하는 타사와 균형을 이루는 체계가 있고 var / www / html / (제 경우에는)에있는 폴더를 파일 시스템으로 지정하여 동일한 정보를 공유합니다. 응답하고 아파치의 ip로 리디렉션하는 가상 ip가 필요합니다. 응용 프로그램에 대한 도메인, 당신은 두 서버에 백엔드를 수행하는 파운드와 균형을 맞출 수 있습니다. 무들 또는 mysql의 데이터베이스에 연결하는 특정 응용 프로그램과 같은 특정 경우에는 동일한 데이터베이스를 가리키는 앱 서버별로 사용자를 만들어야합니다. .

  3.   샤 마루

    게시물에 대해 대단히 감사합니다. 절대적으로 옳습니다. 램이 기본 계산이지만 프로세서가 처리 할 수있는 최대 프로세스 수를 계산한다고 상상합니다 (물론 먼저 주 메모리 계산을 수행합니다) 디스크가 하드 배포되는 방법 (예 : 파티션 / var = 1TR).

    1.    드라 실

      네가 옳아; 무엇보다도 온도 제어와 같은 모든 것이 중요합니다. 분명히 강력한 프로세서는 더 많은 작업을 동시에 큰 효율성으로 실행할 수 있지만이 게시물의 목적은 동시 연결 수와 관련하여 RAM의 중요성을 설명하는 것이 었습니다.

      이러한 모든 요소를 ​​제어하고 프로세서가 포화 상태가 아닌지 또는 여유 RAM이 거의 없는지 확인하는 좋은 방법은 bash 스크립트를 사용하는 것입니다. 아마도 며칠 전에 내가 작성한이 게시물이 여러분에게 흥미로울 것입니다. 다음 링크에 남겨 둡니다. 글로벌 모니터링이지만 누군가에게는 흥미로울 수 있습니다.

      http://bytelearning.blogspot.com.es/2015/07/controlando-la-salud-del-equipo-con-bash.html

      안부

  4.   세르지오 S

    아주 좋은 메모, 대단히 감사합니다!

    1.    드라 실

      감사합니다! 나는 당신이 그것을 활용할 수 있기를 바랍니다.

  5.   어릿광대

    나는 바보가되고 싶지 않다 ...
    …하지만 연결 수를 늘림으로써 DDoS 공격에 더 취약하지 않게 하시겠습니까?

    1.    드라 실

      조용한 크레 틴 질문이 아닙니다. 진실은 동시 연결 수를 늘림으로써 DDOS 공격에 대해 Apache를 부분적으로 강화한다는 것입니다. 왜냐하면 서버에 설정된 최대 동시 연결 수가 서버에서 오는 연결이 아니라 총 최대 연결 수라는 점을 고려해야하기 때문입니다. 단일 사용자. 따라서 처음에는 150 개의 동시 연결 만 지원할 수 있었지만 (적법한 소스의 연결이든 아니든) 이제 서버가 지원하는만큼 많은 연결을 사용할 수 있습니다. 서비스. 분명히 최대 연결 수를 늘리는 것은 이러한 유형의 공격으로부터 자신을 보호하는 방법이 아니라 방화벽 정책을 구현해야합니다. 예를 들어 배치하려는 웹 서비스가 인터넷에 노출 될 경우 구현할 수있는 보안 조치는 방화벽에 다음 행을 추가하는 것입니다.

      iptables -A INPUT -p tcp -syn -dport 80 -m connlimit -connlimit-최대 10 -m state -state NEW -j ACCEPT

      iptables -A INPUT -p tcp –dport 80 -m state –state ESTABLISHED, RELATED -j ACCEPT

      iptables -A INPUT -p tcp -dport 80 -j DROP

      1.    어릿 광대

        DDoS 공격의 특징 중 하나는 공격자가 여러 방향에서 패킷을 보내는 것처럼 보일 수있어 패킷 흐름이 한 방향에서만 들어오는 것을 방지한다는 것입니다.

    2.    드라 실

      내가 설정 한 방화벽과 같은 방화벽은 DDOS 공격에 대해 그다지 효율적이지 않다는 점에서 맞습니다. 다른 소스에서 비롯되기 때문입니다. 그러나 이러한 소스 각각에 대해 연결 수를 제한하지 않는 것보다 10 개로 제한하여 각 소스가 XNUMX 개 이상의 연결을 설정할 수 있도록하는 것이 좋습니다.

      어쨌든 문제의 키트는 서버가 지원하는 동시 연결 수가 많을수록 DDOS 공격으로 연결이 더 어려워 져 공격자가 페이지를 무너 뜨리는 것이 더 어려워진다는 것입니다. .

      인사말.

  6.   엘리오타임3000

    좋은. 지금은 보유한 VPS를 고문하지 않기 위해 내 사이트에서 NGINX를 계속 사용합니다.

  7.   브루노 카시오

    좋은 게시물 @Drassill!

    나는 아마도 구성보다 더 통계적인 것을 기여하고 싶었다.
    소비 매개 변수를 계산하는 가장 쉽고 빠른 방법은 평균을 사용하는 것이지만 더 엄격하게 "평균"대신 "중간 값"을 사용할 수 있습니다. 무엇이 우리를 구할까요? 연결이 많은 메모리를 소비 한 경우 숫자가 증가합니다. 예를 들어, 원하는 메모리 단위 (KB, MB, MiB 등)로 다음 값을 사용하는 다음 클라이언트가 있다고 가정합니다.

    10, 15, 150, 5, 7, 10, 11, 12

    평균은 약 ~ 30을 줄 것입니다

    그리고 이것은 우리가 매우 큰 극단 값 (150)을 가지고 있고 계산이 미쳤 기 때문입니다. 중앙값은 이러한 데이터를 정렬하고 샘플 수를 2 (우리 중심)로 나눈 다음 해당 위치의 수를 얻는 것으로 구성됩니다. 이것으로 우리는

    5, 7, 10, 10, 11, 12, 15, 150

    따라서 평균은 다음과 같습니다. 8/2 = 4 즉 ~ 10

    여기에서 극한이 아무리 미치더라도 항상 더 현실적인 가치를 제공한다는 것을 알 수 있습니다. 200을 소비하는 고객을 추가하면 중앙값은 11이되고 평균은 ……가 될 수 있습니다.

    그것은 단지 기여 일 뿐이며, 연결로 인해 망가지지 않았기 때문에 매우 논쟁의 여지가 있습니다.

    사람들 linuxera 🙂 포옹

  8.   카를로스

    안녕하세요, 제 전용 서버에 문제가 생겼는데, 구글 애널리틱스에 따르면 실시간으로 약 250 명이 온라인에 접근 할 때마다 제 서버가 무너지고 연결이 끊어 질 때까지 연결이 느려집니다 웹 사이트에 온라인 사용자 수보다 더 많은 사용자를 업로드하지 않습니다.하지만 8GB RAM 인 전용 서버의 성능을 보면 10 % 사용, CPU : 5 % 사용 및 하드 디스크 : 1.99 % 사용.
    도와주세요? 수행 할 작업을 찾을 수 없습니다.이 단계를 수행하는 것이 해결책입니까?

    1.    드라 실

      좋은 카를로스.

      설명하는 문제는 서버가 제대로 준비되지 않은 경우 매우 일반적입니다. 서버는 아마도 훨씬 적은 수의 동시 연결을 허용 할 것이며 250 개의 연결에 도달하면 충돌 할 것입니다. 매뉴얼을 따르면 문제를 해결할 수 있지만 해당 서버에 데이터베이스가있는 경우 해당 데이터베이스도 최적화해야합니다.

      인사말.

      1.    카를로스

        Drassill, 말씀 드린 구성을 완료했고 만족 스러웠습니다. 어제 280 명의 온라인 사용자에게 도달했고 서버가 중단되지 않았습니다.이 결과에 매우 만족합니다. 또한 최적화하라고 말씀하신 다른 작업도 수행하고 싶습니다. 데이터베이스, ¿ 어떻게 이것을 달성합니까?

    2.    드라 실

      데이터베이스 개념은 매우 개방적입니다. mysql을 사용하는 것은 (예를 들어) postgres와 동일하지 않습니다. 분명히 모든 데이터베이스를 알지는 못합니다. 나는 mysql과 postgres를 시도해 보았고 이것들의 동시 연결 증가는 매개 변수 max connections를 기반으로 할 것이다. mysql의 최적화는 /etc/my.conf에서 수행되며 매개 변수 max connections (다른 것들 중에서)를 변경해야합니다. 대신 postgres의 경우 블로그에 유용 할 수있는 최적화 방법을 설명하거나 데이터베이스에 대한 참조로 사용할 수있는 기사가 있습니다.

      http://bytelearning.blogspot.com.es/2016/02/postgresql-una-alternativa-mysql-en.html

      인사말.

  9.   에릭슨 바스케스

    안녕하세요, 첫 번째 명령을 던지면 0 값이 표시됩니다. 무엇일까요?

  10.   다니엘 오제 다

    이 게시물에 감사드립니다.