#############################################
## 주제 : 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'