March 29, 2019

CentOS 6.X APM (Aapache, PHP, MySQL) 설치하기

동아리 내에서 APM 구축을 패키지 말고 컴파일로 과제 내주려고 했으나 관련 패키지가 충돌이 많이 나서 우분투 apt-get 패키지로 대처로 낸 적이 있었습니다. 이를 바탕으로 APM 구축 방법을 소개해 드리고, 데비안 기반의 우분투와 레드햇 기반의 CentOS와 설치 명령어가 다르니 주의하셔야 합니당.

LAPM는 Linux + Apahce + PHP + MySQL의 약자입니다.
물론 Apache 대신 Nginx을 사용할 수도 있지만, 이번 글에서는 Apache로 구현해보도록 하겠습니다.!!
대표적인 APM를 활용한 WordPress로 볼 수 있습니다.

자 그러면 구현하기에 앞서 Apache란 무엇일까요?

  • 오픈 소스 소프트웨어 그룹인 "아파치 소프트웨어 재단"에서 제작되었다.

  • Apache는 확장성이 좋다.

  • 정적인 페이지를 (데이터) 처리하는 Web Server다.

  • 리눅스에서는 Apache을 사용하고, Windows Server에서는 IIS를 사용한다.

설치 순서는 Apache(httpd) -> PHP -> MySQL 순서로 진행하겠습니다

띠용!!
본글은 CentOS 6.0 Server 기반으로 작성되어있습니다.

Release: 6.0
Apache: 2.2.15-69
PHP: 5.3.3-49
MySQL: 5.1.73-8





Package 확인

[rpm 패키지 조회]
[root@dongdonge ~] rpm -qa | grep httpd
[root@dongdonge ~] rpm -qa | grep mysql
[root@dongdonge ~] rpm -qa | grep php

CentOS에 설치된 패키지를 조회해본 결과 (APM이 설치되어 있지 않다.) Ubuntu에서는 Apache 프로세스가 apache2인 반면 CentOS에서는 httpd이니 혼동하면 안 된당!!

[Package list]
[root@dongdonge ~] yum list httpd
[root@dongdonge ~] yum list php
[root@dongdonge ~] yum list mysql-server

차례대로 패키지 리스트를 조회해본 결과 Apache(httpd)는 2.2.15 Version, PHP 5.3.3, MySQL 5.1.73 버전으로 조회되는 걸 볼 수 있다.

[root@dongdonge ~] yum search <패키지>

또는 해당 명령어를 사용하여 보다 구체적인 패키지를 검색할 수 있다.



Apache(httpd) install

[Apache install]
[root@dongdonge ~] yum install httpd

Apache(httpd)을 설치를 하면 부가적으로 "apr, apr-util, apr-util-Idap, httpd-tools, mailcap, openssl" 등... 여러가지 모듈이 함께 설치가 된다.
나중에 직접 컴파일하여 설치하면 알겠지만. Apache Web Server을 구동하기 위해 수많은 모듈을 수동으로 설치해야 작동이 된다.!! (이부분은 추후에 수동으로 APM 컴파일 하는 방법을 올리겠습니당)




PHP install

[PHP install]
[root@dongdonge ~] yum install php php-mbstring php-pdo php-xml php-mysql

단순하게 PHP를 구동한다면 "php"만 설치하면 되나 주로 많이 쓰이는 모듈이 많아 기본적으로 설치를 하게 되었습니다.

  • "PHP" => PHP Engine

  • "php-mbstring" => Multi Byte Encode (UTF-8, Unicode 등...)

  • "php-mysql" => PHP와 MySQL 연동 모듈

  • "php-pdo" => PHP와 DB 연동 모듈 "SQL Injection 공격에 대해 시큐어코딩이된 함수."

  • "php-xml" => XML관련 모듈 사용시




MySQL install

[MySQL install]
[root@dongdonge ~] yum install mysql mysql-server

CentOS에서는 MySQL 설치 후 Password 설정을 해야 한다.
우선 모든 패키지가 정상적으로 설치가 되었는지 확인 후 재부팅 후에도 자동으로 프로세스를 실행하기 위한 서비스 등록을 한 뒤 패스워드 재설정 하자.!




Process && 패키지 && Service 실행

[Port 확인]
[root@dongdonge ~] netstat -ntlp

Apache (80), MySQL (3306) 포트가 정상적으로 올라오지 않았다. 정상적으로 설치가 완료되었으니 Service 시작만 해주면 된다.

설치 여부는 아래의 명령어를 통하여 확인할 수 있다.

[root@dongdonge ~] rpm -qa | grep httpd
[root@dongdonge ~] rpm -qa | grep php
[root@dongdonge ~] rpm -qa | grep mysql




Service (Apache && MySQL) Start

