2008년 5월 7일 수요일
2008년 3월 17일 월요일
cannot restore segment prot after reloc: Permission denied
Syntax error on line 205 of /usr/local/apache/conf/httpd.conf:
Cannot load /usr/local/apache/libexec/mod_pyapache.so into server: /usr/local/apache/libexec/mod_pyapache.so: cannot restore segment prot after reloc: Permission denied
이런 황당한 에러는... 아래와 같이 하면 해결됨.
[root@localhost libexec]# restorecon -R -v /usr/local/apache/libexec
또는
[root@localhost libexec]# chcon -t texrel_shlib_t /usr/local/apache/libexec/mod_pyapache.so
2008년 3월 13일 목요일
Windows에 아파치 + 톰캣 + modpython 적용하기
1. 아파치 설치
아파치 다운로드
아파치 설치 (설치디렉토리예: C:/apache2)
2. 톰캣설치
톰캣 다운로드
톰캣 설치 (설치디렉토리 예: C:/tomcat)
3. 아파치에서 mod_jk2를 이용하여 톰캣 연동하기
modjk2 모듈다운로드 - mod_jk2
아파치설정 (c:/apache2/conf/httpd.conf)
LoadModule jk2_module modules/mod_jk2.so
아파치설정 (c:/apache2/conf/workers2.properties) - 없다면 생성하자.
[shm]
info=Scoreboard. Requried for reconfiguration and status with multiprocess servers.
file=anon
# Example socket channel, override port and host.
[channel.socket:localhost:8009]
port=8009
host=127.0.0.1
# define the worker
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
# Uri mapping
[uri:10.0.0.10/*.jsp]
worker=ajp13:localhost:8009
[uri:pey.avis.com/*.jsp]
worker=ajp13:localhost:8009
[uri:pey.automs.com/*.jsp]
worker=ajp13:localhost:8009
위 내용을 보면 알겠지만, uri에 설정한 URL(위:*.jsp)로 request가 들어올 경우 8009포트(톰캣)로 request를 전달하고 있다.
톰캣설정 (c:/tomcat/conf/server.xml)
protocol="AJP/1.3" URIEncoding="KSC5601" />
8009포트에 AJP/1.3이라는 프로토콜을 사용하여 request를 처리한다. 요새 나오는 톰캣버전의 server.xml에는 위 사항이 디폴트로 적용되어 있으니 빠져있지만 않다면 특별히 수정할 사항은 없다. 단 GET방식의 request일 경우 URIEncoding에 KSC5601을 설정해 주어야 한글처리가 가능하다는 점을 유의해야 한다.
4. 가상 호스트 설정
한 PC에서 여러개의 웹싸이트를 개발하고 있다면 가상호스트를 설정하여 사용하면 편리하다. 아파치, 톰캣 설정을 반복하는짓을 그만둘수 있다.
hosts(C:/WINNT/system32/drivers/etc/hosts)파일 수정
필자의 hosts파일 예
127.0.0.1 localhost
127.0.0.1 pey.avis.com
127.0.0.1 pey.automs.com
127.0.0.1 pey.dev.com
127.0.0.1 pey.note.com
아파치 설정(c:/apache2/conf/httpd.conf)
필자의 Virtual Host예
NameVirtualHost *:80
ServerName pey.avis.com
ServerAlias www
ServerAlias localhost
ServerAdmin pey@tdd.or.kr
DocumentRoot "d:/AVIS/avis/httphome/avis/"
ErrorLog logs/avis-error.log
CustomLog logs/avis-access.log common
JkUriSet worker ajp13:localhost:8009
ServerName pey.automs.com
ServerAdmin pey@tdd.or.kr
DocumentRoot "d:/AVIS/automs/"
ErrorLog logs/automs-error.log
CustomLog logs/automs-access.log common
JkUriSet worker ajp13:localhost:8009
ServerName pey.dev.com
ServerAdmin pey@tdd.or.kr
DocumentRoot "d:/por/"
ErrorLog logs/por-error.log
CustomLog logs/por-access.log common
ServerName pey.note.com
ServerAdmin pey@tdd.or.kr
DocumentRoot "d:/note/"
ErrorLog logs/por-error.log
CustomLog logs/por-access.log common
톰캣설정 (c:/tomcat/conf/server.xml)
필자의 Host설정 예
5. mod_python 적용
mod_python download (http://www.modpython.org)
mod_python 설치 (win32용 프로그램으로 인스톨)
아파치 설정 (c:/apache2/conf/httpd.conf)
LoadModule python_module modules/mod_python.so
Options Indexes FollowSymLinks ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AddHandler mod_python .py
PythonHandler mod_python.cgihandler
PythonDebug On
Options Indexes FollowSymLinks ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AddHandler mod_python .py
PythonHandler mod_python.cgihandler
PythonDebug On
위에서 설정한 가상호스트를 modpython cgihandler와 연결시킨 예제이다.
2008년 3월 12일 수요일
httpd.conf 설정파일(1.*) 설정법정리
최종 수정일 : 2001년 8월 3일
글쓴이 : 윤 일 (yunil@dreamwiz.com)
HOW-TO Configuration httpd.conf(apache)
ServerType Standalone
# 서버 타입을 설정하는 지시자 이다.
# ServerType 에서 설정할 수 있는 것은 Standalone 과 inetd 두가지 설정이 있다.
ServerRoot /usr/local/apache
# 아파치 서버의 루트 디렉토리를 설정한다.
PidFile /usr/local/apache/logs/httpd.pid
# 아파치가 실행될 때 생성되는 httpd.pid 파일이 생성될 경로를 지정한다.
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
#부모 프로세스가 자식 프로세스와 의사 소통을 할 때 사용되는 지시자와 그 파일을 지정한다.
Timeout 300
# Timeout은 클라이언트에서 서버로 접속할 때 클라이언트나 서버의 통신장애로 인해 300초 동안
# 클라이언트에서 완벽한 처리를 하지 못할 때 클라이언트와의 연결을 해제한다.
KeepAlive On
# 서버와의 지속적인 연결을 하도록 설정되어 있다. 즉 한번의 연결에 대해 한번의 요청만 처리하는
# 것이 아니라 또 다른
# 요청을 기다리게 된다. 하지만 지속적인 연결 시간은 KeepAliveTimeout 값에 설정한 만큼 유지된다.
# KeepAlive를 Off로 설정하게 되면 클라이언트로 부터 한번의 요청을 받은 후 바로 접속을 해제한다.
# 특별한 경우가 아니라면 On 상태로 유지하는 것이 좋다.
MaxKeepAliveRequests 100
# KeepAlive 상태에서 처리할 최대 요청 처리 건수를 설정한다.
# 보통의 웹 사이트에서는 설정값 100으로 충분하다.
KeepAliveTimeout 15
# KeepAlive 상태를 유지할 시간을 초 단위로 설정한다.
MinSpareServers 5
# 아파치가 실행될 때 최소 예비 프로세스 수를 설정한다. 이 값에 의해 현재 nobody 소유의
# 아파치 프로세스가 5보다 작을 경우 자동으로 부족한 만큼의 아파치 프로세스 생성한다.
# 8 정도 설정하는 것이 적당하다.
MaxSpareServers 10
# 아파치가 실행될 때 최대 예비 프로세스 수를 설정한다. 이 값에 의해 현재 nobody 소유의
# 아파치 프로세스가 10보다 클 경우 불필요한 프로세스를 제거한다.
# 20 정도 설정하는 것이 적당하다.
StartServers 5
# 아파치가 실행될 때 생성 시키는 자식 프로세스 수이다.
# 하지만 이 값이 MinSpareServers 값보다 작을 경우 아파치 실행 후에 바로 MinSpareServers 의
# 설정만큼 생성하기때문에 아무런 의미가 없게 된다. StartServer 값과 MinSpareServers 값은 같은
# 값을 설정하는것이 바람직하다.
MaxClients 150
# 아파치 서버의 동시 접속자 수를 정의한다.
# 최대 값은 256이다.
# 256 이상의 값을 설정하고 싶을 때는 아파치 소스의 httpd.h 헤어 파일의 HARD_SERVER_LIMIT 부분을
# 수정하고 아파치를 다시 컴파일 해야 된다.
MaxRequestsPerChild 0
# 아파치의 자식 프로세스가 처리할 수 있는 최대 요청 처리 건수를 설정한다.
# 0 은 무제한을 뜻한다.
BindAddress *
# 가상 호스트를 지워한다. 기본적으로 주석 처리 되어 있지만 실제로는 가상 호스트에 영향을
# 주지 않았다.
Port 80
# 아파치가 사용할 기본 포트를 지정한다.
User nobody
Group nobody
# 자식 프로세스가 생성될 때 그 프로세스의 소유자와 소유그룹을 결정한다.
# 보안상 절대 root 로 설정하는 일은 없도록 한다.
ServerAdmin admin@rootman.co.kr
# 아파치 서버 관리자 e-mail을 설정하는 부분이다.
ServerName rootman.co.kr
# 아파치 서버가 작동중인 서버 이름을 설정한다. 기본적으로 주석 처리 되어 있다.
# 도메인이 아닌 IP 주소로 사용자의 홈페이지에 접속할 때 URL 끝에 /를 붙여야 접속이 되는 경우가
# 있는데 이럴 경우ServerName 지시자에 주석을 제거 하고 아이피 주소를 설정해 주면 된다.
DocumentRoot "/usr/local/apache/htdocs"
#아파치의 웹 문서들의 루트 디렉토리를 지정한다.
# 아래 부터 디렉토리 제어이다. Directory 구문에 대한 자세한 설명은 아래에 있다.
# 시스템 루트( / ) 디렉토리에 대한 제어
Options FollowSymLinks
AllowOverride None
# /usr/local/apache/htdocs 디렉토리에 대한 제어
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
# 사용자 홈 디렉토리인 public_html 디렉토리에 대한 제어
AllowOverride FileInfo AuthConfig Limit
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Order allow,deny
Allow from all
Order deny,allow
Deny from all
##############################################################################################
# 디렉토리 제어와 관련된 설정과 옵션 설 #
##############################################################################################
디렉토리 제어문의 시작은 로 시작해서 로 끝난다.
# -->> Options(옵션) 설명 ;
옵션 구문은 Options 라는 키워드로 시작된다.
FollowSymLinks : 실볼릭 링크를 허용한다.
SymLinksIfOwnerMatch : 링크를 허용하지만 링크 하고자 하는 사용자의 소유로 되어 있는 것만 링크
# 가능하다.
ExecCGI : CGI 실행을 허용한다.
Includes : SSI를 허용한다.
IncludesNOEXEC : SSI를 허용하지만 "#exec" 와 "include"로 정의한 CGI 실행은 거부한다.
Indexes : 웹 서버의 디렉토리에 접근 했을 때 DirectoryIndex 지시자로 설정한 파일이 없을
#경우 디렉토리안의 파일 목록을 보여준다.
MultiViews : 클라이언트의 요청에 따라 적절하게 페이지를 보여준다. 쉽게 생각하면 HTTP 헤드 정보가
# Accept-Language:ko 라면 Korea 언어에 맞게 데이터를 클라이언트에 전송한다.
None : 모든 설정을 부정한다.
All : MultiViews를 제외한 옵션을 의미한다.
# -->> AllowOverride 설명
AllowOverride는 클라이언트의 디렉토리 접근 제어에 관한 설정이다.
AllowOverride 는 AccessFileName 지시자와 밀접한 관계를 가지고 있다.
아래의 각 설정값들은 AccessFileName 지시자에서 설정한 파일에 적용된다.
None : AllowOverride를 off 한다는 것이다.
All : AccessFileName 지시자로 설정한 파일에 대해 민감하게 반응한다. 모든 지시자를 사용할 수 있다.
AuthConfig : AccessFileName 지시자에 명시한 파일에 대해서 사용자 인증 지시자 사용을 허락한다.
--> AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile,
# require등을 사용할 수 있다.
FileInfo : AccessFileName 지시자로 설정한 파일에 대해서 문서 유형을 제어하는 지시자 사용을 허락한다.
#-> AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument,
#LanguagePriority등을 사용할 수 있다.
Indexes : AccessFileName 지시자로 설정한 파일에 대해서 디렉토리 Indexing을 제어하는 지시자
#사용을 허락한다.
--> AddDescript-xion, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex,
#FancyIndexing, HeaderName, IndexIgnore, IndexOpions, ReadmeName등을 사용할 수 있다.
Limit : AccessFileName 지시자로 설정한 파일에 대해서 호스트 접근을 제어하는 지시자 사용을 허락한다.
--> Allow, Deny, order 등을 사용할 수 있다.
Options : AccessFileName 지시자에 명시한 파일에 대해서 Options 그리고 XBiHack 등과 같은 지시자
#사용을 허락한다.
--> Options, XBitHack등을 사용할 수 있다.
AloowOverride와 AccessFileName에 설정한 파일을 이용해서 아파치 인증 기능을 사용할 수 있다.
아파치 인증에 관한 자세한 설명은 "아파치 인증" 강좌를 참고하길 바란다.
##############################################################################################
DirectoryIndex index.html
# 파일 이름을 명시하지 않고 디렉토리에 접근할 경우 자동으로 보여줄 파일 이름을 설정한다.
# 여러개의 파일 이름을 설정할 수 있다. 파일 이름에 대한 구분은 Space 키, 즉 빈 공간으로 구분한다.
AccessFileName .htaccess
# 특정 디렉토리의 접근 제어를 할 파일 이름을 정의한다.
# 단, 해당 디렉토리의 AllowOverride 에서 None으로 설정되어 있지 않아야 된다.
# 자세한 설명은 "아파치 인증" 강좌 참고
CacheNegotiatedDocs
# 프록시 서버에 문서를 캐시하도록 설정한다. 기본적으로 주석 처리 되어 있다.
HostnameLookup Off
# 아파치의 로그 파일에는 기본적으로 클라이언트의 IP 주소 정보가 기록되는데 이 설정을 On 하면
# 호스트 네임(도메인)이 기록된다. 하지만 DNS 질의를 해야 되므로 속도가 느리다는 단점이 있다.
# 그냥 Off로 사용하는것을 추천한다.
ErrorLog /usr/local/apache/logs/error_log
# 아파치 서버 접속 에러 로그를 기록할 결로와 파일 이름을 설정한다.
LogLevel warn
# 에러 로그 내용의 레벨을 설정한다.
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
# 사용자 접속을 기록할 로그 포멧을 정의한 부분이다. 위와 같이 4가지 형식의 로그 포멧이
#기본적으로 설정되어 있다.
common : 가장 일반적인 로그 기록
referer : 현재 아파치 서버에 접속하기 전에 머물렀던 URL으 기록한다.
agent : 접속자의 웹 브라우저(OS 포함) 종류를 기록한다.
combined : 위의 3가지 로그 포멧을 모두 조합한 것이다.
접속자에 대한 많은 정보를 기록하길 원한다면 combined으로 설정하면 된다.
# %h %I 등과 같은 아파치 로그 포멧을 알고 싶으면 아파치 메뉴얼를 참고 하기 바란다.
CustomLog /usr/local/apache/logs/access_log common
# 로그 파일의 경로와 파일 이름, 그리고 로그의 포맷을 설정한다.
# common 이외에 위에서 정의한 로그 포멧을 지정할 수 있다.
ServerSignature On
# apache 서버가 생성하는 Error 페이지와 Ftp 디렉토리 목록, mod_status, mod_info 등에 apache
#서버 버젼과 가상 호스트
# 네임을 추가적으로 표시해 준다.(On 설정시) Email 설정시 ServerAdmin의 E-mail 주소를 페이지에
#링크해 준다.
# On, Off, Email을 설정해서 사용할 수 있다.
Alias /icons/ "/usr/local/apache/icons/"
# 특정 디렉토리를 alias 한다. 위의 경우는 /usr/local/apache/icons/ 디렉토리를 icons 라는 이름으로
# alias 한것이다
# icons 디렉토리 앞의 /(슬래쉬)는 DocumentRoot를 의미한다.
Script-xAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
# Alias와 같은 형식이고 실행할 스크립트 디렉토리를 alias할 때 사용한다.
Redirect old-URL new-URL
# old-URL을 new-URL로 코딩해준다. 하지만 HTML태그로 위의 기능을 대신할 수 있기때문에 사용할 일이
# 거의 없을것이다.
IndexOptions Fancy Indexing
# 디렉토리에 DirectoryIndex에 설정된 파일명이 없을경우 아파치서버는 디렉토리목록을 보여주는데
# Fancy Indexing을 설정 할 경우 파일의 크기, 생성날짜 등을 같이 출력해준다.
DefaultIcon /icons/unknown.gif
# 아이콘이 설정되어 있지 않은 파일 확장자들의 아이콘을 대신한다
AddDescript-xion "GZIP compressed document" .gz
AddDescript-xion "tar archive" .tar
AddDescript-xion "GZIP compressed tar archive" .tgz
# 아파치가 디렉토리 목록을 보여줄 경우 파일 확장자에 대해 간략한 설명을 할 수 있게 한다. 단,
# IndexOptions에서 FancyIndexing이 적용되어 있어야 된다.
ReadmeName README
HeaderName HEADER
# 아파치가 디렉토리가 목록을 보여줄 경우 페이지 위(HEADER)와 아래(README)에 추가로 출력할
# 텍스트들을 설정할 수 있다.
# 각 디렉토리에 README, HEADER 라는 이름으로 텍스트 파일을 만들면 된다.
ErrorDocument 500 "The server made a boo bo"
ErrorDocument 404 /missing.html
ErrorDocument 402 http://some.other_server.com/subscript-xion_info.html
# 클라이언트의 요구에 의해 발생하는 아파치 서버의 에러페이지에 출력할 텍스트나 문서를 정의할
# 수 있다.
# 각 페이지는 에러 코드별로 설정할 수 있으며 외부의 URL을 지정할 수도 있다.
# 문자열을 설정을 경우네는 " "안에 문자열을 설정하면 되고 내부 html 문서를 지정해줄 경우에는
# 문서의 경로를 지정해 주면 된다. 단, (/)최상위 경로는 DocumentRoot를 의미한다.
SetHandler server-status
Order deny,allow
Deny from all
Allow from .your_domain.com
SetHandler server-info
Order deny,allow
Deny from all
Allow from .your_domain.com
# 위의 설정을 함으로써 웹 브라우저에서 아파치 서버의 상태와 정보를 볼수 있다. 보안상 특정
# 호스트에서만 볼 수 있게 설정할 수 있으며 기본적으로 주석 처리되어 있다.
Deny from all
ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
# 아파치 1.1 이전 버젼의 버그를 악용하는 경우가 있는데 이 설정에 해 두면 이러한 공격을
# phf.apache.org의 로깅 스키립트로 리다이렉트 시켜준다. 요즘은 필요없는 설정이고 위의 URL에
# cgi스크립트가 존재하지도 않는다.
DefaultType text/plain
# 아파치가 처리할 기본 문서들을 정의한다. 위의 설정은 html과 text 파일을 포함시킨 것이다.
# 위의 설정 때문에 text 파일도 웹 브라우저에 표시해 줄수 있는 것이다.
apache 설치시 Error Output for sanity check
======== Error Output for sanity check ========
cd ..; gcc -DLINUX=22 -DUSE_HSREGEX -DUSE_EXPAT -I./lib/expat-lite `./apaci` -o helpers/dummy helpers/dummy.c -lm
============= End of Error Report =============
아파치 설치시 위와 같은 에러가 발생했을 경우 처리 방법은 apache 인스톨 폴더명을 확인
해보도록 하자 혹시나 폴더 네임에 스페이스바가 들어가 있다면 제거 하고 인스톨하도록 하자.
그러면 에러가 나지 않고 설치가 될것이다.
2007년 5월 23일 수요일
Apache 서버 폴더리스트가 출력 안되게 할때
별로 안보여주고 싶은데 파일리스트가 주르륵 나올때 막아주는 방법
우선 httpd.conf 파일을 vi편집기로 연다.
/ 를 누르고 FollowSymLinks 를 검색해보자!!
그러면 딱 여기에 요게 보인다.
Options Includes Indexes FollowSymLinks
여기서 indexes 부분을 싸악 지워주고 저장한다.
그리고 아파치 재시작!!!
(가상호스트인경우는 각자 저 indexes가 써있는 경우가 있다.열씨미 찾아서 고쳐서 재부팅했는데도 안나와서 알고보니 가상호스트쪽에 하나 더 저 indexes가 있더군...고것도 고치고서 다시
아파치 재부팅하니까 제대로 작동됨)
2007년 4월 13일 금요일
Apache 웹 서버 장애 해결하기 7 (검색 로봇의 접근 차단하기)
검색 로봇의 접근 차단하기
갑자기 특정한 IP 주소에서 짧은 시간에 많은 접속을 하여 시스템의 부하가 올라가 웹 접속 로그를 살펴보니 다음과 같이 이해할 수 없는 내용이 남는 경우 가 있다.
211.51.63.4 - - [26/Sep/2001:22:19:42 +0900] "GET /robots.txt HTTP/1.0" 404 285
211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /index.asp HTTP/1.0" 404 284
211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /index.php HTTP/1.0" 404 284
211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /index.php3 HTTP/1.0" 404 285
211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /default.htm HTTP/1.0" 404 286
211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /default.html HTTP/1.0" 404 287
211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /default.asp HTTP/1.0" 404 286
211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /default.php HTTP/1.0" 404 286
211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /default.php3 HTTP/1.0" 404 287
211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /main.htm HTTP/1.0" 404 283
211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /main.html HTTP/1.0" 404 284
211.51.63.4 - - [26/Sep/2001:22:19:43 +0900] "GET /main.asp HTTP/1.0" 404 283
211.51.63.4 - - [26/Sep/2001:22:19:44 +0900] "GET /main.php HTTP/1.0" 404 283
211.51.63.4 - - [26/Sep/2001:22:19:44 +0900] "GET /main.php3 HTTP/1.0" 404 284
무작위로 index.php, index.asp, index.php3, default.html, default.asp 등 의 파일을 순서대로 요청하는 것으로 보아 검색 엔진일 가능성이 높다고 가정 할 수 있다. 특히 robots.txt 파일을 요청하는 것으로 검색 엔진이라고 장담 할 수 있을 것이다.
httpd.conf에서 Logformat를 common 대신 {User-agent} 변수를 추가하여 정의 하면 서버에 접근하는 에이전트 정보도 알 수 있는데, UA(User Agent)는 일반 적인 웹브라우저 뿐만 아니라 검색 로봇이나 방랑 로봇 등 웹 서버에 접속하여 웹페이지를 가져오거나 해석하는 모든 종류의 프로그램을 뜻한다. 이는 흔히 사용하는 익스플로러나 넷스케이프 등의 브라우저 외에도 라이코스의 스파이더(spider)나 알타비스타의 스쿠터(Scooter)와 같은 검색 로봇과 텔리포트(Teleport)나 WebZIP, GetRight 등 오프라인 브라우저 모두 UA의 범위에 속한다. 검색 로봇이 어떤 사이트를 방문하여 문서를 인덱싱하거나 오프라 인 브라우저가 페이지를 한꺼번에 요청하여 긁어 가는 것은 일반 사용자가 웹 브라우저로 서버에 접속하여 원하는 페이지를 보는 일반적인 경우와 그 성격 이 다르다. 여러 페이지를 동시에 요청하는 정도를 벗어나 아예 한 웹사이트 의 모든 페이지를 짧은 시간에 통째로 긁어가기도 하기 때문에 이러한 경우에 는 서버에 매우 많은 프로세스를 생성하면서 웹 서버의 로드가 크게 올라가게 되는 것이다. 특히 DB와 연동하는 사이트의 경우에는 심할 경우 정상적인 서비스를 하지 못 할 정도이다.
모든 사이트가 검색 엔진에 등록될 필요는 없거나 또는 허용된 일부 유저만 접근이 가능한 페이지의 경우 로봇의 접근을 차단할 필요가 있으므로 이러한 경 우에는 다음과 같이 설정된 robots.txt 파일을 웹 서버의 최상위 / 디렉토리 에 두면 모든 검색 로봇이 /secure 디렉토리를 인덱싱하지 않는다.
User-agent: *
Disallow: /secure
User-agent: *”는 모든 로봇를 대상으로 한다는 것을 뜻하며 예를 들어 알타비스타 스쿠터 등 특정한 UA에 대해서만 설정하고 싶다면 다음과 같이 하면 된다.
User-agent: scooter
검색 로봇과 관련된 더 자세한 정보를 얻기 원한다면 다음의 사이트를 참고하 기 바란다.
http://info.webcrawler.com/mak/projects/robots/robots.html
http://info.webcrawler.com/mak/projects/robots/norobots.html
아울러 웹 서버에서 특정한 유저 에이전트의 접근을 차단하려면 httpd.conf에 다음과 같이 BrowserMatch를 사용하여 설정해도 된다.
BrowserMatch "WebZIP" go_out
BrowserMatch "Teleport" go_out
BrowserMatch "GetRight" go_out
BrowserMatch "WebCopier" go_out
BrowserMatch "NetZip Downloader 1.0" go_out
BrowserMatch "NetZip-Downloader/1.0.62" go_out
BrowserMatch "Teleport Pro/1.29" go_out
BrowserMatch "Teleport Pro/1.24" go_out
BrowserMatch "Teleport Pro/1.26" go_out
Options Includes ExecCGI
AllowOverride None
Order allow,deny
Allow from all
Deny from env=go_out
위와 같이 설정 시에는 /home/no-ua/ 디렉토리 이하에 대해서는 go_out이라는 변수에 지정한 WebZip이나 Teleport 등 UA 프로그램의 접근을 차단하게 된다. 다른 UA도 차단하고 싶으면 위와 같이 웹 서버의 로그를 살펴보아 에이전트 정 보에 남는 UA를 go_out으로 추가해 주면 된다. 같은 방식으로 만약 특정 디렉토리 이하에 대해서 MSIE 브라우저로 접근하지 못하도록 설정하려면 다음과 같 이 BrowserMacth를 이용한다. 이렇게 하면 에이전트 정보에 MSIE라 설정되는 UA는 차단될 것이다.
BrowserMatch "MSIE" msie
Options Includes ExecCGI
AllowOverride None
Order allow,deny
Allow from all
Deny from env=msie
Apache 웹 서버 장애 해결하기 6 (특정한 이름의 파일을 실행을 제한하려면 )
최근에는 대부분의 사이트들이 대화방(채팅)을 위해 자바로 프로그래밍된 자바 대화방을 사용하는 추세이지만 얼마 전까지만 하더라도 C나 펄로 된 CGI 대 화방을 설치하여 사용하는 것이 유행이었다. 그런데 이 대화방의 경우 대화방 에 참여하는 유저 중 한 명이 글을 입력할 경우 모든 유저에게 이 내용이 실시 간으로 나타나야 하는 특성상 시스템의 메모리를 매우 많이 소모하는 대표적 인 프로그램 중 하나였다.
따라서 채팅 CGI 프로그램을 원천적으로 사용할 수 없도록 하는 방법을 고민하게 되었는데, 해결 방법은 대부분의 채팅 프로그램이 xxxchat.cgi 또는 chatxxx.cgi라는 파일을 실행 파일 이름으로 한다는 특징을 이용하면 된다. 즉, httpd.conf를 열어 다음과 같이 설정하면 파일명에 ‘chat’이라는 단어 가 포함된 CGI 파일은 작동하지 않게 되는 것이다.
Order allow,deny
Deny from all
Apache 웹 서버 장애 해결하기 5 (용량 큰 파일의 업/다운로드시 부하가 유발될 경우 )
LimitRequestBody는 클라이언트가 요청시 http 프로토콜을 통해 서버가 제공 할 수 있는 메시지의 크기를 바이트 단위로 정의하는 것으로 무한대를 의미하는 0부터 2,147,483,647(2Giga)까지 설정 가능하며 이 설정으로 대용량의 파일 을 업/다운로드 하는 형태의 서비스 거부 공격을 차단할 수 있다. 이를 설정하는 방법은 httpd.conf를 열어 다음과 같은 라인을 추가하면 된다.
LimitRequestBody 7168000
LimitRequestBody 10240000
Apache 웹 서버 장애 해결하기 4 (프로세스가 과도한 메모리를 사용할 경우)
특별히 이상한 프로세스는 없는데, 시스템의 부하가 갑자기 올라가는 경우가 있다. 심할 경우에는 콘솔에서 키 작동이 되지 않아 제어 자체가 불가능한 경 우도 있는데, 이러한 경우는 어쩔 수 없이 시스템을 재 시작하는 수밖에 없다. 이는 의도적이든 아니든 유저가 cgi나 php 등의 프로그램을 잘못 짜서 과도한 메모리를 소모하는 프로세스를 실행하기 때문인 경우인데, 실제로 시스템의 메 모리를 많이 소모하는 프로그램을 짜는 것은 단 몇 줄의 코드로도 가능하다. 다음과 같이 메모리를 소모하는 간단한 C 코드를 작성해 보자(참고로 스크립트 키드의 악용을 막기 위해 코드 중 일부를 변경하였다).
/* memory.c */
#include
#include
void html_content(void);
int main() {
char *some_memory;
int size_to_allocate = ONE_K;
int megs_obtained = 0;
int ks_obtained = 0;
html_content();
printf("Program Executed !!!
");
while (1) {
for (ks_obtained = 0; ks_obtained < 1024; ks_obtained++) {
some_memory = (char *)malloc(size_to_allocate);
if (some_memory == NULL) exit(EXIT_FAILURE);
sprintf(some_memory, "Hello World");
}
printf("Now allocated %d Megabytes
n", megs_obtained);
}
exit(0);
}
void html_content(void)
{
printf("Content-type: text/htmlnn");
}
작성 후 gcc -o memory.cgi memory.c로 컴파일 한 후 이 파일을 http://domain.com/memory.cgi와 같이 웹에서 실행해 보도록 하자. 아무리 메 모리와 CPU의 여유가 있는 시스템이라 하더라도 이 프로그램을 실행하자마자 거의 통제 불능 상태로 되어 결국 시스템 재부팅하게 될 것이다. 이렇듯이 메 모리를 무한정 소모하는 것을 차단하기 위해서는 아파치의 설정 인자 (Directive) 중에서 RLimitMEM을 사용하여 차단할 수 있다. 이 인자는 아파치 웹 서버에서 생성된 특정 프로세스가 작동시 소요 가능한 최대 메모리의 양을 제한하는 것으로 메모리를 많이 소모하는 CGI가 작동할 때 이 인자에서 지정 된 메모리까지만 실행이 되고 그 이상 소요시에는 더 이상 작동하지 않도록 해 준다.
예를 들어 httpd.conf에 다음과 같이 설정하였다면 모든 디렉토리에서는 메모 리를 20MB나 최대 21MB까지만 사용이 가능하고 /home /special/public_html/* 디렉토리 이하에 접근 시에는 특별히 50MB까지 메모리 이용이 가능하게 된다.
RLimitMEM 20480000 21504000
RLimitMEM 51200000 52224000
Apache 웹 서버 장애 해결하기 3 (include를 잘못하여 무한 루프가 돌 경우)
요즘에는 php와 mysql을 연동하여 많이 사용하고 있는데, 프로그래밍 과정에서 의 실수로 php 파일에서 같은 php 파일을 include하는 경우가 있다. 또는 a.php 파일에서 b.php 파일을 include하고 b.php 파일에서 다시 a.php 파일을 include하는 경우도 그러한 경우일 것이다. 이러한 경우에는 무한 루프가 돌 게 되어 결국은 아파치 데몬이 금새 Maxclients에서 지정한 개수로 차 버리게 되는데, 어떤 파일에서 무한 루프가 돌고 있는지 찾기가 힘들다. 따라서 임시로 다음과 같이 include를 하지 못하도록 차단을 하는 방법이 있다.
# iptables -A INPUT -p tcp -i lo -s xxx.xxx.xxx.xxx --sport 1024:65535 -j DROP
이는 같이 서버 내에서 include 시에는 lo(Lookback Interface)를 통해 sport 가 1024 이후의 하이 포트를 이용하여 통신한다는 특성을 이용한 것이다. 그러 나 이 설정을 하였을 경우 로컬 서버에서 클라이언트 포트를 전혀 사용할 수 없게 되므로 다른 서비스에도 장애가 되기 때문에 임시로만 사용하기 바란다. 또는 ps aux grep http로 보이는 프로세스에서 ls -la/proc /pid/로 각각의 http 프로세스가 어떤 파일을 참조하고 있는지 일일이 추적하는 방법도 있다.(예:cwd -> /home/user1/public_html/infinite_loop/)
2007년 3월 21일 수요일
Apache 웹 서버 장애 해결하기 2 (서비스 거부 공격(DoS)이 가해졌을 때)
DoS는 동시에 서비스할 수 있는 프로세스의 한계가 있다는 점을 악용한 공격이다.
한번의 실행으로 100개나 200개 등 원하는 만큼의 동시 접속을 맺은 후 이 접속을 끊지 않고 유지할 수 있는 공격 코드가 인터넷 상에 공개되어 있다.
그러나 이러한 공격의 경우 공격지의 IP를 속이기가 매우 어려우므로 netstat으로 확인 후 비정상적인 접속으로 확인 될 경우 해당 IP를 차단하면 된다.
특정 IP의 라우팅을 차단하는 방법은 다음과 같이 route를 이용한 방법과 iptables(커널 2.4 이상)를 이용한 방법 두 가지가 있다.
Apache 웹 서버 장애 해결하기 1 (접속이 느려지거나 접속이 안 될 때)
가끔 접속자가 많은 서버를 운영하다 보면 갑자기 웹 접속이 되지 않거나 접속 이 너무 느려 아파치 데몬 개수를 확인해 보면 httpd가 256개나 떠 있는 경우 가 있다.
기본적으로 아파치 웹 서버의 경우 Max Clients가 256으로 설정되어 있어 동시에 256개의 데몬이 뜨게 되면 더 이상의 접속을 받아들이지 않고, 기 존의 프로세스가 죽을 때까지 대기한 후 접속이 끊기게 되면 그제서야 접속을 받아들이게 된다.
따라서 동시 접속이 많은 경우에는 이전의 웹 접속이 끊길 때까지 대기해야 하 므로 접속 속도가 느린 것처럼 느끼게 되는 것이다.
일반적으로 정상적인 접속 의 경우에 256개의 프로세스가 모두 뜨는 경우는 그리 많지 않기에 현재의 상 태가 비정상적인 접속인지 여부를 판단해야 한다. 이를 판단할 수 있는 방법 은 netstat -na grep ES로 ESTA BLISHED된 연결 상태를 확인하여 클라이언트 의 IP가 정상적인 연결인지 여부를 확인하면 된다.
또는 netstat -nagrep ESawk '{print $5}'sort로 클라이언트의 IP만 따로 소트하여 확인해 봐도 된다. 통상적으로 HTTP 1.1 규약에서부터 적용되기 시작 한 KeepAlive 기능을 지정하였을 경우 한 클라이언트 IP에서 동시에 3~5개 정 도의 http 프로세스를 생성하므로 한 IP에서 3~5개 정도의 프로세스를 생성하는 것은 정상적인 현상이다.
비정상적인 접속의 경우에는 다음과 같은 이유가 있을 수 있다.
Apache의 access_log에 관련된 파일형식 남기지 않게 하는 방법
용량이 초과하는 경우가 많았을것이다. 여기서 로그들을 주석처리해서 막아 버리는 방법도
있지만 아래와 같이 해서 부분적으로 로그 쌓임을 방지 할수가 있다.
Apache httpd.conf 파일을 열어 다음의 내용들을 추가 하도록 하자.
### JPG Red Deny ####
SetEnvIf Request_URI \.jpg worm
SetEnvIf Referer \.jpg worm
### GIF Red Deny ####
SetEnvIf Request_URI \.gif worm
SetEnvIf Referer \.gif worm
### SWF Red Deny ####
SetEnvIf Request_URI \.swf worm
SetEnvIf Referer \.swf worm
### html Red Deny ####
SetEnvIf Request_URI \.html worm
SetEnvIf Referer \.html worm
### CodeRed Deny ####
SetEnvIf Request_URI \.ida worm
SetEnvIf Referer \.ida worm
### Nimda Deny #####
SetEnvIf Request_URI cmd\.exe worm
SetEnvIf Referer cmd\.exe worm
SetEnvIf Request_URI root\.exe worm
SetEnvIf Referer root\.exe worm
SetEnvIf Request_URI admin\.dll worm
SetEnvIf Referer admin\.dll worm
CustomLog /usr/local/apache/logs/access_log common env=!worm
진한 부분이 CustomLog 부분에 추가해줘야 할 부분이다.
Apache log들 용량을 줄이고 싶을때 사용하는 명령어
이때 이 양을 0으로 만드는 방법을 소개 하겠다.
cat /dev/null > access_log
cat /dev/null > error_log
Apache 웹서버에서 폴더 리스트가 출력 안되게 할려면...
"폴더 리스트가 나오는데 안나오게 할 수 없나요"
이 문의를 받고 난 열심히 웹서핑을 시작하였다.
찾아낸 정보는 다음과 같다.
Apache 설정 파일인 httpd.conf 파일을 열고
/를 키워드 검색을 하자. 찾을 단어는 'FollowSymLinks'
찾게 되면 다음과 같은 문구를 볼수 있다.
Options Includes Indexes FollowSymLinks
그럼 여기서 어떻게 하면 되느냐 indexes를 지워주도록 한다.
그리고 Apache Restart를 해준후에 접근을 해보자. 그럼 원하던대로...
p.s 가상호스트일 경우에는 가상호스트 설정부분에도 indexes를 삭제해주면 된다.