이 글은 Apache, PHP, Mariadb 의 각 소스 코드를 받아서 사용자가 변경한 디렉토리에 설치를 합니다. 그 이유는 웹서버를 통합적으로 한 디렉터리에서 관리 하기 쉽게 만들기 위해서 입니다. 이 글은 내용 설명 보다는 설치 위주이며 우선 이 설명을 따라 설치 해보시고 그 과정에서 이유를 생각하고 각자에게 발생한 trouble shooting을 하면서 배워 나갑니다.
Setup web server on centos 7
구축 환경: CentOS7-x64bit
웹 서버 디렉토리 구조
/apm | /apps | /data | ||
/docs | /xe | |||
/plugin | /phpmyadmin | |||
/server | /apache | /apr | ||
/apr-iconf | ||||
/apr-util | ||||
/httpd | ||||
/conf | ||||
/mariadb | ||||
/php | ||||
- 각 Application 개발자사이트 소개
*Mariadb
- 최신버전 : 10.1.14
- 웹사이트 http://mariadb.org - Select Platform 의 콤보박스에서 Source Code 를 선택하여 가장 마지막 항목을 다운로드 한다. (Generic Linux (Architecture Independent), Compressed TAR Archive)
- 다운로드 URL : http://ftp.kaist.ac.kr/mariadb/mariadb-10.1.14/source/mariadb-10.1.14.tar.gz
*MySQL
- 최신버전 : 5.6.24
- 웹사이트 http://www.mysql.com - Select Platform 의 콤보박스에서 Source Code 를 선택하여 가장 마지막 항목을 다운로드 한다. (Generic Linux (Architecture Independent), Compressed TAR Archive)
- 다운로드 URL : http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.24.tar.gz
*Apache Portable Runtime
- 최신버전 : APR 1.5.2, APR-util 1.5.4, APR-iconv 1.2.1
- 웹사이트 : http://apache.org
- APR 다운로드 URL : http://mirror.apache-kr.org/apr/apr-1.5.2.tar.gz
- APR-iconv 다운로드 URL : http://mirror.apache-kr.org/apr/apr-iconv-1.2.1.tar.gz
- APR-util 다운로드 URL : http://mirror.apache-kr.org/apr/apr-util-1.5.4.tar.gz
*Apache HTTP Server
- 최신버전 : 2.4.12
- 웹사이트 : http://apache.org - mirror 에서 다운받는 경우 http 폴더로 들어가서 다운로드한다.
- 다운로드 URL : http://mirror.apache-kr.org/httpd/httpd-2.4.12.tar.gz
*PHP
- 최신버전 : 5.6.10
- 웹사이트 : http://php.net
- 다운로드 URL : http://kr1.php.net/distributions/php-5.6.10.tar.gz
*phpMyAdmin
- 최신버전 : 4.4.8
- 웹사이트 : http://phpmyadmin.net
- 다운로드 URL : http://nchc.dl.sourceforge.net/project/phpmyadmin/phpMyAdmin/4.4.8/phpMyAdmin-4.4.8-all-languages.tar.gz
*XE
- 최신버전 : 1.8.2
- 웹사이트 : https://www.xpressengine.com
- 다운로드 URL : http://download.xpressengine.com/download/18325662/22755020
위 링크들은 본 문서의 기록된 시점에서의 링크임으로 버전업이 있을 경우 링크주소가 변할 수도 있습니다.
링크가 다운로드되지 않을 경우 웹사이트를 방문하여 최신버전으로 다운로드 합니다.
Installing Mariadb
[root@host ~] yum -y groupinstall "Development Tools"
[root@host ~] yum install wget
[root@host ~] yum install cmake
[root@host ~] yum install ncurses-devel
[root@host ~] yum install openssl-devel
또는
[root@host ~] yum -y groupinstall "Development Tools"
[root@host ~] yum -y install wget cmake ncurses-devel openssl-devel
[root@host ~] yum -y install libtool-ltdl-devel expat-devel db4-devel pcre-devel libdb-devel
위의 두 명령은 같은 명령이나 아래 명령은 설치를 한번에 처리 하는 것이니 두가지 방법 중 하나를 선택해서 수행하면 된다.
* 프롬프트 : 위와 같이 [root@host ~] 로 표시된 부분을 프롬프트라 한다.
프롬프트의 형태는 설정에 의해 얼마든지 바꿀수는 있지만 bash쉘이 표준으로 자리잡고 있는 현재에는 이와 같은 표시방법을 사용하고 있다.
프롬프트가 표시되는 이런 상황은 시스템이 사용자로부터 명령을 받아들일 수 있는 준비 된 상태라는 의미이고, 이 프롬프트를 통하여 사용자는 쉘로 명령을 전달하게 된다.
상단의 표시 형식에 대하여 간단하게 설명 하자면 ["로그인된계정"@"호스트이름" "현재경로"]로 표시된다.
로그인된 계정이란 현재 시스템으로부터 사용자로서의 인증을 받은 계정이란 뜻이고, 호스트이름은 관리자에 의하여 부여받은 시스템의 명칭이 되겠다. 현재 경로는 현 사용자가 접근한 디랙토리의 경로상의 마지막 디렉토리 이름을 뜻한다.
여기서 "~"의 의미는 현재 상태의 사용자의 홈 디렉토리를 의미하는 것이며 이때는 디랙토리 명이 아닌 "~"로 표시하게 된다.
[root@host ~] 이와 같은 상황이면 root라는 계정으로 host라는 시스탬으로부터 인증받아 /root라는 디렉토리에 접근한 상태를 나타넨다.
* 추가로 현재 접속된 경로의 전체경로를 알고 싶다면 프롭ㅁ프트상에 "pwd"라는 명령을 입력하면 된다.
* yum : /etc/yum.repo.d/ 에 있는 repo파일에 기록된 페키지 저장소를 참조하는 명령어.
(RHEL계열에서 쓰는 레포지터리참조 명령어이다.)
옵션 -y : 이후 시스템에서 질의하는 내용에 자동으로 y라고 답한다는 옵션
옵션 update : 현제 시스템에 설치된 페키지와 참조한 페키지저장소의 페키지의 버전을 비교하여 최신버전으로 업데이트 하라는 명령어.
옵션 groupinstall : 어떤 종류로 정의된 페키지들을 한번에 설치한다는 명령어.
인자 "Development Tools" : Development Tools 종류로 정의된 페키지들의 집합.
(항상 " "로 지정한다.)
옵션 install : 뒤에 명시된 인자를 페키지로 간주하고 저장소를 참조한다.
[root@host ~] useradd -M -c "MySQL" -d /var/mysql -g dba -s /bin/nologin mysql
* groupadd : 새로운 그룹을 생성하는 명령어.
(위 명령은 dba라는 그룹을 생성하는 명령어이다.)
* useradd : 새로운 사용자를 생성하는 명령어.
옵션 -M : 사용자 home디렉토리를 생성하지 않는다.
옵션 -c : 사용자의 설명문이다.
옵션 -d : home디렉토리 지정. home디렉토리를 생성 후 지정하려면 -m과 같이 사용한다.
옵션 -g : 소속될 그룹을 지정한다.
옵션 -s : 사용할 쉘을 지정한다.
(위 명령은 홈디렉토리는 새로 만들지 말고 /var/mysql디렉토리를 홈으로 사용하며 dba라는 그룹에 MySQL이라는 주석으로 mysql이라는 사용자를 생성하되, 사용하는 쉘이 없음으로 이계정으로 일반 사용자와 같이 로그인 할 수는 없다. 라는 명령어이다.)
[root@host src] wget http://ftp.kaist.ac.kr/mariadb/mariadb-10.0.20/source/mariadb-10.0.20.tar.gz
[root@host src] tar zxvf mariadb-10.0.20.tar.gz
[root@host src] cd mariadb-10.0.20
[root@host mariadb-10.0.20] cmake \
-DCMAKE_INSTALL_PREFIX=/apm/server/mariadb \
-DMYSQL_UNIX_ADDR=/apm/server/mariadb/mysql.sock
[root@host mariadb-10.0.20] make; make install
* cd : 디랙토리 변경 명령어
* wget : 뒤에 명시되는 링크를 다운로드하는 프로그렘
* tar : 여러개의 파일을 단일파일로 묵거나, 묵어진 단일파일을 다시 분리시키는 프로그렘
단, tar만으로 압축을 하는것은 아니라는 것에 주의하자.
압축을 하는 것이 아니라는 말은 말 그대로 tar는 복수의 파일을 단수의 파일로 묵는 효과만 있을 뿐 데이터의 압축에 대하여는 아무로 연관이 없다.
tar형식을 유심히 보면 뒤에 bz2라든지 gz이라든지 따라붙는데, 이때 명시된 것이 bunzip 도는 gunzip으로 압축했다는 뜻이다.
정리하자면, ~.tar.gz라는 파일은 복수의 파일을 tar로 ~이라는 단일파일로 묵었고 gunzip을 통하여 압축했다는 뜻이다.
* 소스설치 : 리눅스 상에서 소스설치를 구분하여 보자면 일반적으로 3단계로 볼수 있을 것이다.
먼저 컴파일을 어떻게 할 것인지 정의 하는 configure
두번째로 정의한 규칙대로 바이너리화 시키는 컴파일
세번째로 컴파일된 목적파일을 정위치 시키는 install
* cmake : 소스를 컴파일 함에 있어 소스개발자의 환경에 맞추어 컴파일 환경을 만들고 컴파일을 수행하는 것이 통상이지만 사용자의 환경을 고려하여 개발환경과 다른 환경에서 컴파일을 하더라도 목적파일을 만드는것에 크게 지장이 없도록 어쩌면 사용자를 배려하는 입장이라고 볼 수 있는 개발자들도 있다.
이런상황을 일종의 크로스컴파일로 볼 수 있는데 MySQL이나 MariaDB는 이런 크로스컴파일 지원을 위하여 리눅스 자체의 gcc를 이용하지 않고 cmake라는 다른 컴파일러는 사용하여 컴파일 한다.
* configuer 옵션중 경로상의 몇가지만 알아보자.
prefix : 컴파일 후 설치할 경로
datadir : 저장될 DB파일들의 경로
unix_address : DB의 외부 연결 통로 파일인 socket파일이 생성될 경로
이외의 MySQL 설치 옵션은 아래 URL을 참고한다.
http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html
Step 4 >> 데이터베이스가 저장되는 폴더 생성
“/apm/apps/data” 에 데이터베이스 파일들을 저장하기 위해서 “data” 폴더의 부모 폴더인 “/apm/apps” 폴더를 생성한다.
기본 데이터베이스 저장 폴더인 “/apm/server/mariadb/data” 에 저장하는 경우는 부모 폴더가 존재하기 때문에 폴더를 생성하지 않아도 된다.
[root@host mariadb-10.0.20] mkdir /apm/apps
Step 5 >> 환경 설정
위에서 mysql_install_db 를 실행하면 “/etc” 디렉토리에 my.cnf 파일이 생성된다.
이 파일을 설치시에 지정한 “/apm/server/conf” 디렉토리로 이동시켜서 환경 설정 파일을 수정한다.
[root@host mariadb] mkdir /apm/server/conf
[root@host mariadb] mv /etc/my.cnf /apm/server/conf/my.cnf
[root@host mariadb] vi /apm/server/conf/my.cnf
[mysqld] sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES datadir=/apm/apps/data socket=/apm/server/mariadb/mysql.sock innodb_buffer_pool_size = 16M innodb_additional_mem_pool_size = 2M innodb_log_file_size = 5M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid # include all files from the config directory !includedir /etc/my.cnf.d
더 자세한 옵션은 아래 URL을 참고한다.
http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html
[root@host mariadb] mkdir /var/log/mariadb
[root@host mariadb] mkdir /var/run/mariadb
[root@host mariadb] chown mysql:dba /var/log/mariadb
[root@host mariadb] chown mysql:dba /var/run/mariadb
Step 7 >> 기본 데이터베이스 생성 및 폴더 권한 변경
[root@host mariadb] ./scripts/mysql_install_db --user=mysql --datadir=/apm/apps/data --defaults-file=/apm/server/conf/my.cnf
[root@host mariadb] chown -R mysql:dba /apm/server/mariadb
Step 8 >> 기본 데이터베이스 생성 및 폴더 권한 변경
DB디렉토리의 위치가 /apm/server/mariadb하위가 아닐경우 별도로 DB디렉토리의 권한도 변경한다.
[root@host mariadb] chown -R mysql:dba /apm/apps/data
MySQL 의 주요 실행 파일을 어떤 경로에서든지 실행할 수 있도록 PATH 환경 변수에 추가된 “/bin”, “/sbin” 디렉토리로 Symbolic Link 를 걸어둔다.
[root@host mariadb] ln -s /apm/server/mariadb/bin/mysqldump /usr/sbin/mysqldump
[root@host mariadb] ln -s /apm/server/mariadb/bin/mysql_config /usr/sbin/mysql_config
[root@host mariadb] ln -s /apm/server/mariadb/bin/mysqladmin /usr/sbin/mysqladmin
[root@host mariadb] service mysql start
[root@host mariadb] service mysql stop
[root@host mariadb] chkconfig --add mysql
[root@host mariadb] chkconfig --level 24 mysql off
# It's not recommended to modify this file in-place, because it will be # overwritten during package upgrades. If you want to customize, the # best way is to create a file "/etc/systemd/system/@DAEMON_NAME@.service", # containing # .include /usr/lib/systemd/system/@DAEMON_NAME@.service # ...make your changes here... # or create a file "/etc/systemd/system/@DAEMON_NAME@.service.d/foo.conf", # which doesn't need to include ".include" call and which will be parsed # after the file @DAEMON_NAME@.service itself is parsed. # # For more info about custom unit files, see systemd.unit(5) or # http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F # For example, if you want to increase mysql's open-files-limit to 10000, # you need to increase systemd's LimitNOFILE setting, so create a file named # "/etc/systemd/system/@DAEMON_NAME@.service.d/limits.conf" containing: # [Service] # LimitNOFILE=10000 # Note: /usr/lib/... is recommended in the .include line though /lib/... # still works. # Don't forget to reload systemd daemon after you change unit configuration: # root> systemctl --system daemon-reload [Unit] Description=MariaDB database server After=syslog.target After=network.target [Service] Type=simple User=mysql Group=dba #ExecStartPre=@libexecdir@/mysql-check-socket #ExecStartPre=@libexecdir@/mysql-prepare-db-dir %n # Note: we set --basedir to prevent probes that might trigger SELinux alarms, # per bug #547485 ExecStart=/apm/server/mariadb/bin/mysqld --defaults-file=/apm/server/conf/my.cnf --datadir=/apm/apps/data --socket=/apm/server/mariadb/mysql.sock #ExecStartPost=@libexecdir@/mysql-wait-ready $MAINPID #ExecStartPost=@libexecdir@/mysql-check-upgrade #ExecStopPost=@libexecdir@/mysql-wait-stop # Give a reasonable amount of time for the server to start up/shut down TimeoutSec=300 # Place temp files in a secure directory, not /tmp PrivateTmp=true [Install] WantedBy=multi-user.target
[root@host mariadb] systemctl stop mysql.service
[root@host mariadb] systemctl status mysql.service
[root@host mariadb] systemctl enable mysql.service
[root@host mariadb] systemctl disable mysql.service
MySQL 의 관리자 계정인 “root” 의 암호를 설정한다.
암호를 설정한 뒤에는 MySQL 의 root 계정으로 접속 시에 설정한 암호를 요구하게 된다.
New password: ********
Confirm new password: ********
[root@host mariadb] mysqladmin -u root -p reload
Enter password: ********
MySQL 라이브러리를 다른 어플리케이션에서 쉽게 접근할 수 있도록 공유 라이브러리에 추가한다.
[root@host mariadb] ldconfig
Installing Apache
[root@host src] wget http://mirror.apache-kr.org/apr/apr-1.5.2.tar.gz
[root@host src] wget http://mirror.apache-kr.org/apr/apr-iconv-1.2.1.tar.gz
[root@host src] wget http://mirror.apache-kr.org/apr/apr-util-1.5.4.tar.gz
[root@host src] tar zxvf apr-1.5.2.tar.gz
[root@host src] tar zxvf apr-iconv-1.2.1.tar.gz
[root@host src] tar zxvf apr-util-1.5.4.tar.gz
[root@host apr-1.5.2] ./configure --prefix=/apm/server/apache/apr
[root@host apr-1.5.2] make; make install
[root@host apr-iconv-1.2.1] ./configure \
--prefix=/apm/server/apache/apr-iconv-1.2.1 \
--with-apr=/apm/server/apache/apr/bin/apr-1-config
[root@host apr-iconv-1.2.1] make; make install
[root@host apr-util-1.5.4] ./configure \
--prefix=/apm/server/apache/apr-util-1.5.4 \
--with-apr=/apm/server/apache/apr/bin/apr-1-config \
--with-apr-iconv=/apm/server/apache/apr-iconv-1.2.1/apriconv
[root@host apr-util-1.5.4] make; make install
[root@host apr-util-1.5.4] cd /usr/src
[root@host src] wget http://mirror.apache-kr.org/httpd/httpd-2.4.12.tar.gz
[root@host src] tar zxvf httpd-2.4.12.tar.gz
[root@host src] cd httpd-2.4.12
[root@host httpd-2.4.12] ./configure \
--prefix=/apm/server/apache/httpd \
--sysconfdir=/apm/server/conf \
--with-apr=/apm/server/apache/apr/bin/apr-1-config \
--with-apr-iconv=/apm/server/apache/apr-iconv-1.2.1/apriconv \
--with-apr-util=/apm/server/apache/apr-util-1.5.4/bin/apu-1-config
[root@host httpd-2.4.12] make; make install
[root@host httpd-2.4.12] cd /apm/server/conf
[root@host conf] vi httpd.conf
ServerRoot "/apm/server/apache/httpd" Listen 80 # 사용할 모듈의 주석을 제거하여 활성화한다 LoadModule slotmem_shm_module modules/mod_slotmem_shm.so LoadModule dav_module modules/mod_dav.so LoadModule vhost_alias_module modules/mod_vhost_alias.so LoadModule negotiation_module modules/mod_negotiation.so LoadModule rewrite_module modules/mod_rewrite.so ... </IfModule> # 관리자 이메일 ServerAdmin admin@my.domain # 서버 이름 #ServerName www.my.domain:80 ServerName 127.0.0.1 # 루트 디렉토리 <Directory /> AllowOverride none Require all denied </Directory> # 도큐먼트 루트 디렉토리 DocumentRoot "/apm/apps/docs" <Directory "/apm/apps/docs"> Options FollowSymLinks AllowOverride All Require all granted </Directory> # 폴더로 접근할 때 실행하는 인덱스 파일 설정 <IfModule dir_module> DirectoryIndex index.html index.htm index.php index.php3 </IfModule> # 개발 환경 설정 참조 <Files ".ht*"> Require all denied </Files> # 설정 파일 import # Server-pool management (MPM specific) Include /apm/server/conf/extra/httpd-mpm.conf # Language settings Include /apm/server/conf/extra/httpd-languages.conf
[root@host conf] vi extra/httpd-mpm.conf
PidFile "/apm/server/apache/httpd/logs/httpd.pid"
DefaultLanguage ko
SELINUX=disabled
#프로토콜명으로 허용시 <service name="ssh"/> #포트번호로 허용시 <port protocol="tcp" port="80"/>
#!/bin/sh # # Apache This starts and stops Apache. # # chkconfig: 35 20 80 # description: Apache Web Service # # Licensed to the Apache Software Foundation ...
[root@host ~] service apache start
[root@host ~] service apache stop
[root@host ~] chkconfig --add apache
[root@host ~] chkconfig --level 24 apache off
[Unit] Description=Apache Web Server. After=network.target [Service] Type=simple ExecStart=/apm/server/apache/httpd/bin/httpd $OPTIONS -DFOREGROUND ExecStop=/apm/server/apache/httpd/bin/httpd $OPTIONS -k graceful-stop ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
[root@host ~] systemctl stop apache.service
[root@host ~] systemctl status apache.service
[root@host ~] systemctl enable apache.service
[root@host ~] systemctl disable apache.service
Step 12 >> Apache 테스트
실제 브라우저를 이용하여 확인
[root@host ~] chmod 755 /apm/apps/docs/index.html
[root@host ~] ldconfig
Installing PHP
[root@host ~] yum install libjpeg-turbo-devel
[root@host ~] yum install libpng-devel
[root@host ~] yum install freetype-devel
[root@host ~] yum install zlib
[root@host ~] yum install gd
또는
- MySQL 라이브러리 참조
[root@host src] wget http://kr1.php.net/distributions/php-5.6.10.tar.gz
[root@host src] tar zxvf php-5.6.10.tar.gz
[root@host src] cd php-5.6.10
[root@host php-5.6.10] ./configure \
--prefix=/apm/server/php \
--with-apxs2=/apm/server/apache/httpd/bin/apxs \
--with-config-file-path=/apm/server/conf \
--with-freetype-dir \
--with-gd \
--with-jpeg-dir \
--with-mysql=mysqlnd \
--with-mysql-sock=/apm/server/mariadb/mysql.sock \
--with-mysqli=mysqlnd \
--with-png-dir \
--with-zlib-dir=/usr \
--enable-mbstring \
[root@host php-5.6.10] make; make install
[root@host php-5.6.10] vi /apm/server/conf/php.ini
engine = On short_open_tag = On asp_tags = On memory_limit = 1024M error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT display_errors = Off display_startup_errors = Off post_max_size = 1023M default_charset = "UTF-8" file_uploads = On upload_tmp_dir = /tmp upload_max_filesize = 1022M max_file_uploads = 20 date.timezone = "Asia/Seoul"
# PHP 모듈이 정상적으로 추가되었는지 확인 LoadModule php5_module modules/libphp5.so <IfModule mime_module> ... 중략 ... AddType application/x-httpd-php .php .html AddType application/x-httpd-php-source .phps </IfModule>
[root@host php-5.6.10] ln -s /apm/server/php/bin/php /bin/php
[root@host php-5.6.10] ln -s /apm/server/php/bin/php-config /usr/local/bin/php-config
[root@host php-5.6.10] ln -s /apm/server/php/bin/phpize /usr/local/bin/phpize
[root@host php-5.6.10] echo "<?php phpinfo() ?>" > /apm/apps/docs/phpinfo.php