블로그 > 행복이네 집 http://blog.naver.com/prebetty79/100028415343 | |
폼변수 다루기 폼변수 PHP 스크립트에서 폼 필드 값은 PHP 변수처럼 접근 할수 있다. 3가지 방법이 있다. ex) $tireqty //짦은 스타일 $_POST['tireqty'] // 중간 스타일 $HTTP_POST_VARS['tireqty'] // 긴 스타일 1. 짧은 스타일 : register_globals를 활성화 시켜야 쓸수 있다. (비추천) 지역변수와 혼란을 야기 한다. 4.2.0이후로 비활성화 되어있다. 2. 중간 스타일 : 추천되는 방식(4.1.0이후에서만 가능) 3. 긴 스타일 : 지양되어 왔다. 모든 버전에서 사용할수 있어 이식성은 높다. 성능에 좋지 않다. registre_long_arays로 비활성화 할수 있다.
식별자(Identifier) dfe - 식별자는 변수의 이름을 말한다. - 길이 제한은 없으며 문자,숫자,'_', '$'로 만들 수 있다. - '$'는 가변변수때문에 조심해서 사용해야 한다. - 숫자는 매 앞에 올수 없다. - 대소문자를 구분한다.
변수형 : 변수의 형(type)은 저장된 데이터의 종류에 따라 정해진다. 기본데이터형 ■ Integer : 모든 숫자 ■ Float ■ String ■ Boolean ■ Array ■ Object
이 외에 NULL형과 resource형(외부자원 ex DB연결)이 있다.
형 강도(Type Strength) PHP는 형 강도가 매우 약한다. 변수에 저장된 값에 따라 형이 결정된다. $a = 0; $a = 0.00; // $a는 처음엔 정수형이였다가 실수형으로 바뀐다. $a = 'Hello'; // 이것도 가능하다 이제 $a는 문자열이다
가변 변수(variable varialbes) : 가변변수를 사용하면 변수의 이름을 동적으로 바꿀수있다. ex) $varname = 'b'; $$varname = 5;
위는 $b = 5 와 하는 것과 동일하다.
상수 - 상수는 define 함수를 사용하여 상수를 정의한다. ex) define('TIREPRICE' , 100); define('OILPRICE', 10); define('SPARKPRICE', 4); - 상수의 사용 : 변수는 $를 붙이지만 상수는 상수의이름만 적어주면 된다. ex) echo TIREPRICE; 변수의 범위(scope) 6개의 범위를 가지고 있다. - 수퍼글로벌 변수는 스크립트 전역에서 사용할 수 있다. - 한번 선언된 상수는 스크립트 전역에서 사용할 수 있다. 즉 함수의 안과 밖 모두에서 사용할 수 있다. - 전역변수는 스크립트 내에서 정의된 변수로 스크립트 내에서 사용할 수 있지만, 함수 안에서는 사용할 수 없다. - 함수 안에서 정의된 변수는 함수 내에서만 사용할 수 있다. - 함수 안에서 전역으로 정의된 변수는 함수 밖에서는 사용할 수 없지만 매 사용 시마다 값이 저장되어 다음에 사용할 수 있다 ??? - 함수 안에서 사용된 변수는 함수가 끝나면 삭제된다. 수퍼글로벌 전체 리스트 - $GLOBALS - $_SERVER - $_GET - $_POST - $COOKIES - $_FILES - $_ENV - $_REQUEST - $_SESSION Operation(연산자) 대부분 C, Java랑 비슷하고 틀린부분만 정리 - 문자열 연산자 '.' : 문자열을 앞뒤로 붙여서 새로운 문자열을 만든다. ex) $a = "Bob's"; $b = 'Auto Parts'; $result = $a.$b; 결과 $result에 저장된 값은 "Bob's Auto Parts"이다. - 산술 연산자 : 산술 연산자의 operand(피연산자)는 정수와 실수형으로만 쓰일 수 있다. 만약 문자열로 산술연산을 시도한면 문자열을 숫자로 바꾸어서 실행한다. 문자열에 "e"나 "E"가 들어있다면 실수형으로 변화 한다. 그 외에는 정수형으로 변환. PHP는 문자열 처음에서 숫자를 찾아서 그것을 값으로 인식하는데, 만약에 문자열에 숫자가 없다면 문자열의 값은 0이 된다. - 참조 연산자(Reference) : C의 &연산자와 같음.. ex) $a = 5 $b = $a; --> $a, $b 서로 다른 메모리 영역을 가진다. $a = 5; $b = &a; &b = 7 // $a, $b 서로 같은 메모리영역을 가진다 즉 $a, $b가 7 unset($a) : 서로의 참조를 다르게 한다 (관계를 떼어놓을 수 있다) - 비교연산자(Comparison Operatiors) identical operator (===) : 두 피연산자가 값이 같고 같은형일 때만 true를 리턴한다. Not Identical (!==) : != 와는 다르다 Not Equal (<>) : 같지 않다. (!=) 와 같이 동일한 의미로 쓰인다. - 에러 억제 연산자(error suppression operator) : @ : '@'은어떠한 표현식에도 쓸수 있다. ex) $a = @(57/0) '@'가 없다면 위 문장은 "0으로 나누기"에 의한 에러가 발생하지만 '@'를 앞에 써주어서 에러는 무시하고 넘어간다. 만약 이런 방식으로 억제한다면 에러를 처리하는 코드를 작성해야 한다. 만약 PHP에서 track_error를 설정해 놓았다면 에러메시지를 전역변수인 $PHP_erromsg에 저장한다. - 실행 연산자(execution operation) : '`' 와 '`'로 이루어진 한 쌍의 연산자로 '`'는 홑따옴표(')와는 다른 키보드 ~아래에 있다. PHP에서 서버의 커맨드 라인에서 실행하고 싶은 것이 있다면 `` 사이에 명령어를 쓰면된다. 그러면 ``의결과값이 표현식의 리턴값이 된다. EX) 유닉스 환경 @out = `ls -la`; echo '<pre>'.$out.'</pre>'; 그러면 시 디렉토리의 파일 리스트가 보이게 된다.
- 배열 연산자 + | $a + $b | $a와 $b가 가지고 있는 모든값을 반환한다(합집합) == : $a, $b가 같은 요소를 가지고 있으면 true === | $a, $b가 같은 요소를 같은 순서로 가지고 있으면 true != <> !== 변수와 관련된 함수 - 변수의 데이터 형을 검사하고 설정하기
string gettype(mixed var); : 'boolean", "integer", "double", "string", "array", "object", "resource", 혹은 NULL을 반환한다. 표준 데이터 형이 아니면 "unknown"을 반환 bool settype(mixed var, string type); ■ is_array() ■ is_double(), is_float(), is_real() (모두 같은 함수) ■ is_long(), is_int(), is_integer() (모두 같은 함수) ■ is_string() ■ is_object() ■ is_null() ■ is_scalar() - 변수가 스칼라 변수인지 확인한다. 즉 정수형, 불리어형, 문자열이나 실수형인지 확인한다. ■ is_numeric() - 변수가 숫자나 혹은 숫자 문자열인지 확인한다. ■ is_callable() - 변수에 저장된 값이 호출할 수 있는 함수의 이름인지 확인한다. - 변수 상태 검사 boolean isset(mixed var); : 이 함수는 변수의 이름을 인자로 받아서 만약 이 변수가 존재한다면 true를 반환한다. , 로 연결된 변수들을 주면 모든 변수가 존재해야 true를 반환 boolean unset(mixed var); : 인자로 받은 변수의존재 자체를 없애고 true를 반환한다. empty(mixed var); : 변수가 존재하고, 비어 있지 않으며, 0이 아닌값을 가지고 있다면 true를 리턴
- 변수형 변환 int intval(mixed var[, int base]); base :진수 (10, 2, 16) float floatval(mixed var); string strval(mixed var);
== 제어문 == 대부분 C와 비슷하지만, 틀린점만 요약하면
1. else if --> elseif 와 같이 붙여서 쓴다 2. 루프를 빠져나갈때 'continue', 'break' 이외에 'exit' 라는 제어문이 있다. 'exit' : 루프를빠져나가 PHP 스크립트를 완전히 끝낸다. 3. 대체 제어 구조 { } 로 구역을 정하는 것이 아니라 '{' 대신에 ':' 를 쓰고, '}' 대신에 사용한 제어구조에 따라, endif, endswitch, endwhile, endfor, endforeach를 쓸수있다. ex) if( $totalqty == 0 ) { echo 'You did not ... '; exit; } 를 아래와 같이 쓸수 있다. if( $totalqty == 0 ) : echo 'You did not ... '; exit; endif 4. declare declare (directive) { // block } 이 구조는 코드 블록에서 실행 지침(execution directive)를 설정하기 위해 사용된다. 단 하나의 실행 지침인 tricks 만이 구현되어있는데 tricks=n이라는 방식으로 지침을 삽입할 수 있다. 코드 블록내에 있는 특정 함수 중 n개의 코드 행을 실행 시킬 수 있어 디버깅에 매우 유용한다. |
인터넷 서비스를 계획하다 보면 차후에 많은 양의 데이터를 각각의 서버별로 어떻게 동기화를 실행할것인지 걱정이 될것이다. 물론 많은 자금을 들여서 스토리지를 구입을 하면 좋지만, 웹서버 3-4대분량이나 소량의 데이터를 위해서 스토리지를 구입하기에는 가격이 만만하지 않다.
이런 중소형의 미러링을 위해서 생각해 볼수 있는 방법중에 하나가 rsync다. rsync는 파일크기의 변화나 시간의 변화등을 이용 동기화를 한다. 테스트 결과 적은량의 리소스로 빠른동기화의 효과를 볼수 있었다. 물론 원격에서 접근해서 미러링을 한다는 것 자체가 보안에 문제가 있기는 하지만, 매우 유용한 프로그램인 것은 확실하다. 어떻게 사용하느냐는 사용자들의 선택일 것이다.
|
링크, device, 소유자, 그릅, 허가권 복사를 지원
GNU tar와 비슷한 exclude, exclude-from 옵션 지원
RSH 또는 SSH등 사용가능
root 권한이 필요없음
anonymous 또는 인증 rsync 서버 지원(미러링에 유용함)
|
Rsync의 설치는 매우 간단하다. 설치라고 할것도 없다. 요즘 리눅스 플랫폼에는 거의 기본으로 들어있기 때문이다. 혹시 모르니 간단하게 설치를 해보자. 설치는 소스설치와 RPM설치로 진행하겠다. 될수 있으면 RPM으로 설치하는것을 권장한다. rsync홈페이지에 가보면 리눅스 플랫폼 외에도 다양한 플렛폼에서 사용할수 있도록 바이너리 화일이 제공된다.
먼저 소스 설치를 해보자. 아래 링크에서 Rsync소스 파일을 다운로드 받는다. 적당한 디렉토리로 이동후 압축을 해제하고 설치해 보자. configure옵션은 별다른게 없다. install화일에도 아래와 같이 나와있었다.
소스 다운로드 : rsync-2.5.6.tar.gz
[root@localhost]# |
[root@localhost]# tar xvfz rsync-2.5.6.tar.gz[root@localhost]# ./configure[root@localhost]# make[root@localhost]# make install |
위와 같이 소스로 설치할 경우 rsync실행화일은 /usr/local/bin/rsync에 생성이 되었다. 혹시라도 패스 설정이 안돼 있다면 /usr/local/bin을 넣어주기 바란다.
|
RPM설치는 기본적으로 리눅스에서 제공이 되기 때문에 간단히 설명하겠다. 그냥 up2date로 설치하거나, 패치지 구해서 설치하면 된다. rpm패치지는 아래 링크에서 받으면 된다.
RPM 다운로드 : rsync-2.4.6-1.i386.rpm
[root@localhost]# |
[root@localhost]# up2date rsync실행전에 rhn에 등록이 되어있어야 한다.[root@localhost]# rpm -Uvh rsync-2.4.6-1.i386.rpm |
rpm설치시 rsync실행화일 경로는 /usr/bin/rsync이다.
|
rsync는 xinetd기반으로 동작한다. 아래와 같이 설정화일을 만들어 준다. 아래 파일은 TCP 837포트를 이용해 미러링을 시킬 때 설정하면 된다. 만약 SSH를 사용할 것이라면 별도의 설정화일은 필요하지 않다.
[root@localhost]# |
[root@localhost]# vi /etc/xinetd.d/rsyncservice rsync { disable = no socket_type = stream wait = no user = root server = /usr/bin/rsync server_args = --daemon log_on_failure += USERID }[root@localhost]# /etc/rc.d/init.d/xinetd restart |
xinetd를 재시작 시키면 아래와 같이 873번 포트가 열릴 것이다.
[root@localhost]# |
[root@localhost]# nmap localhost873/tcp open rsync |
이제 rsyncd.conf 설정화일을 작성해 보자. rsyncd.conf화일은 TCP 837포트를 사용할 때 설정해줘야 된다. 필자는 백업용도의 미러링 설정을 할 것이다.
[root@localhost]# |
[root@localhost]# vi /etc/rsyncd.conf[/home/backup]path = /home/backupcomment = www.nasord.comuid = nobodygid = nobodyuse chroot = yesread only = yeshosts allow = 192.168.0.2max connections = 3timeout 600 |
설정화일 옵션이다. 옵션은 간단하며, 기본적으로 위의 옵션들만 있으면 동작이 된다. 나머지 옵션들은 man을 참고 하기 바란다.
[/home/backup] 서비스명
path : 미러링 경로
comment : 설명
uid : 파일전송하는 사용자의 id. 기본값은 nobody
gid : 파일전송하는 사용자의 그룹 id. 기본값은 nobody
use chroot : 위의 path를 root 디렉토리로 사용. 보안상 필요함.
read only : 읽기전용
hosts allow : 호스트별 접속허용. 기본값은 all host이므로 보안을 유지하려면 반드시 설정함
max connections : 동시접속자수
timeout : 클라이언트에서 접근시 타임아웃시간. anonymous 로 운영하는 경우 설정을 해야 클라이언트가 죽었을 때 서버에서 접속을 해체할 수 있음.
보안상 hosts allow와 use chroot는 설정을 해줄 것을 권장한다.
|
위의 설정으로 서버측 설정은 모두 끝났다. 이제 실제로 동기화를 시켜보자. 실행방법은 TCP 873포트를 이용한 실행과 SSH를 이용한 실행으로 나눠서 설명하겠다.
873 포트를 이용한 미러링
[root@localhost]# |
[root@localhost]# rsync -avz hostname(IP)::서비스명 /백업받을 경로ex) [root@localhost]# rsync -avz 192.168.0.1::/home/backup /home/admin |
ssh를 사용한 미러링
ssh를 사용할때는 위에서 설정한 xinetd설정화일과 rsyncd.conf화일이 필요없다. 사용자 인증만되면 동기화를 시킬수 있다.
[root@localhost]# |
[root@localhost]# rsync -avz -e ssh hostname(IP):/타겟 경로 /백업 받을 경로ex) [root@localhost]# rsync -avz -e ssh 192.168.0.1:/home/backup /home/admin |
rsync의 실행옵션은 무지 많다. 다 알려면 복잡하고, 아래 옵션만 알아도 사용하는데 지장없다. 나머지 옵션이 궁금하면 man을 참고 바란다.
-a는 archive mode (심볼릭 링크, 속성, 퍼미션, 소유권등 보존).
-v verbose(상세하게 보여움).
-z compress(전송시 압축을 함).
-u update only(새로운 파일을 덮어쓰지 않음)
--delete 서버쪽에 없고 클라이언트쪽에만 있는 파일을 지움
위의 실행 예제를 보면 호스트 설정다음에 : "콜론"이 보일것이다. : 는 ssh나 rsh를 이용할 때 사용하고 ::는 TCP 873포트를 이용할때 설정해 주면 된다. 타겟경로를 지정해줄 때도 경로뒤에 /가 붙는 것과 안붙을 경우 차이가 난다. 타겟경로를 /home/backup라고 해주면 backup폴더가 생성되고 자료들이 backup폴더 안으로 들어가고 타겟 경로를 /home/backup/라고 해주면 백업 경로에 바로 저장이 된다. 주의 하기 바란다. 주기적인 미러링을 위해서는 cron을 이용하여 동기화 시키면 된다.
|
Rsync는 상당히 유용한 도구임에는 틀림없다. 하지만 보안상 취약하니 설정에 주의해서 사용해야 된다. 2002년 rsync의 취약점을 이용한 exploit이 나왔다. 2.5.1버전이나 이전 버전들에 한해서 적용이 되는 것이니 2.5.1버전 이상을 사용해야 된다. 마지막으로 rsync영문 매뉴얼을 링크 걸어 놓겠다. 참고 하기 바란다.
AddCSlashes [한글] -- C 형식으로 문자열에 슬래쉬를 덧붙입니다. | |||
addslashes [한글] -- 문자열에 슬래쉬를 덧붙입니다. | |||
autoLink [한글] -- 자동으로 링크를 걸어줍니다 | |||
bin2hex [한글] -- 바이너리 데이터를 16진수 표현으로 바꿉니다. | |||
chop [한글] -- rtrim()의 별칭. | |||
chr [한글] -- 특정 문자를 반환합니다. | |||
chunk_split [한글] -- 문자열을 작은 조각으로 나눕니다. | |||
convert_cyr_string [한글] -- 키릴 문자셋을 다른 것으로 변환합니다. | |||
count_chars [한글] -- 문자열 안에 사용한 문자에 대한 정보를 반환합니다. | |||
crc32 [한글] -- 문자열의 crc32값을 계산합니다. | |||
crypt [한글] -- 단방향 문자열 암호화(해슁). | |||
echo [한글] -- 하나 이상의 문자열을 출력합니다. | |||
explode [한글] -- 문자열을 주어진 문자열을 기준으로 분리합니다. | |||
fprintf [한글] -- 문자열을 형식화하여 스트림에 기록합니다. | |||
get_html_translation_table [한글] -- htmlspecialchars()와 htmlentities()에서 사용하는 변환표를 반환합니다. | |||
hebrev [한글] -- 논리적인 헤브루 텍스트를 알아볼 수 있는 텍스트로 변환한다. | |||
hebrevc [한글] -- 개행 문자를 포함하여 논리 헤브라이어 텍스트를 표시 텍스트로 변환합니다. | |||
htmlentities [한글] -- 해당하는 모든 문자를 HTML 엔티티로 변환합니다. | |||
htmlentities [한글] -- 해당하는 모든 문자를 HTML 엔티티로 변환합니다. | |||
htmlspecialchars [한글] -- 특수 문자를 HTML 엔터티로 변환합니다. | |||
html_entity_decode [한글] -- 모든 HTML 엔티티를 해당하는 문자로 변환합니다. | |||
implode [한글] -- 문자열로 배열 요소를 결합합니다. | |||
join [한글] -- implode()의 별칭. | |||
levenshtein [한글] -- 두 문자열 사이의 Levenshtein distance를 계산합니다. | |||
localeconv [한글] -- 숫자 형식화 정보를 얻습니다. | |||
ltrim [한글] -- 문자열 시작 부분의 공백을 제거합니다. | |||
md5 [한글] -- 문자열의 md5 해쉬를 계산합니다. | |||
md5_file [한글] -- 주어진 파일명의 md5 해쉬를 계산합니다. | |||
metaphone [한글] -- 문자열의 메타폰 키를 계산합니다. | |||
money_format [한글] -- 통화 형식에 맞게 포맷한다. | |||
nl2br [한글] -- 문자열의 모든 줄바꿈 앞에 HTML 줄바꿈 태그를 삽입합니다. | |||
nl_langinfo [한글] -- 언어와 로케일 정보를 얻습니다. | |||
number_format [한글] -- 숫자를 천단위로 묶어서 표현한다. | |||
ord [한글] -- 문자의 아스키 값을 반환합니다. | |||
parse_str [한글] -- 문자열을 처리하여 변수를 생성합니다. | |||
print [한글] -- 문자열을 출력합니다. | |||
printf [한글] -- 형식화한 문자열을 출력합니다. | |||
quoted_printable_decode [한글] -- 인용되어 있는 출력 가능 문자열을 8비트 문자열로 변환합니다. | |||
quotemeta [한글] -- 메타 문자를 인용합니다. | |||
rtrim [한글] -- 문자열 끝 부분의 공백을 제거합니다. | |||
setlocale [한글] -- 지역정보를 지정한다. | |||
sha1 [한글] -- 문자열의 sha1 해쉬를 계산합니다. | |||
sha1_file [한글] -- 파일의 sha1 해쉬를 계산합니다. | |||
similar_text [한글] -- 두 문자열 간의 유사성을 계산합니다. | |||
soundex [한글] -- 문자열의 soundex 키를 계산합니다. | |||
sprintf [한글] -- 형식화한 문자열을 반환합니다. | |||
sscanf [한글] -- 문자열을 형식에 따라 처리합니다. | |||
strcasecmp [한글] -- 대소문자를 구별하지 않는 바이너리 호환 문자열 비교 | |||
strchr [한글] -- strstr()의 별칭. | |||
strcmp [한글] -- 바이너리 호환 문자열 비교 | |||
strcoll [한글] -- 로케일 기반 문자열 비교 | |||
strcspn [한글] -- 마스크에 매칭하지 않는 처음 세그먼트의 길이를 찾습니다. | |||
stripcslashes [한글] -- addcslashes()로 처리한 문자열을 되돌립니다. | |||
stripos [한글] -- 대소문자를 구별하지 않고 문자열이 처음 나타나는 위치를 찾습니다. | |||
stripslashes [한글] -- addslashes()로 처리한 문자열을 되돌립니다. | |||
stripTags [한글] -- 문자열 중 특정한 태그를 제거한다 | |||
strip_tags [한글] -- 문자열에서 HTML과 PHP 태그를 제거합니다. | |||
stristr [한글] -- 대소문자를 구별하지 않는 strstr() | |||
strlen [한글] -- 주어진 문자열의 길이를 구해서 돌려준다. | |||
strnatcasecmp [한글] -- "natural order" 알고리즘을 이용한 대소문자를 구별하지 않는 문자열 비교. | |||
strnatcmp [한글] -- "natural order" 알고리즘을 이용한 문자열 비교 | |||
strncasecmp [한글] -- 대소문자를 구별하지 않는 처음 n 문자의 이진 호환 문자열 비교 | |||
strncmp [한글] -- 처음 n 문자의 이진 호환 문자열 비교 | |||
strpos [한글] -- 문자열이 처음 나타나는 위치를 찾습니다. | |||
strrchr [한글] -- 문자열에서 가장 마지막의 어커런스를 찾는다. | |||
strrev [한글] -- 문자열을 뒤집는다. | |||
strripos [한글] -- 대소문자를 구별하지 않고 문자열에서 어떤 문자열의 마지막 위치를 찾습니다. | |||
strrpos [한글] -- 문자열 안에서 문자의 마지막 출현 위치를 반환한다. | |||
strspn [한글] -- 마스크에 매칭되는 초기 세그먼트의 길이를 찾는다. | |||
strstr [한글] -- 문자열의 처음 어커런스를 찾는다 | |||
strstr [한글] -- 문자열의 처음 어커런스를 찾는다 | |||
strtok [한글] -- 문자열을 토큰화한다. | |||
strtolower [한글] -- 문자열을 소문자로 만든다. | |||
strtoupper [한글] -- 문자열을 대문자로 만든다. | |||
strtr [한글] -- 특정 문자를 번역한다. | |||
str_ireplace [한글] -- 대소문자를 구별하지 않는 str_replace(). | |||
str_pad [한글] -- 문자열을 주어진 길이로 만든다. | |||
str_repeat [한글] -- 문자열을 반복합니다. | |||
str_replace [한글] -- 발견한 모든 검색 문자열을 치환 문자열로 교체합니다. | |||
str_replace [한글] -- 발견한 모든 검색 문자열을 치환 문자열로 교체합니다. | |||
str_rot13 [한글] -- 문자열에 rot13 변환을 수행합니다. | |||
str_shuffle [한글] -- 문자열을 랜덤하게 섞습니다. | |||
str_split [한글] -- 문자열을 배열로 변환합니다. | |||
str_word_count [한글] -- 문자열에서 사용한 단어에 대한 정보를 반환합니다. | |||
substr [한글] -- 문자열의 일부를 반환한다. | |||
substr_compare [원문] -- Binary safe optionally case insensitive comparison of 2 strings from an offset, up to length characters | |||
substr_count [한글] -- 부분문자열의 수를 센다 | |||
substr_replace [한글] -- 문자열의 일부를 치환한다. | |||
trim [한글] -- 문자열의 처음과 끝에 있는 공백을 제거한다. | |||
ucfirst [한글] -- 문자열의 처음 글자를 대문자로 만든다. | |||
ucwords [한글] -- 문자열에 있는 각 단어의 처음 글자를 대문자로 바꾼다. | |||
vprintf [원문] -- Output a formatted string | |||
vsprintf [원문] -- Return a formatted string | |||
wordwrap [한글] -- 정지문자를 이용해 주어진 수 만큼의 문자를 래핑한다. |
| |||
블로그 > [스케치] http://blog.naver.com/tripsketch/3703720 | |
======================================================================= 출처 : http://www.ricky.co.kr/jsboard/read.php?table=system&no=17&page=1 ======================================================================= [제목] 아파치 로그 파일 - 특이한 녀석들은 따로 담거나 없애기* 제목이 좀 이상하네요........^.^작성자 : 김칠봉 <san2(at)linuxchannel.net>작성일 : 2001. 04. 30대상자 : 초보- 힌트 URL : 임은재님이 쓴 글을 보고 나서 http://kltp.kldp.org/stories.php?story=00/10/22/9724184- 관련 문서 : 아파치 제공 문서 http://httpd.apache.org/docs/mod/mod_log_config.html http://httpd.apache.org/docs/mod/mod_setenvif.html목차1. 배경2. 기초지식 2-1. 로그포맷과 CustomLog 지시자 2-2. 아파치 환경변수 설정3. 예제 3-1. 특정 IP 주소만 환경변수로 설정하기 3-2. 특정 타입의 파일만 환경변수로 설정하기 3-3. 특정 User-Agent 만 환경변수로 설정하기 3-4. 종합예제 : 사오정(?) 로그 분석 피하기------------------------------------------1. 배경몇 달 전부터 Webalizer 라는 로그 분석기로 제가(이하 '필자') 운영하는 싸이트의로그를 대충 분석(?)해 봤는데 사오정(?) 분석이 되어 버렸더군요.결정적으로 필자가 운영하는 싸이트의 대부분은 php로 구성되어 있는데, 이는 실제로 - 방문자 외에 localhost에서 php가 실행하는 로그 기록 - 로봇들의 접근 기록 - 운영자(필자)가 접근한 로그 기록 등등이 함께 기록되어 있어 순수 방문자 통계에 약간 덜(?) 정확한 통계가 나오더군요. 따라서 이런 유형들의 로그는 없애거나 따로 로그기록하는 것이 낫을 것 같더군요. 위의 내용이 이하 다루는 내용입니다.2. 기초지식2-1. 로그포맷과 CustomLog 지시자Module mod_log_config 은 아파치 기본 모듈입니다. 로그 포맷 스트링 %a : 원격의 IP 주소 %b : 헤더를 포함한 전송량(bytes) %{var}e : 환경 변수 "var" %f : 파일이름 %h : 원격의 호스트 %{hdr}i : 서버에 들어오는(요청) 헤더 값 "hdr" %l : 원격의 로그인 ID(지원한다면) %{label}n : 다른 모듈에서 "label" 구성 %{hdr}o : 응답 헤더 값 "hdr" %p : 서버의 Canonical 포트 번호 %P : 자식 프로세스 ID(PID) %r : 첫번째 요청 라인 %s : 상태코드 %t : 시간 포맷(CLF 포맷) %{format}t : "format"으로 구성된 시간 포맷 %T : 서버에 요청하는 시간(초) %u : 원격의 유저이름(인증시) %U : 요청한 URL %v : 클라이언트 요청에 따른 Canonical 서버네임 %V : UseCanonicalName 설정에 따른 서버네임일반적으로 아파치를 설치하고 나면, 다음과 같이 기본설정되어 있을 겁니다.(굳지 수정할 필요없음) 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 CustomLog /usr/local/apache/logs/access_log common물론 이 정도는 다 알고 계시리라 믿습니다. 로그 기록 지시자 CookieLog CustomLog LogFormat TransferLogCookieLogs는 제외하고 나머지 지시자에 대해서 알아봅시다.LogFormat 지시자Syntax: LogFormat format|nickname [nickname]Default: LogFormat "%h %l %u %t \"%r\" %>s %b"Context: server config, virtual hostStatus: BaseCompatibility: Nickname only available in Apache 1.3 or laterModule: mod_log_configCustomLog 지시자Syntax: CustomLog file|pipe format|nickname [env=[!]environment-variable]Context: server config, virtual hostStatus: BaseCompatibility: Nickname only available in Apache 1.3 or later.Conditional logging available in 1.3.5 or later.Module: mod_log_configTransferLog 지시자Syntax: TransferLog file|pipeDefault: noneContext: server config, virtual hostStatus: BaseModule: mod_log_configLogFormat 지시자는 앞에서 예제가 있으므로 생략하고 비슷한 기능을 가진CustomLog, TransferLog 지지자에 대해서 잠깐 알아봅시다.둘다 file 에 로그를 기록한다는 면에서는 동일한 기능입니다.(pipe 기능도 동일) 같은점 1. 둘다 file에 로그를 기록한다. 2. |pipe 에 설정한 외부 프로그램을 인자로 사용할 수 있다. 3. 둘다 다중 로그를 사용할 수 있다. 다른점 1. CustomLog 지시자는 LogFormat 지시자에서 설정한 nickname이나 Log format을 인자로 사용할 수 있다. 2. CustomLog 지시자는 환경변수를 인자로 가질 수 있다.따라서,이하 다룰 내용은 환경변수를 설정하고 이 환경변수(env)와 동일(=)하거나 그렇지 않은(!=)특정 유형에 대해서 로그에 기록해야하 하므로 당연히 CustomLog 지시자를 사용해야합니다.*주의)환경변수를 인자로 사용할 경우 하나만 가능.이해가 되셨는지 모르겠네요....2-2. 아파치 환경변수 설정아파치에서 환경변수를 설정하는 방법은 몇가지 있습니다.예를 들어, - mod_env 모듈에 의한 SetEnv 지시자 이용 - mod_setenvif 모듈에에 의한 BrowserMatch BrowserMatchNoCase SetEnvIf SetEnvIfNoCase 지시자 이용등이 있습니다.여기에서 주로 사용할 지시자는 BrowserMatch 지시자와 SetEnvIf 지시자입니다.*참고)xxxxNoCase 지시자는 대소문자를 구분하지 않겠다는 의미입니다.이 두개의 지시자에 대한 사용법만 간단하게 알아봅시다.BrowserMatch 지시자Syntax: BrowserMatch regex envar[=value] [envar[=value]] ...Default: noneContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod_setenvifCompatibility: Apache 1.2 and above (in Apache 1.2 this directive was found in thenow-obsolete mod_browser module); use in .htaccess files only supported with1.3.13 and laterSetEnvIf 지시자Syntax: SetEnvIf attribute regex envar[=value] [envar[=value]] ...Default: noneContext: server config, virtual host, directory, .htaccessOverride: FileInfoStatus: BaseModule: mod_setenvifCompatibility: Apache 1.3 and above; the Request_Protocol keyword andenvironment-variablematching are only available with 1.3.7 and later; use in .htaccess files only supportedwith 1.3.13 and later 환경변수 지정 및 값 지정 방법 1.varname, or 2.!varname, or 3.varname=value 예 : BrowserMatch ^Mozilla forms jpeg=yes browser=netscape BrowserMatch "^Mozilla/[2-3]" tables agif frames javascript BrowserMatch MSIE !javascript BrowserMatchNoCase Robot is_a_robot SetEnvIfNoCase User-Agent Robot is_a_robot BrowserMatchNoCase mac platform=macintosh BrowserMatchNoCase win platform=windows SetEnvIf Request_URI "\.gif$" object_is_image=gif SetEnvIf Request_URI "\.jpg$" object_is_image=jpg SetEnvIf Request_URI "\.xbm$" object_is_image=xbm : SetEnvIf Referer www\.mydomain\.com intra_site_referral : SetEnvIf object_is_image xbm XBIT_PROCESSING=1 SetEnvIfNoCase Host Apache\.Org site=apache SetEnvIf 지자자에서 attribute 에 올 수 있는 것들 : Remote_Host - the hostname (if available) of the client making the request Remote_Addr - the IP address of the client making the request Remote_User - the authenticated username (if available) Request_Method - the name of the method being used (GET, POST, et cetera) Request_Protocol - the name and version of the protocol with which the request was made (e.g., "HTTP/0.9", "HTTP/1.1", etc.) Request_URI - the portion of the URL following the scheme and host portion 그외 Host, User-Agent, and Referer 가능 see http://www.rfc-editor.org/rfc/rfc2616.txt따라서,BrowserMatch와 SetEnvIf User-Agent 는 서로 동일하다는 것을 알 수 있을 겁니다.*중요)CustomLog 지자자와 다르게 환경변수 인자에 여러 개를 설정할 수 있음.여기까지 이해가 되셨다면 다음은 보지 않아도 될듯 하군요.......^.^3. 예제3-1. 특정 IP 주소만 환경변수로 설정하기- 환경변수 이름 : do_not_log- 목적 : 이 환경변수에 해당되는 특정 IP 주소는 access_log에 기록하지 않는다. SetEnvIf Remote_Addr "^127.0.0.1$" do_not_log SetEnvIf Remote_Addr "^211.35.159.12[89]$" do_not_log SetEnvIf Remote_Addr "^211.35.159.1[345][0-9]$" do_not_log 위에서 설정한 특정 IP 주소는 127.0.0.1 자기자신을 말하는 루프백 주소 211.35.159.128, 211.35.159.129 두개의 IP 주소 211.35.159.130 ~ 211.35.159.139 10개의 IP 주소 211.35.159.140 ~ 211.35.159.149 10 개의 IP 주소 211.35.159.150 ~ 211.35.159.159 10 개의 IP 주소즉 원격의 IP 주소(Remote_Addr)가 위와 일치하면 do_not_log 환경변수에 지정하는 예임.*참고)^ 은 시작을 의미$ 은 마지막을 의미[0-9] 0~9까지의 숫자중 어느 하나3-2. 특정 타입의 파일만 환경변수로 설정하기 SetEnvIfNoCase Request_URI "\.(gif|jpg|png|css|js|java)$" do_not_log 요청 URI(Request_URI) 파일이 *.gif *.jpg *.png *.css *.js *.java 로 끝난 파일인 경우(대소문자를 구별하지 않음) do_not_log 환경변수에 지정함3-3. 특정 User-Agent 만 환경변수로 설정하기- 환경변수 이름 : do_not_log 과 is_a_robot- 목적 : 이 환경변수에 해당되는 특정 User-Agent는 access_log에 기록하지 않고, 따로 로그(robot-log)에 기록하거나 기록하지 않기 위함. BrowserMatchNoCase "ru-robot" do_not_log is_a_robot BrowserMatchNoCase "Slurp/si" do_not_log is_a_robot BrowserMatchNoCase "Mercator" do_not_log is_a_robot BrowserMatchNoCase "Gulliver" do_not_log is_a_robot BrowserMatchNoCase "SyncIT/" do_not_log is_a_robot BrowserMatchNoCase "FAST-WebCrawler" do_not_log is_a_robot BrowserMatchNoCase "Lycos_Spider" do_not_log is_a_robot BrowserMatchNoCase "^ia_archive" do_not_log is_a_robot BrowserMatchNoCase "^tv" do_not_log is_a_robot BrowserMatchNoCase "Scooter" do_not_log is_a_robot BrowserMatchNoCase "ZyBorg/" do_not_log is_a_robot BrowserMatchNoCase "KIT-Fireball" do_not_log is_a_robot BrowserMatchNoCase "Googlebot/" do_not_log is_a_robot BrowserMatchNoCase "DIIbot/" do_not_log is_a_robot BrowserMatchNoCase "teoma_agent3" do_not_log is_a_robot BrowserMatchNoCase "empas_robot" do_not_log is_a_robot모두 로봇으로 맞게 설정되었는지 모르겠네요...............T.T각각의 정규표현식 조건에 맞는 User-Agent 인 경우, do_not_log 환경변수와is_a_robot 이라는 두개의 환경변수에 설정한 예입니다.is_a_robot 이라고 또 하나의 환경변수를 지정한 이유는 앞서 얘기했듯이이 조건게 맞는 User-Agent가 접근할 경우 따로 로그에 기록하기 위함입니다.이 BrowserMatchNoCase 지시자 대신에 SetEnvIfNoCase User-Agent 로 대신할 수 있는데첫번째 부분을 다음과 같이 설정할 수 있습니다.(둘다 똑 같은 결과임) SetEnvIfNoCase User-Agent "ru-robot" do_not_log is_a_robot3-4. 종합예제 : 사오정(?) 로그 분석 피하기앞의 3개의 예제를 모두 적용하면 다음과 같습니다.목적은 배경에서 설명했듯이 가능한 access_log 파일에 - 방문자 외에 localhost에서 php가 실행하는 로그 기록은 기록하지 않는다. - 로봇들의 접근 기록은 따로 robot-log 파일에 기록한다. - 운영자가 주고 접근할 IP 주소는 로그에 기록하지 않는다. - *.gif, *.jpg, *.png, *.css, *.js, *.java 등과 같은 파일은 로그에 기록하지 않는다. 이 정도의 조건이라면 가능한 어느 정도 수준으로 순수 방문자의 접근 기록만 access_log 파일에 기록할 수 있습니다. -- httpd.conf(실제로 필자가 운영하는 아파치 설정 내용임) --------------------#### 중간 생략##LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%h %l %u %t \"%r\" %>s %b" commonLogFormat "%{Referer}i -> %U" refererLogFormat "%{User-agent}i" agentLogFormat "%h %l %u %t \"%r\" %>s %b \"%{User-Agent}i\"" use_robot#### 중간 생략#### 환경변수 do_not_log에 일치하지 않은 접근만 access_log 파일에 기록함.##CustomLog /usr/local/apache/logs/access_log combined env=!do_not_log## 중간 생략## 로봇들은 따로 robot_log 파일에 user_robot 포맷에 맞게 기록함##CustomLog /usr/local/apache/logs/robot_log use_robot env=is_a_robot## 중간 생략## 특정 IP 주소는 로그에 기록하지 않는다.## 주로 서버 IP 주소와 운영자가 자주 접속하는 IP 주소들##SetEnvIf Remote_Addr "^127.0.0.1$" do_not_logSetEnvIf Remote_Addr "^211.35.159.12[89]$" do_not_logSetEnvIf Remote_Addr "^211.35.159.1[345][0-9]$" do_not_log## 중간 생략## 주로 이미지 파일을 요청했을 경우 로그에 기록하지 않는다.##SetEnvIfNoCase Request_URI "\.(gif|jpg|png|css|js|java)$" do_not_log## 중간 생략## 로봇들의 환경변수 지정##BrowserMatchNoCase "ru-robot" do_not_log is_a_robotBrowserMatchNoCase "Slurp/si" do_not_log is_a_robotBrowserMatchNoCase "Mercator" do_not_log is_a_robotBrowserMatchNoCase "Gulliver" do_not_log is_a_robotBrowserMatchNoCase "SyncIT/" do_not_log is_a_robotBrowserMatchNoCase "FAST-WebCrawler" do_not_log is_a_robotBrowserMatchNoCase "Lycos_Spider" do_not_log is_a_robotBrowserMatchNoCase "^ia_archive" do_not_log is_a_robotBrowserMatchNoCase "^tv" do_not_log is_a_robotBrowserMatchNoCase "Scooter" do_not_log is_a_robotBrowserMatchNoCase "ZyBorg/" do_not_log is_a_robotBrowserMatchNoCase "KIT-Fireball" do_not_log is_a_robotBrowserMatchNoCase "Googlebot/" do_not_log is_a_robotBrowserMatchNoCase "DIIbot/" do_not_log is_a_robotBrowserMatchNoCase "teoma_agent3" do_not_log is_a_robotBrowserMatchNoCase "empas_robot" do_not_log is_a_robot## 이하 생략##------------------------------------------------------END |
블로그 > 정신없이 어디로 뛰어야 하는걸까? http://blog.naver.com/vhfpss/20002975774 | |
* tomcat 4. 대까지 적용 앞으로 test 라는 context에서 작업 하고자 한다면..... 구조는 c:\Tomcat4.1\webapps\test 폴더를 하나 만드시고, 그리고, server.xml 에서 268 라인 쯤에
<Context path="/test" docBase="webapps/test" debug="0" reloadable="true"/>라고 하니깐 안되더군요... 라고 하시면 끝....reloadable="true"는 무엇이냐 하면, 소스 코드가 바뀌었을 때 Tomcat 를 껐다 켜지 않아도 자동적으로 리로드 되게 하는 것입니다. 파일들이 가야할 위치는, 앞으로 작업하게 될 jsp, html 등은 test 밑에 있으면 됩니다. 여기까지 하시고, 간단한 html 을 작성하여 test 밑에 두시고, * tomcat 5. 대 적용 1. 톰캣 어드민 페이지를 연다. 예)http://도메인:8080/admin 2. $TOMCAT_HOME/conf/tomcat-users.xml파일을 아래와 같이 수정 --------------------------------------------------------------------------------------- <?xml version='1.0' encoding='utf-8'?> --------------------------------------------------------------------------------------- 3. tomcat-users.xml에서 기재했던 사용자아이디와 패스워드를 이용 admin페이지에 로그인한다. 4. 오른쪽 상단에 commitchange버튼을 클릭한다. 5. $TOMCAT_HOME/conf/Catalina/localhost 디렉토리에 기존에 없던 ROOT.xml 파일이 생성된다. 6. ROOT.xml 파일을 자신이 원하는 디렉토리 경로로 변경하면 된다. ---------------------------------------------------------------------------------------- ** default 설정 예) <?xml version='1.0' encoding='utf-8'?> ---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------- ** 변경된 설정 예) <?xml version='1.0' encoding='utf-8'?> ---------------------------------------------------------------------------------------- |
출처 http://www.linuxchannel.net/board/read.php?table=alpha&no=15&page=1
0