본문 바로가기

old

LAMP 구축하기 (CentOS 6.5 / MySQL5.6.17 / Apache 2.4.9 / PHP 5.5.12)

CentOS 6.5 (32bit, minimal)

MySQL 5.6.17

Apache 2.4.9

PHP 5.5.12



  • CentOS 6.5 설치

    • 설치
설치 관련된 설명은 구글링하면 자세하게 잘 나온다. 나는 centos 홈페이지에서 netinstall버전 파일을 받고, iso2usb라는 프로그램을 사용해 usb로 구워서 설치했다. 설치 모드는 minimal로 진행했다.
    • 업뎃
>yum update
    • 기본유틸 설치
>yum install man rdate wget vsftpd
    • 시스템 시간 설정
// 시간을 동기화하고 CMOS 타임까지 수정한다
>rdate -s time.bora.net && clock -w

// 하루에 한 번씩 자정에 시간동기화 작업 등록하기
>crontab -e

// vi편집기로 들어가진다. 다음을 입력하고 :qw로 빠져나온다. vi편집기의 명령어, 단축키는 숙지해두는게 좋다.
00 00 * * * rdate -s time.bora.net && clock -w
    • vsftpd 설정
>vi /etc/vsftpd/vsftpd.conf

/**
 * 옵션값을 편하게 찾으려면 vi편집기의 단어검색 / 를 사용한다. ex) /keyword
 * 없는 옵션은 추가하면 된다.
 **/

// 익명 접속 방지
anonymous_enable=NO

// 쓰기 허가
write_enable=YES

// 파일 업로드 후 파일권한 자동설정
local_umask=022

// ftp 접속시 출력 메시지. 지정하지 않으면 버전정보가 노출되므로 따로 설정한다.
ftpd_banner=Welcome

// 접속자가 자신의 홈 디렉토리보다 상위로 접근하는 것을 방지
// chroot_list_enable과 같이 사용하게 되면 반대로 작용하게 되므로 주의한다.
// chroot_list_enable은 접근 방지를 특정 사용자에게만 적용하는 기능이다.
chroot_local_user=YES

// 특정 사용자의 접속을 거부
// ftpuser파일에 등록된 사용자는 접속시 암호까지 입력받고 거부하는 형태지만
// user_list파일에 등록된 사용자는 암호조차 물어보지 않고 거부한다.

// 나는 ftpuser와 user_list에 각각 www와 mysql을 추가했다.

// 시발 말을 뭐이리 꼬아서 써놨어.... 삼십분을 빙빙돌았네...
userlist_enable=YES
userlist_deny=YES

// ftp 패시브모드 허가
pasv_enable=YES
pasv_min_port=51234
pasv_max_port=51244

// 저장 후 나온다. 처음 설치한 vsftpd는 부팅 시 자동으로 실행되지 않는다.
// 자동실행을 등록한다.
chkconfig vsftpd on

// vsftpd를 실행한다. 만약 실행중이라면 start 대신 restart 입력
service vsftpd start
    • iptables 설정
>vi /etc/sysconfig/iptables

/**
 * 각종 포트의 제어를 여기서 한다. 웹서비스에 필요한 기본 포트를 열어준다.
**/

// 다음을 COMMIT 위로 적당한 곳에 입력한다.
-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 51234:51244 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

// 저장하고 나와서 iptables를 재시작해준다.
>service iptables restart
    • 웹서비스 계정 생성하기
// 계정 생성
>useradd 계정명
>passwd 계정명

// 홈 디렉토리 설정
>mkdir /home/계정명/public_html
>chmod -R 755 /home/계정명
>chown -R  계정명:계정명 /home/계정명

// 이제 원격에서 방금 생성한 계정으로 ftp, ssh에 접속해보자.
// 530에러가 뜬다면 vsftpd의 ftpusers, user_list에 계정이 들어가있는지 확인한다.
// 500에러가 뜬다면 selinux가 관련된 확률이 높으므로 selinux를 종료하는 방법을 검색한다.
// 그 외 다른 에러들도 에러코드로 구글링하면 많은 자료가 나온다


  • APM 설치

    • 설치파일 내려받기
// /usr/local/src로 이동해서 설치파일을 내려받고 압축을 해제한다.
>cd /usr/local/src

>wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.17.tar.gz
>tar zxvf mysql-5.6.17.tar.gz

>wget http://mirror.apache-kr.org/httpd/httpd-2.4.9.tar.gz
>tar zxvf httpd-2.4.9.tar.gz

>wget http://kr1.php.net/distributions/php-5.5.12.tar.gz
>tar zxvf php-5.5.12.tar.gz
    • MySQL 5.6.17 설치
