[Server] 분산 환경에서의 Apache, PHP - MySQL 설치 및 설정 가이드

2024. 6. 19. 18:06·Linux
목차
  1. 개요
  2. Apache
  3. 아파치 다운로드
  4. 필수 패키지 다운로드 및 파일 이동
  5. Apache 컴파일
  6. Apache 시작
  7. Apache 아파치 에러 모음
  8. PHP
  9. PHP 다운로드
  10. PHP 컴파일
  11. php.ini (설정 파일) 설정 옵션 수정
  12. PHP 연동
  13. PHP 에러 모음
  14. PHP 에러 모음 참조 문서
  15. MYSQL 5.6
  16. MYSQL 기존 버전 삭제
  17. MYSQL 다운로드 및 설치
  18. MYSQL SQL 파일 Import/Export
  19. MYSQL 계정 액세스 권한 설정
  20. MYSQL 인터페이스 액세스 권한 설정
  21. 비고
  22. MYSQL ERROR Package
  23. 주의사항
728x90

개요

카페24 웹 호스팅에서 홈페이지를 다른 외부 업체에게 맡겨 운영하고 있었습니다. 사유가 생겨 홈페이지를 내부에서 운영하기로 했습니다. 하지만 카페24에서 동일하게 운영하려했지만 PHP 5.5.x 버전 지원이 종료되어 새로운 웹 호스팅 생성이 불가능했습니다.

기존 사용자들은 구 버전을 유지할 수 있었지만, 신규로는 지원하지 않았기 때문에 내부 시스템으로 이관하는 방법밖에 없었습니다. 이 과정에서 많은 시행착오를 겪었기에 조금이라도 다른분들이 도움이 될 수 있길 바라며 글로 남기기로 했습니다.

너무 상세한 내용은 작성하지 않겠습니다. ChatGPT가 잘 설명해주더라구요.
AWS 프리티어 2개의 계정을 생성하여 진행했습니다. 이 과정에서는 권한과 보안 등을 신경 쓰지 않았습니다. 상용 서비스로 옮길 때는 보안적인 부분도 모두 설정했지만, 이 글은 이관 테스트 시의 경험을 바탕으로 하므로 참고용으로 보시면 될 것 같습니다.

2Tier로 Apache-PHP(A서버) - DB(B서버) 구성으로 했습니다.
3Tier로 Nginx(A서버) - PHP(B서버) - DB(C서버)는 방법을 찾아보고 다시 올리겠습니다...!

 

@2024.06.27
성공했습니다. 이 글은 단일서버, WEB/WAS - DB구조로 운영중인 사람들이 참고하면 좋을 것같고,
아래 글은 WEB/WAS/DB 를 모두 나눠야 하는 분들이 참고하시면 될 것 같습니다.

2024.06.26 - [Etc] - 분산 환경에서의 Nginx, PHP, MySQL 설치 및 설정 가이드

 


 

Apache

아파치 다운로드

$ mkdir -p /appstore/webserver/util
$ cd /appstore/webserver/util
$ wget https://dlcdn.apache.org/httpd/httpd-2.4.59.tar.gz
$ tar zxvf httpd-2.4.59.tar.gz

 

필수 패키지 다운로드 및 파일 이동

아래 스크립트는 왠만하면 에러가 나지 않도록 하기 위해서 작성했다.
예를 들면 --with-included-apr옵션을 사용하는 것과 수동으로 패키지를 다운로드하여 srclib에 넣어두는것, 그리고 패키지의 devel을 다운로드하는 것들이 여러 환경에서 에러가 나지 않도록 하기 위해서 중복되는 작업이 있을 수 있으나 환경에 따라 참조가 안 되는 경우가 있어서 작성한 것이니 중복되더라도 하는 걸 권장하는데 이유는 여러 환경에서 동일하게 작업을 해도 에러가 나는 경우가 있다.

