#############################################

## 주제 : APM                                                        ##

##                                                                       ##

## Written by K.S.W                                                ##

## boaniyagi@naver.com                                         ##

#############################################

Apache : 1.3.41 -> 2.2, 2.4 

Mysql : 4.0.27 -> 4.1 -> 5.6 

Php : 4.x -> 5.x


경험상 다양한 버전을 가지고 여러가지 컴파일 방법을 연습해둬야 한다. 

이유는 ? 

1. 운영중인 사이트가 오래된 버전을 사용하다가 (A:1.3.41, M:4.0.27, P:4.x) -> 상위버전으로 올리고 싶다고해서 무턱대고 올리면 잘 돌아가던 애플리케이션이 php 버전문제로 안될 수 있기 때문이다.


또한 최신버전의 php 버전을 사용하다가보면 현재 사용중인 애플리케이션이 동작하지 않을 수 있으므로 마이그레이션을 해야한다. 


LAMP 


o APM 을 사용하는 방식 : static, DSO 방식 두가지를 사용한다. 


o APM 을 설치하는 방법 

 1. yum 을 이용해서 설치하는 방법 

  - DSO 방식으로 설치한다.

  - 생략  


 2. 소스를 이용해서 설치하는 방법 



o APM 설치순서 


필요한 패키지나 모듈 설치 이후

-> MySQL install 

-> Apache install 

-> Php install 

-> mod_security 

-> phpmyadmin 


다양한 모듈들을 설치 


################

##    mysql 설치  ##

################


==== 체크사항 ====

mysql 소스로 설치할 수 있는가 ?

mysql 4.x and 5.x 를 소스로 설치할 수 있는가 ? 

mysql 을 yum 으로 설치할 수 있는가 ? 

mysql 운영중에 홈페이지가 에러가 발생이되면(DB가 깨진 것이다.) 복구할 수 있는가 ?

mysql DB를 다른쪽 mysql 서버로 옮길 수 있는가 ?

mysql DB를 백업(덤프) 받을 수 있는가 ?

mysql 의 접속이 많을때 부하분산을 할 수 있는가 ?

mysql replication 으로 운영할 수 있는가 ?

 :

 :     <-- 나머지 부분은 정리해서 알려줄 것!!!


1. 필요한 패키지나 모듈 설치

- 설치가 안된 경우에 설치한다.

필요한 패키지 : ncurses-devel, 

필요한 패키지 그룹 : Development Tools


- 아래처럼 command not found 가 출력되면 개발툴이 설치가 

  안된 것이므로 이때는 개발툴(Development Tools)을 설치해야 한다.

# gcc

-bash: gcc: command not found


# LANG=C

# yum grouplist

  :

  :

Installed Groups:

  :

Available Groups:

  :

  Development Tools

  :


# yum -y groupinstall "Development Tools"

(-y는 설치하는 행동을 물어볼 것인가? 라는 명령어)

(groupinstall 이란 설치할 패키지를 그룹으로 설치 한다는 의미)


- 만약 yum을 실행했는데 아래처럼 lock이 출력되면서 설치가 안된다면

  yum이 이미 실행된 것이므로 ps 로 확인해서 실행된 yum을 죽이고 

  다시 실행하면 된다.

#  yum groupinstall "MySQL Database"


Loaded plugins: fastestmirror, security

Existing lock /var/run/yum.pid: another copy is running as pid 2531.

Another app is currently holding the yum lock; waiting for it to exit...

  The other application is: yum

    Memory :  55 M RSS ( 97 MB VSZ)

    Started: Wed Sep 30 09:11:31 2015 - 02:42 ago

    State  : Running, pid: 2531

Another app is currently holding the yum lock; waiting for it to exit...

  The other application is: yum

    Memory :  55 M RSS ( 97 MB VSZ)

    Started: Wed Sep 30 09:11:31 2015 - 02:44 ago

    State  : Uninteruptable, pid: 2531

Another app is currently holding the yum lock; waiting for it to exit...

  The other application is: yum

    Memory :  58 M RSS ( 99 MB VSZ)

    Started: Wed Sep 30 09:11:31 2015 - 02:50 ago

    State  : Sleeping, pid: 2531



Exiting on user cancel.


# ps aux | grep yum


(aux 전체 프로세스를 보여주세요)


( |는 aux 프로세스를 출력을  grep yum 에게 입력 한다.)

 - yum만을 포함해서 출력


root      2436  0.0  2.0  26772 10308 ?        SN   08:54   0:00 /usr/bin/python -tt /usr/sbin/yum-updatesd

root      2531 12.6 11.4 101788 59100 pts/0    S+   09:11   0:22 /usr/bin/python /usr/bin/yum -y 


groupinstall Development Tools

root      2591  0.0  0.1   5240   724 pts/1    D+   09:14   0:00 grep yum

# kill -9 2436 2531


- 현재 설치된 전체 패키지에서 ncurses 패키지를 검색한다.

- ncurses 개발 라이브러리를 설치한다.


# rpm -qa | grep ncurses

ncurses-5.5-24.20060715


# yum -y install ncurses-devel

 ( 우리는 development tool을 깔아서 상관 없을 듯 tool을 안깔았을 때 하는거)


-- ncurses-devel 패키지가 없을 때 메세지 --

- 만약 ncurses-devel 패키지가 없다면 아래와 같이 에러가 발생되면서

  configure 가 종료된다. 당연한 얘기지만 configure가 정상적으로 

  끝나지 않는다면 그 다음 단계인 make 는 실행되지 않는다.

  :

  :

checking for tgetent in -lncurses... no

checking for tgetent in -lcurses... no

checking for tgetent in -ltermcap... no

checking for tgetent in -ltinfo... no

checking for termcap functions library... configure: error: No curses/termcap library found

-- ncurses-devel 패키지가 없을 때 메세지 --


======= mysql 소스설치의 옵션들 ======= 

!!! 참고로 이외의 여러가지 다양한 옵션이 존재하는걸 볼 수 있다. !!!

!!! gcc <-- pgcc 로 컴파일하면 gcc 

!!! --with-raid        Enable RAID Support

!!! --without-server   Only build the client.

!!! mysql5 에서는 mysqli 라는 확장된 mysql이 존재하므로 이를 설치해야 한다. 


옵션을 사용하는 형식 : --옵션명=값 ... (이건 형식이 중요)


--prefix : mysql(DBMS) 이 설치될 디렉토리 

--localstatedir : mysql DB가 저장될 디렉토리 

--with-mysqld-user : mysql 데몬 사용자 

--with-charset : 언어설정 euc_kr 로 지정 

--enable-thread-safe-client  :  apache compile시 기본적으로 thread mode로 설치가 되기 때문에 위의 옵션을 주


지 않을 경우 연동이 되지 않고, 

                                php configure 시에 mysql-client 에러가 발생한다.

=================================================================


2. mysql 설치 전 세팅 (소스로 설치할 거야 )

- mysql 패키지를 확인해서 설치가 되어있으면 삭제한다.

- 만약 설치가 안되었다면 이 부분은 넘어가도 된다.

# rpm -qa |grep mysql   

# yum grouplist 

# yum groupremove "MySQL Database"

# userdel -r mysql


- CentOS 5 에서는 반드시 추가해야 한다. 

- 주석이 끝나는 18라인 부분에  추가한다.


# vi /usr/include/pthread.h 

-- /usr/include/pthread.h --

  :

  :

/* Linuxthreads */

  :

  :

-- /usr/include/pthread.h --


3. 환경설정

- mysql 소스파일을 서버에 업로드해서 진행한다.


# tar xzf mysql-4.0.27.tar.gz (압축해제)

# cd mysql-4.0.27


(환경설정)

# ./configure \

 --prefix=/usr/local/mysql \

 --localstatedir=/usr/local/mysql/data \

 --with-mysqld-user=mysql \

 --enable-thread-safe-client \

 --with-charset=euc_kr


(한줄)

./configure \ --prefix=/usr/local/mysql \ --localstatedir=/usr/local/mysql/data \ --with-mysqld-user=mysql \ --enable-thread-safe-client \ --with-charset=euc_kr


4. 컴파일 

# make 


5. 설치 

- make install을 이용해서 시스템에 설치한다.

# make install


- 설치 후 mysql 디렉토리가 /usr/local 디렉토리에 있는지 확인한다.

# ls -F /usr/local

... lib/  libexec/  mysql/  sbin/  share/  src/

                   ~~~~~~~


6. 세팅 

- 아무 디렉토리에서도 실행파일들이 실행이 될 수 있도록 

  mysql 실행파일들을 PATH에 걸려있는 디렉토리로 심볼릭링크를 건다.

# ln -sf /usr/local/mysql/bin/* /usr/bin          

# ln -sf /usr/local/mysql/libexec/mysqld /usr/sbin     


- 설정파일을 복사한다.

- 자신의 시스템 메모리에 맞추어 설정파일을 복사한다.

# cd support-files

# cp my-large.cnf /etc/my.cnf 


- 데몬스크립트를 /etc/init.d 디렉토리에 복사한다.

- cp mysql.server /etc/init.d/mysqld

- chmod 700 /etc/init.d/mysqld

 (위 두줄 을 한번에 하는 방법)

# install -m 700 mysql.server /etc/init.d/mysqld  


- 부팅시 mysql 을 활성화한다.

