Ubuntu 18.04 에서 웹서버(Apache + PHP + MySQL) 구성하기

HYEONG HWAN, MUN/ 9월 10, 2018/ 미분류/ 1 comments

** 이 글은 초고입니다. 작성중입니다. **

이 글에서는 Ubuntu 18.04 운영체제 환경에서 Apache + PHP + MySQL 소프트웨어를 설치하고 구성하는 방법에 대해 설명합니다.

Ubuntu 9.04 버전부터 10년째 설치 방법 글을 작성/유지보수 하고 있는데, 그동안 별 문제가 없었고 외부 링크글이 많으니 올바르게 설명하고 있는 것 같습니다. 아무 문제가 없겠지만, 구축 중 문의사항이 생기면 댓글을 남겨주세요.

일반 사업체 및 실무 서비스에서 사용할 수 있는 안정적인 구축 방법을 설명 하겠습니다.


* 리눅스 명령어 환경으로 접속하는 방법을 모른다면 이 글로 이동하세요.
리눅스 명령어 환경으로 원격 접속하는 방법 : https://blog.lael.be/post/7574

* Ubuntu 운영체제가 설치되어 있지 않다면 이 글로 이동해서 설치하세요.
Ubuntu 18.04 LTS 운영체제 설치하는 방법  : https://blog.lael.be/post/7541

* 리눅스 설치 후 기초 원격접속 설정을 하려면 이 글로 이동하세요.
ㅇㄹㅇㄹ

 


 

1) root 계정 비밀번호 설정 (Set root account password)

클라우드 호스팅 업체마다 기본 제공되는 계정이 다릅니다.
만약 클라우드 호스팅 업체에서 기본으로 제공되는 계정이 root 였다면 이 단계를 건너뛰고 2번 단계로 이동합니다.
운영체제 직접 설치 또는 클라우드 호스팅 업체에서 기본 제공된 계정이 root 가 아니라면 이 단계를 진행합니다.

< VULTR 클라우드의 경우 root 계정을 제공해 줍니다 >

 

< Amazon EC2 의 경우 ubuntu 라는 관리 계정을 제공해 줍니다 >

 

한번 더 적습니다. 초기 제공받은 계정이 root 라면 2번으로 넘어가세요.

 

1] 관리 계정으로 로그인 후 id 정보 확인

# id

sudo 라는 글자만 확인하면 됩니다.

 

2] 관리 계정에서 root 계정으로 권한 상승

# sudo su

바로 전환될 수도 있고, 현재 계정의 비밀번호를 물어볼 수도 있습니다.

# id

올바르게 전환 되었는지 확인해 보세요.

 

3] root 계정 비밀번호 설정

# passwd root

명령어 형식 :  # passwd [리눅스 사용자 아이디]
root 사용자는 시스템 최고권한을 가지고 있기 때문에, 자신의 계정 및 다른 계정의 비밀번호를 바꿀 수 있습니다.
영문 숫자 특수문자를 섞어서 사용하기 권장합니다.

4] ssh 원격 접속 환경설정 파일 수정

위에서 설정한 비밀번호로 서버에 접속하기 위해 몇가지 설정을 해야 합니다.

vi 에디터를 통해 다음의 파일을 수정하세요.
vi 에디터 사용법을 모른다면 이곳으로 이동 : https://blog.lael.be/post/7321

# vi /etc/ssh/sshd_config

PermitRootLogin : root 사용자의 로그인 허용 여부. (yes, prohibit-password, forced-commands-only, no) 중에서 설정해야 합니다. 설정하지 않으면 prohibit-password 가 됩니다.
yes 로 설정하세요.

PasswordAuthentication : 비밀번호 로그인 허용 여부. (yes, no). 설정하지 않으면 yes 가 됩니다.
yes 로 설정하세요.

ChallengeResponseAuthentication : ChallengeResponse 라는 특이한 인증 허용여부. (yes, no). 설정하지 않으면 yes 가 됩니다.
no 로 설정하세요.

< 이렇게 변경하면 됩니다 >

 

ssh 서비스 재시작

# service sshd reload

 


Shell 연결을 끊지말고 새로 창을 열어서 연결하세요.
root 계정 및 root 비밀번호 (방금설정한) 로 로그인하세요.

 

5] 관리 계정 삭제

새로운 Shell 에서 root 로그인이 성공했다면 기존에 연결한 창을 닫습니다.

 

초기에 생성한 sudo 명령을 사용할 수 있는 관리 계정을 삭제합니다.

만약 최초로 생성한 관리 계정의 아이디가 firstusername 라면 다음의 명령을 실행합니다.

# userdel -r firstusername

 

이 글의 모든 단계는 root 권한으로 진행합니다.


2) 쉘 기본 언어값 변경

서버 운영중에 문제가 발생했을 때 구글 검색을 할 수 있게 하는 기초 작업이다.

쉘의 기본 언어값영어로 변경하도록 하자.