물론 난 삽질하는 김에 어떤 상황에서 에러가 발생하는지 그냥 다해봤다. 시간에 여유가 있다면 그 방법도 좋은 방법이다 ^_^
나는 필수패키지들을 아파치가 컴파일하면서 한번에 모두 같이 하는 방법으로 했기 때문에 다른 사람들이 올린 방법과 조금 다를 수 있다.

$ yum update
$ yum -y install gcc gcc-c++ apr-devel apr-util-devel pcre-devel openssl-devel expat-devel
$ mkdir -p /usr/local/util
$ cd /usr/local/util

# apr, apr-util, pcre 다운로드
$ wget http://apache.mirror.cdnetworks.com/apr/apr-1.7.4.tar.gz
$ wget http://apache.mirror.cdnetworks.com/apr/apr-util-1.6.3.tar.gz
# pcre는 홈페이지에서 다운로드 받아 sftp로 pcre파일을 서버로 이동하였습니다. (/home/ec2-user)
# 다운로드 경로: https://www.pcre.org/)
$ mv /home/ec2-user/pcre-8.45.tar.gz /usr/local/util

# 압축해제
$ tar zxvf apr-1.7.4.tar.gz
$ tar zxvf apr-util-1.6.3.tar.gz
$ tar zxvf pcre-8.45.tar.gz

# 아파치 컴파일 내 패키지 참조 경로로 파일 이동
$ mv /usr/local/util/apr-1.7.4 /appstore/webserver/util/httpd-2.4.59/srclib/apr
$ mv /usr/local/util/apr-util-1.6.3 /appstore/webserver/util/httpd-2.4.59/srclib/apr-util
$ mv /usr/local/util/pcre-8.45 /appstore/webserver/util/httpd-2.4.59/srclib/pcre

# 디렉토리 권한 일치화
$ chown -R 501:games /appstore/webserver/util/httpd-2.4.59/srclib/apr
$ chown -R 501:games /appstore/webserver/util/httpd-2.4.59/srclib/apr-util
$ chown -R 501:games /appstore/webserver/util/httpd-2.4.59/srclib/pcre

 

Apache 컴파일

make && make install 을 사용하는데 순차적으로 한 단계식 하는 걸 권장한다.
configure를 할 땐 에러가 안 나는데 make 할 때 에러가 발생하는 경우도 있기 때문이다.

$ cd /appstore/webserver/util/httpd-2.4.59
$ ./configure --prefix=/appstore/webserver/apache-test \
--enable-mods-shared=all --enable-so --enable-ssl --enable-module=ssl \
--with-ssl --with-included-apr
# make 후 에러가 발생하면 make clean 후 다시 make 하자.
$ make
$ make install

 

Apache 시작

여기서부터 홈페이지가 잇츠웍!_! 하고 뜰 것이다.

$ cd /appstore/webserver/apache-test/bin
$ ./apachectl start

# 웹브라우저에서 localhost 를 통해 접속해보자.

 

Apache 아파치 에러 모음

make[2]: * [htpasswd] 오류 1
make[2]: Leaving directory '/usr/local/httpd-2.2.2/support'
make[1]: * [all-recursive] 오류 1
make[1]: Leaving directory '/usr/local/httpd-2.2.2/support'
make: *** [all-recursive] 오류 1

여러 설명들을 다 보고 이것저것 하나씩 하면서 적용해 본 결과, 컴파일할 때 pcre를 파일을 시스템 라이브러리를 바라보고 있어서 발생하는 것으로 추측된다... 그리고 수동컴파일을 하면 이걸 해도 해결이 안 되는 경우가 있으니 위에 설명한방법대로 하는 걸 권장한다.

$ yum install pcre-devel

 

configure: error: pcre-config for libpcre not found. PCRE is required and available from pcre.org/

$ yum install pcre-devel

 

checking for OpenSSL version >= 0.9.8a... FAILED
configure: WARNING: OpenSSL version is too old
no
checking whether to enable mod_ssl... configure: error: mod_ssl has been requested but can not be built due to prerequisite failures