- 3:off 되어 있다면 아래 명령어를 이용해서 on 으로 설정해야 한다.

- # chkconfig mysqld on

# runlevel 

N 3

# chkconfig --add mysqld  

# chkconfig --list mysqld

mysqld         0:off 1:off 2:on 3:on 4:on 5:on 6:off



- DB 초기화 작업을 한다.

- 기본적으로 DB파일들은 존재하지 않는다. 

- 그러므로 DB를 생성시켜줘야 한다.

- database 의 파일들이 위치하는 디렉토리이다. 

- --localstatedir 옵션의 지정된 디렉토리가 생성된다.

# mysql_install_db  


- mysql DBMS 사용자를 생성한다.

- 참고 : RedHat 계열의 사용자/그룹 정보 확인한다.

- # vi /usr/share/doc/setup-2.5.58/uidgid  

- -s : 쉘

- -d : 홈디렉토리 --localstatedir 옵션에 적은 디렉토리를 적어야 한다.

- -M : 디렉토리 생성 X 이미 mysql_install_db 에서 디렉토리가 생성된다.

- -r : 시스템 사용자 (UID : 100 이하) 

- -u : UID


# useradd -s /bin/false -d /usr/local/mysql/data -M -r -u 27 mysql   


- 슈퍼유저가 초기 DataBase 디렉토리를 생성했다면 root.root 로 권한이

- 되어있을 것이다. 그러므로 mysql DataBase 디렉토리를 모두 일반유저인

- mysql 사용자의 권한으로 변경해야 한다.


# chown -R mysql.mysql /usr/local/mysql/data                         


7. mysql 데몬 시작

# /etc/init.d/mysqld start   


- mysql 포트(3306)를 확인한다.

-  DBMS    port  DBA

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

- MySQL  : 3306  : root

- Oracle : 1521  : sys, system

- MS-SQL : 1433  : sa

- SyBase : ...

- DB2    : ...

- postgresql : ...

- mariaDB : ...

- ... 


# netstat -nltp   

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   

tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      12704/mysqld        

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3425/httpd          

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1748/sshd           

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      3521/sendmail  


- mysql에 접속을 확인한다.

- mysql에 접속이 정상적으로 이루어지면 mysql 설치에 성공한 것이다.


# mysql

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1 to server version: 4.0.27-log


Type 'help;' or '\h' for help. Type '\c' to clear the buffer.


mysql> quit


- mysql root 사용자의 비밀번호를 ksw1234로 설정한다.

- 형식 : mysqladmin -u root password 비밀번호

# mysqladmin -u root password ksw1234    


- mysql root 로 로그인한다.

- 접속시 -h localhost 면 생략이 가능하다.

- 비밀번호 ksw1234를 입력한다.

- 형식 : mysql -h localhost -u 사용자 -p[비밀번호] [DB명]

-              ~~~~~~~~~~~~

-               자기자신(Local Loopback Address)

- 서버와 클라이언트가 같이 있고 클라이언트가 서버로 접속하면 

- -h localhost는 생략이 가능하다.

- # mysql -h localhost -u root -p


# mysql -u root -p

Enter password:        <-- ksw1234 를 입력한다.

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 5 to server version: 4.0.27-log


Type 'help;' or '\h' for help. Type '\c' to clear the buffer.


mysql> quit


- MySQL startup 파일 생성 (root 로 자동으로 로그인하기 위한 설정)

- mysql client 프로그램을 실행할 때 참조하는 파일이다.

- mysql -h localhost -u root -pksw1234

- startup 파일 형식 :

- [client]

- host = 접속할 호스트명 or IP 주소

- user = 접속할 사용자명

- password = 접속할 사용자의 비밀번호


# vi ~/.my.cnf       

-- /root/.my.cnf --

[client]

host = localhost

user = root

password = ksw1234

-- /root/.my.cnf --


- 자동로그인 기능에 의해 접속 (~/.my.cnf 에 설정되어 있다)

- 접속이 되면 DB설치 성공!!!  

- # mysql -h localhost -u root -pksw1234 mysql


# mysql mysql    

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1 to server version: 4.0.27-log


Type 'help;' or '\h' for help. Type '\c' to clear the buffer.


mysql> select user();

+----------------+

| user()         |

+----------------+

| root@localhost |

+----------------+

1 row in set (0.00 sec)


mysql> select database();

+------------+

| database() |

+------------+

| mysql      |

+------------+

1 row in set (0.00 sec)


mysql> show tables;

+-----------------+

| Tables_in_mysql |

+-----------------+

| columns_priv    |

| db              |

| func            |

| host            |

| tables_priv     |

| user            |

+-----------------+

6 rows in set (0.00 sec)


- user table 의 구조를 본다.

mysql> describe user;

  :

  :


- user 테이블에서 모든 필드를 출력한다.

mysql> select * from user;   


- user 테이블에서 host,user,password 필드만 출력한다.

mysql> select host,user,password from user;          

+-----------------------+------+------------------+

| host                  | user | password         |

+-----------------------+------+------------------+

| localhost             | root | 57c0dba50319edd5 |    <-- ksw1234 암호화

| localhost.localdomain | root | 57c0dba50319edd5 |    

| localhost             |      |                  |    <-- 삭제

| localhost.localdomain |      |                  |    <-- 삭제

+-----------------------+------+------------------+

4 rows in set (0.00 sec)


- 비밀번호가 없는 레코드(행)를 모두 삭제한다.

mysql> delete from user where password = '';

Query OK, 3 rows affected (0.00 sec)


mysql> select host,user,password from user;

+-----------+------+------------------+

| host      | user | password         |

+-----------+------+------------------+

| localhost | root | 57c0dba50319edd5 |

+-----------+------+------------------+

1 row in set (0.00 sec)


- db 테이블의 구조를 출력한다.

mysql> describe db;


- db 테이블에서 host,user,db 필드만 출력한다.

- db 테이블에 들어있는 test 는 임시 작업 DB이므로 삭제한다.

mysql> select host,user,db from db;          

+------+------+---------+

| host | user | db      |

+------+------+---------+

| %    |      | test    |   <-- 삭제

| %    |      | test\_% |   <-- 삭제

+------+------+---------+

2 rows in set (0.00 sec)


- db 테이블의 임시 자료를 모두 삭제한다.

mysql> delete from db;                       

Query OK, 2 rows affected (0.00 sec)


mysql> select host,user,db from db;

Empty set (0.00 sec)


- user,db 테이블의 세팅되어 있는 권한으로 적용한다.

mysql> flush privileges;    

Query OK, 0 rows affected (0.00 sec)

mysql> quit



# netstat -ant  <-- mysql 포트 확인

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address               Foreign Address             State      

tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN        <-- mysql 포트대기

  :

  :

  :


- 외부에서 접속할 필요가 없을땐 보안상 외부 접속을 차단하면 된다.

- skip-networking 앞에 # 을 제거하면 외부에서 들어오는 포트가 없어진다.

# vi /etc/my.cnf

...

skip-networking    

...


- mysql 설정 파일을 수정했으므로 서버를 재시작한다.

# /etc/init.d/mysqld restart


- mysql 포트 3306 이 없는 것을 확인할 수 있다.

# netstat -nltp  


# ls -l /tmp/mysql.sock  <-- 이때는 unix domain socket 으로 통신을 한다.


# mysql   <-- /tmp/mysql.sock 파일을 통해서 접속하는 것이다.

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1 to server version: 4.0.27-log


Type 'help;' or '\h' for help. Type '\c' to clear the buffer.


mysql> quit



***mysql yum으로 설치 시

yum -y install mysql 하면 32비트 64 비트 같이 깔리니까 

32비트 지워야 함

# yum remove mysql.i386



*** yum 으로 mysql 설치

# yum -y install mysql

# yum search mysql

# yum -y install mysql-server

# /etc/init.d/mysqld start

# rm -f ~/.my.conf

# mysql 



*** 아파치 설치

# yum -y install httpd httpd-devel > /dev/null

# which httpd

# which apxs

# rpm -qf /usr/sbin/httpd

# rpm -qf /usr/sbin/apxs

# rpm -e httpd-devel.i386

# rpm -qf /usr/sbin/apxs



*** PHP 설치

# yum search php

# yum -y install php.x86_64

 

 - /var/www/html

 ( php루트)


#################

## apache 설치 ##

#################


공식 사이트 : http://httpd.apache.org

아파치 문서 : http://httpd.apache.org/docs/


1. apache 설치 전 확인

- httpd 패키지가 설치되어 있다면 삭제한다. 

# rpm -qa | grep httpd

httpd-2.2.3-82.el5.centos   

# apachectl stop

# rpm -e httpd


의존성 때문에 삭제가 안되면 아래 yum 을 이용해서 삭제한다.


- httpd 가 설치가 되어 있으면 "web server" 그룹을 삭제한다.

# yum grouplist                     

# yum -y groupremove "web server"   


2. 환경설정

# tar xzf apache_1.3.41.tar.gz 

# cd apache_1.3.41


- 1.3.41 의 모듈을 확인 

- 거의 대분의 소스들은 압축을 해제하면 configure라는 설치 스크립트를

- 제공한다. 

- 사용자는 이 스크립트를 이용해서 관련 환경들을 설정해야 한다.

- ./configure --help 를 이용해서 환경설정의 여러가지 옵션들을 