/**
 * 컴파일 설치 시 제일 짜증나고 헷갈리고 초보자에겐 너무나도 높은 장벽이 되는것이 바로 컴파일 옵션이다. 
 * 구글링을 하면 정보의 바다속에서 몇날 몇일을 헤매게 된다. 네이버에선 몇 개 나오지도 않는다.
 * 다음은 mysql에서 제공하는 설치 매뉴얼의 링크다.
 * 옵션들의 종류와 기본값 등을 안내하고 있으므로 많은 참고가 될것이다.
 * http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html#cmake-installation-layout-options
 **/

// MySQL을 컴파일하기 위해 필요한 툴이 몇 가지 있다. 다음은 매뉴얼에서 언급하는 것들이다.
------------------------------

To install MySQL from source, your system must have the following tools, regardless of installation method:

  • CMake, which is used as the build framework on all platforms. CMake can be downloaded fromhttp://www.cmake.org.

  • A good make program. Although some platforms come with their own make implementations, it is highly recommended that you use GNU make 3.75 or newer. It may already be available on your system as gmake. GNUmake is available from http://www.gnu.org/software/make/.

  • A working ANSI C++ compiler. GCC 4.2.1 or later, Sun Studio 12 or later, Visual Studio 2010 or later, and many current vendor-supplied compilers are known to work.

  • Perl is needed if you intend to run test scripts. Most Unix-like systems include Perl. On Windows, you can use a version such as ActiveState Perl.

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


// 언급된 툴을 설치한다.

>yum install cmake make gcc-c++ perl


// 설치 도중에 필요한 라이브러리를 설치한다.

>yum install ncurses-devel bison


// 옵션과 함께 설치 준비를 한다. 나름 고민한 최소한의 옵션들이다.

>cmake -DDEFAULT_CHARSET=utf8 \

>-DDEFAULT_COLLATION=utf8_general_ci \

>-DMYSQL_DATADIR=/usr/local/mysql/data \

>-DWITH_INNOBASE_STORAGE_ENGINE=1 \

>-DENABLED_LOCAL_INFILE=1


/**

 * 설치 옵션에 따라 추가 라이브러리가 요구될 수 있고, 그런 경우 오류가 발생한다. 구글링으로 

 * 해당 라이브러리를 추가 설치하면 된다. 다만 다시 설치를 시도하려면 실패했던 소스트리의 캐시를

 * 삭제해야 한다. 설치파일 디렉토리에서 다음을 수행한다.

 *

 *     make clean

 *     rm CMakeCache.txt

 *

 **/


// 컴파일

>make && make install


// MySQL 전용 그룹과 계정을 생성한다.

>groupadd mysql

>useradd -r -g mysql mysql


// MySQL이 설치된 디렉토리의 소유권과 소유그룹을 방금 만든 계정과 그룹으로 변경한다.

// 설치된 경로는 기본값에 따라 /usr/local/mysql 이다.

>chown -R mysql:mysql /usr/local/mysql


// 설치된 디렉토리로 이동해서 기본 DB를 생성한다.

>cd /usr/local/mysql

>./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql -->datadir=/usr/local/mysql/data


// mysql 5.6.x 버전대는 기본 설정파일이 제공되지 않아 사용자가 직접 작성해야 한다.

// 매우 짜증나는 일이다... my.cnf 파일을 수정한다.

>vi /usr/local/mysql/my.cnf

....

[client]

socket=/tmp/mysql.sock


[mysqld]

innodb_buffer_pool_size=128M

basedir=/usr/local/mysql

datadir=/usr/local/mysql/data

socket=/tmp/mysql.sock

sort_buffer_size=2M

read_rnd_buffer_size=64M

init_connect=SET NAMES utf8

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

...


// 설정파일을 복사한다.

>cp /usr/local/mysql/my.cnf /etc/my.cnf


// 실행파일을 복사한다.

>cp support-files/mysql.server /etc/init.d/mysqld


// 간편하게 실행하기 위해 설치된 경로를 시스템 경로에 추가해준다

>vi ~/.bash_profile

...

PATH=$PATH:$HOME/bin   -> 이 라인에 다음과 같이 mysql bin 디렉토리 경로를 추가한다

PATH=$PATH:$HOME/bin:/usr/local/mysql/bin

...


// 저장하고 빠져나와서 수정사항을 시스템에 적용시킨다.

>source ~/.bash_profile


// 부팅 시 자동으로 시작되도록 설정한다.

chkconfig mysqld on


// 기초적인 보안 세팅을 한다.

mysql_secure_installation