$ yum install openssl-devel

 


PHP

PHP 다운로드

$ mkdir -p /webstore/pub/util
$ cd /webstore/pub/util
$ wget https://www.php.net/distributions/php-5.5.38.tar.gz
$ tar zxvf php-5.5.38.tar.gz

 

PHP 컴파일

AWS에서 테스트를 한다면 Amazon Linux 2023 AMI 2023.4.20240611.0 x86_64 HVM kernel-6.1으로 하지 말아라.
Amazon Linux 2 Kernel 5.10 AMI 2.0.20240610.1 x86_64 HVM gp2 버전으로 하는 것을 권장한다.

2023 버전으로 한다면 호환성문제로 인해 설치 진행이 어려울수 있다. 차이점을 간단하게 요약한 내용을 아래에 적어두었다.
2023 버전으로 하고 있다면 인스턴스를 다시 생성해서 하는 걸 권장한다. 아마 패키지 오류 해결하는데 꽤나 골머리 아플 것이다...

$ cd /webstore/pub/util/php-5.5.38

# 이 패키지 다운로드를 하지 않으면 컴파일 중 에러를 볼 수있습니다.
$ yum -y install libxml2 libxml2-devel
$ yum -y install curl-devel
$ yum -y install libpng-devel
# AWS 에서 2023버전으로 하면 리포지토리 문제로 해결 안됨.
$ yum -y install libmcrypt-devel
$ yum -y install readline-devel

$ ./configure --prefix=/usr/local/php --with-apxs2=/appstore/webserver/apache-test/bin/apxs --with-config-file-path=/etc/php --with-config-file-scan-dir=/etc/php/conf.d --with-curl --with-openssl --with-zlib --with-gd --with-jpeg --with-png --with-mcrypt --with-readline --with-libxml --with-mysqli --with-pdo-mysql --with-mysql
# 에러 잘 확인할 것.
$ make
$ make install

Amazon Linux 2023과 Amazon Linux 2의 주요 차이점 요약

  1. 커널 버전: Amazon Linux 2023은 최신의 kernel-6.1을 사용하며, Amazon Linux 2는 비교적 안정된 kernel-5.10을 사용합니다.
  2. 최신 기술 및 기능: Amazon Linux 2023은 최신 기술과 기능을 지원하며, 최신 하드웨어와의 호환성이 높습니다. 반면, Amazon Linux 2는 검증된 안정성을 제공합니다.
  3. 업데이트 및 지원: Amazon Linux 2023은 최신 업데이트와 보안 패치를 더 자주 받을 가능성이 높습니다.
  4. 사용 사례: 최신 기능과 성능 최적화가 필요한 경우 Amazon Linux 2023을 선택하는 것이 좋으며, 안정성과 호환성이 중요한 경우 Amazon Linux 2를 선택하는 것이 좋습니다.

Amazon Linux 2023은 최신 기능과 성능 최적화를 원하는 사용자에게 적합하며, Amazon Linux 2는 안정성과 호환성을 중요시하는 사용자에게 적합하다. 선택은 주로 애플리케이션의 요구 사항과 환경에 따라 달라지니 자신이 맞는 걸 선택하라고 하지만 대부분 Linux 2에서도 안 되는 것은 거의 없을 거라 본다.

 

php.ini (설정 파일) 설정 옵션 수정

컴파일로 PHP를 설치하면 설정파일이 따로 생성되지 않는다. 다운로드한 PHP 디렉터리 안에 디폴트 파일이 존재하고 디폴트파일은 2가지로 나뉘며 개발환경과 운용환경을 구별되어 있다. 보통 관례적으로 사용하는 경로는 /etc/php.ini, /usr/local/lib/php.ini를 사용한다. 나는 후자의 경로로 옮겨 사용했다.

# 설정파일 파일 이동
$ cd /webstore/pub/util/php-5.5.38
$ cp /webstore/pub/util/php-5.5.38/php.ini-production /usr/local/lib/php.ini
$ vi /usr/local/lib/php.ini