- 확인할 수 있다.

# ./configure --help   

  :

  :

--enable-module=NAME   enable  a particular Module named 'NAME'

--disable-module=NAME  disable a particular Module named 'NAME'

                        [access=yes      actions=yes     alias=yes      ]     <-- yes : 모듈 활성화 

                        [asis=yes        auth_anon=no    auth_dbm=no    ]     <-- no  : 모듈 비활성화 

                        [auth_db=no      auth_digest=no  auth=yes       ]

                        [autoindex=yes   cern_meta=no    cgi=yes        ]

                        [digest=no       dir=yes         env=yes        ]

                        [example=no      expires=no      headers=no     ]

                        [imap=yes        include=yes     info=no        ]

                        [log_agent=no    log_config=yes  log_forensic=no]

                        [log_referer=no  mime_magic=no   mime=yes       ]

                        [mmap_static=no  negotiation=yes proxy=no       ]

                        [rewrite=no      setenvif=yes    so=no          ]      <-- so : DSO 방식일때 반드시 


모듈을 활성화시키고 컴파일해야 한다. 

                        [speling=no      status=yes      unique_id=no   ]

                        [userdir=yes     usertrack=no    vhost_alias=no ]      <-- vhost_alias : DSO 방식일


때 반드시 모듈을 활성화시키고 컴파일해야 한다. 

  :

  :



- DSO 방식으로 compile

- configure 옵션은 config.status 파일에 저장된다.

- prefix : 아파치 웹서버가 설치될 경로

# ./configure  \

--prefix=/usr/local/apache \

//

--enable-shared=max \

--enable-rule=SHARED_CORE \

--enable-module=so \

// 3가지 중요<dso> 방식으로 컴파일 하겠다 !


--enable-module=vhost_alias


3. 컴파일

- make 명령어를 이용해서 컴파일 한다.

# make


4. 설치

- make install을 이용해서 설치한다.

- 설치가 완료되면 아래처럼 box가 나온다.

# make install

  :

  :

+--------------------------------------------------------+    

| You now have successfully built and installed the      |

| Apache 1.3 HTTP server. To verify that Apache actually |

| works correctly you now should first check the         |

| (initially created or preserved) configuration files   |

|                                                        |

|   /usr/local/apache/conf/httpd.conf

|                                                        |

| and then you should be able to immediately fire up     |

| Apache the first time by running:                      |

|                                                        |

|   /usr/local/apache/bin/apachectl start

|                                                        |

| Thanks for using Apache.       The Apache Group        |

|                                http://www.apache.org/  |

+--------------------------------------------------------+


- 설치된 디렉토리를 확인해보자.

# tree /usr/local/apache/

/usr/local/apache/

|-- bin

|   |-- ab

|   |-- apachectl

|   |-- apxs

|   |-- checkgid

|   |-- dbmmanage

|   |-- htdigest

|   |-- htpasswd

|   |-- httpd

|   |-- logresolve

|   `-- rotatelogs

|-- cgi-bin

|   |-- printenv

|   `-- test-cgi

|-- conf

|   |-- access.conf

|   |-- access.conf.default

|   |-- httpd.conf

|   |-- httpd.conf.bak

|   |-- httpd.conf.default

|   |-- magic

|   |-- magic.default

|   |-- mime.types

|   |-- mime.types.default

|   |-- srm.conf

|   `-- srm.conf.default

|-- htdocs

|   |-- index.html

|   `-- manual

|       |-- LICENSE

|       |-- bind.html.en

|       |-- bind.html.fr

|       |-- bind.html.html

|       |-- bind.html.ja.jis

|       |-- configuring.html.en

|       |-- configuring.html.fr

|       |-- configuring.html.html

|       |-- configuring.html.ja.jis

|       |-- content-negotiation.html.en

|       |-- content-negotiation.html.html

|       |-- content-negotiation.html.ja.jis

|       |-- custom-error.html.en

|       |-- custom-error.html.fr

|       |-- custom-error.html.html

|       |-- custom-error.html.ja.jis

|       |-- cygwin.html

|       |-- dns-caveats.html.en

|       |-- dns-caveats.html.fr

|       |-- dns-caveats.html.html

|       |-- dns-caveats.html.ja.jis

|       |-- dso.html

|       |-- ebcdic.html

|       |-- env.html.en

|       |-- env.html.html

|       |-- env.html.ja.jis

|       |-- footer.html

|       |-- handler.html.en

|       |-- handler.html.html

|       |-- handler.html.ja.jis

|       |-- header.html

|       |-- howto

|       |   |-- auth.html

|       |   |-- cgi.html.en

|       |   |-- cgi.html.html

|       |   |-- cgi.html.ja.jis

|       |   |-- footer.html

|       |   |-- header.html

|       |   |-- htaccess.html

|       |   |-- ssi.html.en

|       |   |-- ssi.html.html

|       |   `-- ssi.html.ja.jis

|       |-- images

|       |   |-- apache_header.gif

|       |   |-- custom_errordocs.gif

|       |   |-- home.gif

|       |   |-- index.gif

|       |   |-- mod_rewrite_fig1.fig

|       |   |-- mod_rewrite_fig1.gif

|       |   |-- mod_rewrite_fig2.fig

|       |   |-- mod_rewrite_fig2.gif

|       |   |-- pixel.gif

|       |   `-- sub.gif

|       |-- index.html.en

|       |-- index.html.fr

|       |-- index.html.html

|       |-- index.html.ja.jis

|       |-- install-tpf.html

|       |-- install-ztpf.html

|       |-- install.html.en

|       |-- install.html.es

|       |-- install.html.fr

|       |-- install.html.html

|       |-- install.html.ja.jis

|       |-- invoking.html.en

|       |-- invoking.html.fr

|       |-- invoking.html.html

|       |-- invoking.html.ja.jis

|       |-- keepalive.html.en

|       |-- keepalive.html.html

|       |-- keepalive.html.ja.jis

|       |-- location.html.en

|       |-- location.html.html

|       |-- location.html.ja.jis

|       |-- logs.html

|       |-- man-template.html

|       |-- misc

|       |   |-- API.html

|       |   |-- FAQ.html

|       |   |-- HTTP_Features.tsv

|       |   |-- client_block_api.html

|       |   |-- compat_notes.html

|       |   |-- custom_errordocs.html

|       |   |-- descriptors.html

|       |   |-- fin_wait_2.html

|       |   |-- footer.html

|       |   |-- header.html

|       |   |-- howto.html

|       |   |-- index.html

|       |   |-- known_client_problems.html

|       |   |-- nopgp.html

|       |   |-- perf-bsd44.html

|       |   |-- perf-dec.html

|       |   |-- perf-hp.html

|       |   |-- perf-tuning.html

|       |   |-- perf.html

|       |   |-- rewriteguide.html

|       |   |-- security_tips.html

|       |   |-- tutorials.html

|       |   |-- vif-info.html

|       |   `-- windoz_keepalive.html

|       |-- mod

|       |   |-- core.html.en

|       |   |-- core.html.fr

|       |   |-- core.html.html

|       |   |-- core.html.ja.jis

|       |   |-- directive-dict.html.en

|       |   |-- directive-dict.html.fr

|       |   |-- directive-dict.html.html

|       |   |-- directive-dict.html.ja.jis

|       |   |-- directives.html.de

|       |   |-- directives.html.en

|       |   |-- directives.html.fr

|       |   |-- directives.html.html

|       |   |-- directives.html.ja.jis

|       |   |-- footer.html

|       |   |-- header.html

|       |   |-- index-bytype.html.en

|       |   |-- index-bytype.html.fr

|       |   |-- index-bytype.html.html

|       |   |-- index-bytype.html.ja.jis

|       |   |-- index.html.en

|       |   |-- index.html.fr

|       |   |-- index.html.html

|       |   |-- index.html.ja.jis

|       |   |-- mod_access.html.en

|       |   |-- mod_access.html.html

|       |   |-- mod_access.html.ja.jis

|       |   |-- mod_actions.html.en

|       |   |-- mod_actions.html.html

|       |   |-- mod_actions.html.ja.jis

|       |   |-- mod_alias.html.en

|       |   |-- mod_alias.html.html

|       |   |-- mod_alias.html.ja.jis

|       |   |-- mod_asis.html.en

|       |   |-- mod_asis.html.html

|       |   |-- mod_asis.html.ja.jis

|       |   |-- mod_auth.html.en

|       |   |-- mod_auth.html.html

|       |   |-- mod_auth.html.ja.jis

|       |   |-- mod_auth_anon.html

|       |   |-- mod_auth_db.html

|       |   |-- mod_auth_dbm.html

|       |   |-- mod_auth_digest.html

|       |   |-- mod_autoindex.html.en

|       |   |-- mod_autoindex.html.html

|       |   |-- mod_autoindex.html.ja.jis

|       |   |-- mod_browser.html

|       |   |-- mod_cern_meta.html

|       |   |-- mod_cgi.html.en

|       |   |-- mod_cgi.html.html

|       |   |-- mod_cgi.html.ja.jis

|       |   |-- mod_cookies.html

|       |   |-- mod_digest.html

|       |   |-- mod_dir.html.en

|       |   |-- mod_dir.html.html

|       |   |-- mod_dir.html.ja.jis

|       |   |-- mod_dld.html

|       |   |-- mod_env.html.en

|       |   |-- mod_env.html.html

|       |   |-- mod_env.html.ja.jis

|       |   |-- mod_example.html

|       |   |-- mod_expires.html

|       |   |-- mod_headers.html

|       |   |-- mod_imap.html

|       |   |-- mod_include.html

|       |   |-- mod_info.html.en

|       |   |-- mod_info.html.html

|       |   |-- mod_info.html.ja.jis

|       |   |-- mod_isapi.html

|       |   |-- mod_log_agent.html

|       |   |-- mod_log_common.html

|       |   |-- mod_log_config.html.en

|       |   |-- mod_log_config.html.html

|       |   |-- mod_log_config.html.ja.jis

|       |   |-- mod_log_forensic.html.en

|       |   |-- mod_log_forensic.html.html

|       |   |-- mod_log_referer.html

|       |   |-- mod_mime.html.en

|       |   |-- mod_mime.html.html

|       |   |-- mod_mime.html.ja.jis

|       |   |-- mod_mime_magic.html

|       |   |-- mod_mmap_static.html

|       |   |-- mod_negotiation.html.en

|       |   |-- mod_negotiation.html.html

|       |   |-- mod_negotiation.html.ja.jis

|       |   |-- mod_proxy.html

|       |   |-- mod_rewrite.html.en

|       |   |-- mod_rewrite.html.html

|       |   |-- mod_rewrite.html.ja.jis

|       |   |-- mod_setenvif.html.en

|       |   |-- mod_setenvif.html.html

|       |   |-- mod_setenvif.html.ja.jis

|       |   |-- mod_so.html.en

|       |   |-- mod_so.html.html

|       |   |-- mod_so.html.ja.jis

|       |   |-- mod_speling.html.en

|       |   |-- mod_speling.html.html

|       |   |-- mod_speling.html.ja.jis

|       |   |-- mod_status.html

|       |   |-- mod_unique_id.html.en

|       |   |-- mod_unique_id.html.html

|       |   |-- mod_unique_id.html.ja.jis

|       |   |-- mod_userdir.html.en

|       |   |-- mod_userdir.html.html

|       |   |-- mod_userdir.html.ja.jis

|       |   |-- mod_usertrack.html

|       |   |-- mod_vhost_alias.html

|       |   |-- module-dict.html.en

|       |   |-- module-dict.html.html

|       |   `-- module-dict.html.ja.jis