# Apache (httpd) 서비스 시작 해주자.
[root@dongdonge ~] service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for dongdonge
httpd: Could not reliably determine the server s fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
                                                           

# MySQL 서비스 시작 해주자.
[root@dongdonge ~] service mysqld start
Initializing MySQL database:
WARNING: The host 'dongdonge' could not be looked up with resolveip.
This probably means that your libc libraries are not 100 % compatible
with this binary MySQL version. The MySQL daemon, mysqld, should work
normally with the exception that host name resolving will not work.
This means that you should use IP addresses instead of hostnames
when specifying MySQL privileges !
Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h dongdonge password 'new-password'

Alternatively you can run:
/usr/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd /usr ; /usr/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd /usr/mysql-test ; perl mysql-test-run.pl

Please report any problems with the /usr/bin/mysqlbug script!

                                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

서비스 시작을 하였으니 Process에 정상적으로 올라왔는지 확인해보자.!



Service 확인

[root@dongdonge ~] netstat -ntlp | grep httpd
tcp        0      0 :::80                       :::*                        LISTEN      1518/httpd

[root@dongdonge ~] netstat -ntlp | grep mysqld
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      1416/mysqld

위와 같이 정상적으로 프로세스가 올라오고 LISTEN 되어야 한다.




MySQL Password && 보안 설정

[root@dongdonge ~] mysql_secure_installation




NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
	

In order to log into MySQL to secure it, well need the current
password for the root user.  If you ve just installed MySQL, and
you haven t set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.


# 익명 계정 제거할지? (보안을 위해 삭제하자.)
Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

# 원격에서 'root' 계정 접속을 허용할지? (보안을 위해 거부하자.)
Disallow root login remotely? [Y/n] y
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

# 누구나 사용할 수 있는 'test' 데이터베이스 제거할지? (보안을 위해 제거하자.)
Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

# 설정값을 저장할지? (저장하자!)
Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...



All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

위의 출력값 처럼 [ OK ] 문구가 나오면 정상적으로 Service가 활성화된 것이다.
자 그럼 MySQL Password을 설정하자.!!

[MySQL Setting]

위 사진 처럼 진행하면 된다.



Apache (httpd) && MySQL Service 등록하기

부팅 시 Apache와 MySQL이 자동으로 실행되지 않는다. 자동으로 실행하기 위해 서비스 등록을 해주자.

[root@dongdonge ~] chkconfig httpd on
[root@dongdonge ~] chkconfig mysqld on




iptables 설정하기

CentOS에서는 Default로 iptables가 설정되어있다.
해당 룰 (규칙)에 등록되어 있지 않으면 Default로 차단된다.
즉, 현재 Apache가 설치되어 80번 Port로 Listen (대기)하고 있으나 방화벽 (iptables)에 의해 외부에서 접속을 차단하고 있다! 아래 예시를 한번 확인 해보자.

[iptables Default]

현재 iptables Default 설정으로 Web Server 접근시 위와 같이 방화벽 룰에서 차단이 된다.

자 그럼 방화벽 룰이 어떻게 설정되었는지 확인해보자.


[root@dongdonge ~] iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited


Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited


Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

"INPUT" 룰을 확인해 보면 80 PORT Apache (httpd)에 허용 룰이 없다. 해당 룰을 추가하여 외부에서 접속할 수 있도록 하자.


# 80 PORT 추가하기
[root@dongdonge ~] iptables -I INPUT -p tcp --dport 80 -j ACCEPT


# iptables 리스트 확인
[root@dongdonge ~] iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited

해당 명령어를 입력하여 80 Port Apache를 허용해주면, iptables 리스트 첫 번째로 http 허용 룰(규칙)이 추가되어 있다.

하지만 재부팅하면 다시 Default로 초기화 되므로 저장해야 한다.

# iptables 룰(규칙) 저장하기.
[root@dongdonge ~] /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]


# iptables 재시작하기.
[root@dongdonge ~] /etc/init.d/iptables restart
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]

룰 저장 후 iptables 재시작하자!!

[root@dongdonge ~] cat /etc/sysconfig/iptables

# Generated by iptables-save v1.4.7 on Tue Apr  2 01:03:11 2019
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [137:23132]
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Tue Apr  2 01:03:11 2019

참고로 iptables 룰에 대한 저장은 /etc/sysconfig/iptables에 저장되어 있다.




phpinfo page 접속 테스트하기

정상적으로 APM 설치후 방화벽 룰 까지 추가했다면 phpinfo() 함수를 출력하여 테스트 해보자.

[root@dongdonge ~] echo "<?php phpinfo(); ?>" > /var/www/html/testinfo.php

해당 명령어로 phpinfo() 페이지를 생성하고 접속해보자.!!

[phpinfo page]

위 사진처럼 페이지가 정상적으로 출력되면 된당.!!!

설치하는 동안 고생 많으셨습니당.