개요
카페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의 주요 차이점 요약
- 커널 버전: Amazon Linux 2023은 최신의 kernel-6.1을 사용하며, Amazon Linux 2는 비교적 안정된 kernel-5.10을 사용합니다.
- 최신 기술 및 기능: Amazon Linux 2023은 최신 기술과 기능을 지원하며, 최신 하드웨어와의 호환성이 높습니다. 반면, Amazon Linux 2는 검증된 안정성을 제공합니다.
- 업데이트 및 지원: Amazon Linux 2023은 최신 업데이트와 보안 패치를 더 자주 받을 가능성이 높습니다.
- 사용 사례: 최신 기능과 성능 최적화가 필요한 경우 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 에러 모음 참조 문서
사실 내가 작성하면서 웬만하면 링크를 걸지 않는데 이 주인장은 설치하면서 하나하나 에러를 확인하며 설치한 것 같다. 나보다 에러난 케이스가 더 많다. 그래서 이 내용을 참조하는 것을 추천한다.
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버전에 따라서 원활하게 이뤄지지 않을 수 있습니다.
'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 |