|       |-- mpeix.html

|       |-- multilogs.html

|       |-- netware.html

|       |-- new_features_1_0.html

|       |-- new_features_1_1.html

|       |-- new_features_1_2.html

|       |-- new_features_1_3.html.en

|       |-- new_features_1_3.html.html

|       |-- new_features_1_3.html.ja.jis

|       |-- process-model.html.en

|       |-- process-model.html.html

|       |-- process-model.html.ja.jis

|       |-- programs

|       |   |-- ab.html

|       |   |-- apachectl.html.en

|       |   |-- apachectl.html.html

|       |   |-- apachectl.html.ja.jis

|       |   |-- apxs.html

|       |   |-- dbmmanage.html

|       |   |-- footer.html

|       |   |-- header.html

|       |   |-- htdigest.html

|       |   |-- htpasswd.html.en

|       |   |-- htpasswd.html.html

|       |   |-- htpasswd.html.ja.jis

|       |   |-- httpd.html.en

|       |   |-- httpd.html.html

|       |   |-- httpd.html.ja.jis

|       |   |-- index.html.en

|       |   |-- index.html.html

|       |   |-- index.html.ja.jis

|       |   |-- logresolve.html

|       |   |-- other.html

|       |   |-- rotatelogs.html

|       |   |-- suexec.html.en

|       |   |-- suexec.html.html

|       |   `-- suexec.html.ja.jis

|       |-- readme-tpf.html

|       |-- sections.html.en

|       |-- sections.html.html

|       |-- sections.html.ja.jis

|       |-- server-wide.html.en

|       |-- server-wide.html.fr

|       |-- server-wide.html.html

|       |-- server-wide.html.ja.jis

|       |-- sitemap.html

|       |-- sourcereorg.html

|       |-- stopping.html.en

|       |-- stopping.html.fr

|       |-- stopping.html.html

|       |-- suexec.html.en

|       |-- suexec.html.html

|       |-- suexec.html.ja.jis

|       |-- suexec_1_2.html

|       |-- unixware.html

|       |-- upgrading_to_1_3.html

|       |-- urlmapping.html

|       |-- vhosts

|       |   |-- details.html

|       |   |-- details_1_2.html

|       |   |-- examples.html

|       |   |-- fd-limits.html.en

|       |   |-- fd-limits.html.html

|       |   |-- fd-limits.html.ja.jis

|       |   |-- footer.html

|       |   |-- header.html

|       |   |-- host.html

|       |   |-- index.html.en

|       |   |-- index.html.html

|       |   |-- index.html.ja.jis

|       |   |-- ip-based.html

|       |   |-- mass.html

|       |   |-- name-based.html.en

|       |   |-- name-based.html.html

|       |   |-- name-based.html.ja.jis

|       |   |-- vhosts-in-depth.html

|       |   `-- virtual-host.html

|       |-- win_compiling.html.en

|       |-- win_compiling.html.html

|       |-- win_compiling.html.ja.jis

|       |-- win_service.html.en

|       |-- win_service.html.html

|       |-- win_service.html.ja.jis

|       |-- windows.html.en

|       |-- windows.html.html

|       `-- windows.html.ja.jis

|-- icons

|   |-- README

|   |-- README.html

|   |-- a.gif

|   |-- a.png

|   |-- alert.black.gif

|   |-- alert.black.png

|   |-- alert.red.gif

|   |-- alert.red.png

|   |-- apache_pb.gif

|   |-- apache_pb.png

|   |-- back.gif

|   |-- back.png

|   |-- ball.gray.gif

|   |-- ball.gray.png

|   |-- ball.red.gif

|   |-- ball.red.png

|   |-- binary.gif

|   |-- binary.png

|   |-- binhex.gif

|   |-- binhex.png

|   |-- blank.gif

|   |-- blank.png

|   |-- bomb.gif

|   |-- bomb.png

|   |-- box1.gif

|   |-- box1.png

|   |-- box2.gif

|   |-- box2.png

|   |-- broken.gif

|   |-- broken.png

|   |-- burst.gif

|   |-- burst.png

|   |-- c.gif

|   |-- c.png

|   |-- comp.blue.gif

|   |-- comp.blue.png

|   |-- comp.gray.gif

|   |-- comp.gray.png

|   |-- compressed.gif

|   |-- compressed.png

|   |-- continued.gif

|   |-- continued.png

|   |-- dir.gif

|   |-- dir.png

|   |-- diskimg.gif

|   |-- diskimg.png

|   |-- down.gif

|   |-- down.png

|   |-- dvi.gif

|   |-- dvi.png

|   |-- f.gif

|   |-- f.png

|   |-- folder.gif

|   |-- folder.open.gif

|   |-- folder.open.png

|   |-- folder.png

|   |-- folder.sec.gif

|   |-- folder.sec.png

|   |-- forward.gif

|   |-- forward.png

|   |-- generic.gif

|   |-- generic.png

|   |-- generic.red.gif

|   |-- generic.red.png

|   |-- generic.sec.gif

|   |-- generic.sec.png

|   |-- hand.right.gif

|   |-- hand.right.png

|   |-- hand.up.gif

|   |-- hand.up.png

|   |-- icon.sheet.gif

|   |-- icon.sheet.png

|   |-- image1.gif

|   |-- image1.png

|   |-- image2.gif

|   |-- image2.png

|   |-- image3.gif

|   |-- image3.png

|   |-- index.gif

|   |-- index.png

|   |-- layout.gif

|   |-- layout.png

|   |-- left.gif

|   |-- left.png

|   |-- link.gif

|   |-- link.png

|   |-- movie.gif

|   |-- movie.png

|   |-- p.gif

|   |-- p.png

|   |-- patch.gif

|   |-- patch.png

|   |-- pdf.gif

|   |-- pdf.png

|   |-- pie0.gif

|   |-- pie0.png

|   |-- pie1.gif

|   |-- pie1.png

|   |-- pie2.gif

|   |-- pie2.png

|   |-- pie3.gif

|   |-- pie3.png

|   |-- pie4.gif

|   |-- pie4.png

|   |-- pie5.gif

|   |-- pie5.png

|   |-- pie6.gif

|   |-- pie6.png

|   |-- pie7.gif

|   |-- pie7.png

|   |-- pie8.gif

|   |-- pie8.png

|   |-- portal.gif

|   |-- portal.png

|   |-- ps.gif

|   |-- ps.png

|   |-- quill.gif

|   |-- quill.png

|   |-- right.gif

|   |-- right.png

|   |-- screw1.gif

|   |-- screw1.png

|   |-- screw2.gif

|   |-- screw2.png

|   |-- script.gif

|   |-- script.png

|   |-- small

|   |   |-- back.gif

|   |   |-- back.png

|   |   |-- binary.gif

|   |   |-- binary.png

|   |   |-- binhex.gif

|   |   |-- binhex.png

|   |   |-- blank.gif

|   |   |-- blank.png

|   |   |-- broken.gif

|   |   |-- broken.png

|   |   |-- burst.gif

|   |   |-- burst.png

|   |   |-- comp1.gif

|   |   |-- comp1.png

|   |   |-- comp2.gif

|   |   |-- comp2.png

|   |   |-- compressed.gif

|   |   |-- compressed.png

|   |   |-- continued.gif

|   |   |-- continued.png

|   |   |-- dir.gif

|   |   |-- dir.png

|   |   |-- dir2.gif

|   |   |-- dir2.png

|   |   |-- doc.gif

|   |   |-- doc.png

|   |   |-- forward.gif

|   |   |-- forward.png

|   |   |-- generic.gif

|   |   |-- generic.png

|   |   |-- generic2.gif

|   |   |-- generic2.png

|   |   |-- generic3.gif

|   |   |-- generic3.png

|   |   |-- image.gif

|   |   |-- image.png

|   |   |-- image2.gif

|   |   |-- image2.png

|   |   |-- index.gif

|   |   |-- index.png

|   |   |-- key.gif

|   |   |-- key.png

|   |   |-- movie.gif

|   |   |-- movie.png

|   |   |-- patch.gif

|   |   |-- patch.png

|   |   |-- ps.gif

|   |   |-- ps.png

|   |   |-- rainbow.gif

|   |   |-- rainbow.png

|   |   |-- sound.gif

|   |   |-- sound.png

|   |   |-- sound2.gif

|   |   |-- sound2.png

|   |   |-- tar.gif

|   |   |-- tar.png

|   |   |-- text.gif

|   |   |-- text.png

|   |   |-- transfer.gif

|   |   |-- transfer.png

|   |   |-- unknown.gif

|   |   |-- unknown.png

|   |   |-- uu.gif

|   |   `-- uu.png