/**

 * root암호를 변경할지, 익명 계정을 삭제할지, test db를 삭제할지 등등을 물어본다.

 * 필요한 선택지를 따져 y 혹은 n을 입력해서 진행하면 되겠다.

 **/


// mysql에 접속하고, 웹서비스에서 사용할 db와 계정을 생성한다.

create database 계정명

grant all privileges on 계정명.* to 계정명@localhost identified by '비밀번호' with grant option;

flush privileges;


// 드디어 mysql 설치와 세팅이 끝났다.

    • Apache 2.4.9 설치
// 설치파일 디렉토리로 이동한다.
cd /usr/local/src/httpd-2.4.9

// 매뉴얼에서 요구하는 기본적인 것들은 다음과 같다.
-------------------------------
APR and APR-Util
Make sure you have APR and APR-Util already installed on your system. If you don't, or prefer to not use the system-provided versions, download the latest versions of both APR and APR-Util from Apache APR, unpack them into ./srclib/apr and ./srclib/apr-util (be sure the directory names do not have version numbers; for example, the APR distribution must be under ./srclib/apr/) and use ./configure's --with-included-apr option. On some platforms, you may have to install the corresponding -dev packages to allow httpd to build against your installed copy of APR and APR-Util.
Perl-Compatible Regular Expressions Library (PCRE)
This library is required but not longer bundled with httpd. Download the source code fromhttp://www.pcre.org, or install a Port or Package. If your build system can't find the pcre-config script installed by the PCRE build, point to it using the --with-pcre parameter. On some platforms, you may have to install the corresponding -dev package to allow httpd to build against your installed copy of PCRE.
Disk Space
Make sure you have at least 50 MB of temporary free disk space available. After installation the server occupies approximately 10 MB of disk space. The actual disk space requirements will vary considerably based on your chosen configuration options, any third-party modules, and, of course, the size of the web site or sites that you have on the server.
ANSI-C Compiler and Build System
Make sure you have an ANSI-C compiler installed. The GNU C compiler (GCC) from the Free Software Foundation (FSF) is recommended. If you don't have GCC then at least make sure your vendor's compiler is ANSI compliant. In addition, your PATH must contain basic build tools such as make.
Accurate time keeping
Elements of the HTTP protocol are expressed as the time of day. So, it's time to investigate setting some time synchronization facility on your system. Usually the ntpdate or xntpdprograms are used for this purpose which are based on the Network Time Protocol (NTP). See the NTP homepage for more details about NTP software and public time servers.
Perl 5 [OPTIONAL]
For some of the support scripts like apxs or dbmmanage (which are written in Perl) the Perl 5 interpreter is required (versions 5.003 or newer are sufficient). If you have multiple Perl interpreters (for example, a systemwide install of Perl 4, and your own install of Perl 5), you are advised to use the --with-perl option (see below) to make sure the correct one is used byconfigure. If no Perl 5 interpreter is found by the configure script, you will not be able to use the affected support scripts. Of course, you will still be able to build and use Apache httpd.
-------------------------------

/**
 * Apache 또한 다양한 옵션과 툴, 모듈에 따른 패키지 등이 필요하다.
 * 컴파일러 gcc와, Perl 언어로 작성된 지원 스크립트를 위한 인터프리터 정도가 주의해야 할 점이 되겠다.
 * gcc와 perl은 위에서 MySQL을 설치하면서 이미 설치했다. 그 외는 옵션값에 따라 추가되겠지...ㅅㅂ..
 **/

// apr, apr-util, pcre를 설치한다. apr과 apr-util은 apache를 컴파일하면서 같이 설치시키기 위해
// httpd-2.4.9/srclib 디렉토리에 각각 이름으로 설치파일을 이동시킨다. pcre는 따로 컴파일한다.
cd /usr/local/src
wget http://apache.mirror.cdnetworks.com/apr/apr-1.5.1.tar.gz
wget http://apache.mirror.cdnetworks.com/apr/apr-util-1.5.3.tar.gz (15.01.08 버전업으로 인해 링크 수정)
wget http://apache.mirror.cdnetworks.com/apr/apr-util-1.5.4.tar.gz

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.35.tar.gz (15.01.08 버전업으로 인해 링크 수정)

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


>tar zxvf apr-1.5.1.tar.gz
>rm -rf httpd-2.4.9/srclib/apr/*
>mv apr-1.5.1 httpd-2.4.9/srclib/apr
>tar zxvf apr-util-1.5.3.tar.gz
>rm -rf httpd-2.4.9/srclib/apr-util/*
>mv apr-util-1.5.3 httpd-2.4.9/srclib/apr-util
>tar zxvf pcre-8.35.tar.gz
>cd pcre-8.35
>./configure --enable-static=yes --enable-utf8=yes --enable-unicode-properties=yes
>make && make install

/**
 * --enable-static 옵션은 뭔지 모르겠다. 레퍼런스 문서를 봐도 나오질 않는다...
 **/

