<?php
// File and rotation
$filename = 'IMG_9801.jpg';                         // $filename 은 테스트 환경에 맞는 다른 파일로 대체하여 사용
$degrees = 180;

// Content type
header('Content-type: image/jpeg');

// Load
$source = imagecreatefromjpeg($filename);

// Rotate
$rotate = imagerotate($source, $degrees, 0);

// Output
imagejpeg($rotate);

// Free the memory
imagedestroy($source);
imagedestroy($rotate);
?>


 

/bin/rm: Argument list too long

파일수가 많은 경우를 삭제하려고 시도할 때 나타나는 메세지이다.
rm 명령어에서 getopt function의 아규먼트 파싱하는데에 최대 수치를 넘어선 것으로 기본적으로 1024개 이상을 핸들링하지 못한다.
이에 대한 대처로 다음과 같은 명령어를 쓸 수 있다.

1. find . -name '파일타입' | xargs rm 또는 find . -name '파일타입' -exec rm -rf {};

2. find . -name '*' -exec rm {} \;


예시) /var/spool/mqueue 디렉토리 하위의 파일들이 삭제되지 않을 경우
find ./q*/ -print | xargs rm

 ./configure --prefix=/usr/local/mysql --sysconfdir=/etc --with-charset=euckr --with-extra-charsets=complex --with-mysqld-user=mysql --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static
make
make install

[컴파일 옵션 설명]

--prefix=/usr/local/mysql : 컴파일후 관련된 파일들이 설치되는 디렉토리,기본값 : /usr/local 

 --exec-prefix = EPREFIX : 기본값은  --prefix에서 지정한 값과 동일.

 --bin-dir = DIR : 클라이언트 실핼파일과 스크립들이 저장되는 디렉토리, 기본값은 PREFIX/bin

 --libexec=DIR : mysql 데몬, 기본값은 PREFIX/libexec

 --localstatedir=/usr/local/mysql/data : 사용자의 데이터와 로그파일를 저장할 디렉토리 지정, 기본값은 PREFIX/var

 --with-charset=utf8 : utf8로 charset 지정. utf-8로 하면 에러.

 --with-extra-charsets=all : 추가 charset 지정, none,complex,all 또는 charset 리스트

 --with-unix-socket-path=/tmp/mysql.sock : 소켓디렉토리 , 기본값은 /tmp 또는 /var/run

 --with-tcp-port=3306 : 포트 지정. 기본값은 3306

 --with-mysqld-user=mysql : 데몬실행 계정 지정

 --with-debug : debug code추가 , 사용안하는 경우 without 옵션으로

 --without-readline : 콘솔에서 한글 입력가능

 --enable-thread-safe-client : 쓰레드 지원

 --without-server : 서버 기능 없이 클라이언트로만 사용하고자 할 때 즉 클라이언트로만 사용할 때

 --enable-assembler : 어셈블러  함수 지원

 --with-client-ldflags=-all-static : 클라이언트 실행 파일 생성시 라이브러리를 포함하도록 지정, 정적으로 컴파일

 --with-mysqld-ldflags=-all-static : 데몬실행파일 생성시 라이브러리를 포함하도록 지정,정적으로 컴파일

 --sysconfdir=/etc : 설정파일 디렉토리지정

 --with-mit-threads : 강제로 MIT-pthreads 를 실행하고자 할때


php_screw-1.5.tar.gz

 

서론

php 소스 개발을 하다보면 공개하기가 꺼려지는 소스가 있기 마련입니다. 또한 디비 커넥트 설정과 계정정보 및 서버 설정에 대한 php 소스코드 들은 암호화가 해킹에 대한 최소한의 예방책일 것이다. 이러한 소스 암호화 툴로는 Zend , 이온큐브 쪽 솔루션이 잘 알려져 있습니다. 실제 여러업체에서 사용중이며 안정적입니다. 물론 유료화 버젼입니다. 하지만 무료버전의 암호화 툴도 있습니다. 오픈소스인 php_screw 입니다.
해당 솔루션은 일본의 ThePM9.com 이라는 개발업체에서 만들어 졌으며, 현재는 1.5버전까지 개발 되어 졌습니다. php 소스코드를 암호화된 파일로 생성하는 실행 파일과 이를 Zend – Compile에 전달 되기전에 해독하는 php 모듈 형태로 이루어 집니다.