|   |-- sound1.gif

|   |-- sound1.png

|   |-- sound2.gif

|   |-- sound2.png

|   |-- sphere1.gif

|   |-- sphere1.png

|   |-- sphere2.gif

|   |-- sphere2.png

|   |-- tar.gif

|   |-- tar.png

|   |-- tex.gif

|   |-- tex.png

|   |-- text.gif

|   |-- text.png

|   |-- transfer.gif

|   |-- transfer.png

|   |-- unknown.gif

|   |-- unknown.png

|   |-- up.gif

|   |-- up.png

|   |-- uu.gif

|   |-- uu.png

|   |-- uuencoded.gif

|   |-- uuencoded.png

|   |-- world1.gif

|   |-- world1.png

|   |-- world2.gif

|   `-- world2.png

|-- include

|   |-- ap.h

|   |-- ap_alloc.h

|   |-- ap_compat.h

|   |-- ap_config.h

|   |-- ap_config_auto.h

|   |-- ap_ctype.h

|   |-- ap_ebcdic.h

|   |-- ap_md5.h

|   |-- ap_mmn.h

|   |-- ap_sha1.h

|   |-- buff.h

|   |-- compat.h

|   |-- conf.h

|   |-- explain.h

|   |-- fnmatch.h

|   |-- hsregex.h

|   |-- http_conf_globals.h

|   |-- http_config.h

|   |-- http_core.h

|   |-- http_log.h

|   |-- http_main.h

|   |-- http_protocol.h

|   |-- http_request.h

|   |-- http_vhost.h

|   |-- httpd.h

|   |-- multithread.h

|   |-- os-inline.c

|   |-- os.h

|   |-- rfc1413.h

|   |-- scoreboard.h

|   |-- util_date.h

|   |-- util_md5.h

|   |-- util_script.h

|   |-- util_uri.h

|   `-- xml

|       |-- asciitab.h

|       |-- hashtable.h

|       |-- iasciitab.h

|       |-- latin1tab.h

|       |-- nametab.h

|       |-- utf8tab.h

|       |-- xmldef.h

|       |-- xmlparse.h

|       |-- xmlrole.h

|       |-- xmltok.h

|       `-- xmltok_impl.h

|-- libexec

|   |-- httpd.exp

|   |-- libhttpd.ep

|   |-- libhttpd.so

|   |-- libphp4.so

|   |-- mod_access.so

|   |-- mod_actions.so

|   |-- mod_alias.so

|   |-- mod_asis.so

|   |-- mod_auth.so

|   |-- mod_autoindex.so

|   |-- mod_cgi.so

|   |-- mod_dir.so

|   |-- mod_env.so

|   |-- mod_imap.so

|   |-- mod_include.so

|   |-- mod_log_config.so

|   |-- mod_mime.so

|   |-- mod_negotiation.so

|   |-- mod_setenvif.so

|   |-- mod_status.so

|   |-- mod_userdir.so

|   `-- mod_vhost_alias.so

|-- logs

|   |-- access_log

|   |-- error_log

|   `-- httpd.pid

|-- man

|   |-- man1

|   |   |-- dbmmanage.1

|   |   |-- htdigest.1

|   |   `-- htpasswd.1

|   `-- man8

|       |-- ab.8

|       |-- apachectl.8

|       |-- apxs.8

|       |-- httpd.8

|       |-- logresolve.8

|       `-- rotatelogs.8