# Off → On 으로 변경
short_open_tag = On

# 개발환경이라면 On, 운영은 Off (Off → On 으로 변경)
display_errors = On
display_startup_errors = On
  • Short_open_tag:
    php를 개발하면서 태그를 <?php가 아닌 <? 로 사용할 수 있도록 한다.
  • Display_errors:
    PHP스크립트 실행 중 발생하는 오류메시지를 브라우저에 출력할지 설정한다. 여기에 나오는 오류는 아파치랑 연결하면 아파치 로그에서도 오류메시지가 나오긴 한다.
  • Display_startup_error:
    PHP초기화 과정에서 발생하는 오류 메시지를 브라우저에 출력할지 다룬다.

그리고 Display 설정을 만약 사용하게 되면 오류가 발생해도 관련 없는 페이지라면 출력이 되어야 하는데 안 나오는 경우도 있다는 점을 참고하자. 만약 페이지가 안뜬다면 이거 풀고 아파치 재기동해보는것도 좋은생각인것같다.

 

PHP 연동

$ vi /appstore/webserver/apache-test/conf/httpd.conf

# LoadModule 리스트 아래 추가
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

# php.ini 설정 파일 경로 추가
PHPIniDir "/usr/local/lib/php.ini"

# 모듈 활성화 (주석이 해제되어 있어야 합니다)
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php5_module        modules/libphp5.so

# 내용 추가
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    # 여기 아래 추가하면됩니다.
    AddType application/x-httpd-php .html .php5 .php
    AddType application/x-httpd-php-source .phps

# Virtual hosts 주석 해제
Include conf/extra/httpd-vhosts.conf
# 기본 도큐먼트루트 경로를 생성한다.
$ mkdir -p /webstore/pub/TEST/www

# 기본페이지 생성
$ vi /webstore/pub/TEST/www/index.php
<?
phpinfo();
?>
$ vi /appstore/webserver/apache-test/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>
    DocumentRoot "/webstore/pub/TEST/www"
    # AWS에서 테스트했기 때문에 AWS의 퍼블릭IP를 입력했다.
    # 참고로 보안그룹에 80, 443이 열려있는지도 확인하라.
    ServerName  내 서버 아이피 작성
    <Directory /webstore/pub/TEST/www>
                Order allow,deny
                Allow from all
                AllowOverride All
                Require all granted
    </Directory>
    ErrorLog "logs/test-host.example.com-error_log"
    CustomLog "logs/test-host.example.com-access_log" common
</VirtualHost>
# 아파치 재 시작
$ cd /appstore/webserver/apache-test/bin
$ ./apachectl -t 
$ ./apachectl start

 

PHP 에러 모음

configure: error: xml2-config not found. Please check your libxml2 installation.

$ yum install libxml2
$ yum install libxml2-devel

 

configure: error: Please reinstall the libcurl distribution -
easy.h should be in /include/curl/

$ yum -y install curl-devel

 

If configure fails try --with-vpx-dir=


If configure fails try --with-jpeg-dir=
configure: error: png.h not found.
$ yum install libpng-devel

 

Configure: error: mcrypt.h not found. Please reinstall libmcrypt.

$ yum -y install libmcrypt-devel

 

configure: error: Please reinstall readline - I cannot find readline.h

$ yum -y install readline-devel

 

PHP 에러 모음 참조 문서

사실 내가 작성하면서 웬만하면 링크를 걸지 않는데 이 주인장은 설치하면서 하나하나 에러를 확인하며 설치한 것 같다. 나보다 에러난 케이스가 더 많다. 그래서 이 내용을 참조하는 것을 추천한다.

  • https://nowknowing.tistory.com/97
 

소스설치 configure 에러시

configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distributionyum install libxslt-devel configure: error: Could not find net-snmp-config binary. Please check your net-snmp installation.yum install net-snmp-devel configure: erro

