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

2024. 6. 26. 17:52·Linux
728x90

개요

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

 

분산 환경에서의 Nginx, PHP, MySQL 설치 및 설정 가이드(1탄)

개요저는 카페24 웹 호스팅을 통해 홈페이지를 운영하고 있었으며, 위탁 운영을 하고 있었습니다. 하지만 몇 가지 이유로 인해 홈페이지를 이관 받아 직접 운영하려 했습니다. 그러나 카페24에서

wonistorage.tistory.com

이 글을 적은 후에 NGINX-PHP-MYSQL을 별도의 서버에서 운영하는 방법을 계속해서 찾아봤지만 정보가 별로 없었습니다.
PHPShool 홈페이지도 들어가서 많이 찾아봤는데 정~말 정보가 별로 없어서 글을 적게 되었습니다.

간단하게 정리하면ㅡ

  1. 카페24 웹 호스팅에서 외부 업체를 통해 홈페이지를 운영
  2. 외부 업체에게 소스를 받아 자체적으로 카페 24 웹 호스팅에서 운영하고자 함
  3. 카페24에서 PHP를 5.x버전 지원이 종료됨 ( 다른버전에서 구동이 호환성때문에 되지 않음 )
  4. 내부시스템은 3Tier구조라서 한 서버에서 운영했던 환경과 다른환경에서 구조를 해야함 (망분리 규제)
  5. 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에 연결할수 없습니다.");
?>

 

혹시나 글에 문제가 있다면 댓글로 달아주시면 정말 감사하겠습니다.

728x90

'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
'Linux' 카테고리의 다른 글
  • [Server] tar를 이용하여 원하는 파일만 압축 해제 방법
  • [Server] 다중 프로세스 종료(KILL) 방법
  • [Server] 분산 환경에서의 Apache, PHP - MySQL 설치 및 설정 가이드
  • SSL TLS 지원 여부 확인 (Received fatal alert: protocol_version)
정주원
정주원
개인블로그
  • 정주원
    Joon.eng
    정주원
  • 전체
    오늘
    어제
    • 분류 전체보기 (83)
      • Linux (43)
      • Windows (0)
      • Network (5)
      • Database (0)
      • Cloud (23)
      • Docker (3)
      • Ansible (2)
      • Language (1)
      • Etc (5)
  • 블로그 메뉴

    • 링크

      • GITLAB(woni)
    • 공지사항

    • 인기 글

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

    티스토리툴바