2013/01/24

(98)Address already in use: make_sock: could not bind to address [::]:80


서버 운영중에 아파치가 이상동작을 하며 프로세스 실행 시 아래와 같은 에러를 뱉을 경우

httpd (을)를 시작 중: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
                                                           [실패]

이미 어떤 프로세스가 80포트를 점유하고 있으니 같은 포트로 아파치 소켓을 열 수 없다는 말인데, 원인은 좀 더 찾아봐야겠지만 해결방안은 비교적 간단하다.

일단 실행중인 httpd 프로세스를 모두 강제 종료 시킨 후

$ ps ax | grep httpd | awk '{print $1}' | xargs kill

지금 80포트로 바인딩되어있는 프로세스를 확인하고 이 또한 종료시킨다.

$ netstat -nlp | grep :80

$ kill -9 {해당 프로세스 아이디}

이제 다시 아파치를 시작해보면

$ sudo /etc/init.d/httpd start
httpd (을)를 시작 중:                                      [  OK  ]

이상입니다.

2013/01/15

아파치 튜닝


Apache에서 서버 request를 효율적으로 처리하기 위해 MPM(Multi-Processing Module)을 쓰는데 두가지 방식이 있음

prefork / worker

자세한 설명은 레퍼런스를 보면 알수 있지만, 대략 정리해보면

prefork


  • 하나의 자식 프로세스가 하나의 쓰레드를 갖는 구조로, 자식 프로세스는 1024까지 늘일 수 있다.
  • 한개의 자식 프로세스는 한 개의 연결을 담당한다. 
  • 프로세스가 생성되는 구조이므로 당연히 worker보다는 많은 메모리를 사용함.
  • 프로세스간 메모리를 직접 공유하지 않으므로, 메모리 공간이 독립적이어서 안정적임


worker



  • 자식 프로세스들이 여러개의 쓰레드를 갖을 수 있으며, 각 쓰레드는 한번에 한 연결을 담당함. 
  • Prefork보다 메모리 사용량이 적음. 통신량이 많은 서버에 적절함. 
  • 쓰레드 간에 메모리 공간을 공유함. 리소스 경합이 발생하지 않도록 주의 필요. 특히 PHP를 쓰는 경우 유의하여야 함.

즉,
prefork 방식은 프로세스:쓰레드 = 1:1 방식
worker 방식은 프로세스:쓰레드 = 1:n 방식
이다.

대부분 prefork 방식이 기본적으로 사용되며, 사용자가 많은 경우에는 worker방식을 사용하는데 실제 기준은 좀 애매한것 같고, 서버 스펙이랑 평균 동접량에 따라 계산해봤을때 prefork로 버티느냐 못버티느냐에 따라 선택하는것 같다. (근 몇시간 동안 구글링해본 느낌일뿐 정확한 정보는 아니다)

이 글 정독하면 대략 감 잡는데 도움이 된다

그럼 서버 스펙은 어떻게 확인할까.

현재 설정된 아파치 정보를 확인하려면,


httpd -V

Server version: Apache/2.2.3
Server built:   Nov 12 2012 08:48:42
Server's Module Magic Number: 20051115:3
Server loaded:  APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture:   32-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="run/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="logs/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

httpd -l

Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c




그렇담 메모리 확인은 top, meminfo 정도로 확인할 수 있지만,

free -m

명령어가 제일 깔끔하고 필요한 정보를 얻을 수 있다. 옵션에 따라 k, m, g byte로 출력이 가능하다. 더 많은 정보는 물론 -h 치면 나온다.

이제 실제 테스트를 해보며 삽질을 할 시간인듯. 굿럭.



2013/01/13

새해맞이 첫 정리


새해 맞이 사이트 개편을 하자마자
근 2주 동안 참 탈이 많았다.

제대로 준비하지 못하고,
항상 한발 늦게 대처할 수 밖에 없었다.

아직 모르는게 너무 많아 어렵고 두렵다.
조금 다르게 표현하면,
앞으로 배우고 알아야 할 것이 많아 기분이 좋다.

잊지 않기 위해 메모를 해두자면,
브라우저 캐싱에서 .htaccess파일에 ExpiresActive On 설정시 Indexes를 꼭 Override 해줘야 한다. (http://httpd.apache.org/docs/1.3/mod/mod_expires.html#expiresactive)
보안은 신경쓸수록 도움이 된다. 서버 내 파일 권한 관리는 그 기본.
스마트폰, 태블릿이 필수 아이템이 되면서 반응형(responsive) 레이아웃이 주목받는데, 자칫 잘못하면 크로스브라우징의 늪에서 해어나올 수 없다. 경험이 해결해 줄 것 같다. (http://www.leemunroe.com/adaptive-responsive/
2013년은 출발부터 다이나믹한게 파이팅 넘치는 한 해가 될 수 있기를 바란다.


2013/01/08

아파치 레퍼런스 문서



레퍼런스는 기본인데,
여지껏 이정도도 못찾아본 지난날을 반성하며.

2013년도 파이트

2013/01/07

다가올 일을 임하는 자세

우리가 인생을 살면
습관적으로 살기 쉽습니다.
어떤 일을 하거나
사람을 만나거나 할 때도
처음 대하듯이 하기가 어렵지요.

우리가 안 가 본 곳을
처음 구경해보면 신기합니다.
그래서 자세히 봅니다.
인생도 그렇게 해 보세요.

신기한 마음으로 인생에 임해보세요.
어떤 일이든 새로운 마음을 내서
정성을 다해서 처음 하듯히 말이에요.

-법률스님의 희망편지 -
2013. 01. 07


도전하는건 이제 두렵지 않다.
이제는 도전 중에 정성을 다하는것에 집중해야할 때이다.