[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클래스 차단 하기


DB에 영향을 미치는 쿼리문을 찾아낼 수 있는 좋은 방법.

① mysql> show processlist;
show processlist -i5 여기서 숫자는 리프래쉬할 시간(초)입니다.
]# mysqladmin -uroot -p proc stat -i5 (밑에것 보다 조금더 상세)
]# mysqladmin -uroot -p processlist -i5

② mysql> show status;

기타)

]# top

팁!) ①의 경우 mysql에 접속을 한상태에서 내리는 명령어이지만 아래와 같이 접속하자 마자 바로 보여주는 예도 있다.
]# mysqladmin -uroot -p processlist

------------------------- sleep 죽이는 법 두가지 -------------------------
① mysql>kill id;
② mysqladmin kill id -u root -p