Apache
+ PHP
+ Mysql
(MariaDB
)를 설치하기 위한 메뉴얼을 정리해봤다. APM
이 갖춰진 호스팅을 사용하는 것은 간단하고 쉽지만 때로는 원하는 기능 구현을 위해서 서버에 직접 해당 서비스들을 설치하고 구축해야 할 필요도 있다. 여기서는 CentOS
에서 Apache
, PHP7
, Maria
DB를 기준으로 안내한다.
서버 설치
CentOS 7.x
의 64bit
버전을 선택하여 설치를 진행했다. 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
설정에 대한 더 자세한 내용을 확인할 수 있다.
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