Article
Ubuntu 16.04에서 PHP 7.2 설치 및 구성하기
개요
AWS EC2 기반의 Ubuntu 16.04에서 PHP 7.2 개발 및 프로덕션 환경을 구축하는 가이드입니다. NGINX 웹 서버, PHP-FPM, 필수 모듈들을 설치하고 보안 및 성능을 최적화하는 단계별 절차를 다룹니다.
시스템 기본 설정
먼저 패키지 관리자를 업데이트하고 시스템 기본 설정을 구성합니다.
apt-get update
apt-get -y upgrade
지역 설정에서 UTF-8을 기본값으로 설정하면 국제화 문제를 미리 방지할 수 있습니다.
echo "LC_ALL=en_US.UTF-8" >> /etc/default/locale
locale-gen en_US.UTF-8
PPA 추가 및 필수 패키지 설치
NGINX와 PHP의 최신 버전을 사용하기 위해 PPA(Personal Package Archive)를 추가합니다.
apt-get install -y software-properties-common curl
apt-add-repository ppa:nginx/stable -y
apt-add-repository ppa:ondrej/php -y
apt-get update
이 단계 이후 시스템 빌드 도구와 개발 필수 패키지를 설치합니다.
apt-get install -y --force-yes \
build-essential gcc git make \
libpcre3-dev libmcrypt4 libnotify-bin \
python2.7-dev python-pip supervisor \
unattended-upgrades dos2unix re2c whois
PHP 7.2 및 필수 확장 모듈 설치
PHP 7.2의 핵심 패키지와 웹 개발에 필요한 확장 모듈들을 설치합니다.
apt-get install -y --force-yes \
php7.2-cli php7.2-dev php7.2-fpm php7.2-zip \
php7.2-bcmath php7.2-intl php7.2-readline \
php-gd php-curl php-mysql php-mbstring \
php-xml php-apcu php-memcached
주요 모듈 설명:
php-gd: 이미지 처리php-curl: HTTP 요청 처리php-mysql: MySQL/MariaDB 데이터베이스 연결php-memcached: 캐싱 서비스php-apcu: 바이트코드 캐시
Composer(PHP 의존성 관리자)도 함께 설치합니다.
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
PHP 설정 최적화
PHP CLI 설정
보안과 성능을 위해 PHP CLI 구성을 조정합니다.
sed -i "s/expose_php = .*/expose_php = Off/" /etc/php/7.2/cli/php.ini
sed -i "s/display_errors = .*/display_errors = Off/" /etc/php/7.2/cli/php.ini
sed -i "s/memory_limit = .*/memory_limit = 512M/" /etc/php/7.2/cli/php.ini
sed -i "s/upload_max_filesize = .*/upload_max_filesize = 100M/" /etc/php/7.2/cli/php.ini
sed -i "s/post_max_size = .*/post_max_size = 100M/" /etc/php/7.2/cli/php.ini
sed -i "s/;date.timezone.*/date.timezone = UTC/" /etc/php/7.2/cli/php.ini
주요 설정 항목:
expose_php = Off: PHP 버전 정보 노출 방지display_errors = Off: 프로덕션 환경에서 에러 숨김memory_limit = 512M: 대용량 처리 허용post_max_size: 파일 업로드 크기 제한
PHP-FPM 설정
PHP-FPM은 NGINX와 PHP를 연동하는 핵심 프로세스입니다. 동일한 최적화를 적용합니다.
sed -i "s/expose_php = .*/expose_php = Off/" /etc/php/7.2/fpm/php.ini
sed -i "s/display_errors = .*/display_errors = Off/" /etc/php/7.2/fpm/php.ini
sed -i "s/memory_limit = .*/memory_limit = 512M/" /etc/php/7.2/fpm/php.ini
sed -i "s/upload_max_filesize = .*/upload_max_filesize = 100M/" /etc/php/7.2/fpm/php.ini
sed -i "s/post_max_size = .*/post_max_size = 100M/" /etc/php/7.2/fpm/php.ini
sed -i "s/;date.timezone.*/date.timezone = UTC/" /etc/php/7.2/fpm/php.ini
sed -i "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/" /etc/php/7.2/fpm/php.ini
cgi.fix_pathinfo=0 설정은 보안 취약점을 방지합니다.
NGINX 및 PHP-FPM 연동
NGINX를 설치하고 기본 설정을 정리합니다.
apt-get install -y --force-yes nginx php7.2-fpm
rm /etc/nginx/sites-enabled/default
rm -rvf /etc/nginx/sites-available
ln -nfs /etc/nginx/sites-enabled /etc/nginx/sites-available
mkdir -p /etc/nginx/module/
service nginx restart
FastCGI 파라미터 설정
NGINX가 PHP-FPM과 통신하기 위한 FastCGI 파라미터를 구성합니다.
cat > /etc/nginx/fastcgi_params << EOF
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param REDIRECT_STATUS 200;
EOF
사용자 권한 및 프로세스 설정
NGINX와 PHP-FPM이 동일한 사용자로 실행되도록 구성하면 파일 권한 문제를 방지할 수 있습니다. [USERNAME]을 실제 운영 계정명으로 변경합니다.
sed -i "s/user www-data;/user [USERNAME];/" /etc/nginx/nginx.conf
sed -i "s/# server_names_hash_bucket_size.*/server_names_hash_bucket_size 64;/" /etc/nginx/nginx.conf
sed -i "s/user = www-data/user = [USERNAME]/" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/group = www-data/group = [USERNAME]/" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/listen\.owner.*/listen.owner = [USERNAME]/" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/listen\.group.*/listen.group = [USERNAME]/" /etc/php/7.2/fpm/pool.d/www.conf
sed -i "s/;listen\.mode.*/listen.mode = 0666/" /etc/php/7.2/fpm/pool.d/www.conf
service nginx restart
service php7.2-fpm restart
추가 모듈 및 캐시 설정
암호화 함수를 위해 mcrypt를 설치하고, 메모리 기반 캐시를 구성합니다.
pecl install mcrypt-snapshot
apt-get install -y --force-yes memcached
선택 사항으로 Redis나 Beanstalkd도 설치할 수 있습니다.
메모리 스왑을 추가하면 메모리 부족 상황에 대비할 수 있습니다.
/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1
빠른 설치 스크립트
수동 설정을 원하지 않으면 자동화 스크립트를 사용할 수 있습니다.
wget https://raw.githubusercontent.com/yousung/ubuntu16.04-php7.2-install/master/script/install-php7.2.sh
bash install-php7.2.sh [USERNAME]
wget https://raw.githubusercontent.com/yousung/ubuntu16.04-php7.2-install/master/script/server.sh
bash server.sh example.com /path/to/document-root
마치며
이 가이드를 따르면 Ubuntu 16.04에서 프로덕션 수준의 PHP 7.2 환경을 완성할 수 있습니다. 설정된 보안 옵션과 성능 최적화는 AWS EC2뿐 아니라 다른 클라우드 환경이나 온프레미스 서버에도 동일하게 적용 가능합니다. 정기적인 보안 업데이트와 성능 모니터링을 통해 안정적인 서버 운영을 유지하세요.
댓글