// 필요한 라이브러리를 설치한다
>yum install openssl-devel zlib-devel

//소스트리 configure 옵션. 옵션의 내용은 레퍼런스를 참고하길 바람. 나름 고민한 최소한의 옵션들이다.
>./configure --prefix=/usr/local/apache \
>--enable-rewrite \
>--enable-proxy \
>--enable-ssl \
>--enable-deflate \
>--enable-expires \
>--enable-headers \
>--enable-vhost-alias \
>--enable-mods-shared=all \
>--with-mpm=prefork \
>--with-included-apr \
>--with-included-apr-util

// 실행파일 복사
cp /usr/local/apache/bin/apachectl /etc/init.d/httpd

/**
 * 부팅 시 자동실행은 나중에 ssl 구축 시 문제가 발생할 수 있다. 예전에 보안서버를 구축할 때 일이 있었는데, 
 * 비번을 입력해야 하는데 그 과정이 건너뛰어지면서 정상적으로 실행이 되지 않았었다. 지금도 그런지는 모르겠다.
 **/

// service 등록을 위해 /etc/init.d/httpd 파일에 다음 라인을 추가한다.
# chkconfig: - 65 35

/**
 * mysqld보다 나중에 시작하고, 먼저 종료해야 되므로 우선순위를 65와 35로 줬다. mysqld의 경우
 * # chconfig: 2345 64 36 로 지정되어 있다. chkconfig의 자세한 내용은 구글링 참조
 **/

// service 등록. 이제 service httpd start/stop으로 켜고 끌 수 있다.
chkconfig --add httpd

// httpd.conf 수정
vi /usr/local/apache/conf/httpd.conf
...
#LoadModule expires_module modules/mode_expires.so  -> 다음 주석들을 해제한다.
#LoadModule deflate_module modules/mod_deflate.so
#LoadModule headers_module modules/mod_headers.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule ssl_module modules/mod_ssl.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
#LoadModule rewrite_module modules/mod_rewrite.so
#LoadModule userdir_module modules/mod_rewrite.so
#LoadModule slotmem_shm_module /modules/mod_slotmem_shm.so
#Include conf/extra/httpd-mpm.conf
#Include conf/extra/httpd-userdir.conf
#Include conf/extra/httpd-vhosts.conf
....
ServerName localhost:80 -> localhost를 서버의 IP로 변경한다
...
AddType application/x-httpd-php .php -> <IfModule mime_module> ~ </IfModule> 사이에 추가
...
DirectoryIndex index.html  -> 오른쪽으로 공백 한칸 두고 index.php를 연이어 붙여준다
...
<Directory "/home/*/public_html">     -> 파일 맨 마지막에 추가한다. Options에 Indexes가 있다면 
    Options FollowSymLinks                     웹서비스로 접속할 때 DirectoryIndex에 등록된 파일이
    AllowOverride None                            없는 경로로 접속시 해당 경로에 존재하는 파일의 전체
    Order allow,deny                                목록이 출력되게 된다. 당연히 보안상 좋지 않다.
    Allow from all                                     AllowOverride, Order, Allow 등은 구글링 참조
</Directory>
...

// httpd-vhosts.conf 파일 수정. 모든 라인을 주석처리하고 다음을 추가한다.
vi /usr/local/apache/conf/extra/vhosts.conf
...
<VirtualHost *:80>
ServerAdmin 당신의메일주소
DocumentRoot "/home/처음에 생성한 리눅스 계정명/public_html"
ServerName 서버IP
ErrorLog "logs/test-error_log"
CustomLog "logs/test-access_log" common
</VirtualHost>
...

/**
 * 나중에 웹서비스를 다수 운영할 때, 이 파일을 활용하면 여러개의 도메인을 하나의 서버에 붙여서 활용할
 * 수 있다. <VirtualHost *:80> ~ </VirtualHost>를 여러 개를 복붙하고, 각 서비스에 해당하는 계정명과
 * 홈디렉토리, 로그파일을 지정해서 다수의 서비스를 편리하게 관리할 수 있다. 자세한건 virtual host 구글링.
 **/

// 아파치 설치 끝. 다음을 수행해서 결과가 나오는지 확인해본다.
curl http://localhost

-> <html><body><h1>It works!</h1></body></html>
    • PHP 설치