`-- proxy


21 directories, 612 files


5. 세팅

- 아파치의 실행파일들을 $PATH 디렉토리에 심볼릭 링크를 건다.

- 심볼릭 링크를 거는 이유 : 아무 디렉토리에서 실행파일을 실행시켜 주기 위함이다.

# ln -s /usr/local/apache/bin/* /usr/bin


- 부팅시 실행 스크립트를 등록한다.

# ln -s /usr/local/apache/bin/apachectl /etc/init.d/httpd  


- chkconfig 를 지원하지 않을 때의 메세지

# chkconfig --add httpd

service httpd does not support chkconfig


- mysqld 의 start 와 stop의 번호를 확인한다.

# ls /etc/rc3.d/*mysql*

/etc/rc3.d/S90mysqld


# head -20 /etc/init.d/mysqld

// head 위에서 20줄 보여주세요

-- /etc/init.d/mysqld --

  :

  :

# Comments to support chkconfig on RedHat Linux

# chkconfig: 2345 90 20

# description: A very fast and reliable SQL database engine.

  :

  :

-- /etc/init.d/mysqld --


- 부팅시 웹서버가 시작될 수 있도록 스크립트를 등록한다.

- 시작은 mysql 보다 늦게 중지는 mysql 보다 빠르게 등록한다.

# vi /etc/init.d/httpd 

-- /etc/init.d/httpd --

#!/bin/sh

// 두 가지 중요

# chkconfig: 2345 91 19              <--  추가

              런레벨 스타트 스탑

# description: Apache web server     <--  추가

// 중요중요 쉘 스크립트

  :

  :

-- /etc/init.d/httpd --


# chkconfig --add httpd

# chkconfig --list httpd

httpd           0:off 1:off 2:on 3:on 4:on 5:on 6:off


- 각 런레벨 디렉토리의 링크를 확인한다.

# ls -l /etc/rc.d/rc[0-6].d/*httpd

lrwxrwxrwx 1 root root 15 Sep 23 07:18 /etc/rc.d/rc0.d/K19httpd -> ../init.d/httpd

lrwxrwxrwx 1 root root 15 Sep 23 07:18 /etc/rc.d/rc1.d/K19httpd -> ../init.d/httpd

lrwxrwxrwx 1 root root 15 Sep 23 07:18 /etc/rc.d/rc2.d/S91httpd -> ../init.d/httpd

lrwxrwxrwx 1 root root 15 Sep 23 07:18 /etc/rc.d/rc3.d/S91httpd -> ../init.d/httpd

lrwxrwxrwx 1 root root 15 Sep 23 07:18 /etc/rc.d/rc4.d/S91httpd -> ../init.d/httpd

lrwxrwxrwx 1 root root 15 Sep 23 07:18 /etc/rc.d/rc5.d/S91httpd -> ../init.d/httpd

lrwxrwxrwx 1 root root 15 Sep 23 07:18 /etc/rc.d/rc6.d/K19httpd -> ../init.d/httpd



#########################

##    GD 라이브러리  설치     ##

#########################

- GD Library 란  

- Graphics 라이브러리로 선, 도형, 텍스트, 다중 색깔, 

- 이미지의 cut paste, 채우기 등의 이미지 처리기능과 이 결과를 

- 그래픽 파일로 (gif,jpeg,png) 저장하는 기능을 제공한다.


- GD 라이브러리는 소스로 설치하는 방법과 yum으로 설치하는 방법있다.

- 여기서는 yum으로 설치하는 방법을 이용한다.

# yum -y install gd gd-devel libjpeg libjpeg-devel \

giflib giflib-devel libpng libpng-devel freetype freetype-devel


##############

## php 설치 ##

##############


+-----+    +-----+     +-----+     +-----+

|  C    |     |  S    |      |  P   |       |       |

|  L    |--> |  E    | --> |  H   | --> |  M  |

|  I     |<-- |  R   | <-- |  P   | <--  |  Y   |

|  E    |     |  V   |       | 파   |       |  S   |

|  N   |     |  E    |       | 서   |       |  Q  |

|  T    |     |  R   |       |       |       |  L   |

+-----+   +-----+      +-----+     +-----+


1. php 설치 전 확인

-  php 가 설치되어 있으면 삭제한다.

# rpm -qa | grep php   

# rpm -e php-cli php-common


2. 환경설정

- configure 옵션은 config.status 파일에 저장되고 phpinfo() 함수에서도 확인이 가능하다.

# tar xzf php-4.4.8.tar.gz

# cd php-4.4.8


- ./configure --help 로 옵션을 확인해보자.

# ./configure --help 

  :

  :


- 옵션 설명

- --prefix : 설치 디렉토리

//

- --with-apxs : 아파치가 설치된 경로의 apxs 실행파일

- --with-mysql : mysql 라이브러리 사용

// 두개 중요 !! php가 mysql을 인식하는 것, php가 apache를 인식하는 것

- --with-gd : GD 라이브러리 사용

- --with-jpeg-dir : GD 라이브러리 사용

- --with-png-dir  : GD 라이브러리 사용

- --with-freetype-dir  : GD 라이브러리 사용

- --with-zlib : 압축 전송

# ./configure \

--prefix=/usr/local/php \

--with-apxs=/usr/local/apache/bin/apxs \

--with-mysql \

--with-gd \ 

//  밑 부분은 gd 라이브러리 이기때문에 gd 안쓰면 밑에껀 안써도됨 

--with-jpeg-dir \

--with-png-dir \

--with-freetype-dir \

--with-zlib 


3. 컴파일

- make 명령어를 이용해서 컴파일 한다.

# make


4. 보안점검(여기서는 생략한다.)

-- # make test    


5. 설치

- make install을 이용해서 설치한다.

# make install


6.  세팅 

- php 소스에는 기본적으로 샘플 설정파일이 제공되므로 

- 이 샘플 설정파일을 시스템에 복사한다.

- 참고 : apm의 설정파일

- apache : httpd.conf

- php    : php.ini

- mysql  : my.cnf 

# cp php.ini-dist /usr/local/php/lib/php.ini      


- php 실행파일들을 링크를 건다.

# ln -s /usr/local/php/bin/* /usr/bin


- 아파치의 모듈 디렉토리에서 php 모듈을 확인한다.

- 참고 : 

- lib<라이브러리명>.a  <-- 정적라이브러리      (~~~.lib)

- lib<라이브러리명>.so <-- 동적,공유라이브러리 (~~~.dll)

- c 라이브러리 : /usr/lib/libc.a /usr/lib/libc.so

-  ar t /usr/lib/libc.a | grep ^printf

# ls /usr/local/apache/libexec/libphp4.so 

 (libexec --> version2 부터는 modules로 나올 걸?)


- 아파치에서 PHP 를 인식할 수 있도록 설정한다.

- 407번 라인에 index.php 를 추가한다.

# vi /usr/local/apache/conf/httpd.conf  

-- /usr/local/apache/conf/httpd.conf --

  :

  :

<IfModule mod_dir.c>  

    DirectoryIndex index.html index.php 

</IfModule>

  :

  :


- 800번 라인 부근에 AddType application/x-tar .tgz  아래에

  AddType 두 줄을 추가한다.

AddType application/x-tar .tgz  

AddType application/x-httpd-php .php .html 

# AddType application/x-httpd-php-source .phps        


-- /usr/local/apache/conf/httpd.conf --


- SELinux 가 설정되어 있으면 아래 에러가 발생되므로 이때는

- SELinux 를 중지하고 Syntax OK 가 나오면 SELinux 설정은 Skip 한다.

# apachectl configtest    

Syntax error on line 223 of /usr/local/apache/conf/httpd.conf:

Cannot load /usr/local/apache/libexec/libphp4.so into server: /usr/local/apache/libexec/libphp4.so: cannot 


restore segment prot after reloc: Permission denied


# setup   

Firewall configuration ->   

Security Level (disabled) , SELinux (disabled) 로 설정 후 종료한다.


- 아파치 웹서버의 설정파일을 점검한다.

# apachectl configtest

Syntax OK


- 아파치 웹서버를 재시작한다.

# apachectl restart

/usr/bin/apachectl restart: httpd restarted


- 웹서버 포트 80번이 떠있는지 확인한다.

- 만약 없다면 웹서버가 실행이 안된 것이므로 왜 안떠졌는지 로그파일의

- 기록을 통해서 확인해봐야 한다.

# netstat -nltp | grep 80

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      1432/httpd    


- 방화벽에서 웹서버(80) 포트를 접속하도록 설정해야 하지만 

- 아직 방화벽에 대한 부분을 배우지 않은 관계로 지금은 방화벽룰을

- 모두 해제시켜준다.

- 아래는 방화벽룰을 설정할 때의 내용이다.

- -I (대문자 아이)

- # iptables -I INPUT -p tcp --dport 80 -j ACCEPT

# iptables -F


- 웹 루트 디렉토리(DocumentRoot)에 임시로 제공되는 파일들을 

- 삭제하고 샘플 파일을 생성해야 한다.

- 웹 루트 디렉토리란 ?

- 웹페이지 문서가 제공되는 디렉토리를 얘기하며 실무에서는 

- DocumentRoot 디렉토리라고 얘기하기도 한다.


- Default 파일 모두 삭제

# cd /usr/local/apache/htdocs

# rm -rf *                           


- php 문서파일을 생성한다 

# echo '<? phpinfo(); ?>' > index.html   


- 자신의 IP 주소를 확인한다.

# ifconfig 


- 브라우저에서 확인된 IP주소로 접속해서 웹페이지를 확인한다.

- 1. APM 연동 성공

-   파란 화면이 나오면 APM 연동이 성공적으로 된 것이다.

- 2. APM 연동 실패

-   다운로드가 되거나 php 소스가 보이면 연동이 안된 것이다.

http://<Linux IP주소>


- cgi 문서파일 생성한다.

# cd /usr/local/apache/cgi-bin

# vi cgitest.c

-- cgitest.c --

#include <stdio.h>

int main()

{

  printf("Content-type: text/html\n\n");

  printf("<center> Hello CGI </center>");

  return 0;

}

-- cgitest.c --


# gcc -Wall -o cgitest.cgi cgitest.c


- 브라우저에서 확인된 IP주소로 접속해서 CGI 페이지를 확인한다.

http://<Linux IP>/cgi-bin/cgitest.cgi


- php 명령어를 이용해서 모듈을 확인한다.

# php -m

[PHP Modules]

ctype

gd

mysql

overload

pcre

posix

session

standard

tokenizer

xml

zlib


[Zend Modules]


- APM 의 설정파일은 모두 틀리다.

- 왜 ? 만든 곳이 틀려서 그런가 ?

- 관리상 /etc 디렉토리에 APM 설정파일들을 심볼릭 링크로 생성한다.

- /usr/local/apache/conf/httpd.conf 

- /usr/local/php/lib/php.ini 

- /etc/my.cnf 


# ln -s /usr/local/apache/conf/httpd.conf /etc/httpd.conf

# ln -s /usr/local/php/lib/php.ini /etc/php.conf

# ln -s /etc/my.cnf  /etc/mysql.conf


# ls -l /etc/{httpd,php,mysql}.conf

lrwxrwxrwx 1 root root 33 Aug 12 17:29 /etc/httpd.conf -> /usr/local/apache/conf/httpd.conf

lrwxrwxrwx 1 root root 11 Aug 12 17:29 /etc/mysql.conf -> /etc/my.cnf

lrwxrwxrwx 1 root root 26 Aug 12 17:29 /etc/php.conf -> /usr/local/php/lib/php.ini

-------------------------- APM 세팅 끝 -------------------------- 


==================================================================

APM-LAB> 설치된 APM을 삭제해보자.


- 데몬을 중지

- 설치된 프로그램을 삭제한다.

- 윈도우처럼 레지스트리가 없어서 그냥 설치된 디렉토리를 날리면 끝

- 컴파일한 소스디렉토리를 삭제한다.


-- 순서 --

1. 데몬(서비스) 중지

2. 중지된 데몬(서비스) 확인

3. 설치 프로그램 삭제

-- 순서 --


1. 데몬(서비스) 중지

- 외부에 서비스를 하기 위해서 포트를 열어놓은 서비스를 중지한다.

- 아파치 웹서버는 80 포트를 사용하고 DB는 3306 포트를 사용하므로 

- 이 두 개의 데몬을 중지한다.

# /etc/init.d/httpd stop  or apachectl stop

# /etc/init.d/mysqld stop


2. 중지된 데몬(서비스) 확인

- netstat 명령어를 이용해서 LISTEN 된 포트를 확인해서 

- 80과 3306 포트가 없어야 된다. 

- 또한 mysql은 skip-networking 으로 설정이 되어있다면 포트가 

- 열려있지 않으므로 이때는 /tmp/mysql.sock 파일을 확인한다.

# netstat -nltp 

   :

# ls /tmp/mysql.sock

ls: /tmp/mysql.sock: No such file or directory


3. 설치 프로그램 삭제

- 설치된 프로그램을 삭제한다.


# rm -rf /usr/local/apache

# rm -rf /usr/local/php

# rm -rf /usr/local/mysql


# rm -fv /etc/{apache,php,mysql}.conf

# rm -fv /etc/my.cnf

# rm -fv /etc/init.d/mysqld

# rm -fv /etc/init.d/httpd

# rm -fv ~/.my.cnf 


# rm -fv /usr/bin/mysql*

# rm -fv /usr/sbin/mysqld

# rm -fv /usr/bin/php*

# rm -fv /usr/bin/apache*

# rm -fv /usr/bin/httpd*


# userdel -r mysql


- 컴파일한 소스디렉토리를 삭제한다.

# cd ~/apm1

# find  -maxdepth 1 -type d -exec rm -rf {} \;

==================================================================


==================================================================

APM-LAB> MySQL(DBMS) 에서 사용자를 생성하고 DB/TABLE 을 생성해보자.


DATABASE 를 DB라고 줄여서 얘기하고 또한 DBMS DB라고 줄여서 얘기한다.


-- 순서 --

1. DB 생성

2. 사용자 등록

3. TABLE 생성

-- 순서 --


1. DB 생성

- 일반 유저가 사용할 수 있는 DB를 생성한다.

형식 : CREATE DATABASE DB명;


mysql> create database shop;

Query OK, 1 row affected (0.00 sec)


mysql> show databases;

+----------+

| Database |

+----------+

| mysql    |

| shop     |

| test     |

+----------+

3 rows in set (0.00 sec)


2. 사용자 등록

- 일반 사용자를 등록한다.

- 사용자 등록은 insert 문을 이용해서 등록한다.

- DB : mysql -> 

- user table : 사용자의 정보가 있는 테이블 (비밀번호가 있다)

- db   table : 사용자가 DB를 사용할 수 있는 권한이 있는 테이블

- user, db 테이블에 값을 넣어주고 flush privileges 를 해주면 끝

- user : /etc/{passwd,shadow} 동일


- 사용자 : shopuser

- 비밀번호 : shpuser1234!


mysql> use mysql

Database changed

mysql> desc user;


- 일반유저 shopuser를 생성한다.

mysql> insert into user (host,user,password) values(          

    -> 'localhost','shopuser', password('shopuser1234!'));

Query OK, 1 row affected (0.00 sec)


- 사용자의 비번을 확인한다.

mysql> select host,user,password from user

    -> where user = 'shopuser' 

    ->       and 

    -> password = password('shopuser1234!');

+-----------+----------+------------------+

| host      | user     | password         |

+-----------+----------+------------------+

| localhost | shopuser | 1a7912ea36e1cb56 |

+-----------+----------+------------------+

1 row in set (0.00 sec)


mysql> desc db;


- 사용자가 db내에서 모든 권한을 행사할 수 있도록 설정한다.

mysql> insert into db values(

    -> 'localhost','shop','shopuser',

    -> 'y','y','y','y','y','y','y','y','y','y','y','y');

Query OK, 1 row affected (0.00 sec)


mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)


- 사용자가 정상적으로 등록되었는지 확인한다.

mysql> select host,user,password from user;

+-----------+----------+------------------+

| host      | user     | password         |

+-----------+----------+------------------+

| localhost | root     | 57c0dba50319edd5 |

| localhost | shopuser | 1a7912ea36e1cb56 |

+-----------+----------+------------------+

2 rows in set (0.00 sec)


mysql> select host,user,db from db;

+-----------+----------+------+

| host      | user     | db   |

+-----------+----------+------+

| localhost | shopuser | shop |

+-----------+----------+------+

1 row in set (0.00 sec)



3. TABLE 생성

- 일반 유저로 접속해서 TB을 생성한다.

- 형식 : mysql -h localhost -u 사용자 -p[비밀번호] [DB명]

- 형식 : CREATE TABLE 테이블명 ( 필드명 필드타입 [,...] );

mysql> quit


- 생성된 일반유저에서 shop DB로 접속해본다.

# mysql -h localhost -u shopuser -p shop

Enter password:     <-- 비번 입력 : shopuser1234


mysql> select user();

+--------------------+

| user()             |

+--------------------+

| shopuser@localhost |

+--------------------+

1 row in set (0.00 sec)


mysql> select database();

+------------+

| database() |

+------------+

| shop       |

+------------+

1 row in set (0.00 sec)


- member 테이블을 생성한다.

mysql> create table member (          

    -> no int not null default 0 auto_increment,

    -> userid varchar(20) not null,

    -> userpw char(16) not null,

    -> primary key(no)) TYPE=MyISAM;

Query OK, 0 rows affected (0.00 sec)


mysql> desc member;

+--------+-------------+------+-----+---------+----------------+

| Field  | Type        | Null | Key | Default | Extra          |

+--------+-------------+------+-----+---------+----------------+

| no     | int(11)     |      | PRI | NULL    | auto_increment |

| userid | varchar(20) |      |     |         |                |

| userpw | varchar(16) |      |     |         |                |

+--------+-------------+------+-----+---------+----------------+

3 rows in set (0.00 sec)


- member 테이블에 값을 넣는다.

- 형식 : INSERT INTO 만든테이블명 VALUES(필드값, ... )

mysql> insert into member values('', 'testuser', password('1234'));

Query OK, 1 row affected (0.00 sec)


mysql> insert into member values('', 'testuser2', password('1234'));

Query OK, 1 row affected (0.00 sec)


- member 테이블의 값을 확인한다.

- 형식 : SELECT 컬럼명  <-- 모든 컬럼명(*) userid,userpw

         FROM 테이블명

mysql> select *

    -> from member;

+----+-----------+------------------+

| no | userid    | userpw           |

+----+-----------+------------------+

|  1 | testuser  | 446a12100c856ce9 |

|  2 | testuser2 | 446a12100c856ce9 |

+----+-----------+------------------+

2 rows in set (0.00 sec)



mysql> select * from member;

+------+-----------+------------------+

| no   | userid    | userpw           |

+------+-----------+------------------+

|    1 | testuser  | 446a12100c856ce9 |

|    2 | testuser2 | 3fb6947541ec4738 |

+------+-----------+------------------+

2 rows in set (0.00 sec)




==================================================================


==================================================================

APM-LAB> PHP 를 이용해서 DB에 저장된 자료를 화면 출력해보자.


# mysql -h localhost -u root -pksw1234 mysql 

mysql> select host,user,password from user;

  :

  :


-- 순서 --

1. DBMS 접속한다.

2. DB 선택한다.

3. 쿼리 실행한다.

4. Data 를 출력한다.

-- 순서 --


<?php

// 1. DBMS에 접속한다.

// 사용법 : mysql_connect("호스트명", "사용자명", "비밀번호")

$connect = @mysql_connect("localhost","shopuser","shopuser1234!") or die("DB에 접속할 수 없습니다");


// 2. DB를 선택한다.

// 사용법 : mysql_select_db("디비명", $connect)

$select_db = mysql_select_db("shop", $connect);


// 3. 쿼리를 실행한다.

// 사용법 : mysql_query("실행할 쿼리문")

$result = mysql_query("SELECT * FROM member");



// 4. Data를 출력한다.

$number = mysql_num_rows($result); // 전체 자료의 개수를 구한다.


for(; $number > 0; $number--)

{   

  $row = mysql_fetch_array($result);

  echo "no = $row[no], userid = $row[userid], userpw = $row[userpw] <br>";        

}   


?>  


-- 출력결과 --

no=1, userid=testuser, userpw=446a12100c856ce9 

no=2, userid=testuser2, userpw=3fb6947541ec4738 

-- 출력결과 --


==================================================================


==================================================================

APM-LAB> php를 이용한 로그인 구현하기


아래 웹 프로그램을 이해하기 위해서는 php 언어와 세션에 대한 

이해가 먼저 선행되어야 한다.

우리는 아직 이 내용을 안배웠기 때문에 전체적인 흐름만 이해하면 된다.


-- 조건 --

1. 전송방식  : post 방식

2. 전송URL   : login.php -> loginok.php 

3. 기능 설명 : 사용자가 로그인을 안했다면 로그인폼을 보여주고 

               로그인을 했다면 사용자의 userid를 출력한다.

4. 로그인 흐름도

login.php -> loginok.php 

   |

   +-------> logout.php


5. 웹 프로그램 파일들의 역할

login.php   : 사용자가 입력폼에서 userid 와 userpw 값을 입력한다.

              login 버튼을 누르면 loginok.php로 사용자가 입력한

              값을 보내준다.

loginok.php : 사용자가 보내준 값을 받아서 DB의 member TB에서  

              사용자 아이디와 비밀번호  정보를 조회한다. 

              이때 사용자가 있다면  로그인을 허용하고 

              틀리다면 거부를 화면에 출력한다.

logout.php  : 사용자가 로그인했다면 로그아웃을 해준다.

-- 조건 --


o 웹 프로그램 소스

-- login.php --

<?

/*-------------------.

 |  Written by K.S.W |

 `-------------------*/