nowknowing.tistory.com

 

MYSQL 5.6

다시 한번 말하지만 Apache와 PHP서버, MYSQL은 다른 서버에서 운영하는 구조로 구성했다.
여기서부터는 MYSQL서버에서 하는 작업이다.

 

MYSQL 기존 버전 삭제

기존 mysql이 설치되어 있거나, Maria DB가 설치되어 있다면 구글링을 통해 깔끔하게 삭제한 후 진행하는 것을 권장한다. 삭제하는 방법은 나 말고도 많은 사람들이 올라가 있다.

 

MYSQL 다운로드 및 설치

# 리포지토리 설정
$ mkdir -p /webstore/pub/util
$ cd /webstore/pub/util
$ wget https://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
$ rpm -ivh mysql-community-release-el6-5.noarch.rpm 

# 설치
$ yum install mysql-server 
$ systemctl start mysqld
$ systemctl status mysqld

# 접속
$ mysql
  • 설정 파일 경로: /etc/my.cnf

 

여기까지가 기본적인 설치 및 구성작업이다. 이후에는 이관 작업에 사용했던 내용을 적어두었다.

 

MYSQL SQL 파일 Import/Export

mysql에 넣을 데이터가 없다면 넘어가면 된다.
내 목적은 기존 카페 24에서 이관 목적을 가지고 작성한 것이기 때문에 백업된 데이터베이스 파일을 넣는 작업이 필요했다.

# SFTP로 *.sql파일을 서버에 업로드
FileZilla 사용

# Import
CREATE BATABASES hello;
USE hello;
Source <파일경로>/<파일명>.sql
# 예시) SOURCE /webstore/pub/util/my.sql
commit;

# 확인
USE hello;
SHOW TABLES;

# Export
mysqldump -u [사용자 계정] -p [패스워드] [원본데이터베이스명] > [생성할 백업 DB명].sql

ex) mysqldump -u myid -p mydb > mydb.sql
password: 7979

 

MYSQL 계정 액세스 권한 설정

이 내용은 내가 데이터베이스를 모르기 때문에 테스트하기 위해서 권한과 액세스를 모두 허용해 주지만 절대 따라 해서는 안된다. 무조건 데이터베이스담당자를 통해 정확한 권한과 보안적인 부분도 신경써야 한다.

특정 IP를 열어주거나 사용자계정에 대한 권한도 필요하다. 하지만 난 테스트를 위해서 어떤식으로 이뤄지는지에 대해서 파악하기 위함이라서 권한을 루즈하게 작업했다.
그냥 이런 설정들이 있어서 막힐 수도 있겠구나 하는 정도만 알고 있자.

# 외부에서 root 계정 로그인 가능하도록 패스워드 설정하기
SET PASSWORD FOR 'root'@'%' = PASSWORD('your_password');
FLUSH PRIVILEGES;

# 모든 IP에서 로그인 가능하도록 권한 주기
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

# 특정 IP에서만 로그인 가능하도록 권한 주기
GRANT ALL PRIVILEGES ON *.* TO 'root'@'your_ip_address' IDENTIFIED BY 'your_password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

 

MYSQL 인터페이스 액세스 권한 설정

$ vi /etc/my.cnf
# 내용추가
[mysqld]
bind-address = 0.0.0.0
$ systemctl restart mysqld
# Apache 서버도 재기동 필요

 

비고

  • php 설정이 변경되면 apache를 재 기동해야 반영되는 걸 잊지 말도록....
  • DB커넥션 PHP소스는 넣지 않았다. PHP Docs에서 참고하여 사용하는 것을 권장한다. (습관 들이기...물론 나...)

 

MYSQL ERROR Package

Cannot download file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql: All mirrors were tried
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing 'yum clean packages'.

$ sudo vi /etc/yum.repos.d/mysql-community.repo
$ wget https://repo.mysql.com/RPM-GPG-KEY-mysql
$ sudo rpm --import RPM-GPG-KEY-mysql
$ sudo yum clean all
$ sudo yum makecache
$ sudo yum update -y

 

