Apache + PHP + Mysql(MariaDB)를 설치하기 위한 메뉴얼을 정리해봤다. APM이 갖춰진 호스팅을 사용하는 것은 간단하고 쉽지만 때로는 원하는 기능 구현을 위해서 서버에 직접 해당 서비스들을 설치하고 구축해야 할 필요도 있다. 여기서는 CentOS에서 Apache, PHP7, MariaDB를 기준으로 안내한다.

서버 설치

CentOS 7.x64bit 버전을 선택하여 설치를 진행했다. OS 설치는 따로 설명하지 않는다.

설치 확인 및 설치

RPM또는 yum으로 필요한 라이브러리가 설치되어 있는지 확인 및 설치한다.

rpm -qa libjpeg* libpng* freetype* gd-* gcc gcc-c++ gdbm-devel libtermcap-devel
yum install libjpeg* libpng* freetype* gd-* gcc gcc-c++ gdbm-devel libtermcap-devel

Apache 설치

간단하게 아래처럼 Apache를 설치할 수 있다.

yum install httpd

MariaDB 설치

10버전의 MariaDB를 설치하기 위해서는 repo 설정을 먼저 진행해야 한다.

repo 설정

먼저 MariaDB.repo 라는 파일을 만들고 아래처럼 내용을 입력하자.

vi /etc/yum.repos.d/MariaDB.repo
# MariaDB 10.4 CentOS repository list - created 2020-06-05 23:35 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

아래 링크에서 repo 설정에 대한 더 자세한 내용을 확인할 수 있다.

https://downloads.mariadb.org/mariadb/repositories/#distro=CentOS&distro_release=centos7-amd64–centos7&mirror=nucleus&version=10.4

MariaDB 설치

이제 아래처럼 yum을 이용해서 MariaDB를 설치할 수 있다.

yum install MariaDB-server MariaDB-client

PHP7 설치

저장소 추가

PHP7을 설치하기 위해서 먼저 아래와 같이 저장소를 추가해준다.

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

설치

yum install php70w

라이브러리 설치

PHP 개발시 많이 사용하는 라이브러리는 아래 명령으로 설치할 수 있다. 필요에 따라 선택해서 설치할 수도 있다.

yum install php70w-mysql php70w-pdo php70w-pgsql php70w-odbc php70w-mbstring php70w-mcrypt php70w-gd
yum install php70w-pear php70w-pdo_dblib php70w-pecl-imagick php70w-pecl-imagick-devel php70w-xml php70w-xmlrpc

설치 확인

PHP 라이브러리 설치 가능한 리스트 확인

yum search php70w

Apache 버전 확인

설치된 Apache 버전을 확인할 수 있다.

httpd -v

PHP 버전 확인

설치된 PHP 버전을 확인 할 수 있다.

php -v

MariaDB 버전 확인

설치된 MariaDB 버전을 확인 할 수 있다.

mysql -V

설정

Apache config

httpd.conf 파일 중 보통 많이 하는 수정은 아래와 같다.

vi /etc/httpd/conf/httpd.conf
161 # DirectoryIndex: sets the file that Apache will serve if a directory
162 # is requested.
163 #
164 <IfModule dir_module>
165     DirectoryIndex index.html index.htm index.php
166 </IfModule>
270 # AddType allows you to add to or override the MIME configuration
271 # file specified in TypesConfig for specific file types.
272 #
273 #AddType application/x-gzip .tgz
274 AddType application/x-httpd-php .php .html .htm .inc
275 AddType application/x-httpd-php-source .phps

실행 권한이 변경이 필요한 경우 아래 내용을 수정한다.

62 # User/Group: The name (or #number) of the user/group to run httpd as.
63 # It is usually good practice to create a dedicated user and group for
64 # running httpd, as with most system services.
65 #
66 User nobody
67 Group nobody

도메인 또는 해당서버 IP 입력 추가

93 # If your host doesn't have a registered DNS name, enter its IP address here.
94 #
95 #ServerName www.example.com:80
96 ServerName 111.222.333.333:80

Apache VirtualHost

<VirtualHost *:80>
        DocumentRoot /data/www/xxx
        ServerName 111.222.333.444
        ServerName yourdomain

        <Directory />
                AllowOverride All
                Require all granted
        </Directory>
</VirtualHost>

Apache 시작

systemctl start httpd

Apache 부팅 후 자동시작

systemctl enable httpd

iptables config

웹 서버 운영을 위한 기본적인 방화벽 설정은 아래와 같다.

vi /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-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 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
service iptables restart

설정확인

iptables -nL

MariaDB 시작

service mariadb restart

Troubleshooting

세션 관련 오류

사이트 구동 후 아래와 같이 세션 관련 오류가 발생할 수 있다.

[Sat Jun 06 10:16:55.646477 2020] [:error] [pid 19618] [client 14.32.173.65:61646] PHP Warning:  session_start(): open(/var/lib/php/session/sess_39sdpli8uacpeh59qs3ojue7v6, O_RDWR) failed: Permission denied (13) in ...
[Sat Jun 06 10:17:25.433511 2020] [:error] [pid 19624] [client 14.32.173.65:61652] PHP Warning:  session_start(): open(/var/lib/php/session/sess_39sdpli8uacpeh59qs3ojue7v6, O_RDWR) failed: Permission denied (13) in ...

이때는 세션 폴더의 권한 문제로 php.ini에 설정된 세션 폴더에 따라 다를 수 있지만 기본 폴더로 설정된 경우라면 아래처럼 폰더 권한은 변경하여 해결 할 수 있다.

chmod 755 /var/lib/php/session

selinux 관련 오류

아래처럼 selinux와 연관된 권한 오류가 발생하는 경우 chcon를 이용해 보안 context를 변경하여 해결 할 수 있다.

[Sat Jun 06 09:26:51.426199 2020] [core:error] [pid 19019] (13)Permission denied: [client 14.32.173.65:59464] AH00035: access to /index.php denied (filesystem path '/data/www/xxx/index.php') because search permissions are missing on a component of the path
[Sat Jun 06 09:26:51.763097 2020] [core:error] [pid 19019] (13)Permission denied: [client 14.32.173.65:59464] AH00035: access to /index.php denied (filesystem path '/data/www/xxx/index.php') because search permissions are missing on a component of the path
[Sat Jun 06 09:26:51.930704 2020] [core:error] [pid 19019] (13)Permission denied: [client 14.32.173.65:59464] AH00035: access to /index.php denied (filesystem path '/data/www/xxx/index.php') because search permissions are missing on a component of the path
chcon -R -h -t httpd_sys_content_t [PATH]

selinux 해제

특정 서비스에 문제가 있을 경우 아래 명령으로 Permissive mode 로 전환하여 문제 해결 후 Enforce mode 로 전환하는 것이 좋다.

setenforce 0

PHP short_open_tag 허용

<?php 대신 <? 을 쓰고 싶다면 아래와 같이 php.ini를 수정하자.

short_open_tag = On