session_start();

if(!isset($_SESSION['userid']))  // 로그인이 안되었으면

{

?>


<form method=post action=loginok.php>

<table align=center border=1 cellpadding=5 cellspacing=0 width=250>

  <tr>

    <td align=ceter> id </td>

    <td> <input type=text name=userid> </td>

  </tr>

  <tr>

    <td align=ceter> pw </td>

    <td> <input type=password name=userpw> </td>

  </tr>

  <tr>

    <td align=center colspan=2> 

<input type=submit value=로그인> 

    </td>

  </tr>

</table>

</form>

<?

} else {  // 로그인이 되었다면

?>

<table align=center border=1 

       cellpadding=5 cellspacing=0 width=250>

  <tr>

    <td align=ceter> 

<?=$_SESSION['userid']?> 님 환영합니다!!!  

    </td>

  </tr>

  <tr>

    <td align=center colspan=2> 

       <a href=logout.php>로그아웃</a>

    </td>

  </tr>

</table>

<?

}

?>

-- login.php --


-- loginok.php --

<?

/*-------------------.

 |  Written by K.S.W |

 `-------------------*/

session_start();


$connect = mysql_connect("localhost","shopuser","shopuser1234!") or die("DB에 접속할 수 없습니다");

$select_db = mysql_select_db("shop", $connect);