주의사항

이 글은 권한문제, 데이터베이스 보안 문제 등 보안적인 부분을 모두 제쳐두고 구성했다. 대충 어떤 보안성을 갖춰야 하는지에 대해서는 생각나는 것만 적었다. 이거 말고도 참고로 엄청 많다. (전자금융기반시설이라...괜시리 더 신경쓰게 되는듯...)
계속말하지만 구성이 어떻게 이뤄질 수 있고 설정이 어떤게 있는지 파악하기 위해 AWS에서 구성했기 때문이다. 이 내용을 가지고 상용서비스로 하는 순간 큰 일이 생길 수 있다.
구성이 어떻게 이뤄지는지 알면 상용에서도 구성하기 편하고 보안성도 금방 조치할 수 있을 것이다.

  • 서비스는 Root계정이 아닌 서비스 계정으로 운영하는 것을 권장
  • 데이터베이스의 계정 액세스 권한은 사용자의 IP를 지정하여 사용하는것을 권장
  • 데이터베이스의 인터페이스 엑세스 권한도 IP를 지정하여 사용하는 것을 권장

 

글을 적고 AWS에서 스크립트만 챡챡 입력했을 때 정상적으로 되는 걸 검증까지 완료하였습니다.
하지만 OS버전이나 MYSQL버전, PHP버전에 따라서 원활하게 이뤄지지 않을 수 있습니다.

728x90

'Linux' 카테고리의 다른 글

[Server] 다중 프로세스 종료(KILL) 방법  (0) 2024.06.28
[Server] 분산 환경에서의 Nginx-PHP-MySQL 설치 및 설정 가이드  (0) 2024.06.26
SSL TLS 지원 여부 확인 (Received fatal alert: protocol_version)  (0) 2024.06.11
Nginx 수동 설치  (2) 2024.06.05
ELK스택에서 Heartbeat 설치 방법  (0) 2024.06.03
  1. 개요
  2. Apache
  3. 아파치 다운로드
  4. 필수 패키지 다운로드 및 파일 이동
  5. Apache 컴파일
  6. Apache 시작
  7. Apache 아파치 에러 모음
  8. PHP
  9. PHP 다운로드
  10. PHP 컴파일
  11. php.ini (설정 파일) 설정 옵션 수정
  12. PHP 연동
  13. PHP 에러 모음
  14. PHP 에러 모음 참조 문서
  15. MYSQL 5.6
  16. MYSQL 기존 버전 삭제
  17. MYSQL 다운로드 및 설치
  18. MYSQL SQL 파일 Import/Export
  19. MYSQL 계정 액세스 권한 설정
  20. MYSQL 인터페이스 액세스 권한 설정
  21. 비고
  22. MYSQL ERROR Package
  23. 주의사항
'Linux' 카테고리의 다른 글
  • [Server] 다중 프로세스 종료(KILL) 방법
  • [Server] 분산 환경에서의 Nginx-PHP-MySQL 설치 및 설정 가이드
  • SSL TLS 지원 여부 확인 (Received fatal alert: protocol_version)
  • Nginx 수동 설치
정주원
정주원
개인블로그
  • 정주원
    Joon.eng
    정주원
  • 전체
    오늘
    어제
    • 분류 전체보기 (77)
      • Linux (41)
      • Windows (0)
      • Network (4)
      • Database (0)
      • Cloud (23)
      • Docker (3)
      • Ansible (2)
      • Etc (4)
  • 블로그 메뉴

    • 링크

      • GITLAB(woni)
    • 공지사항

    • 인기 글

    • hELLO· Designed By정상우.v4.10.0
    정주원
    [Server] 분산 환경에서의 Apache, PHP - MySQL 설치 및 설정 가이드

    개인정보

    • 티스토리 홈
    • 포럼
    • 로그인
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.