2015년 3월 26일 목요일

[CentOS 6.5] APM 소스설치 - Mysql 5.6 + httpd 2.4.7 + php 5.5.8 + Tomcat 8.0

서버 관리를 하다보니 리눅스(CentOS)에서 YUM으로 설치되는 버전이 낮아 웹 취약점들에 노출되는 경우가 발생되었다.

관공서 쪽 관리하는 경우가 많다보니 이래저래 구글링을하다가 입맛에 맞는 것을 득템!!

내 나름대로 수정을 하여 설치 성공한 이력을 남겨 놓자~

※ 설치 환경
  - OS : CentOS 6.5 32bit 및 64bit

--------------------------------------------------------------------------------


Ⅰ. 설치 전 준비

yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel  ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel libtool  libtool-libs openldap openldap-devel nss_ldap openldap-clients openldap-servers libtool-ltdl libtool-ltdl-devel bison

yum groupinstall "Development Tools"
yum -y install gd gd2 gd-devel gd2-devel wget pcre openssl* perl libaio


- 설치소스 Download

http://dev.mysql.com/downloads/mysql/#downloads

Generic Linux (Architecture Independent), Compressed TAR Archive download

# wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.15-linux-glibc2.5-x86_64.tar.gz
# wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.15-linux-glibc2.5-i686.tar.gz

Gernerally Available (GA) Releases, Source Code : Compressed TAR Archive download
# wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.16.tar.gz

# wget http://mirror.apache-kr.org/httpd/httpd-2.4.7.tar.gz

# wget http://mirror.apache-kr.org/apr/apr-1.5.0.tar.gz
# wget http://mirror.apache-kr.org/apr/apr-iconv-1.2.1.tar.gz
# wget http://mirror.apache-kr.org/apr/apr-util-1.5.3.tar.gz

php : http://www.php.net/downloads.php#v5
# wget http://kr1.php.net/get/php-5.5.8.tar.gz/from/this/mirror

libiconv : http://www.gnu.org/software/libiconv/#downloading
# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

libmcrypt : http://sourceforge.net/projects/mcrypt/files/Libmcrypt/
# wget ftp://ftp.superuser.co.kr/etc/libmcrypt-2.5.7.tar.gz
# wget http://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz/download

mhash : http://mhash.sourceforge.net/
# wget http://sourceforge.net/projects/mhash/files/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz/download

mcrypt : http://sourceforge.net/projects/mcrypt/
# wget http://sourceforge.net/projects/mcrypt/files/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz/download

ImageMagick: http://www.imagemagick.org/script/download.php
# wget ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/ImageMagick-6.8.8-4.tar.gz

imagick: http://pecl.php.net/package/imagick
# wget http://pecl.php.net/get/imagick-3.1.2.tgz


Tomcat 8.0 : http://tomcat.apache.org/download-80.cgi
# wget http://mirror.apache-kr.org/tomcat/tomcat-8/v8.0.0-RC10/bin/apache-tomcat-8.0.0-RC10.tar.gz

Tomcat Native: http://tomcat.apache.org/download-native.cgi
# wget http://mirror.apache-kr.org/tomcat/tomcat-connectors/native/1.1.29/source/tomcat-native-1.1.29-src.tar.gz

Tomcat Connector : http://tomcat.apache.org/download-connectors.cgi
# wget http://mirror.apache-kr.org//tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.37-src.tar.gz

jdk : http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
# wget http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-linux-x64.tar.gz

pcre: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.34.tar.gz


* 위의 모든 소스를 모아 압축해둔 것을 첨부하여 놓는다.





Ⅱ. MySQL

1. 기존 mysql 제거
yum erase mysql-libs


2. 의존성 패키지 설치
yum install cmake.x86_64
yum install ncurses-devel.x86_64
--------------- or ---------------
yum install cmake.i686
yum install ncurses-devel.i686



3. 컴파일

# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=all

# make
# make install


4. 환경 설정
cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
vi /etc/my.cnf
다음 항목을 [mysqld] 영역에 추가 
########################
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
server_id = 1
socket = /tmp/mysql.sock
explicit_defaults_for_timestamp=true
########################


5. 사용자 추가 및 DB 설치
groupadd mysql
useradd -r -g mysql mysql
cd /usr/local
chown -R mysql:mysql mysql
cd mysql
scripts/mysql_install_db \
--user=mysql \
--datadir=/usr/local/mysql/data \
--basedir=/usr/local/mysql


6. MySQL 시동파일 구성 및 시작
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
/etc/init.d/mysqld start


7. root 패스워드 및 보안 설정
/usr/local/mysql/bin/mysql_secure_installation

Enter current password for root (enter for none): 엔터

Set root password? [Y/n] Y
New password: 패스워드입력
Re-enter new password: 패스워드입력
Password updated successfully!
Reloading privilege tables..
 ... Success!



8. 리눅스 시작시 mysql 구동되도록 설정
chkconfig --add mysqld
chkconfig mysqld on
chkconfig --list mysqld



Ⅲ. Tomcat 8 설치

1. apr 1.4.8 설치
tar zxvf apr-1.5.0.tar.gz
cd apr-1.5.0
./configure --prefix=/usr/local/apr
make
make install


2. apr-iconv 설치
tar zxvf apr-iconv-1.2.1.tar.gz
cd apr-iconv-1.2.1
./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr
make
make install


3. apr-util 설치
tar zxvf apr-util-1.5.3.tar.gz
cd apr-util-1.5.3
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv
make
make install

4. jdk 설치
rpm -ivh jdk-7u45-linux-x64.rpm


5. Tomcat 8.0 설치
tar zxvf apache-tomcat-8.0.0-RC10.tar.gz
mv apache-tomcat-8.0.0-RC10 /usr/local/

cd /usr/local/
mv ./apache-tomcat-8.0.0-RC10 ./tomcat-8.0.0-RC10


tar xvzf tomcat-native-1.1.29-src.tar.gz
cd tomcat-native-1.1.29-src/jni/native/
./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.7.0_51/ --libdir=/usr/local/lib64
./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.7.0_51/ --libdir=/usr/local/lib

make
make install



a. 환경구성

vi /etc/profile 파일의 마지막에 다음 행 추가

export LD_LIBRARAY_PATH=/usr/local/apr/lib
export JAVA_HOME=/usr/java/jdk1.7.0_51
export TOMCAT_HOME=/usr/local/tomcat-8.0.0-RC10
export PATH=$JAVA_HOME/bin:$TOMCAT_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib

b. 설정 확인을 위해 다음 명령 실행

# source /etc/profile
# java -version

************* 다음 내용이 출력되면 성공 ***************************
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) Client VM (build 24.51-b03, mixed mode, sharing)
*****************************************************************

### 그냥 두고 jdk 버전의 순서를 변경하는 경우

우선 현재 java config를 살펴보자

# update-alternatives --config java
3 개의 프로그램이 'java'를 제공합니다.
  선택    명령
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk/bin/java
   2           /usr/lib/jvm/jre-1.6.0-openjdk/bin/java

자동적으로 설치된 openjdk가 자리잡고 있다.

그러므로, 위에 설치한 버전을 config에 추가하고 선택해주어야 한다.

우선 config에 추가
-- 사용법: update-alternatives --install <링크> <이름> <경로> <우선순위>
# update-alternatives --install /usr/bin/java java /usr/local/jdk1.7.0_45/bin/java 3

그럼 추가가 됐는지 볼까요?