어떠한 방법으로 암호화하는지는 공개 하지 않을 sourceforge를 통해 해당 소스를 다운 받아 php 동적 모듈을 생성 추가 하는 형태 입니다. 아래부터는 해당 모듈의 설치 법에 대해서 알아 보고겠습니다.

본론

1. 설치 조건
다운 받은 소스상 README 파일을 읽어보시면 알 수 있겠지만 php_screw-1.5버젼은 PHP5.x 버젼에 zlib 이 설치 되어있어야 하며, UNIX 계열 ( 리눅스 , FreeBSD 등) 에서만 지원 합니다. 그런데 php4 버젼에서도 설치 및 운영이 잘됩니다. (당연한 말씀이겠지만 php가 동적으로 설치 되어 있어야 합니다.)

 

2. sourceforge를 통해 해당 파일을 다운 받습니다. (http://sourceforge.net/projects/php-screw/)

 

3. 저는 해당 소스를 /usr/local/src 디렉토리에 옮겨 놓았습니다.
[root@localhost src]# pwd
/usr/local/src
[root@localhost src]# ls
php_screw-1.5.tar.gz

 

4. 소스 압축 해제
[root@localhost src]# tar xvzf php_screw-1.5.tar.gz
php_screw-1.5/
php_screw-1.5/zencode.c
php_screw-1.5/LICENSE
php_screw-1.5/tools/
php_screw-1.5/tools/zencode.c
php_screw-1.5/tools/Makefile
php_screw-1.5/tools/screw.c
php_screw-1.5/config.h
php_screw-1.5/README.en
php_screw-1.5/config.m4
php_screw-1.5/Makefile.in
php_screw-1.5/php_screw.c
php_screw-1.5/php_screw.h
php_screw-1.5/my_screw.h
php_screw-1.5/README.jp

 

5. phpize 명령어를 이용하여 서버 정보에 맞는 configure 생성
[root@localhost src]# cd php_screw-1.5
[root@localhost php_screw-1.5]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version: 20020918
Zend Module Api No: 20020429
Zend Extension Api No: 20050606

 

6. 생성된 소스 확인
  [root@localhost php_screw-1.5]# ll
합계 800
-rw-rw-rw- 1 root root 1388 1월 12 2004 LICENSE
-rw-r–r– 1 root root 3151 4월 4 00:10 Makefile.global
-rw-rw-rw- 1 root root 245 8월 1 2002 Makefile.in
-rw-rw-rw- 1 root root 4052 10월 14 2007 README.en
-rw-rw-rw- 1 root root 3290 10월 14 2007 README.jp
-rw-r–r– 1 root root 52186 4월 4 00:10 acinclude.m4
-rw-r–r– 1 root root 174501 4월 4 00:10 aclocal.m4
drwxr-xr-x 2 root root 4096 4월 4 00:10 autom4te.cache
drwxr-xr-x 2 root root 4096 4월 4 00:10 build
-rwxr-xr-x 1 root root 41134 4월 4 00:10 config.guess
-rw-r–r– 1 root root 1644 10월 13 2007 config.h
-rw-r–r– 1 root root 1540 4월 4 00:10 config.h.in
-rw-rw-rw- 1 root root 593 4월 17 2002 config.m4
-rwxr-xr-x 1 root root 29708 4월 4 00:10 config.sub
-rwxr-xr-x 1 root root 279525 4월 4 00:10 configure
-rw-r–r– 1 root root 2226 4월 4 00:10 configure.in
-rw-r–r– 1 root root 0 4월 4 00:10 install-sh
-rw-r–r– 1 root root 143988 4월 4 00:10 ltmain.sh
-rw-r–r– 1 root root 0 4월 4 00:10 missing
-rw-r–r– 1 root root 0 4월 4 00:10 mkinstalldirs
-rw-rw-rw- 1 root root 63 8월 1 2002 my_screw.h
-rw-rw-rw- 1 root root 3142 10월 14 2007 php_screw.c
-rw-rw-rw- 1 root root 194 8월 1 2002 php_screw.h
drwxrwxrwx 2 root root 4096 10월 14 2007 tools
-rw-rw-rw- 1 root root 1772 10월 14 2007 zencode.c

 

7. SEED key 변경
  – README를 잘 읽어보시면 알겠지만 암호화 할때 특정 키값에 따라 암화된 값이 달라집니다.
그러므로 각자가 원하시는 값으로 변경 하시면 됩니다. my_screw.h 의 배열의 값을 변경 하시면 됩니다.
값의 크기에 따른 속도 차이는 없다고 합니다.

[root@localhost php_screw-1.5]# cat my_screw.h
short pm9screw_mycryptkey[] = {
11152, 368, 192, 1281, 62
};

 

8. 컴파일 환경 설정
  [root@localhost php_screw-1.5]# ./configure –with-php-config=/usr/local/php/bin/php-config

 

9. 컴파일
  [root@localhost php_screw-1.5]# make

 

10. 모듈 확인
  [root@localhost php_screw-1.5]# ll modules/
합계 32
-rw-r–r– 1 root root 721 4월 4 00:25 php_screw.la
-rwxr-xr-x 1 root root 26781 4월 4 00:25 php_screw.so

 

11. 모듈 위치 지정
  – 모듈을 확인 하고 make install 을 통해 자동으로 모듈을 특정 디렉토리를 이동 할 수 있지만 경로명이 직관적이지 않아 자체디렉토리를 만들어 줍니다.
[root@localhost php_screw-1.5]# mkdir /usr/local/lib/php_modules
[root@localhost php_screw-1.5]# mv modules/php_screw.so /usr/local/lib/php_modules

 

12. php.ini 설정
  – php.ini 의 설정을 통해 해당 모듈을 로드할 수 있게 합니다. 아래와 같이
[root@localhost php_screw-1.5]# vi /usr/local/lib/php.ini
……
extension_dir = “./” 을 extension_dir = “/usr/local/lib/php_modules” 로 수정 및 아래 내용 추가
extension=php_screw.so
…..

 

13. 모듈 확인
  – 아파치 재시작 후 모듈 확인
[root@localhost php_screw-1.5]# /usr/local/apache/bin/apachectl restart
[root@localhost php_screw-1.5]# php -i | grep php_screw
php_screw
php_screw support => enabled
PWD => /usr/local/src/php_screw-1.5
_SERVER["PWD"] => /usr/local/src/php_screw-1.5
_ENV["PWD"] => /usr/local/src/php_screw-1.5
[root@localhost php_screw-1.5]#

 

14. 암호화 명령어 컴파일
  – 모듈 추가가 완료 되면 소스를 암호화하는 툴을 컴파일 해야 합니다.
해당 소스트 tools 라는 디렉토리에 있습니다.
[root@localhost php_screw-1.5]# cd tools/
[root@localhost tools]# pwd
/usr/local/src/php_screw-1.5/tools

 

15. 컴파일 및 결과 확인
[root@localhost tools]# make
gcc -o screw screw.c zencode.c -lz
[root@localhost tools]# ll
합계 24
-rw-r–r– 1 root root 105 10월 14 2007 Makefile
-rwxr-xr-x 1 root root 8644 4월 4 00:34 screw
-rw-rw-rw- 1 root root 1541 10월 14 2007 screw.c
-rw-rw-rw- 1 root root 1772 10월 14 2007 zencode.c

 

16. screw 라는 명려어를 이용해서 암호화하기
  – 사용하기 쉽게 path가 잡혀있는 경로 이동 하기 것이 좋을듯합니다.
- test.php 자연수를 입력 받아 구구단을 출력하는 소스입니다.
[root@localhost tools]# mv screw /usr/local/bin
[root@localhost tools]# cd /home/test/public_html/
[root@localhost public_html]# ll
합계 4
-rw-r–r– 1 root root 1398 4월 4 00:39 test.php
[root@localhost public_html]# screw test.php
Success Crypting(test.php)
[root@localhost public_html]# ll
합계 8
-rw-r–r– 1 root root 768 4월 4 00:44 test.php
-rw-r–r– 1 root root 1398 4월 4 00:44 test.php.screw

 

17. 암호화 파일 확인 및 원소스 삭제
  – 위의 결과와 같이 소스이름뒤 .screw 가 붙은 파일이 원 소스이다. 백업 후 삭제 해준다.
- 암호화 파일 확인
[root@localhost public_html]# cat test.php
PM9SCREW �>;ㅤㅅㅟㅊ,�{�!`�s첨e=�Iㅤㅍㅐㅍ�YU.i*�+ⓘⅴㅤㄷㅘㄻㅤㄲㅑㄷㅤㄷㅜㅋ��|(p�@~B㎎臾;Nx�{uㅤㄱㅢㄻ1ㅤㅈㅙㅅ$ごㅤㅆㅢㄵ�Li�.b��ㅤㅅㅞㅅ厘TH�*�[c�Lf
RbZ�gr統�ㅤㅇㅡㄾt24%#�ㅤㄹㅓㅀ�8�EㅤㅆㅒㅤZ緡v�ㅤㅎㅞㄺㅤㄷㅘㅇ�#_�Mㅤㄲㅘㅊㅤㄷㅙㅍ4n펍岱!
�`ㅤㄸㅙㅀ�h�`�iZHㅤㄱㅘㄾ:s�#�-LTㅤㄲㅣㅍH�3ㅤㄲㅔㄿ狼lㅤㅅㅒㄳ�ㅤㄴㅔㅊㅤㅉㅡㅈ뼘x0ㅤㄱㅏㄲ1�ㅤㄲㅘㅀBEㅤㅁㅣㅀㅤㅆㅒㄼ��tㅤㅎㅣㅌc22%ㅤㅌㅔㅀx�{ㅤㄷㅙㄳ)嗅X窺!st�ㅤㅆㅞㅆ섞ㅤㄲㅖㅂ8�E�[m�*陛�
�*w�gㅤㅌㅛㄺJU1ㅤㅈㅝㄵ�W�I�lT商P'ㅤㄲㅔㄺ�+�|+M�V�76��Yㅤㄴㅑㄵㅤㅇㅡㄾ�ㅤㄲㅖㅁ莩�nr���8c詐yKR�}%A僭r�T�`ㅤㅃㅓㄵ"A�
ㅤㄴㅘㅇ��O�r$LZ쇨mㅤㄹㅕㄻ_�\D7淨ㅤㅋㅕㅊ芟鍋$侘ㅤㄲㅒㄺC�\���%驕W廈ㅤㅍㅐㄶe�Z펫Y�Urㅤㅇㅏㅄ~ㅤㅈㅜㄳ鍋�ㅤㅅㅝㄱ�6� ㅤㅎㅕㄼ�bS沈�Jㅤㄱㅢㅈ�cb ㅤㅂㅒㄵ%ㅤㅎㅝㅅx炡�8;?o筒V1ㅤㅍㅑㄻVy((ㅤㄴㅠㅀㅤㅈㅜㄵ0.BbC
���6崗≫?a-;戾+倜�m�F�6d|Tx/�ㅤㅉㅜㄻㅤㄲㅛㄲㅤㅊㅛㄴ�2ㅤㅈㅐㄻ�ㅤㄹㅠㅆ!�ㅤㄱㅗㅋqRc>匕qo@逋[root@localhost public_html]#

 

결론

설치 및 운영에는 특별히 신경 쓴 부분이 없다. 그러나 서버 이전시 문제 되는 부분이 있다. my_screw.h 에 설정된 SEED key 값을 모르게 된다면 아무리 모듈을 만들어도 해당 소스 웹출력이 되지 않습니다. 원 소스 백업이 중요하며 해당 SEED key 값도 백업 해 놓는것도 중요합니다.

 

에러 발생시
php_screw-1.5/php_screw.c:124: error: ‘struct _zend_compiler_globals’ has no member named ‘extended_info’
php_screw-1.5/php_screw.c: In function ‘zm_shutdown_php_screw’:
php_screw-1.5/php_screw.c:133: error: ‘struct _zend_compiler_globals’ has no member named ‘extended_info’
make: *** [php_screw.lo] Error 1
이러한 에러가 날 경우, 위의 에러메시지의 라인 124, 133을 찾아보면 CG(extended_info) = 1; 라고 적혀있는데,
이것을 주석처리하거나 삭제한 뒤, 다시 make 하면 된다.


개요 : 최신 트렌트는 모바일용 홈페이지가 대세인데 이를 구현하기 위한 몇가지 설정에 대한 정리를 하고자 한다.


1. 모든 모바일페이지 (*.html, *.php 문서 해당) 의 <head> </head> 사이에 아래 내용을 정의한다.


<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0">


위 태그는 작성된 웹문서를 모바일 디바이스의 해상도에 맞게 표현해주는 태그다.


2. 모바일 페이지/모바일 홈페이지 자동 리다이렉션 (기존 운영된 홈페이지의 index 파일 최상단에 아래 내용 정의한다.)


[Java Script 버전]

 <script type="text/javascript" language="JavaScript">

var mobileKeyWords = new Array('iPhone', 'iPod', 'BlackBerry', 'Android', 'Windows CE', 'Windows CE;', 'LG', 'MOT', 'SAMSUNG', 'SonyEricsson', 'Mobile', 'Symbian', 'Opera Mobi', 'Opera Mini', 'IEmobile');

for (var word in mobileKeyWords){

if (navigator.userAgent.match(mobileKeyWords[word]) != null){

window.location.href = "이동할 주소";

break;

}

}

</script>

 


[PHP 버전]

<? php

$mobileKeyWords = array ('iPhone','iPod','BlackBerry','Android','Windows CE','Windows CE;','LG','MOT','SAMSUNG','SonyEricsson','Mobile','Symbian','Opera Mobi','Opera Mini','IEmobile');

 

for($i = 0 ; $i < count($mobileKeyWords) ; $i++)

{

if(strpos($_SERVER['HTTP_USER_AGENT'],$mobileKeyWords[$i]) == true)

{

header("Location: http://이동할주소");

exit;

}

}

?>

 


3. .htaccess 파일 정의 (기존 index 파일이 위치한 동일 경로에 생성)


RewriteEngine On

RewriteCond $1 !^(m)/
RewriteCond %{HTTP_HOST} ^m\.domain\.com [NC]
RewriteRule ^(.*)$ /m/$1 [L]


위 내용을 .htaccess 파일로 저장하면 된다.



신문이나 TV에 나오는 ‘연료첨가제’ 광고를 보면 귀가 솔깃해진다. 연료를 절감하고 엔진 출력을 높여 준다고 광고하기 때문이다. 그러나 가격이 만만치 않고 실제 효과도 무작정 믿을 수가 없어 구입이 망설여지기 마련이다. 첨가제를 자주 사용하면 오히려 엔진에 해롭다는 주장도 있어 소비자는 혼란스럽기만 하다. 연료첨가제는 일부 효과가 있는 것은 사실이지만 과신하거나 과용하면 안 된다는 것이 전문가들의 의견이다.

○엔진의 때 빼주는 세정기능 연료첨가제

연료첨가제는 말 그대로 휘발유나 경유에 일정 비율로 섞어 쓰는 화학 첨가제다.

첨가제는 크게 엔진 실린더에 낀 때를 빼주는 기능과 엔진 출력을 높여 주는 기능으로 나뉘는데 국내에서 팔리는 것은 대부분 세정 기능용 연료첨가제다.

휘발유나 경유는 연소 과정에서 다양한 불순물이 나온다. 그중에서도 카본은 실린더와 피스톤에 달라붙어 엔진의 기능을 떨어뜨린다. 실린더 내에 연료가 분사되면 피스톤이 밀고 올라와 고온고압 상태가 되는데 이때 실린더 윗부분에서 불꽃을 튀겨 폭발하면서 피스톤의 상하 운동이 반복된다.

문제는 카본이 실린더 내부에 잔뜩 끼어 있으면 내부 압력과 온도가 높아져 피스톤이 끝까지 밀고 올라오기 전에 자연 발화(노킹 현상)를 해 버린다는 점. 피스톤이 실린더 윗부분 끝까지 올라왔다가 폭발력으로 튕겨 내려가는 힘에 따라 엔진의 출력이 결정되는데 노킹 현상이 발생하면 출력이 떨어질 뿐만 아니라 엔진도 손상된다.

세정 기능용 연료첨가제는 이처럼 엔진에 낀 묵은 때를 벗겨 주고, 연료통의 수분도 없애는 역할을 한다.

현재 시중에서 팔리는 제품으로는 불스원샷, 레덱스, 엔팍, STP 등 10여 종류가 있다.

불스원의 조승현 제품개발담당 차장은 “세정 기능이 있는 연료첨가제는 완전연소를 돕기 때문에 연료소비효율 개선 효과도 적지 않다”고 설명했다.

○옥탄가 높여 주는 옥탄부스터

연료첨가제 중에는 연료의 옥탄가를 높여 주는 ‘옥탄부스터’도 있다.

옥탄가는 피스톤이 압축할 때 연료가 자연 발화되지 않고 견딜 수 있는 내화점(耐火點)을 의미하는데 높을수록 고급 휘발유다. 일반 휘발유의 옥탄가는 91∼93인 반면 요즘 나오는 프리미엄급 휘발유는 98∼100이다.

옥탄부스터는 휘발유에 일정 비율로 섞어 넣으면 같은 휘발유라도 옥탄가가 1, 2 정도 올라가는 효과가 있어 노킹이 발생하는 엔진이나 고(高)옥탄가를 요구하는 수입차에는 출력이 약간 올라가는 효과가 있다.

문제는 옥탄부스터에 어떤 화학물질을 첨가했느냐다. 일부 첨가물은 유해물질을 발생시키거나 엔진에 손상을 줄 수 있어 사용이 제한되고 있다.

자동차 정비업체 카젠의 김창석 정비팀장은 “연료첨가제는 엔진 내 카본의 생성을 조금 줄여 줄 수는 있지만 없애지는 못한다”며 “어떤 첨가제든 성능을 과신하면 안 되고 일부 제품은 너무 자주 사용하면 오히려 해로울 수도 있으니 주의해야 한다”고 충고했다.

김창원 기자 changkim@donga.com

 

[php pdo-mysql 확장 모듈 설치]
 
1.pdo_mysql download
wget http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
 
2.설치

적당한 위치에 다운로드 받은 파일을 압축해제 후 압축해제한 디렉토리로 이동 
/usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql
make && make install
 
3.적용

php.ini 파일은 대부분 /etc 또는 apache/conf 디렉토리에 있음.

php.ini 파일에 추가
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/pdo_mysql.so
 
추가 후 apache restart 하면 적용완료 됨!! 
/usr/local/apache/bin/apachectl restart


※ 에러 처리

make 과정시 아래와 같은 에러가 발생할 경우


/usr/local/src/PDO_MYSQL-1.0.2/php_pdo_mysql_int.h:25:19: error: mysql.h: 그런 파일이나 디렉터리가 없습니다
In file included from /usr/local/src/PDO_MYSQL-1.0.2/pdo_mysql.c:31:
/usr/local/src/PDO_MYSQL-1.0.2/php_pdo_mysql_int.h:36: error: expected specifier-qualifier-list before ‘MYSQL’
/usr/local/src/PDO_MYSQL-1.0.2/php_pdo_mysql_int.h:48: error: expected specifier-qualifier-list before ‘MYSQL_FIELD’
/usr/local/src/PDO_MYSQL-1.0.2/php_pdo_mysql_int.h:53: error: expected specifier-qualifier-list before ‘MYSQL_RES’
make: *** [pdo_mysql.lo] 오류 1

해결 : vi /usr/local/src/PDO_MYSQL-1.0.2/php_pdo_mysql_int.h

25라인의 #include <mysql.h> 를 #include </usr/local/mysql/include/mysql/mysql.h> 로 변경

 

/usr/local/src/PDO_MYSQL-1.0.2/mysql_driver.c:33:26: error: mysqld_error.h: 그런 파일이나 디렉터리가 없습니다
In file included from /usr/local/src/PDO_MYSQL-1.0.2/mysql_driver.c:40:
/usr/local/src/PDO_MYSQL-1.0.2/php_pdo_mysql_sqlstate.h: In function ‘pdo_mysql_get_sqlstate’:
/usr/local/src/PDO_MYSQL-1.0.2/php_pdo_mysql_sqlstate.h:378: error: ‘WARN_DATA_TRUNCATED’ undeclared (first use in this function)
/usr/local/src/PDO_MYSQL-1.0.2/php_pdo_mysql_sqlstate.h:378: error: (Each undeclared identifier is reported only once
/usr/local/src/PDO_MYSQL-1.0.2/php_pdo_mysql_sqlstate.h:378: error: for each function it appears in.)
make: *** [mysql_driver.lo] 오류 1

해결 : vi mysql_driver.c

33라인의 #include <mysqld_error.h> 를 #include </usr/local/mysql/include/mysql/mysqld_error.h> 로 변경




 

mod_geoip-latest.tar.gz   mod_geoip2_1.2.5.tar.gz


아파치에 GeoIP 모듈 설치하는 방법

GeoIP 란 MaxMind 에서 제공하는 국가별로 IP를 확인할 수 있는 오픈소스 라이브러리로 이를 이용하여 서버에 접근 하는 아이피를

국가별로 관리할 수 있습니다.

 

http://www.maxmind.com

(1) GeoIP C API 설치하기

1. 

- GeoIP C API를 다운 받아 설치 합니다.

http://geolite.maxmind.com/download/geoip/api/c/

#wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP-1.4.6.tar.gz

#wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP-1.5.1.tar.gz  (최신)

2

- 압축을 해제 합니다.

#tar zxvf GeoIP-1.4.6.tar.gz

3.
- 해제된 디렉토리로 이동 후 설치 디렉토리를 지정하여 ./configure 합니다.

#cd GeoIP-1.4.6
#./configure --prefix=/usr/local/GeoIP

4.
- 컴파일 및 설치를 진행 합니다.

#make && make install

5.
GeoIP의 ip 목록을 최신정보로 갱신하기 위하여 GeoIP.dat 를 다운받아 설치된 위치에 복사 합니다.

- 국가 정보 다운로드

#wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

- 도시 정보 다운로드

#wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

- 압축 해제

#gzip -d GeoIP.dat.gz 
#gzip -d GeoLiteCity.dat.gz

- 해제된 파일을 GeoIP가 설치된 위치에 덮어쓰기

#cp -a GeoIP.dat /usr/local/GeoIP/share/GeoIP/
#cp -a GeoLiteCity.dat /usr/local/GeoIP/share/GeoIP/

(2)
geoip모듈을 아파치에 설치하기.

1.mod_geoip를 다운 받습니다.

아파치 1.x 용

http://geolite.maxmind.com/download/geoip/api/mod_geoip/   안되면

http://www.maxmind.com/download/geoip/api/mod_geoip/mod_geoip-latest.tar.gz

아파치 2.x 용

http://geolite.maxmind.com/download/geoip/api/mod_geoip2/

 

ex)아파치 2.x용 다운로드

#wget http://geolite.maxmind.com/download/geoip/api/mod_geoip2/mod_geoip2_1.2.5.tar.gz

 

2

.
압축을 해제 합니다.

#tar zxvf mod_geoip2_1.2.5.tar.gz

3.
해제된 위치로 이동 후 c파일을 apxs를 이용하여 설치 합니다.

#cd mod_geoip2_1.2.5

#[아파치 apxs경로] -i -a -L[geoip설치디렉토리의lib경로] -I[geoip설치디렉토리의include경로] -lGeoIP -c[mod_geoip.c 경로] 

## 옵션의 대소문자 주의 -lGeoIP = 소문자 l로 시작

#/usr/local/apache/bin/apxs -i -a -L/usr/local/GeoIP/lib -I/usr/local/GeoIP/include -lGeoIP -c /root/mod_geoip2_1.2.5/mod_geoip.c

4.
모듈이 정상적으로 설치,로드 되었는지 확인합니다.

#ls -al /usr/local/apache/modules/mod_geoip.so 
-rwxr-xr-x 1 root root 38179  3월 26 13:16 /usr/local/apache/modules/mod_geoip.so

- httpd.conf 파일의 LoadModule 위치에 추가 되었는지 확인

LoadModule geoip_module       modules/mod_geoip.so

- phpinfo 페이지의 Apache Environment 정보에 GEOIP_CONTINENT_CODE, GEOIP_COUNTRY_CODE, GEOIP_COUNTRY_NAME 항목 확인

5.
httpd.conf에 mod_geoip 모듈의 적용 내용을 설정합니다.

특정 국가의 접근 차단

<IfModule mod_geoip.c>
    GeoIPEnable On
    GeoIPDBFile /usr/local/GeoIP/share/GeoIP/GeoIP.dat
    <Location /home>
           SetEnvIf GEOIP_COUNTRY_CODE CN go_out
           SetEnvIf GEOIP_COUNTRY_CODE RU go_out
           SetEnvIf GEOIP_COUNTRY_CODE TH go_out
           <Limit GET POST>
             Order Allow,Deny
             Allow from all
             Deny  from env=go_out
           </Limit>
    </Location>
</IfModule>

특정 국가에만 접근 허용

<IfModule mod_geoip.c>
    GeoIPEnable On
    GeoIPDBFile /usr/local/GeoIP/share/GeoIP/GeoIP.dat
    <Location /home>
          SetEnvIf GEOIP_COUNTRY_CODE KR go_in
           <Limit GET POST>
             Order Deny,Allow
             Deny from all
             Allow  from env=go_in
           </Limit>
    </Location>
</IfModule>

또는 httpd.conf 와 virtualhosts.conf 에 분리해서 설정도 가능

[httpd.conf 내용]

<IfModule mod_geoip.c>
GeoIPEnable On
GeoIPDBFile /usr/local/GeoIP/share/GeoIP/GeoIP.dat
</IfModule>

[virtualhosts.conf 내용]

<Virtualhost *>
<Location />
 SetEnvIf GEOIP_COUNTRY_CODE KR go_in
  <Limit GET POST>
   Order Deny,Allow
   Deny from all
   Allow  from env=go_in
 </Limit>
</Location>
</Virtualhost>


[참고]
Cannot load /usr/local/apache/libexec/mod_geoip.so into server: libGeoIP.so.1: cannot open shared object file: No such file or directory   <--- 요런 에러 발생시
/etc/ld.so.conf 파일에
/usr/local/GeoIP/lib 라인 추가 후
ldconfig 명령실행

 

/usr/local/apache/bin/apachectl 파일을 열어 아래 처럼 수정해라.

[before]

    start)
        if [ $RUNNING -eq 1 ]; then
            echo "$0 $ARG: httpd (pid $PID) already running"
            continue
        fi
        if $HTTPD ; then
            echo "$0 $ARG: httpd started"
        else
            echo "$0 $ARG: httpd could not be started"
            ERROR=3
        fi
        ;;


[after]
   
    start)
        if [ $RUNNING -eq 1 ]; then
            echo "$0 $ARG: httpd (pid $PID) already running"
            continue
        fi
        if $HTTPD -DSSL; then
            echo "$0 $ARG: httpd started"
        else
            echo "$0 $ARG: httpd could not be started"
            ERROR=3
        fi
        ;;

이후 /usr/local/apache/bin/apachectl start 로 실행했을 때 ssl 포트가 동시에 open 되는지 netstat -nlp 로 확인 해 볼것.


<Directory  "/home/sysadm/public_html">
  Order  allow,deny
  allow from all
  deny from 223.33.184.104
</Directory>


* (1) 223.33.184.104 에서 접속이 들어오면 차단하고 그 외에는 모두 허용한다.



* (2) Deny from all 을 생략할 경우 아래와 같이 Order 순서를 allow,deny 순으로 하여 allow만 처리되도록 한다.


<Directory "/www/sysadm/public_html">
    Order allow,deny
    Allow from 223.33.184.104
</Directory>


* (3) Deny from all 이 들어갈 경우 아래와 같이 Order 순서를 deny,allow 순으로 하고 Deny from을 먼저 정의한다.


<Directory "/www/sysadm/public_html">
    Order deny,allow
    Deny from all
    Allow from 223.33.184.104
</Directory>


* (2)와 (3) 모두 223.33.184.104 만 접속을 허용하고 나머지는 모두 차단한다.


[참고] Allow from 과 Deny from 은 아래와 같이 특정 IP 뿐만 아니라 C클래스 또는 B클래스 대역까지도 차단이 가능하다.


ex) Allow from 10.10.10.0/16   -> 10.10.10.0 대역 b클래스 허용 하기

ex) Deny from 10.10.10.0/16   -> 10.10.10.0 대역 b클래스 차단 하기


ex) Allow from 10.10.10.0/24   -> 10.10.10.0 대역 c클래스 허용 하기

ex) Deny from 10.10.10.0/24   -> 10.10.10.0 대역 c클래스 차단 하기