// 설치파일 디렉토리로 이동한다.
cd /usr/local/src/php-5.5.12

// 필요한 라이브러리 설치
yum install libxml2-devel bzip2-devel curl-devel libjpeg-devel libpng-devel freetype-devel libicu-devel openldap-devel

// mcrypt의 경우 yum 레포지터리가 등록이 되어있지 않았다. 다음과 같이 추가하고 yum 설치를 진행한다.
wget http://ftp.neowiz.com/fedora-epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
yum install libmcrypt-devel

// configure 시작.
./configure --prefix=/usr/local/php \
--with-libdir=lib \
--with-config-file-path=/usr/local/apache/conf \
--with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-pear=/usr/share/php \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir \
--with-curl \
--with-iconv-dir \
--with-mcrypt \
--with-gd \
--with-openssl \
--with-mhash \
--with-ldap=/usr/lib/evolution-openldap \   -> yum으로 설치하면 경로가 이렇다..거참...
--with-ldap-sasl \
--with-xmlrpc \
--with-bz2 \
--with-pdo-mysql \
--with-gettext \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-fpm \
--enable-mbstring \
--enable-gd-native-ttf \
--enable-pcntl \
--enable-sockets \
--enable-zip \
--enable-soap \
--enable-static \
--enable-intl \
--enable-exif \
--enable-opcache=no \  -> 내가 설치하는 PC에서는 오류가 발생해서 옵션을 껐다.

/**
 * php 소스트리 생성 중 오류는 아니고 경고가 발생했다.
 * 내 경우 apache를 컴파일 할 때 mpm을 prefork로 지정했었는데, 만약 내가 그걸  threaded mpm으로
 * 변경한다면 --enable-maintainer-zts 옵션을 넣으란다. 이 문서를 작성하면서 수많은 포스트들을 봤는데,
 * 종종 --enable-maintainer-zts 옵션값이 포함된 configure 명령을 봐서 적어둔다.
 **/

// 컴파일을 시작한다.
make && make install

/**
 * /usr/local/src/php-5.5.12/sapi/cli/php: error while loading shared libraries: libmysqlclient.so.18:
 * cannot open shared object file: No such file or directory 오류가 발생했었다.
 * 경로만 잡아주면 되니 당황하지 말고 우선 libmysqlclient.so.18 파일이 어디 있는지 검색한다.
 * 내 경우 /usr/local/mysql/lib 디렉토리에 존재했다. 아마 이 과정을 따라하고 있는 사람들도 같을 듯 싶다.
 * vi편집기로 /etc/ld.so.conf 파일을 열고, 방금 검색한 경로 /usr/local/mysql/lib 를 마지막 다음 라인에 추가.
 * 저장하고 나온 후, ldconfig를 실행해서 변경사항을 적용하면 된다. 다시 설치를 시도하기 전에 make clean을
 * 잊지 말고 꼭 수행해주자.
 *
 * 아.. 그리고 중간에 무슨 에러가 또 있었는데, 구글링을 열심히 해도 자료가 없어서 고민 끝에
 * 메모리 부족은 아닐까 싶어서 apache랑 mysql를 다 끄고 하니까 지나가버렸다. 서버 스펙이 딸리는 경우
 * 메모리도 고려해봐야 겠다.. 에러메시지를 확인하려고 다시 돌아가기는 너무 귀찮아서 그냥 적어두기만 한다.
 **/

// 설치파일 디렉토리에서 설정파일 php.ini를 복사해서 수정한다.
cp /usr/local/src/php-5.5.12/php.ini-production /usr/local/apache/conf/php.ini
vi /usr/local/apache/conf/php.ini
....
post_max_size = 10M         -> post로 폼값을 전송할 때의 맥시멈값
file_uploads = On               -> 파일 업로드의 허용 여부
upload_max_filesize = 10M  -> 파일 업로드의 맥시멈값
allow_url_fopen = Off          -> fopen()과 같은 파일함수에서 url로 파일을 읽어오는 것의 허용 여부
allow_url_include = Off        -> url로 외부 파일을 include/require로 불러오는 것의 허용 여부
short_open_tag = Off           -> <?php를 <?로 줄여주는 기능
...

// 5.5 버전대에서 register_globals는 지원하지 않는다. 즉 얄짤없이 $_GET['var'] 정석대로 써야된다.

// php까지 설치가 끝났다. 다음의 내용이 작성된 php파일을 업로드해서 테스트해보자.

// root 계정으로 올리면 소유권때문에 안될 수도 있으니, 맨 처음 리눅스를 설치하고 생성했던

// 서비스용 계정으로 ftp접속해서 업로드한다.

<?php phpinfo(); ?>