// 넘어온 사용자와 비번을 DB에서 검색한다.

$query = "SELECT * FROM member WHERE userid = '" . $_POST['userid']  .  "' and  userpw = password('" . 


$_POST['userpw'] . "')";

$result = mysql_query($query);


// 전체 사용자를 구한다.

$number = mysql_num_rows($result); 


 if($number) // 사용자가 존재하면

 {

   $row = mysql_fetch_array($result);

   $_SESSION['userid'] = $row['userid'];


   echo "<script language=JavaScript>

          location.href = 'login.php';

         </script>

        ";

 } else {  // 사용자가 존재하지 않다면

     echo "<script language=JavaScript>

  alert('id 와 pw 를 다시 확인해주세요!');

            history.go(-1);

  </script>

          ";

     exit;

   }


?>

-- loginok.php --


-- logout.php --

<?

/*-------------------.

 |  Written by K.S.W |

 `-------------------*/

session_start();

session_destroy();  // 세션 파일을 삭제한다.

?>

<meta http-equiv=refresh content='0; url=login.php'>

-- logout.php --


==================================================================


###################

## php 실무 TIP  ##

###################


1. 어떤 소스를 가져와서 실행할려고 했더니 아래와 같은 에러메세지가 발생되었다.

- Call to undefined function: socket_create() 이라는 메세지는 현재 socket_create() 함수가 실행되는 라이브러


가 php 파서가 

  인식을 못하기 때문이다. 

  해결방안 : php 를 socket_create() 함수가 인식되게 다시 컴파일해야 한다.


Fatal error: Call to undefined function: socket_create() 


o php 파일에 포함되어 있는 라이브러리

- php를 컴파일할때 옵션으로 enable 시켜준다.


o php 파일에 포함되지 않은 라이브러리 

- 외부의 파일을 가져와서 먼저 설치한 후에 php 를 컴파일할때 enable 시켜준다.


# cd /usr/local/apache/htdocs

# vi index.html

-- index.html -- 

  1 <?php

  2 error_reporting(E_ALL);

  3

  4 /* Allow the script to hang around waiting for connections. */

  5 set_time_limit(0);

  6

  7 /* Turn on implicit output flushing so we see what we're getting as it comes in. */

  8 ob_implicit_flush();

  9

 10 $address = '0.0.0.0';

 11 $port = 10000;

 12

 13 if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) == false) {

 14    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";

 15 }

 16

 17 if (socket_bind($sock, $address, $port) == false) {

 18    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";

 19 }

 20

 21 if (socket_listen($sock, 5) == false) {

 22    echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";

 23 }

 24

 25 if (($msgsock = socket_accept($sock)) === false) {

 26        echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";

 27        break;

 28 }

 29 /* Send instructions. */

 30 $msg = "\nWelcome to the PHP Test Server. \n" .  "To quit, type 'quit'. To shut down the server type 


'shutdown'.\n";

 31

 32 socket_write($msgsock, $msg, strlen($msg));

 33 socket_close($msgsock);

 34

 35 socket_close($sock);

 36 ?>


-- index.html -- 


브라우저에서 접근시 : http://192.168.56.101   <-- 정상적으로 실행이 안된다.

Fatal error: Call to undefined function: socket_create()  에러가 발생한다.


-- 해결방안 --

!!! 기존 소스 디렉토리로 이동해서 socket 함수를 쓸 수 있도록 옵션을 추가해서 다시 재설치 한다. !!!


# cd <php source directory>

# ./configure  \

--prefix=/usr/local/php \

--with-apxs=/usr/local/apache/bin/apxs \

--with-mysql \

--enable-sockets                               <-- 추가한다. 

# make

# make install 

# apachectl restart


브라우저에서 접근시 : http://192.168.56.101    <-- 정상적으로 실행이 된다.


# netstat -nat

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Pro

  :

  :

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      32179/h/httpd

tcp        0      0 0.0.0.0:10000               0.0.0.0:*                   LISTEN      32386/httpd          


<-- 10000 포트가 열렸다.

  :

  :



!!! php 에서 기능들을 확인하는 옵션 


# ./configure --help | grep with

  :

  :

  --with-mysql[=DIR]      Include MySQL support. DIR is the MySQL base directory.

  :

  :

# ./configure --help | grep enable

  :

  :

  --enable-sockets        Enable sockets support

  :

  :



#########################

## 배포판에서 APM 설치 ##

#########################

!!! yum 을 이용해서 Web Server 를 설치하면 자동으로 php 가 설치된다. !!!


yum 으로 설치할때 

- 실행파일 위치 : /usr/bin, /usr/sbin

- 설정파일 위치 : /etc/httpd/conf, /etc/httpd/conf.d

- 문서파일 위치 : /var/www/html

- 로그파일 위치 : /var/log/httpd

- 실행파일 스크립트 : /etc/init.d/httpd, /usr/sbin/apachectl


소스로 설치할때 ( --prefix=/usr/local/apache, --with-layout=Apache 일때 config.layout 을 참고 )

- 실행파일 위치 : $PREFIX/bin

- 설정파일 위치 : $PREFIX/conf

- 문서파일 위치 : $PREFIX/htdocs

- 로그파일 위치 : $PREFIX/logs

- 실행파일 스크립트 : $PREFIX/bin/apachectl 


소스로 설치하는데 레드햇의 분산 파일로 설치하고 싶다면 (--with-layout=RedHat 옵션을 사용한다. 단 이 옵션 이


외의 다른 옵션들은 모두 써줘야 한다.)



# yum groupinstall "Web Server"


# vi /etc/httpd/conf.d/php.conf             <-- html 확장자를 추가

-- /etc/httpd/conf.d/php.conf --

  :

  :

AddHandler php5-script .php

AddType text/html .php .html                 <-- php 가 설치될때 설정에서 .html 이 인식이 안된다. 관리자가 


따로 수정해줘야 한다.


DirectoryIndex index.php index.html          <-- php 가 설치될때 설정에서 .html 이 인식이 안된다. 관리자가 


따로 수정해줘야 한다.

  :

  :

-- /etc/httpd/conf.d/php.conf --


# /etc/init.d/httpd restart

# cd /var/www/html

# echo '<?php phpinfo(); ?>' > index.html


브라우저로 옵션을 확인한다.  http://192.168.56.101


'./configure' '--build=i386-redhat-linux-gnu' '--host=i386-redhat-linux-gnu' '--target=i386-redhat-linux-


gnu' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--


sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib' '--


libexecdir=/usr/libexec' '--localstatedir=/var' '--sharedstatedir=/usr/com' '--mandir=/usr/share/man' '--


infodir=/usr/share/info' '--cache-file=../config.cache' '--with-libdir=lib' '--with-config-file-path=/etc' 


'--with-config-file-scan-dir=/etc/php.d' '--disable-debug' '--with-pic' '--disable-rpath' '--without-pear' 


'--with-bz2' '--with-curl' '--with-exec-dir=/usr/bin' '--with-freetype-dir=/usr' '--with-png-dir=/usr' '--


enable-gd-native-ttf' '--without-gdbm' '--with-gettext' '--with-gmp' '--with-iconv' '--with-jpeg-dir=/usr' 


'--with-openssl' '--with-png' '--with-pspell' '--with-expat-dir=/usr' '--with-pcre-regex=/usr' '--with-zlib' 


'--with-layout=GNU' '--enable-exif' '--enable-ftp' '--enable-magic-quotes' '--enable-sockets' '--enable-


sysvsem' '--enable-sysvshm' '--enable-sysvmsg' '--enable-track-vars' '--enable-trans-sid' '--enable-yp' '--


enable-wddx' '--with-kerberos' '--enable-ucd-snmp-hack' '--with-unixODBC=shared,/usr' '--enable-memory-


limit' '--enable-shmop' '--enable-calendar' '--enable-dbx' '--enable-dio' '--with-mime-


magic=/usr/share/file/magic.mime' '--without-sqlite' '--with-libxml-dir=/usr' '--with-xml' '--with-system-


tzdata' '--with-apxs2=/usr/sbin/apxs' '--without-mysql' '--without-gd' '--without-odbc' '--disable-dom' '--


disable-dba' '--without-unixODBC' '--disable-pdo' '--disable-xmlreader' '--disable-xmlwriter'




'OS > [Linux] CentOS' 카테고리의 다른 글

[CentOS] CentOS 목차  (0) 2017.07.22
[CentOS] 16. APM2 설치  (0) 2016.07.30
[CentOS] 14-2 패키지 관리 - tomcatWAS설치  (3) 2016.07.10
[CentOS] 14-1 패키지 관리 - tomcat 환경설정  (0) 2016.07.10
[CentOS] 14. 패키지 관리  (0) 2016.07.10

+ Recent posts