apache 로 접속자가 많습니다. 잠시 후에 접속해주세요~ 페이지 만들기

kunho1002의 이미지

글을 읽어주셔서 감사합니ㅏㄷ.

관리하는 서버중에, 사용자가 심하게 많을 경우, 사용자가 많으니 잠시 후에 접속하라는 안내페이지를 띠어주고 싶습니다.

http 코드가 따로 없으니, 이런저런 방법을 생각하고 있는데,

현재 실무에서는 어떻게 쓰고 계신가요?

제가 나름 짱구 굴린건, apache 컨넥션의 갯수를 특정파일에 주기적으로 넣고, 그걸 main 페이지에서 읽어서 특정조건이 될때,
미리 만들어놓은 페이지로 포워딩을 시키든가..머 그런건데,

실무에서는 다들 어떻게 쓰고 계시나요?

가르침 부탁드립니다. (__)

김정균의 이미지

제가 apache score board에서 session 수를 넣어서 503 페이지를 뜨도록 해 보았는데, 정말 사용자가 많을 경우에는 효과를 보기 어렵습니다. 왠만해서 이 기능을 꼭 구현해야 한다면 l7 swicth 쪽을 알아 보시는 것이 좋습니다. 기껏 구현해 놓고 제대로 작동하지 않는 것을 보고선 맘이 좀 많이 아팠습니다. T.T

제가 구현한 방식은, MaxClient 가 100 으로 지정을 해 놓았다면, 이 중 5개 정도를 503 page 전용으로 할당해 놓고, score board의 세션 수가 100 - 5 에 도달하면, 503 page를 display 하도록 했습니다만.. 이 5개 가지고 모자르더군요. 물론 이 수를 늘릴 수는 있습니다만, 거의 Max Client에 도달하는 경우가 DDoS 공격이 들어오거나, 게임이 죽어서 유저들이 게시판에 몰릴 경우 써먹는 형편이라, 대응이 되지를 않았습니다. 그렇다고 503에 30-40%를 할당하기도 그렇고요.

johan의 이미지

아파치는 아니지만, 우연히 저도 최근에 503 구현해야 했습니다. 제 경우는 웹서버 accept후 pool에 있는 worker에게 소켓 넘기면 해당 worker가 request처리해서 reply하는데, pool에 worker가 없는 순간(즉, 모든 worker가 바쁜 순간)에는 바로 503 되돌리고 close 하도록 했습니다. 단순히 아파치로만 그렇게 하는 것이 가능한지는 모르겠네요. 때로는 약간의 시간동안 worker를 기다려보고 타임아웃되면 503 되돌리는 것도 가능할 것 같은데 그냥 단순한 "식당" 알고리듬 썼습니다.

가용 worker가 없는 순간 request가 몰리면 503 되돌리는 것 자체가 문제가 될 수도 있지만, 503 worker 하는 일이 HTTP return code 503 셋팅하고 "Server busy" 메시지와 함께 close 해버리기 때문에 큰 문제는 없으리라고 예상합니다. 단순 테스트로 worker가 128개 일때, "ab -c 128 -n 100000 ..." 하면 한 300개 전후 503 뜨고, "-c 127" 하면 503 하나도 안뜨네요. (그런데, ab 테스트 하신다면 어떠한 네트워크 셋팅에서 어떠한 파라미터로 어떠한 결과를 예상하면서 하시는지 궁금합니다. 저는 그냥 제 기준대로 테스트 해버려서 그 테스트 자체가 의미가 있는지 잘 모르겠네요)

송효진의 이미지

apache 니까 php 겠죠?
경험상 김정균님 처럼 전문적인 상황(?) 이 아닌 웬만한 상황에서는 503 까지 안가도 될 것 같더군요.
apache+php 는 apache 에 의해 MaxConnection 이 결정됩니다.
php 가 이를 조절할 수가 없죠.

php 로 MySQL 연결하는 것이 많은지
그냥 그림 가져가는 것이 많은지 알 수도 없고 제어할 수도 없습니다.

MySQL 에서 max_connections = 128 정도를 견딜 수 있다고 한다면,
관리를 위한 접근을 감안해서 100 정도만 php 가 접근 할 수 있어야 겠죠.
apache 가 256 이라면 당연히 MySQL 접속이 초과되어 php 가 connection 에러를 냅니다.

저는 nginx + php-cgi 로 쓰고 있는데요.

#!/bin/bash
E="PHP_FCGI_CHILDREN=80"
E="$E PHP_FCGI_MAX_REQUEST=10000"
exec 2>&1
n=`pwd | sed -e "s@^.*/@@g"`
exec setuidgid nginx env - $E /usr/bin/php-cgi -b /var/run/nginx/$n.socket

요렇게 php 를 80개만 뜨도록 해 놓았습니다.
nginx 는 epoll 이라 수백 이상의 접속이 와도 문제 없고,
php 가 필요한 것만 nginx 가 골라서 php 로 넘겨주고,
접속수가 부족하면 nginx 가 기다립니다.
오래는 안기다리지만, 게임 게시판 몰리는 것 같은 진짜 수백명이 클릭질을 하는 상황만 아니라면
충분히 효과가 있습니다.
php 쿼리 하나당 0.0몇초 정도 걸릴테고 몇초 정도면 그 쿼리들 다 소화될테니까요.

자연스럽게 MySQL 의 한도를 넘어서는 접속요청 자체가 없어지는 거죠.
php 에서 뿌리는 MySQL connection 에러 메세지 자체가 없어지는 겁니다.

아예 pconnect 로 해 놓아도 php.ini 설정 필요 없이 80 개 이상의 연결은 발생하지 않습니다.
fork 된 php-cgi 하나당 연결 하나죠.

꽤 만족스럽습니다.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇 개 안돼요~
http://xenosi.de/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.