개요
2024.06.19 - [Etc] - 분산 환경에서의 Apache, PHP - MySQL 설치 및 설정 가이드
이 글을 적은 후에 NGINX-PHP-MYSQL을 별도의 서버에서 운영하는 방법을 계속해서 찾아봤지만 정보가 별로 없었습니다.
PHPShool 홈페이지도 들어가서 많이 찾아봤는데 정~말 정보가 별로 없어서 글을 적게 되었습니다.
간단하게 정리하면ㅡ
- 카페24 웹 호스팅에서 외부 업체를 통해 홈페이지를 운영
- 외부 업체에게 소스를 받아 자체적으로 카페 24 웹 호스팅에서 운영하고자 함
- 카페24에서 PHP를 5.x버전 지원이 종료됨 ( 다른버전에서 구동이 호환성때문에 되지 않음 )
- 내부시스템은 3Tier구조라서 한 서버에서 운영했던 환경과 다른환경에서 구조를 해야함 (망분리 규제)
- 3Tier환경으로 구성하고자 했는데 고통 많이 받음.
기초 설명
기초 설명은 제가 이 과정을 진행하면서 이 내용들을 알고 있었다면 조금 더 빠르게 방법을 찾았겠다! 하는 내용만 넣었습니다.
- PHP: 서버 사이드 스크립팅 기반 언어로 서버이며 PHP는 주로 서버 측에서 HTML, CSS, JavaScript를 생성 및 처리합니다.
그리고 nginx, apache가 세트라고 생각하면 됩니다. (PHP 단독도 가능하지만 거의 그렇게 안 쓰는 것 같음...) - PHP-FPM: Nginx와 같은 웹 서버와 연동되어 PHP 코드를 실행하는 데 사용
- PHP, MYSQL 은 버전의 호환성이 중요합니다.
테스트 구성
테스트 환경은 3개의 AWS 프리티어 계정을 가지고 각각의 1개씩 계정마다 1개의 인스턴스를 생성 테스트를 진행했습니다.
예전에 누가 무제한으로 프리티어 만드는 방법을 알려주셔 가지고... 처음 써먹어봤습니다..
- 서버 이미지: Amazon Linux 2 Kernel 5.10 AMI 2.0.20240610.1 x86_64 HVM gp2
※ 2023 이미지로 할 경우 패키지 설치 과정에서 많은 난관이 발생합니다.. AWS에서 한다면 꼭 위 이미지를 사용하시기 바랍니다. - NGINX Verison: nginx-1.26.1
- PHP Version: 5.5.38
- MYSQL Version: 5.6.38
NGINX (A서버)
NGINX 설치
https://nginx.org/en/download.html 에 접속하시면 원하시는 버전을 설치하실 수 있습니다.
그리고 PHP와 NGINX의 사이에서 버전에 의한 호환성 영향이 크게 없어 보였습니다.
NGINX는 최신 버전인데 5.5.38의 PHP버전을 사용해도 문제가 없더라고요....?
# 'yum update'를 하기전에 꼭 상용 서버라면 Kernal 업데이트는 되지 않도록 하고 사용하세요.
$ yum update
$ yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
$ mkdir -p /appstore/webserver/util
$ cd /appstore/webserver/util
$ wget https://nginx.org/download/nginx-1.26.1.tar.gz
$ tar zxvf nginx-1.26.1.tar.gz
$ cd /appstore/webserver/util/nginx-1.26.1
./configure --prefix=/appstore/webserver/nginx \
--sbin-path=/appstore/webserver/nginx/sbin/nginx \
--conf-path=/appstore/webserver/nginx/conf/nginx.conf \
--pid-path=/appstore/webserver/nginx/logs/nginx.pid \
--lock-path=/appstore/webserver/nginx/logs/nginx.lock \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-stream \
--with-stream_ssl_module \
--with-mail \
--with-mail_ssl_module \
--with-threads \
--with-pcre \
--with-http_realip_module
$ make
$ make install
$ cd /appstore/webserver/nginx/sbin
# syntax test
$ ./nginx -t
# 서비스 시작
$ ./nginx
# 서비스 종료
$ ./nginx -s stop
검증
http://웹서버의 IP를 접속했을 때 정상적으로 접속되는지 확인합니다.
페이지가 정상적으로 뜨는지 확인하지 않는다면 추후 문제가 발생하면 정확히 어디서 발생했는지를 추측하기 어려워지기 때문에 확인하는 것을 권장합니다.
NGINX Conf
이제 다음 PHP서버에 연결하기 위해 아래와 같이 설정합니다.
$ mkdir /appstore/webserver/nginx/conf/site-available
# 내용 수정
$ vi /appstore/webserver/nginx/conf/nginx.conf
user nginx;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
keepalive_timeout 65;
#gzip on;
incloud /appstore/webserver/nginx/conf/site-available/*.conf
#tcp_nopush on;
server_tokens off;
}
위 설정은 한 서버에서 여러 서비스를 운영할 때 별도의 설정파일로 관리하기 위해서 이와 같은 방법을 사용합니다.
습관이 돼서 이렇게 설정하지만 아래 서버 설정을 그대로 nginx.conf 에 설정해도 상관없습니다.
$ vi /appstore/webserver/nginx/conf/site-available/myhomepage.conf
upstream php-fpm {
server 192.168.0.2; # PHP-FPM이 실행 중인 B 서버의 IP 주소와 포트 (php서버)
}
server {
listen 80;
server_name 192.168.0.1; # 서버의 IP 주소 또는 도메인 이름 (nginx서버)
location / {
root /webstore/pub/HOMEPAGE/www;
allow all;
index index.php index.html index.htm;
try_files $uri $uri/ =404;
}
location ~* \.php$ {
root /webstore/pub/HOMEPAGE/www;
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
.PHP의 확장자를 가진 요청일 경우 fastcgi를 이용해 PHP서버로 요청합니다. PHP가 아닌 경우에는 nginx서버에서 처리합니다.
PHP특성상 파싱 후 클라이언트에게 HTML파일을 전달하고 그 코드 안에서 js, image는 재 요청한다는 얘기입니다.
하지만 제 환경 특성상 PHP서버는 WAS Internal Zone에 있어서 외부에서 접근이 안됩니다. 그래서 리소스 파일들은 모두 nginx에 동일 경로(/webstore/pub/HOMEPAGE/www)에 넣어서 외부에서 리소스 접근이 가능하도록 했습니다.
PHP, PHP-FPM (B서버)
PHP, PHP-FPM는 서로 다른 개념입니다. 추후 문제 해결에 많은 도움이 됩니다.
PHP (Hypertext Preprocessor)
- 정의: 서버 사이드 스크립트 언어로, 웹 서버에서 실행되어 동적인 웹 페이지를 생성합니다.
- 역할: HTML에 동적인 콘텐츠를 추가하거나 데이터베이스와 상호작용하여 사용자에게 맞춤형 정보를 제공합니다.
PHP-FPM (PHP FastCGI Process Manager)
- 정의: PHP를 효율적으로 실행하기 위한 FastCGI 프로세스 관리자입니다.
- 역할: PHP 스크립트를 빠르고 안정적으로 처리하며, 특히 높은 트래픽을 처리할 때 성능을 최적화합니다. Nginx와 같은 웹 서버와 연동되어 PHP 코드를 실행하는 데 사용됩니다.
PHP, PHP-FPM 설치
$ yum install -y gcc libxml2 libxml2-devel bzip2 bzip2-devel curl curl-devel libpng libpng-devel libjpeg libjpeg-devel libXpm libXpm-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel mysql mysql-devel aspell aspell-devel recode recode-devel autoconf epel-release php-mcrypt libmcrypt-devel
$ cd /usr/local/src
$ wget http://museum.php.net/php5/php-5.5.38.tar.gz
$ tar -zxvf php-5.5.38.tar.gz
$ cd php-5.5.38
$ ./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--with-mysqli \
--with-pdo-mysql \
--with-zlib \
--with-curl \
--with-openssl \
--with-mhash \
--with-mcrypt \
--with-gd \
--with-jpeg-dir=/usr/lib \
--with-png-dir=/usr/lib \
--with-freetype-dir=/usr/lib \
--enable-mbstring \
--enable-soap \
--enable-calendar \
--enable-sockets \
--enable-bcmath \
--enable-exif \
--enable-ftp \
--with-gettext \
--with-pdo-mysql \
--with-mysql
$ make
$ make install
PHP Conf
# PHP 설정 파일 옮기기
$ cp /usr/local/src/php-5.5.38/php.ini-production /usr/local/php/php.ini
# 서비스 디렉토리 생성 및 권한 부여
$ adduser nginx
$ gpasswd nginx nginx
$ mkdir -p /webstore/pub/HOMEPAGE/
$ chown -R nginx:nginx /webstore/pub/HOMEPAGE/
$ chmod -R 755 /webstore/pub/HOMEPAGE/
$ vi /usr/local/php/php.ini
# 페이지에 에러를 보여주는 옵션을 끕니다.
display_errors = Off
# <?php 를 <? 로 코드를 짰다면 해당 옵션을 킵니다.
short_open_tag = On
PHP-FPM Conf
# PHP-FPM 설정 파일 옮기기
$ cp /usr/local/src/php-5.5.38/sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf
# systemctl 으로 구동가능하도록 파일 옮기기
$ cp /usr/local/src/php-5.5.38/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
# 실행 권한 수정
$ chmod +x /etc/init.d/php-fpm
# 데몬 리로드
$ systemctl daemon-reload
$ vi /usr/local/php/etc/php-fpm.conf
# 내용 수정
listen = 9000
# 주석 제거
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
검증
B서버에서 아래와 같이 index.php를 생성합니다.
$ vi /webstore/pub/HOMEPAGE/www/index.php
<?
phpinfo();
?>
$ systemctl start php-fpm
$ systemctl status php-fpm
http://웹서버의 IP를 접속했을 때 PHP의 정보들이 나온다면 연결이 정상적으로 이뤄진 것을 알 수 있습니다.
MYSQL (C서버)
사유가 있어 버전을 MYSQL 5.6을 사용하게 되었는데 이 버전이 높으면 PHP와 연결이 되지 않습니다.
암호화 및 여러 많은 패치가 이뤄지면서 커넥션 하는 방식 등이 많이 달라졌더군요...
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 Conf
이 설정은 인터페이스의 접근 허용 권한 설정입니다. 로컬호스트 접속만 한다면 이 설정을 할 필요 없습니다.
저는 망분리가 되어있는 구조라서 사설 IP를 가진 DB이다 보니 내부 서버들이 모두 접근할 수 있도록 하기 위해서 모두 허용해 둔 것입니다.
적절하게 대역을 지정해 주시면 될 것 같습니다.
$ vi /etc/my.cnf
# 내용 추가
[mysqld]
bind-address = 0.0.0.0
$ systemctl restart mysqld
※ 웹서버(nginx)도 재기동 필요
MYSQL Data Import
여기서부터는 저 처럼 카페 24에서 데이터베이스를 가져온 경우에 참고하시면 될 것 같습니다.
# mysql 서버에서 mysql 접속
$ mysql
$ create database <생성할 테이블명>;
$ use <생성한 테이블명>;
$ source <.sql파일경로>
MYSQL 접근 계정 생성 및 권한 부여
상황에 맞게 사용하시면 될 것 같습니다.
그리고 혹시나 NCP(네이버클라우드)에서 홈페이지를 운영하시는 경우 아래 'localhost'에 인스턴스의 IP가 아닌 hostname을 입력해야 접속이 됩니다. 여기서 삽질을 좀 많이한것 같아서 적습니다.
# 모든 데이터베이스와 테이블에 대한 설정
# 계정 생성 + 계정 패스워드 설정 + 테이블에 대한 사용자 권한 부여
GRANT ALL PRIVILEGES ON *.* TO 'myID'@'localhost' IDENTIFIED BY 'myPW' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# tmonetcorp라는 데이터베이스만 허용해줄경우
# 계정 생성 + 계정 패스워드 설정 + 테이블에 대한 사용자 권한 부여
GRANT ALL PRIVILEGES ON myID.* TO 'myID'@'localhost' IDENTIFIED BY 'myPW' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 계정이 이미 있는 경우에 패스워드만 변경
SET PASSWORD FOR 'myID'@'localhost' = PASSWORD('myPW');
FLUSH PRIVILEGES;
PHP-MYSQL Connection 예시 파일
아래 PHP코드는 PHP 5.5.38에서 사용하였습니다. 이후 버전에서는 MYSQLI 등 다른 방법을 사용하니 낮은 버전을 사용하시는 사람만 참고하면 될 것 같습니다.
<?
define("DB_HOST", "192.168.0.3");//호스트명
define("DB_USER", "corp");//DB아이디
define("DB_PASS", "mypasswd");//DB패스워드
define("DB_NAME", "corp");//DB명
$connect=mysql_connect("192.168.0.3", "corp", "mypasswd") or die("SQL server에 연결할수 없습니다.");
?>
혹시나 글에 문제가 있다면 댓글로 달아주시면 정말 감사하겠습니다.
'Linux' 카테고리의 다른 글
[Server] tar를 이용하여 원하는 파일만 압축 해제 방법 (0) | 2024.06.28 |
---|---|
[Server] 다중 프로세스 종료(KILL) 방법 (0) | 2024.06.28 |
[Server] 분산 환경에서의 Apache, PHP - MySQL 설치 및 설정 가이드 (0) | 2024.06.19 |
SSL TLS 지원 여부 확인 (Received fatal alert: protocol_version) (0) | 2024.06.11 |
Nginx 수동 설치 (2) | 2024.06.05 |