크게 달라지는 것은 없고 오직 쉘 메세지영어로 바뀐다.

반드시 qwerty 라고 입력하세요.

# qwerty

이미 영어메시지가 출력된다면 3번 단계로 넘어가도록 하자.

< 그림 : 동일한 서버. 쉘 언어값만 다름. >

 

# vi /etc/default/locale
LANG="en_US.UTF-8"
LANGUAGE="en"

LANG 설정만 해도 되는데, 그래도 영어로 바뀌지 않는다면 LANGUAGE 값도 설정하도록 하자.

k3

k4

다시 로그인 해 보면 값이 적용된 것을 알 수 있다.

 

3) 서버 저장소를 카카오로 설정 (set APT mirror)

데이터를 복제하여 저장하는 것을 미러링이라고 한다. APT 업데이트 서버를 다음카카오 서버로 지정하여, APT 통신의 성능을 올릴 것이다.

만약 당신이 클라우드 서버를 사용중이라면 이 단계를 넘어가도 된다. 대형 클라우드트래픽 절약 & 속도 향상을 위해 자체적으로 mirror 서버를 운영하고 있다.

< AWS / Lightsail >

< Linode >

 

# vi /etc/apt/sources.list

만약 위와 같은 그림이라면 아래의 명령어를 입력한다. (그대로 따라 입력하면 됨)

:%s/kr.archive.ubuntu.com/mirror.kakao.com/ig

 

또는 잘 모르겠으면, 내용을 다 지우고 다음의 3줄만 입력한다. (운영에 아무런 문제 없음)

deb http://mirror.kakao.com/ubuntu bionic main
deb http://mirror.kakao.com/ubuntu bionic-security main
deb http://mirror.kakao.com/ubuntu bionic-updates main

 

모든 인증된 ubuntu mirror 저장소 목록을 보려면 https://launchpad.net/ubuntu/+archivemirrors 참조.

 

4) 현재 운영체제에 설치되어 있는 프로그램 최신버전 패치

기억하세요! 어떠한 운영체제를 설치하든 (윈도우 포함) 가장먼저 해야 할 일업데이트 입니다.

APT 목록 갱신
APT란 Advanced Packaging Tool 을 뜻합니다.
우리는 apt 라는 우분투에 내장된 프로그램을 이용해서 프로그램을 쉽게 설치/제거 할 수 있습니다.

 

패키지 목록 갱신.

#apt update

현재 운영체제에 설치되어있는 프로그램 최신버전 패치

#apt upgrade

설치 중 일부 프로그램 설정파일을 초기화 할것인지 물어보는데 기본값Keep Local Version 을 선택한다. (미리 선택되어 있으므로 Enter 만 누르면 된다.)

설치, 제거, 업데이트 과정중에 생긴 찌꺼기 파일이 있으면 제거

#apt autoremove

아주 가끔씩 찌꺼기 파일이 생긴다. 지우지 않아도 문제는 없다.

 

5) 시스템 정보 확인

서버 운영 중에도 자주 실행하는 명령어 이므로 한번씩은 실행해 보도록 하자.
스크린샷은 생략한다.

운영체제 정보 확인

# lsb_release -a

시스템 메모리 정보 확인

# free -m

디스크 용량 확인

# df -h

부팅 시간 확인

# who -b

서버 부하량, 부팅 시간, 서버 접속자 확인

# w

CPU 모델 확인

# cat /proc/cpuinfo | grep CPU | head -1

CPU 코어수 확인

# cat /proc/cpuinfo | grep CPU | wc -l

 

6) 시스템 시간 설정

이것을 하지 않으면 클라우드 서버 사업자가 미리 지정해 둔 지역의 시간을 불러올 것이다. (한국은 Seoul, 일본은 Tokyo, 그외에는 GMT.)

물론 초기 설치할 때 Asia/Seoul 을 설정했다면 이 작업을 할 필요는 없다. 하지만 또 설정하더라도 문제가 생기지는 않는다.

- 데비안 패키지 재설정 TimeZone Data 를 실행한다.

#dpkg-reconfigure tzdata

GUI 환경이 나올 텐데, 순서대로 Asia - Seoul 을 선택하면 된다.  a 와 s 키를 누르면 관련 위치로 이동한다.

 

이 예제 서버의 시각은 한국시간기준(KST) 2018년 10월 04일 00:51:33 이다.


 

7) Apache2 설치

# apt install apache2

 

- 설치된 아파치 버전 확인

# apache2 -v

 

- 웹브라우저에 서버의 아이피를 입력해 접속해보자.

< 이렇게 보이면 Apache2 웹서버가 정상적으로 설치되었고 실행 중이다 >

 

- 널리 사용되는 Apache2 Module 활성화.
모듈 설명은 생략한다.

# a2enmod rewrite
# a2enmod headers
# a2enmod ssl
# a2dismod -f autoindex

 

- 변경사항 적용.

# service apache2 restart

- 기본 언어셋 변경

# vi /etc/apache2/conf-available/charset.conf