# update-alternatives --config java
3 개의 프로그램이 'java'를 제공합니다.
  선택    명령
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk/bin/java
   2           /usr/lib/jvm/jre-1.6.0-openjdk/bin/java
   3           /usr/java/jdk1.7.0_51/bin/java


 현재 선택[+]을 유지하려면 엔터키를 누르고, 아니면 선택 번호를 입력하십시오 :

3)에 추가가됐네요! 그럼 3을 입력하고 엔터키...

# update-alternatives --config java

3 개의 프로그램이 'java'를 제공합니다.
  선택    명령
-----------------------------------------------
*  1           /usr/lib/jvm/jre-1.7.0-openjdk/bin/java
   2           /usr/lib/jvm/jre-1.6.0-openjdk/bin/java
 + 3           /usr/java/jdk1.7.0_51/bin/java


3이 선택된 것을 알 수 있습니다.

그리고 버전을 출력하면,

#java -version

Java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b04)
Java HotSpot(TM) Server VM (build 20.6-b01, mixed mode)

위와 같이 위에서 설치한 sun Java가 잡혀있는 것을 볼 수 있다.



c. 방화벽 포트를 오픈

iptables -A INPUT -m state -state NEW -m tcp -p tcp -dport 8080 -j ACCEPT
service iptables save
service iptables restart

d. tomcat 시작/정지

/usr/local/tomcat-8.0.0-RC10/bin/startup.sh
# tomcat 시작

/usr/local/tomcat-8.0.0-RC10/bin/shutdown.sh
# Tomcat 정지

e. 테스트

http://server-ip:8080/

f. 구동파일 생성
vi /etc/init.d/tomcat

다음 내용을 추가
#################################################
#!/bin/bash
# description: Tomcat Start Stop Restart
# processname: tomcat
# chkconfig: 234 20 80

export JAVA_HOME=/usr/java/jdk1.7.0_51
export PATH=$JAVA_HOME/bin:$PATH
export CATALINA_HOME=/usr/local/tomcat-8.0.0-RC10

case $1 in
start)
sh $CATALINA_HOME/bin/startup.sh
;;
stop)
sh $CATALINA_HOME/bin/shutdown.sh
;;
restart)
sh $CATALINA_HOME/bin/shutdown.sh
sh $CATALINA_HOME/bin/startup.sh
;;
esac
exit 0
#################################################

chmod 755 /etc/init.d/tomcat
chkconfig --add tomcat
chkconfig tomcat on

chkconfig --list tomcat



Ⅳ. apache 설치


1. pcre 설치

pcre-8.33.tar.gz

# tar zxvf pcre-8.33.tar.gz
# cd pcre-8.33/
# ./configure --libdir=/usr/local/lib64
# ./configure --libdir=/usr/local/lib
# make && make install

ln -s /usr/local/lib64/libpcre.so.1 /lib    (64bit 일때만)

2. apache 설치

tar -xvzf httpd-2.4.7.tar.gz
cd httpd-2.4.7

groupadd apache
useradd -g apache apache

./configure --prefix=/usr/local/apache-2.4.7 \
--enable-authn-alias \
--enable-cache \
--enable-file-cache \
--enable-mem-cache \
--enable-disk-cache \
--enable-mods-shared=most \
--enable-proxy=shared \
--enable-proxy-ajp=shared \
--enable-proxy-ajp=shared \
--enable-dav=shared \
--with-apr=/usr/local/apr/ \
--with-apr-util=/usr/local/apr-util/ \
--enable-ssl \
--enable-dav \
--enable-cgi \
--with-mpm=event \
--enable-cgid \
--enable-vhost-alias \
--enable-rewrite \
--enable-forward=shared \
--enable-proxy-connect=shared \
--enable-proxy-http=shared \
--enable-deflate=shared \
--enable-so \
--enable-headers=shared \
--enable-include=shared \
--enable-rewrite=shared


make&&make install



3. Apache 사용자 지정을 위해 /usr/local/apache-2.4.7/conf/httpd.conf 파일 수정

User apache

Group apache



4. Apache 시작

/usr/local/apache-2.4.7/bin/apachectl start



테스트



http://server-ip



It Works!가 보이면 정상


5. 구동 파일 설정
cp /usr/local/apache-2.4.7/bin/apachectl /etc/rc.d/init.d/httpd
vi /etc/rc.d/init.d/httpd

다음 5줄을 #을 포함하여 위 파일의 상단부에 복사
# chkconfig: 2345 90 90
# description: init file for Apache server daemon
# processname: /usr/local/apache-2.4.7/bin/apachectl
# config: /usr/local/apache-2.4.7/conf/httpd.conf
# pidfile: /usr/local/apache-2.4.7/logs/httpd.pid

chkconfig --add httpd
chkconfig httpd on
chkconfig --list httpd

아파치 재시작
/etc/rc.d/init.d/httpd restart




Ⅴ. php-5.5.8 설치

1. PHP 5 지원 라이브러리 설치

a. libiconv(문자 인코딩 라이브러리)

tar xvzf libiconv-1.14.tar.gz
cd libiconv-1.14/
./configure --prefix=/usr/local --libdir=/usr/local/lib64
./configure --prefix=/usr/local --libdir=/usr/local/lib
make && make install
cd ..

b. libmcrypt(PHP에서 암호화 해독 알고리즘인 mcryp를 사용하기 위해서 설치해야 한다)

tar xvzf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure --prefix=/usr/local --libdir=/usr/local/lib64
./configure --prefix=/usr/local --libdir=/usr/local/lib
make && make install

/sbin/ldconfig

cd libltdl/
./configure --enable-ltdl-install --libdir=/usr/local/lib64
./configure --enable-ltdl-install --libdir=/usr/local/lib
make && make install
cd ../../

c. mhash(hash암호화 알고리즘)

tar xvzf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9
./configure --prefix=/usr/local --libdir=/usr/local/lib64
./configure --prefix=/usr/local --libdir=/usr/local/lib
make && make install
cd ..


d. mcrypt 설치

tar xvzf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8/
/sbin/ldconfig
./configure --prefix=/usr/local --libdir=/usr/local/lib64
./configure --prefix=/usr/local --libdir=/usr/local/lib
make && make install
cd ..

-- 오류 해결 방법 : configure: error: *** libmcrypt was not found
# vi .bash_profile (root 계정을 사용할 수 있을 경우 /etc/ld.so.conf 파일에 추가, 이 때 디렉토리들만 추가할 것)
---------------------------- 라이브러리 환경변수 추가 ------------------------
...
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib:/usr/local/lib
export LD_LIBRARY_PATH
...
# source .bash_profile
* 또는 root 권한이 있을 경우, /etc/ld.so.conf 파일 수정
# vi /etc/ld.so.conf
...
include ld.so.conf.d/*.conf
/lib
/usr/lib
/usr/local/lib
...
# ldconfig


2. php-5.5.8 설치

yum install libxml2-devel bzip2-devel libcurl-devel openldap-devel 

tar xvzf php-5.5.8.tar.gz

mysql lib를 64비트로 인식되도록 변경
ln -s /usr/local/mysql/lib /usr/local/mysql/lib64

./configure --prefix=/usr/local/php-5.5.8 \
--with-libdir=lib64 \
--with-config-file-path=/usr/local/php-5.5.8/etc \
--with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-apxs2=/usr/local/apache-2.4.7/bin/apxs \
--with-pear=/usr/share/php \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-maintainer-zts \
--enable-opcache \
--with-curl \
--with-iconv-dir=/usr/local \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--with-mcrypt \
--with-gd \
--enable-gd-native-ttf \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-ldap \
--with-ldap-sasl \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--with-bz2 \
--enable-static \
--enable-intl \
--enable-exif \
--with-pdo-mysql=/usr/local/mysql \
--with-gettext

configure 오류시 : configure: error: Unable to detect ICU prefix or no failed. Please verify ICU install prefix and make sure icu-config works.
# yum -y install icu libicu-devel
# ldconfig

configure 오류시 : configure: error: Don't know how to define struct flock on this system, set --enable-opcache=no
해결방법 : 심볼릭 링크 생성
# ln -s /usr/local/mysql/lib/libmysqlclient.so /usr/lib
# ln -s /usr/local/mysql/lib/libmysqlclient.so /usr/lib64/
# ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib
# ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/

make

iconv관련 링크에러가 날  경우 vi 로 Makefile 을 열어서 EXTRA_LIBS 를 찾아 -liconv 를 추가
# cd /usr/local/php-5.5.8
# vi ./Makefile
    /EXTRA_LIBS 명령어로 검색
    -liconv 추가

make 오류시 : error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
# vi /etc/ld.so.conf
    아래 내용 추가
    ###################################
    /usr/local/mysql/lib
    /usr/local/mysql/lib64
    ###################################

make install


3. php구성 파일 생성
cp -f php.ini-production /usr/local/php-5.5.8/etc/php.ini


4. opcache 활성화
/usr/local/php-5.5.8/etc/php.ini 의 opcache 부분을 아래와 같이 변경

 [opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000

;opcache.max_wasted_percentage=5
;opcache.use_cwd=1
;opcache.validate_timestamps=1

opcache.revalidate_freq=60

;opcache.revalidate_path=0
;opcache.save_comments=1
;opcache.load_comments=1

opcache.fast_shutdown=1

;opcache.enable_file_override=0
;opcache.optimization_level=0xffffffff
;opcache.inherited_hack=1
;opcache.dups_fix=0
;opcache.blacklist_filename=
;opcache.max_file_size=0
;opcache.consistency_checks=0
;opcache.force_restart_timeout=180
;opcache.error_log=
;opcache.log_verbosity_level=1
;opcache.preferred_memory_model=
;opcache.protect_memory=0

맨 끝에 다음 내용 추가
zend_extension=/usr/local/php-5.5.8/lib/php/extensions/no-debug-zts-20121212/opcache.so




Ⅵ. PHP5확장모듈 컴파일 및 설치


1. ImageMagick-6.8.8-3.tar.xz 설치

ImageMagick은 TIFF, JPEG, GIF, PNG, PDF 및 기타 포토 CD 등 89가지 이상의 이미지의 읽기, 쓰기 및 처리하는 데 사용할 수 있는 안정적인 도구 및 개발 키트 세트입니다

tar xvzf ImageMagick-6.8.8-3.tar.gz
cd ImageMagick-6.8.8-3
./configure --libdir=/usr/local/lib64
./configure --libdir=/usr/local/lib
make && make install
cd ..


2. imagick-3.1.2.tgz 설치

yum -y install gtk2-devel* gtk+extra

tar -zxvf imagick-3.1.2.tgz
cd imagick-3.1.2

/usr/local/php-5.5.8/bin/phpize
./configure --with-php-config=/usr/local/php-5.5.8/bin/php-config
make && make install

vi /usr/local/php-5.5.8/etc/php.ini
"Dynamic Extensions" 부분 마지막 라인에 추가
extension=/usr/local/php-5.5.8/lib/php/extensions/no-debug-zts-20121212/imagick.so
cd ..

3. php
# echo "/usr/local/php-5.5.8/lib" >> /etc/ld.so.conf
# ldconfig

4. php-cgi 프로세스 시작
cd /usr/local/php-5.5.8/etc
cp php-fpm.conf.default php-fpm.conf

올바른 구분을 시작하기 전에 다음 php-fpm.conf 를 테스트 할 수 있습니다.

/usr/local/php-5.5.8/sbin/php-fpm -t
NOTICE: configuration file /usr/local/php-5.5.8/etc/php-fpm.conf test is successful
위 메세지가 나오면 성공

/usr/local/php-5.5.8/sbin/php-fpm 실행


5. apache 에서 PHP5 지원

vi /usr/local/apache-2.4.7/conf/httpd.conf
#아래 LoadModule 추가
LoadModule php5_module modules/libphp5.so

#AddType 추가
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    바로 아래 아래 스크립트 추가
    
    AddType application/x-httpd-php .php .php3 .inc
    AddType application/x-httpd-php-source .phps

아파치 재시작
/usr/local/apache-2.4.7/bin/apachectl restart

libconv 에러 발생시 /usr/local/apache-2.4.7/bin/apachectl 와 /etc/rc.d/init.d/httpd 의 맨 위에 다음 라인 추가
export LD_PRELOAD=/usr/local/lib64/libiconv.so
-------------------- or --------------------
export LD_PRELOAD=/usr/local/lib/libiconv.so

6. php지원 여부 테스트

cd /usr/local/apache-2.4.7/htdocs
echo "<?php phpinfo(); ?>" > phpinfo.php

http://server-ip/phpinfo.php,정상적으로 출력되는 지 확인



Ⅶ. apache와 tomcat 통합

 1. mod_jk 생성

tomcat-connectors-1.2.37-src.tar.gz
tar xvzf  tomcat-connectors-1.2.37-src.tar.gz
cd tomcat-connectors-1.2.37-src/

cd native
./configure --with-apxs=/usr/local/apache-2.4.7/bin/apxs
make
cp ./apache-2.0/mod_jk.so /usr/local/apache-2.4.7/modules/

2. 설정파일 복사
cd ../conf
cp httpd-jk.conf /usr/local/apache-2.4.7/conf/mod_jk.conf
cp workers.properties /usr/local/apache-2.4.7/conf/

a. mod_jk.conf 설정

vi /usr/local/apache-2.4.7/conf/mod_jk.conf

다음 내용 추가: 

JkWorkersFile /usr/local/apache-2.4.7/conf/workers.properties
JkLogFile /usr/local/apache-2.4.7/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"

JkMount /servlet/* worker1
JkMount /*.jsp         worker1
JkMount /application/* worker1
JkMount /*.do          worker1
JkMount /*.class       worker1
JkMount /*.jar         worker1

########해석#############

1. JkMount 위치는 Tomcat이 해석을 담당, JkUnMount는 반대임
2.  JkMount /test/* worker1 의 의미는 test 디렉토리 아래는 Tomcat이 처리를 담당
3. jsp와servlet은 tomcat이 처리, 그 외 그림이나 정적 파일은 Apache가 처리
###################

b. vi /usr/local/apache-2.4.7/conf/workers.properties

마지막줄에 다음 내용 추가: 

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=192.168.1.185
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300

c. apache 설정파일 수정

vi /usr/local/apache-2.4.7/conf/httpd.conf
다음 내용 추가 --------------------------
Include /usr/local/apache-2.4.7/conf/mod_jk.conf

# 위 mod_jk.conf 파일의 맨 위에 아래 라인이 있는 지 확인
LoadModule jk_module modules/mod_jk.so

d. TOMCAT 설정 변경

cd /usr/local/tomcat-8.0.0-RC10/conf
vi server.xml

<Host 를 찾음
(다음과 같음:  <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">)

다음 줄에 다음 내용을 추가: 
<Context path="" docBase="/usr/local/tomcat-8.0.0-RC10/webapps"
 debug="0" reloadable="true" crossContext="true"/>

########dobase 경로는 /usr/local/apahce/htdocs 로 변경 가능#####

e. apache와 tomcat을 다시 시작

apache 재시작

/usr/local/apache-2.4.7/bin/apachectl stop
/usr/local/apache-2.4.7/bin/apachectl start

tomcat 재시작

/usr/local/tomcat-8.0.0-RC10/bin/shutdown.sh
/usr/local/tomcat-8.0.0-RC10/bin/startup.sh


이 시점에서,tomcat과 apache 통합 완료!


성공여부 확인 :

/usr/local/apache-2.4.7/logs/mod_jk.log 확인
다음과 같은 라인이 나오면 성공!
[Sun Sep 22 23:21:18 2013][15053:3078219984] [info] init_jk::mod_jk.c (3365): mod_jk/1.2.37 initialized

테스트:

vi /usr/local/tomcat-8.0.0-RC10/webapps/test.jsp

다음 내용 추가:

<html>
<h1>JSP test<hr>

<%out.println("Hello World!");%>

</html>



http://server-ip/test.jsp

출력결과: HELLO WORLD

2012년 11월 5일 월요일

주저리 주저리... 난 이제 품절남 ㅠ

가끔~(사막에 꽃이필정도? ㅎ) 이라도제 블로그를 찾아주시는 분들이 계시는것 같네요
자주는 아니더라도 블로그에 소홀하게 되었던 제 자신을 다시 되돌아보게 됩니다. 하핫 ^^;;

슬금슬금 블로그를 다시 시작해야겠다는 생각이 들어 이렇게 포스팅을 샤샥 올려봅니다

과거에도 그렇고 지금도 그렇지만 제가 직접적으로 글을 올리는 경우는 극히!!! 드문일이라 ㅎㅎㅎ 최대한 많은 유용한 정보가 공유될수 있도록 노력하겠습니다.

p.s - 2012년 11월 25일 (일) ... 장가갑니다 ㅎㅎㅎㅎㅎ (야호!!!)

2010년 11월 25일 목요일

[JavaScript] 동적인 테이블 태그 생성하기

출처 : PHPSCHOOL

<html>
<head>
    <script language="javascript">
        function init(){
       
            var oRow = tbl.insertRow();
            var oCell1 = oRow.insertCell();
            oCell1.rowSpan="2";
            var oCell2 = oRow.insertCell();
           
           
            var oRow2 = tbl.insertRow();
            var oCell3=oRow2.insertCell();
           
            oCell1.innerHTML = "aaaa";
            oCell2.innerHTML = "bbbb";
            oCell3.innerHTML = "cccc";
           
        }
    </script>
</head>
<body onload="javascript:init();">
    <table id="tbl" border=1>
        <tr>
            <td rowspan="2">rowspan2</td>
            <td>1111</td>
        </tr>
        <tr>
            <td>2222</td>
        </tr>
    </table>
</body>
</html>

2010년 11월 24일 수요일

[PHP] php에서 숫자표현할때 소수점 둘째자리까지만 나오게하는 방법은?

출처 : http://www.happyjung.com/gnuboard/bbs/board.php?bo_table=lecture&wr_id=275&sca=&sfl=&stx=&sst=wr_1&sod=desc&sop=&page=10


[ 방법1 ]
<?
$a=4.99*10;
echo sprintf("%2.2f" ,$a);
?>
%2.2f 부분이 실수형을 00.00식으로 표현하게 해줍니다.
%2.3f 는 00.000이겠죠?


[ 방법2 ]
숫자형으로 출력시 소수점과 1000단위 컴마 표시법

<?
$number = 1234.56;

// english notation (default)
$english_format_number = number_format($number);
// 1,234

// French notation
$nombre_format_francais = number_format($number, 2, ',', ' ');
// 1 234,56

$number = 1234.5678;
// english notation without thousands seperator
$english_format_number = number_format($number, 2, '.', '');
// 1234.57
?>

2010년 11월 12일 금요일

[자바스크립트] 문자열 자르기 (배열)

자바스크립트에서.. split 을 쓸경우..

var s_data = "2005-03-25";  // 잘라야 되는 값..

var array_data = s_data.split("-");  // split 함수사용..

var s_year = array_data[0];   // 잘라진 값 배열..
var s_month = array_data[1];
var s_day = array_data[2];

2010년 11월 11일 목요일

PHP Ajax MySQL 로그인 중복체크

중복 중복 중복 ㅠㅠ;;
로그인 중복체크가 이렇게 어려울줄이야~~ 여러가지로 검색을 해보아도 나오지가 않아서 저 나름데로 짜집기(?)를 하여 중복체크 성공을하게되었습니다.

혹여나~ 다른곳에서 찾아헤메지마시고~ 제가 쓴방법을 한번 써보시기 바랄께요~~

p.s - 완벽하지는 않습니다.  ㅡ,.ㅡ;;

웹 사용환경
서버 : CentOS 5.5
APM : Apache 2.2.14, PHP5.2.12, MySQL5.1.41
사용언어 : PHP, Ajax

아래에 붙여질 소스코드에 대해서는 제가 사용하는 환경의 소스를 그대로 올리도록 하겠습니다.
클래스화 시켜 사용하던건데 일일이 풀기가 애매하네요.. 기억도 안나고 ㅎㅎ;;;

기능 1 - 로그인전이면 새로 데이터를 입력한다. → 로그인처리
기능 2 - 로그인된상태일때 다른곳에서 로그인이되면 먼저 로그인된 페이지는 자동 로그아웃된다.
기능 3 - 같은 브라우져에서 로그인을 중복해서하게되면 로그인정보의 시간만 업데이트가된다.

1. 중복체크를할 테이블 생성
Table: smstmember_session
 Field Type Comment
 sesskey varchar(50) NOT NULL 
 expiry int(10) NOT NULL 
 sessvalue varchar(50) NOT NULL 
 sessid varchar(30) NOT NULL 
 security int(1) NOT NULL 
 remoteip varchar(20) NULL 
저는 위의 형식으로 테이블을 생성하였습니다. ^^

2. 로그인 처리페이지 소스 추가 (ex> login_ok.php)

소스보기

소스와같이 세션DB에 로그인했을때의 세션ID와 사용자 ID 로그인 시간등을 입력하게됩니다.
또한 같은 세션ID일때 로그인을 다시하게되면 로그인 시간이 업데이트됩니다.

3. 로그아웃 처리하기 (ex> logout.php)

소스보기

로그아웃 페이지에서는 세션을 클리어하는것은 물론이고, 로그인하면서 DB에 입력되어있던 로그인정보를 삭제하게됩니다.

4. 중복 로그인 체크페이지 (ex> outlogin_check_session.php)

소스보기

다른곳에서 중복로그인이 되었는지 체크하는 페이지이다.
이 페이지에서는 세션DB의 값과 비교하기위한 정보들을 담고 있는다.
header 페이지나 footer 페이지 즉, 항상 웹페이지에 표시되는 부분에 추가하면 되겠다.

5. 중복 로그인 체크값 추출 (ex> login_check_tender.php)

소스보기

지금보이는 코드는 xml 형식으로 데이터를 추출하게되는 부분이다.
다음으로 설명된 js 파일에서 위의 페이지에서 생성된 xml 코드를 참조하여 로그인여부를 체크하게된다.

6. 중복로그인 체크 및 처리하기 (ex> login_check.js)

소스보기

바로위에서 말했듯이 "login_check_tender.php" 페이지에서 생성된 xml 형식의 코드를 분석 참조하여
다른곳에서 로그인이 이루어졌는지를 판단 및 처리를하게되는 스크립트이다.
다른곳 또는 다른 웹브라우저로 로그인을하게되면 기존에 로그인된 웹페이지는 자동적으로 로그아웃이 이루어지게된다.

여기까지 섭군이가 대충 짜집기한 중복로그인 방지 소스코드였습니다.
실질적으로 구상은 쉽게되는데 짜맞추려니... 여간 힘든게 아니네요 ㅠㅠ;;
질문은 않받을래요~ 머리가 뽀개질꺼 같거든요 ㅎㅎ;;;

2010년 10월 28일 목요일

리눅스 시스템 정보 확인 명령어

출처 : http://blueb.net/blog/1316

dmesg : 부팅시 메시지 보기

cat /proc/version : 리눅스 버전 확인

cat /etc/issue : 리눅스 버전 확인

cat /proc/cpuinfo : CPU 정보 확인

df -u : 디스크 사용량 보기

free -m : 메모리 사용량 보기

top : 메모리 사용량 보기

ps -aux : 현재 실행중인 프로세스 보기

2010년 10월 27일 수요일

리눅스 폴더(디렉토리) 크기(용량) 확인하기

폴더 용량 확인하는 방법

1. /usr 폴더의 용량 확인
예) du -hs /usr

2. 여러개의 폴더별 용량을 보고자 할때
예) du -hsc /usr /bin /etc

옵션 -hsc를 주면 크기를 알고 싶은 폴더의 목록을 나열하게 됩니다.

결과는
2.8G    /usr
7.7M    /bin
105M    /etc
2.9G    total

위와 같이 출력되게 된다.

2010년 10월 4일 월요일

아이폰 iSO 4.1 펌웨어 전파 수신률 체크하기!!

출처 : http://dtalker.tistory.com/985


아이폰 4 iOS 4.1 필드테스트로 수신률을 확인하자!

 

애플은 iOS 4.1에도 필드테스트 모드를 포함시켜 현재 내가 자주 사용하는 활동반경 내에서 아이폰 수신률을 수치상으로 확인할 수 있게 됐다. 필드테스트 모드는 안테나 수신 강도를 상단 바에 숫자로 표시해주는 기능으로 간단한 조작으로 확인할 수 있다.

 

해외 아이폰 4 수신률 문제가 꾸준히 제기되는 상황에서 국내 출시를 앞둔 아이폰 4에 대한 국내 유저들의 관심 역시 안테나 수신률에 대해 무척 높은 상황이다.

 

iOS 4.1로 업데이트 된 아이폰에 *3001#12345#*를 누른 후 통화버튼을 누르면 현재 위치에서의 수신률을 간단히 확인할 수 있다. 상단에 마이너스 숫자가 보여지며 이렇게 보여진 숫자(절대값)가 높을수록 수신강도는 낮아으며 수가 작을수록 수신률을 높다.

 

예를 들자면 -100은 수신률이 낮고 -50은 수신률이 좋다고 볼 수 있다.


2010년 10월 1일 금요일

MySQL에서 제어함수 (Control Flow Functions)

출처 : http://wizard.ncafe.net/wt/2368

MySQL에서 제어함수들에 대해서 설명한다. (Control Flow Functions)


1. CASE
 1.1 CASE value WHEN [compare_value] THEN result ... [ELSE result] END
   - value가 compare_value 이면 result 아니면 ELSE 의 result ...

 1.2 CASE WHEN [condition] THEN result ... [ELSE result] END
   - condition 이 true 면 result 아니면 ELSE 의 result

2. IF
  2.1 IF (condition, result1, result2)
    - condition 이 true 면 result1 아니면 result2
    - MySQL 5.0 메뉴얼에 IF(0.1,1,0) 의 값이 0 이라고 나와 있는데 난 1이 나온다.
      1이 나오는게 맞는거 같은데.

3. IFNULL
  3.1 IFNULL(expr1, expr2)
    - expr1이 널이면 expr2

4. NULLIF
  4.1 NULLIF(expr1, expr2)
    - expr1=expr2 이면 NULL


2010년 9월 30일 목요일

[MySQL] 두개(여러개) 테이블 데이터 합치기

출처 : http://dddd87.untoc.com/tc/13

잊어먹을라~ ㅠㅠ;;

  1. INSERT Ignore INTO A SELECT * FROM B;

    테이블 A 와 B 가 같은 schema 일 때, 테이블 B의 데이터를 A 의 데이터에 넣는
    쿼리문이다.  A 와 B 의 중복 데이터를 제거하고 A와 다른 데이터만 추가하게 된다.

    예를 들어
      테이블 A 가

      id    name    age
    --------------------------
      1     kim         20
      2     lee         22
      3     kim         23

     이고
     
      테이블 B 가

      id    name    age
    --------------------------
      1     kim         20
      2     lee         22
      3     lee         24
      4     park       20

    일때 INSERT Ignore INTO A SELECT * FROM B; 쿼리 문을 실행 하게 되면 테이블 A는 아래와 같이 된다.
     
      id    name    age
    --------------------------
      1     kim         20
      2     lee         22
      3     kim         23
      4     lee         24
      5     park       20

  2. SELECT * FROM A UNION SELECT * FROM B

    1번과 같은 역할이지만 A테이블로 insert 하는것이 아니라
    테이블 A, B 를 중복된 데이터 제거하고 테이블이 union 되여 화면에 출력된다.
    이때도 테이블 A, B 는 같은 schema

2010년 9월 15일 수요일

PHP에서 UTF-8, EUC-KR 인코딩 변경

출처 : http://bomool.net/bbs/board.php?bo_table=bo0102&wr_id=10

UTF-8을 EUC-KR로 변경
$str = iconv("UTF-8", "EUC-KR", $str);

EUC-KR을 UTF-8로 변경
$str = iconv("EUC-KR", "UTF-8", $str);

다른 서버에서 글 내용을 가져와 파싱하는 경우에 특히 많이 사용하게 된다.
상식적으로 알아둘 점: EUC-KR에서 한글은 2byte, UTF-8에서 한글은 3byte이다.
글자수 기준으로 substr() 함수를 이용하여 자를 때 참고해두자.

2010년 9월 4일 토요일

Theme_BnW_rAIN - 짜집기 3번째...

※개인적인 사용을 목적으로 만들어 보았으며, 기존의 테마와 대부분 비슷하다는점 말씀드립니다.

이번것은 Black&White 테마와 rAIN 테마 두가지를 제 취향에 맞게 만들어 보았습니다.
시디아 어플등 안정화 작업을 마친후에 적용하시기 바랍니다.

p.s - 짜집기 테마이고, 원본 출처가 기억나지를 않네요 ;; 모든자료는 네이버 카페에서 다운받았습니다.

## 준비사항
-  해킹된 아이폰
- WinterBoard
- iBlank
- Five Icon Dock
- Lockscreen Clock Hide
- QuickLock
- SBSetting

## 테마 설명
- 락스크린 : 기존의 심플 테마에 시간,날짜,달,요일 부분 잘리거나 하는부분 수정
- 홈화면 : 아이콘 변경, 위젯 날씨위젯  변경
- 배경 : 락스크린과 홈스크린 배경을 자동으로 바뀌도록 수정하였습니다. 랜덤으로 변경됩니다.

## 배경 변경
- 락스크린, 홈스크린 둘다 같은 폴더를 사용하며 배경을 바꾸시려면 테마폴더/Wallpapers 폴더 내용을 변경하시면 됩니다.
- 멈춰있는 배경을 원하실때 락스크린
 * LockBackground.html 소스코드 수정 Line19 주석해제
 * Line 23~39 제거 , Line 43~121 제거
 * 테마폴더/Private/Background.png 로 사용할 배경 복사
- 홈화면 정적인 화면으로 바꾸실때
 * 테마폴더/Wallpaper.html 삭제
 * 배경으로 사용할 이미지를 테마폴더/Wallpaper.png 로 복사

## 스크린샷 - 몇일전에 찍은거라... ^^;;;


## 테마파일 다운로드 - 압축프로그램 7zip

2010년 8월 25일 수요일

리눅스의 배포판버전, 커널버전확인방법

출처 : http://www.superuser.co.kr/linux/linux_version/index.htm

리눅스의 배포판버전, 커널버전확인방법

 

 1. 개론

별것 아닌 것 같지만, 리눅스를 처음사용하거나 초보자인경우에는 리눅스의 버전확인하는 방법이 애매할때가 있다.

물론, 자기자신이 설치한 경우에는 기억을 하고 있어서 알겠지만 설치한 기간이 꽤오래된 경우에는 가끔씩 헷갈릴때가 있다.

리눅스설치를 6.0으로 했는지 6.1, 6.2로 했는지 또는 7.0으로 했는지 7.1로 했는지,

그리고 커널버전이 정확히 어떻게 되는지등에 관해서 정확한 버전확인을 원한다면 아래를 참조하기 바란다.

 

 2. 배포판 버전확인

/etc/ 디렉토리에 보면 redhat-release라는 파일이 있다. 이 파일내용에는 배포판의 이름과 버전정보가 있다.

물론, 누군가 수정했다면 이 정보는 신뢰하기 힘들겠지만, 어쨌든 이 정보를 이용하여 배포판의 버전을 확인할수 있다.

 

 3. 커널버전확인

리눅스의 커널버전확인은 간단히 uname -a 로 하면 알수 있다.

 

 

 4. 리눅스 설치 module 정보확인

리눅스박스에 설치된 모듈에 대한 구체적인 파일내역을 확인하려면 아래예와 같이 /lib/modules 디렉토리를 참조하기 바란다.

 

 5. 설치패키지 전체확인

참고로 rpm 명령어를 이용하여 설치된 패키지를 차근차근 살펴보려면 "rpm -qa | more"로 살펴보면 된다.

 

 6. 특정 설치패키지 확인

아래와 같이 "rpm -qa | grep 패키지명"으로 특정 패키지의 설치여부를 확인할수 있다.

 

 7. 초기 설치 패키지 정보확인

/tmp/install.log 파일을 보면 리눅스설치초기시에 설치된 패키지이름들이 들어가 있다.

이 파일도 함께 참조하면 좋을 것 같아서 언급하여본다.


리눅스 - 소유권과 허가권 알아보기

참조 : http://wiki.linuxstudy.pe.kr/wiki.php/linuxstudy8

소유권과 허가권
리눅스 시스템은 앞에서도 말했지만 다중 사용자 시스템이다.
즉 혼자만이 아닌 여러사람이 동시에 같이 사용이 가능한 시스템이라는 이야기다.
따라서 지금 배울 허가권은 유닉스 계열의 시스템에서는 아주 중요한 개념이다.
잘못된 허가권은 시스템에 큰 보안홀을 만들 수 있으므로 잘 사용해야 한다. 

허가권(퍼미션) 이해하기

앞에서 배운 ls 명령을 이용해서 파일 하나를 살펴보도록 하자.
linuxstudy ~ # ls -al /etc/inittab 
-rw-r--r-- 1 root root 1645 Oct 28 13:13 /etc/inittab
linuxstudy ~ #
리눅스의 모든 파일과 디렉토리는 위와 같이 되어 있다.
위의 파일을 풀어서 설명하자면 이렇다.
/etc/inittab 파일은 root사용자와 root그룹의 것이며 root사용자는 읽고 쓸수 있으며
root그룹은 읽기만 되고 root사용자와 root그룹을 제외한 나머지 사용자는 읽기만 되며
파일의 그기는 1645byte 이며 최종적으로 10월28일 13시13분에 수정이 되었다.
뭔가 복잡하게 들릴지 모르겠지만 하나씩 한번 살펴보도록 하자.
리눅스의 기본적인 권한은 세가지로 나눠져 있다.읽기권한(read),쓰기권한(write),실행권한(excute)
-r w xr w xr w x
파일타입소유자소유그룹others

ugo

맨 처음 나오는 - 은 파일타입에 대한 것이다.
참고. 파일 타입
-일반 파일
b블럭형 장치파일(보통 하드 디스크등등)
ccharacter device(보통 장치 파일들,마우스나,콘솔등등)
d디렉토리
p파이프 파일
s소켓파일

컴퓨터는 단순한 기계다.0과1만 이해하는..^^;
이제 rwx 가 숫자로 변경되는 과정을 이해해 보도록 하자. 허가권이 있다면 1 없다면 0이다.
표기r--
비트(2진수)100
8진수2의2승2의1승2의0승
10진수400
읽기 권한만 준다면 숫자는 4로 나온다.

표기rw-
비트(2진수)110
8진수2의2승2의1승2의0승
10진수420
읽고 쓰는 경우에는 4+2가 되서 6

표기rwx
비트(2진수)111
8진수2의2승2의1승2의0승
10진수421
읽고 쓰고 실행하는 권한을 부여하면 4+2+1 해서 7 이 된다.

대충 이해가 되는가? 즉 모든 권한을 다 부여하면 7 이라는 숫자로 되는것이다.
편하게 이해하려면 다음을 보도록 하자.
rwx
421
무조건 4,2,1 이렇게 이해하자.
이제 앞으로 가서 우리가 봤던 /etc/inittab 파일의 퍼미션을 다시 한번 보도록 하자.
r w -(6), r - -(4),r - -(4)
즉 /etc/inittab 파일의 허가권은 644라고 하면 되는것이다.
rwxr-xr-x 는?
r(4),w(2),x(1)/r(4),w(0),x(1)/r(4),w(0),x(1)=7,5,5
자꾸 머리속으로 계산하는 습관을 들이도록 하자..^^;

chmod

이제 위에서 배운 허가권을 변경하는 방법에 대해서 알아보도록 하자.
chmod 명령은 허가권을 변경해 주는 명령으로 시스템 관리자가 되면 아주 많이 사용하게 될 명령어다.
허가권을 변경하는 방법은 두가지의 표현법이 있다.
위에서 배운 숫자로 변경하는 방법과 문자로 부여하는 방법이 있다.
하위 디렉토리까지 같이 변경하기 위해서는 -R 옵션을 사용하면 된다.
chmod 755 /etc/inittab(root에게 읽고 쓰고 실행,root그룹에게 읽고 실행,others에게 읽고 실행)
chmod u+rws,g+rx,o+rx /etc/inittab
위의 두가지는 표현만 다르지 똑같은 결과를 가져온다.
문자로 부여하는 방법은 u(소유자),g(소유그룹),o(others),a(all)과 +,-,= 을 조합해서 허가권을 부여할 수 있다.
+허가권 추가
-허가권 제거
=허가권 유지

특수 퍼미션
이제 설명할것은 기본적인 rwx 권한 이외의 특수한 목적으로 만들어진 퍼미션이다.
SetUID:파일을 실행하는 동안에는 소유자의 권한을 획득하는 허가권.
SetGID:파일을 실행하는 동안에는 소유그룹의 권한을 획득하는 허가권.
Stick Bit:아무나 읽고 쓰기가 가능하지만 생성한 소유자만이 파일을 지울 수 있는 허가권.

SetUID(4),SetGID(2),sticky bit(1) 를 부여하기 위해서는 기본 퍼미션 755 등등의 앞에 붙여주면 된다.
chmod 4755 실행파일(SetUID부여)
chmod 2755 실행파일(SetGID부여)
chmod 1777 디렉토리(Sticky bit부어)
문자 형태로 주고자 한다면 아래와 같다.
chmod u+s 파일
chmod g+s 파일
chod +t 디렉토리

SetUID,SetGID

단순한 설명으로는 이해가 어려울 수 있으니 예를 들어서 설명해 보겠다.
A라는 계정 사용자가 리눅스의 passwd 명령으로 패스워드를 변경한다고 생각해 보자.
당연히 변경된 패스워드는 저장이 될 것이다. 리눅스의 패스워드 파일은 /etc/shadow 라는 파일에 저장이 된다. 그렇지만 /etc/shadow 파일의 퍼미션은 다음과 같이 되어있다.
-rw------- 1 root root 24736 Oct 23 17:54 /etc/shadow
허가권을 알게 되었으니 충분히 이해하겠지만 /etc/shadow 파일은 root는 읽고쓰기,root그룹과others 는 아무 권한이 없는 상태이다.
그런데 어떻게 A라는 계정 사용자가 명령을 내려서 /etc/shadow 파일이 갱신이 될 수 있을까?
바로 여기에 SetUID의 비밀이 숨어있다.
ls -al /bin/passwd 명령을 내려보도록 하자.
-rws--x--x 1 root root 32888 Mar 11  2009 /bin/passwd
실행 권한(x)이 있어야 될 자리에 s 가 보일 것이다.
바로 이게 SetUID 다. 쉽게 설명하자면 시스템의 어떠한 계정이라도 /bin/passwd 파일을 실행하는 동안에는 소유주 즉 root의 권한을 갖는다는 것이다.
물론 실행이 종료되면 다시 A라는 계정의 권한으로 돌아온다..^^;
SetGID 권한은 위와는 동일하지만 소유그룹의 권한을 갖는다는 차이만 있다.
SetUID,SetGID권한은 이렇듯 일반 사용자가 특정사용자나 그룹의 권한을 갖을 수 있으므로
잘못 설정할 경우에는 아주 위험한 경우들이 생겨나므로 조심해야 된다.

나중에 보안 부분을 다루면서 예제를 보여주겠지만 보통 해킹당한 시스템에서 root권한으로 실행되는 백도어등을 많이 심어두고 언제라도 그 파일을 실행해서 root권한을 획득하는 경우가 많다.
그래서 root 비번을 변경하더라도 계속 크래킹이 이뤄지는 것이다.

sticky bit

sticky bit 란 위에서 설명했지만 누구나 읽고 쓸수있는 디렉토리지만 삭제는 생성한 유저만 가능하게 해주는 허가권이다.
보통 sticky bit가 설정되어 있는 대표적이 디렉토리가 있는데 바로 /tmp 디렉토리다.
예를 들어보겠다.리눅스 시스템을 이용해서 여러명의 개발자가 특정 디렉토리에서 프로그램을 개발한다고 가정해 보자.
같은 디렉토리를 공유하기 위해서 디렉토리의 퍼미션을 아래와 같이 설정했다.
chmod 777 /workspace 
즉 모든 사용자가 읽고 쓸수가 있을 것이다.그런데 문제가 생겼다.
A라는 사용자가 같이 작업하는 B의 파일도 역시 읽고 쓸수 있기 때문에 실수로 B사용자의 파일을 지워버렸다. 이런 경우가 발생하지 않기 위해서 sticky bit 를 설정해 주는 것이다.

소유권 이해하기

허가권과 더불어 리눅스 시스템에서 가장 중요한 소유권을 알아보도록 하자.
유닉스 계열의 시스템들은 정확하게 내가 사용할수있는 파일과 사용할 수 없는 파일들이 정확하게 나눠진다. 

chown

파일의 소유자와 소유그룹을 변경하는 명령으로
chown 소유자.소유그룹 파일 및 디렉토리 형태로 실행하면 된다.
하위 디렉토리까지 소유자와 소유그룹을 변경하려면 -R 옵션을 주면 된다.

chgrp

chgrp는 소유그룹만 변경하고자 할 경우에 사용한다. 
chgrp 그룹명 파일 및 디렉토리

앞에서도 설명했지만 시스템 관리자는 많은 사용자의 권한을 적절하게 잘 조정해줘야 한다.
잘못된 권한 설정은 원치않는 결과를 가져올 수 있으므로 주의해서 사용하기 바란다.
특히나 접근이 안된다고 무조건 777로 주는 실수는 범하지 않도록 하기 바란다. 

[CentOS 5.4] 설치 후 설정할것들


CentOS 설치 후 설정

  • 한글 설정
  • /etc/sysconfig/i18n 파일에서 다음을 설정 한다.
LANG="ko_KR.UTF-8"
  • 사용하는 터미널에서 "UTF-8"을 사용하도록 설정 한다.
  • PuTTY의 경우 : Window -> Translation 메뉴에서 "Character set translation on received data"를 "UTF-8"로 설정 한다.
  • 아래 명령을 사용하여 인터넷 접속 여부를 확인 한다.
ping -c3 google.com
  • 서버 시간 설정
echo "00 * * * * root /usr/bin/rdate -s time.bora.net" >> /etc/crontab
  • 기본 업데이트
yum -y update kernel
yum -y update kernel-PAE //--- 32 Bits 시스템에서 메모리가 4GB 이상일 경우
  • 가장 빠른 미러 사이트를 연결하는 yum 플러그인 설치
yum -y install yum-fastestmirror

CentOS Upgrade

  • Upgrade to CentOS 5.4 from 5.3
yum clean all
yum update glibc*
yum update yum* rpm* python*
yum clean all
yum update
shutdown -r now

#--- CentOS 버전 확인
lsb_release -a

CentOS Network 설정

VNC Server 설치

VNC (Virtual Network Computing)는 원격으로 Linux의 GUI 화면으로 접속할 수 있도록 한다.

  • VNC Server 설치
#--- CentOS에 root로 로그인 한다.
yum -y install vnc-server
  • vi /etc/sysconfig/vncservers
VNCSERVERS="1:root"    #--- 1번부터 5901 port를 사용 한다.
VNCSERVERARGS[1]="-geometry 1152x864" #--- 추가 옵션 : -nolisten -nohttpd -localhost
  • VNC Server 사용자 password 생성
cd
mkdir .vnc
cd .vnc
vncpasswd
#--- 여기서 암호를 입력 한다.
service vncserver restart
  • 방화벽에서 해당 사용자의 port를 오픈하여야 한다.
#--- /etc/sysconfig/vncservers에 등록된 1번부터 5901 port를 사용 한다.
  • VNC Client에서 접속 시
VNC Viewer로 접속시 "IP:5901"로 접속 한다.
TightVNC Viewer로 접속시 "IP:1"로 접속 한다.
  • 처음 접속이 완료되면 xstartup 파일이 생성된다. 이를 수정하여 예쁜화면을 사용하자.
cd
cd .vnc
vi xstartup
### twm & #--- 이 라인을 주석 처리(삭제) 한다.
gnome-session & #--- 이 라인을 추가 한다.
service vncserver restart
  • 설치 정보
  • 설치 폴더 :
  • 실행 파일 : /usr/bin/
  • 환경 설정 : /etc/sysconfig/vncservers
  • 기동 종료 : /etc/init.d/vncserver start, stop, restart
  • 서비스 확인 :
  • 참고 문헌

주요 SW 설치

CentOS용 프로그램

  • 시스템 라이브러리 설치
yum -y install zlib curl   
yum -y install gcc g++ cpp gcc-c++ compat-gcc-34-g77
yum -y install libxml2 libxml2-devel
yum -y install gd gd-devel
yum -y install freetype freetype-devel
yum -y install libpng libpng-devel
yum -y install libjpeg libjpeg-devel
yum -y install fontconfig fontconfig-devel
yum -y install mhash mhash-devel
yum -y install libmcrypt libmcrypt-devel
yum -y install openssl openssl-devel
yum -y install gmp gmp-devel
yum -y install flex
yum -y install libtermcap-devel ncurses-devel libc-client-devel bzip2-devel
  • 필요한 경우 컴파일러를 설치 한다.
yum -y install gcc gcc-c++ termcap libtermcap libtermcap-devel gdbm-devel

vsftpd 설치

  • vsftpd 설치
yum -y install vsftpd
  • 아래 설치 정보에 정리된 블랙 리스트에서 ftp를 사용할 사용자를 빼준다.
  • 방화벽에서 20, 21 port를 개방 한다.
  • 설치 정보
  • 실행 파일 : /usr/sbin/
  • 환경 파일 : /etc/vsftpd/vsftpd.conf
  • 블랙 리스트 : /etc/vsftpd/ftpusers, /etc/vsftpd/user_list
  • 기동 종료 : /etc/init.d/vsftpd start, stop, restart, status
  • 서비스 확인 : ps -ef | grep vsftpd | grep -v grep

Java 설치


MySQL 설치

PostgreSQL 설치

Apache Http Server 설치

PHP 설치

Tomcat 설치

  • Linux의 심볼 링크를 사용하여 Tomcat의 Root 폴더를 변경 하는 방법
ln -s /var/www/html /usr/share/tomcat5/webapps/ROOT

Apache ANT 설치

yum -y install ant

부팅시 자동 실행 설정

  • ntsysv 명령어를 실행하고 자동 실행할 데몬을 선택 한다.

사용자 가이드

버전 확인

lsb_release -a
cat /etc/issue

SSH 접속 방법

yum 사용법

  • 관련 폴더
/etc/yum.conf
/etc/yum.repos.d/
/etc/yum/
  • 설치 가능한 package 목록 보기
yum list [all]
yum grouplist #--- package 그룹 보기
  • package 설치 및 삭제
yum install httpd          #--- 설치
yum install httpd.i386 #--- 아키텍처를 지정하여 설치
yum update httpd #--- 업데이트
yum remove httpd #--- 삭제

yum groupinstall "그룹명" #--- package 그룹 설치
yum groupupdate "그룹명" #--- package 그룹 업데이트
yum groupremove "그룹명" #--- package 그룹 삭제
  • 설치된 package 목록 보기
yum list installed [httpd]
  • 업데이트할 package 목록 보기 및 업데이트
yum list updates           #--- 목록 보기
yum update -y #--- 업데이트

RPM 사용법

Redhat Package Manager로 레드헷에서 만든 패키지 관리자 이다.

  • RPM 파일명 구조
패키지이름-버전-릴리즈번호.소스여부.시스템.확장자
  • RPM 명령어
  • rpmfind에서 PRM 패키지(~.rpm)를 찾을 수 있다.
rpm -Uvh gcc-2.96-98.i386.rpm  #--- 패키지 설치
rpm -Uvh ftp://ftp.rpmserver.com/gcc-2.96-98.i386.rpm #--- 네트워크로 패키지 설치
rpm -e gcc-2.96-98.i386 #--- 패키지 제거
rpm -qa | grep httpd #--- 패키지 조회
rpm -qi ~.rpm #--- 패키지 상세 정보 조회
rpm -ql gcc-2.96-98.i386 #--- 패키지 설치 경로 조회
  • RPM 옵션
-i       :기본 설치. 이전 버전이 존재하면 설치하지 않음
-U  : 이전 버전이 설치되어 있으면 업그레이드. (-i 보다 권장)
-F  : 이전 버전이 설치되어 있는 경우에만 설치
-v  : 설치 메시지를 보여 줌
-h  : 진행과정을 '#'으로 표시
-e  : 패키지를 제거
-q  : 패키지가 설치되어 있는 지 확인
-qa  : 현재 설치된 모든 패키지 목록을 출력
-qi  : 현재 설치된 패키지의 간략한 정보를 출력
-ql  : 현재 설치된 패키지의 내용(위치)을 출력
-Vf  : 현재 설치된 파일의 검증. 문제가 없으면 '.'으로 표시
-Va  : 한 패키지만 검증
--force  : 충돌 등을 무시하고 무조건 설치
--nodeps : 의존성 문제를 무시하고 설치

관리자 가이드

방화벽 설정

CentOS는 디폴트로 iptables를 방화벽으로 사용 한다.

  • 특정 IP의 서버 접근 차단 방법
iptables -A INPUT -s 61.247.209.81 -j DROP
iptables -A INPUT -s 61.247.209.0/24 -j DROP

KVM

  • 참고 문헌

VirtualBox 설치

RPM 제작

  • RPM 제작을 위한 패키지 설치
yum -y install rpm-build rpm-devel
yum -y install ~.rpm
  • 설정 파일 : /etc/rpmrc, /usr/lib/rpm/rpmc


  • RPM 소스 패키지(~.src.rpm) 다운로드
  • rpmfind에서 원하는 RPM 소스 패키지를 다운로드 한다.
wget ftp://rpmfind.net/linux/fedora/development/source/SRPMS/~.src.rpm


  • RPM 소스 패키지로 RPM 패키지(~.rpm) 만들기
rpmbuild --rebuild --target=i686 ~.src.rpm
rpmbuild --rebuild ~.src.rpm #--- target은 생략 가능


  • RPM 패키지 설치
rpm -Uvh ~.rpm


  • RPM 소스 패키지 내용 보기
mkdir /usr/src/redhat
rpm -ivh ~.src.rpm
  • /usr/src/redhat/SOURCES : 소스와 패치 파일 저장
  • /usr/src/redhat/SPECS  : 스팩 파일 저장


  • RPM 소스 패키지 다시 만들기
cd /usr/src/redhat/SPECS
rpm -ba ~.spec
  • /usr/src/redhat/SRPMS : RPM 소스 패키지가 생성됨
  • /usr/src/redhat/RPMS  : RPM 패키지가 생성됨


  • /usr/src/redhat/ 폴더의 구조
  • BUILD  : rpm에 의해서 빌드가 이루어지는 디렉토리
  • RPMS  : 아키텍처별 RPM 패키지 저장
  • 아키텍처별로 athlon, geode, i386, i486, i586, i686, noarch 하위 폴더가 있음
  • SOURCES : RPM 소스 저장
  • SPECS  : RPM Spec 저장
  • SRPMS  : SRPM 저장