기본 언어값 UTF-8 에 대해서 주석처리되어 있을 텐데 주석(#)을 제거해 준다.

 

iu4

- 추가 보안 설정

#vi /etc/apache2/conf-available/security.conf

매우 권장하는 보안설정이므로 Ubuntu Apache 패키지 제작자가 미리 써두었다.
이미 다 쓰여 있으니까 주석(#) 만 제거하자.

q1

iu2

iu3

 


#추가 보안패치. (.git, .svn, .env 등 dot로 시작하는 파일 및 폴더 보호, Web Access가 되어서는 안될 파일들의 접근 제어)

# vi /etc/apache2/apache2.conf

파일 중간의 <FilesMatch “^\.ht”> 구문 다음에 추가한다.

# deny file, folder start with dot
<DirectoryMatch "^\.|\/\.">
    Require all denied
</DirectoryMatch>
 
# deny (log file, binary, certificate, shell script, sql dump file) access.
<FilesMatch "\.(?i:log|binary|pem|enc|crt|conf|cnf|sql|sh|key|yml|lock|gitignore)$">
    Require all denied
</FilesMatch>
 
# deny access.
<FilesMatch "(?i:composer\.json|contributing\.md|license\.txt|readme\.rst|readme\.md|readme\.txt|copyright|artisan|gulpfile\.js|package\.json|phpunit\.xml|access_log|error_log|gruntfile\.js|bower\.json|changelog\.md|console|legalnotice|license|security\.md|privacy\.md)$">
    Require all denied
</FilesMatch>

# Allow Lets Encrypt Domain Validation Program
<DirectoryMatch "\.well-known/acme-challenge/">
    Require all granted
</DirectoryMatch>

apache2-conf-161022-2



 

- 변경사항 적용.

# service apache2 restart

여기까지 진행하면 Apache2 를 통해 정적 컨텐츠를 웹서비스 할 수 있다.

Apache 개별 권한 설정

웹 서비스 구동시 발생할 수 있는 Nobody 퍼미션 관련 문제를 해결하기 위해 관련 프로그램을 설치한다.
이 세팅을 하면 shell의 권한과 sftp의 권한과 web의 권한이 동일하게 취급되며 보안도 좋게된다.
순서대로 쓰면 된다.

# apt-cache search mpm-itk

libapache2-mpm-itk - multiuser module for Apache

mpm_1604

 

#apt-get install libapache2-mpm-itk
#chmod 711 /home
#chmod -R 700 /home/*

(/home/* 안에 아무파일도 없을 경우 마지막 구문은 에러가 날 수 있다. 에러가 나면 무시하도록 하자.)


8) PHP 설치

php 설치. Ubuntu 18.04 LTS 에서는 PHP 7.2 버전이 설치된다.

미리, 당신이 사용할 소프트웨어가 PHP 7.2 버전에서 구동 가능한지 확인해보세요.

# apt install php

시스템에 Apache2 가 설치되어 있기 때문에 Apache2 PHP module (libapache2-mod-php7.2) 도 같이 설치되고 적용된다.

- 설치된 PHP 버전 확인

# php -v

글을 작성하는 현재 설치된 버전은 PHP 7.2.10 이며, 여러분의 버전은 이것보다 높을 것이다. (물론 주기적으로 apt update 및 apt upgrade 를 해주면 항상 최신의 상태를 유지할 수 있다.)

기타 널리 사용되는 모듈을 설치한다.

- 다국어 처리모듈
http://php.net/manual/en/book.mbstring.php 기능이 추가된다.

#apt install php-mbstring

 

- 이미지처리 모듈
http://php.net/manual/en/book.image.php 기능이 추가된다.

#apt install php-gd

 

- 원격지 정보 불러는 모듈 (워드프레스 등에서 쓰임)

#apt install php-curl php-xml

- OAuth API 인증 모듈 (클라우드 API 등 연동서비스에서 쓰임)

#apt install php-oauth

- MySQL 연동 모듈 (mysqli, mariadb, pdo-mysql 기능)

#apt install php-mysql

- Composer 설치

#apt install composer

- Git 설치

#apt install git

11-1) PHP 실행확장자 변경

 

php 를 해석하는 확장자가 꽤 많이 있다.

#vi /etc/apache2/mods-available/php7.0.conf

xenial_0630

.php .php3 .php4 .php5 .php7 .pht .phtml  확장자 파일이 기본적으로 php를 해석할 수 있게 되어있다.

웹페이지에서 파일업로드 구현시 이 확장자 파일을 제대로 막아주지 못하면 사이트가 위험하게 된다.

 

.php 를 제외한 나머지의 접근을 차단하자.

 


<FilesMatch ".+\.ph(p3|p4|p5|p7|t|tml)$">
    Require all denied
</FilesMatch>

php-security-1604

 

1 Comment

  1. 구독해서 언제나 잘 보고있습니다.
    발빠르고 좋은정보 감사드립니다.

Leave a Comment

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*