Tip&Tech/아마니&그누보드

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

라떼^^ 2020. 9. 18. 22:36
반응형

Ubuntu 18.04 LTS 에서 웹서버(NGINX + PHP + MySQL) 구성하는 방법을 알아보려면 https://blog.lael.be/post/8319 로 이동.


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

Ubuntu 9.04 버전부터 10년 넘게 구축 방법을 작성/유지보수 하고 있는데, 그동안 별 문제가 없었습니다.
또한, 설치 성공 후기 글이 많으니 올바르게 설명하고 있는 것 같습니다. 혹시라도, 구축 중 문의사항이 생기면 댓글이나 Contact 로 알려주세요.

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


이 글에서는 Ubuntu 18.04 LTS 운영체제를 사용합니다.

* LTS 버전이란? Long Term Support 의 약자입니다. 개발사에서 10년간의 유지보수, 업데이트를 제공합니다.
현재 무료 리눅스 배포판 중에서 10년 업데이트를 지원하는 운영체제는 Ubuntu 뿐입니다.

* 왜 10년 업데이트? Kiosk나 기타 Embeded 기기에서 제품설계 및 구축 운용까지 몇년(1~4년)이 걸립니다. 제품 출시 후 얼마지나지 않아 운영체제의 업데이트가 중단된다면 문제가 생기겠죠.
요즘에는 응용소프트웨어 분야에서도 이와 같이 LTS 라는 용어를 사용하는 추세입니다.  큰 변화 없이(코어의 major 버전번호 변함없음) 업데이트 유지보수를 장기간 제공합니다. 이 경우, 소프트웨어를 도입하려는 고객이 늘어나고, 3rd party software 가 늘어나는 장점이 있습니다.

< 그림 : Ubuntu 18.04 LTS 버전은 2028년 4월까지 업데이트를 제공함 >

참고 : Ubuntu Support - https://en.wikipedia.org/wiki/Ubuntu#Releases

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


1) 쉘 기본 언어값 변경

서버 운영중에 문제가 발생했을 때 구글 검색을 할 수 있게 하는 기초 작업입니다.
쉘의 기본 언어값을 영어로 변경합니다.
시스템이 달라지는 것은 없고 오직 쉘 메세지만 영어로 바뀝니다.

qwerty 라고 입력해봅시다. 반드시 qwerty 라고 입력하세요.
(참고 : 의미없는 명령어이며 무조건 에러가 발생합니다. 에러메세지 테스트 용도임.)

# qwerty

이미 영어메시지가 출력된다면 다음 단계로 넘어가세요.

< 그림 : 동일한 서버. 메세지 언어설정만 다름 >

영어가 아닐 경우 다음 명령어를 사용하여 변경.

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

k3

 

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

 

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

APT 패키지 설치 프로그램이  파일을 해외의 느린 서버에서 다운 받는 경우가 있습니다. 패키지 다운받을 서버를 카카오미러로 설정하여 패키지 다운로드 속도를 높여보도록 하겠습니다.

당신이 클라우드 서버를 사용 중이라면 이 단계를 건너 뛰세요. (이미 클라우드 사업자들이 적절히 처리해 두었을 것입니다.)

당신이 Ubuntu 운영체제를 직접 설치하였을 경우, 이 단계를 따라하세요.

 

APT 서버 변경하는 방법

# vi /etc/apt/sources.list

내용을 다 지우고 다음의 3줄을 입력한다. (복사하거나, 보고 타이핑 하거나)

더블 클릭하면 전체 내용이 선택됨
1
2
3
deb http://mirror.kakao.com/ubuntu bionic main restricted universe multiverse
deb http://mirror.kakao.com/ubuntu bionic-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse

 

참고 : Ubuntu mirror 저장소 목록 https://launchpad.net/ubuntu/+archivemirrors
참고 : Ubuntu 패키지 분류 방법 https://en.wikipedia.org/wiki/Ubuntu

 

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

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

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

** SSD 서버가 아니라 HDD 서버를 사용할 경우 이 단계 진행에 시간이 매우 오래 걸립니다. 서버디스크는 SSD를 쓰도록 합시다.
* 요즘 SSD 기대수명이, 하루 100GB 쓰기작업할 경우 200년 정도 됩니다. 제조사 보증이 10년정도 합니다.
* SSD가 고장나기 전에 컴퓨터(서버)가 먼저 노후됩니다. 가끔씩 백업을 잘 하세요.

18.04 LTS 세팅 가이드 글부터는 apt-get 이나 apt-cache 명령어 대신 apt 를 사용하여 설명합니다.
apt는 apt-get 일부와 apt-cache 일부를 통합하여 만든 명령어 프로그램입니다. (apt-get, apt-cache가 제거된다는 공지는 없습니다.)
사용자가 조금 더 편하고, 헷갈리지 않기 위해 만든 명령어 프로그램이라고 하네요.

APT 에 대한 자세한 설명 : http://manpages.ubuntu.com/manpages/trusty/man8/apt.8.html

 

패키지 목록 갱신.

#apt update

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

#apt upgrade

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

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

#apt autoremove

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

 

4) 시스템 정보 확인

이제 하드웨어 및 운영 관련 정보를 살펴보도록 하자.
나중에 서버 장애가 생겼을 때 이러한 명령어를 사용해 문제의 원인을 파악할 수 있어야 한다.

운영체제 정보 확인

# lsb_release -a

시스템 메모리 정보 확인

# free -m

디스크 파티션 확인

# lsblk

디스크 여유 공간 확인

# df -h

부팅 시간 확인

# who -b

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

# w

CPU 모델 확인

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

CPU 코어수 확인

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

 

5-1) 시스템 시간 설정

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

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

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

#dpkg-reconfigure tzdata

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

 

dpkg-reconfigure 를 사용할 수 없는 환경이라면 아래의 명령을 실행하세요. (동작은 완전히 동일함)

# ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

 

현재 시간 확인

# date

 

참고 : 가상서버(클라우드서버)는 실제 물리서버의 시간으로 자동으로 동기화됩니다.
즉 가상서버(클라우드서버)를 사용하는 경우 시간교정을 설정할 필요가 없습니다.
(시간교정 프로그램은 보통 ntpdate 를 사용한다. 만약 설정하고 싶다면 구글에 ubuntu ntpdate 라고 검색하여라. 물리서버가 아니라면 작업하지 않는것을 권장함.)

 

5-2) 시스템 이름(hostname) 설정

이 단계는 필수 단계가 아닙니다. 이 서버 자체에서 메일발송을 할 예정이 없다면 5-2 번 설정은 건너뛰어도 됩니다.

이 단계를 설정하면, 메일발송(sendmail) 성공 확률이 증가하고, 여러 서버 작업시 실수할 확률을 줄여줍니다.

이 서버에 이름을 정하는 작업이다.
원래 모든 통신기기(컴퓨터, 노트북, 스마트폰, 프린터등등)는 기기이름을 정할 수 있다.
이 서버의 이름을 정하도록 하자.

위의 뜻은 “ip-172-26-10-184 서버에 root 사용자” 라는 뜻이다.

서버 이름은 FQDN(Fully Qualified Domain Name)을 쓰는 것이 좋다.

참고로 라엘이의 이 블로그 서버의 hostname은 blog.lael.be 이다.

 

#vi /etc/hostname

빈 파일 또는 localhost 또는 초기 설치시 설정한 이름이 쓰여있을건데 원하는 이름으로 바꾸어보자.

권장하는 단어는 이 서버에 연결될 대표 도메인이다. 예를 들어 blog.lael.be 같은 것.

 

적용한다.

#hostname -F /etc/hostname

 

서버에 재 접속하면 적용된 것을 확인 할 수 있을 것이다.

g7

hostname 값은 서버작업자에게 서버이름을 알려주는 역할을 하며, 아무 의미없는 글자를 적어도 된다.

일부 sendmail 같은 프로그램에서 다른 서버와 통신시 사용하기도 한다.

 

- hostname 을 FQDN 으로 설정하는 것을 권장하지만, 외부와 연결이 없는 서버이거나 자신이 쓰고 싶은 이름이 있다면 (팀명이나, 회사명, 서비스명 등) 그것으로 해도 된다.
예를 들어 myserver1, new1111 같이 자신이 하고 싶은대로 정했다고 한다면, 서버의 /etc/hosts 에 해당 이름을 등록해두도록 하자.

127.0.0.1    myserver1

g8

 

hostname 고정시키기

재부팅하면 /var/lib/cloud/instances/[인스턴스 코드]/user-data.txt 파일에 쓰여진 hostname 값으로 되돌아간다.
변경사항을 유지하기 위해 preserve_hostname 을 설정한다.

#vi /etc/cloud/cloud.cfg

preserve_hostname 값을 true 로 설정.

 

재부팅 후 서버이름(hostname)이 유지되는지 확인

# reboot

 

6) 일반적으로 사용되는 프로그램 설치

VI 에디터 설치

# apt install vim

GIT 설치

# apt install git

Unzip 설치

# apt install unzip

Sendmail 설치

# apt install sendmail

 

# vi /etc/mail/local-host-names

qv3

localhost 를 제외하고 나머지 항목은 지운다. 이곳에 쓰여진 도메인은 sendmail 발송시 목적 메일서버조회(mx record query)를 하지않고 로컬로 보낸다.


이제 웹서버를 세팅해 보도록 하자.

Apache + PHP 설치MySQL 설치로 나뉘어 있으며 각각 독립적으로 설치 할 수도 있다.

 

7-1) Apache2 설치

# apt install apache2

 

- 설치된 아파치 버전 확인

# apache2 -v

 

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

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

 

https 인증서 관련 프로그램 설치

# apt install ssl-cert

 

무료 인증서 발급 프로그램 설치

# apt install certbot

 

- 널리 사용되는 Apache2 Module 활성화
이걸 하지 않으면 워드프레스를 포함한 많은 프로그램이 구동되지 않거나 사용 제약이 걸리게 된다.

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

 

- 변경사항 적용

# service apache2 restart

 


다음 단계부터 파일 생성, 파일 수정등의 작업을 할 것입니다.

오타 입력을 방지하고 빠른 오류 발견을 위해 Apache2 환경설정 문법검사 명령어를 실행해 봅시다.

 

- Apache2 환경설정 문법검사

# apache2ctl -S

환경설정 문법검사에 통과하면, 문법 분석결과가 표시됩니다.

 

만약, 환경설정 문법에 오류가 있다면 해당 오류 내용과, 오류가 발생한 Line을 표시해줍니다.

자주 이 명령어를 실행해서 Apache2  환경설정 문법오류가 있는지 확인해 보도록 합시다.

 


vi 에디터 사용법 : https://blog.lael.be/post/7321

 

- 기본 언어셋 변경

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

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

 

iu4

- 추가 보안 설정

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

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

q1iu2iu3

 


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

서비스 운영중 의도치않게 발생할 수 있는 보안 문제를 막는 코드이다.

# vi /etc/apache2/apache2.conf

파일 중간(약 199번째 줄)의 <FilesMatch “^\.ht”> 구문 다음에 추가한다.
TIP : vi 에디터 열자마자 199G (대문자) 입력하면 바로 이동합니다.

/etc/apache2/apache2.conf 설정파일 중간에 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 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>
 
# Block .php file inside upload folder. uploads(wp), files(drupal), data(gnuboard).
<DirectoryMatch "/(uploads|default/files|data|wp-content/themes)/">
    <FilesMatch ".+\.php$">
        Require all denied
    </FilesMatch>
</DirectoryMatch>

apache2-conf-161022-2

- 변경사항 적용

# service apache2 restart

 

Apache 개별 권한 설정

웹 서비스 구동시 발생할 수 있는 Permission(권한) 문제를 해결하기 위한 프로그램을 설치한다.
아래와 같이 설정하면 shell의 권한과 sftp의 권한과 web의 권한이 동일하게 취급되며 보안도 좋게된다.
순서대로 입력하면 된다.

# apt-cache search mpm-itk

libapache2-mpm-itk - multiuser module for Apache

mpm_1604

 

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

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

- 변경사항 적용

# service apache2 restart

 

- 기본사이트 추가 설정

# vi /etc/apache2/sites-available/000-default.conf

ServerName localhost 한 줄 추가해주세요.

1
ServerName localhost

 

- HTTPS 기본사이트 켜기

# mv /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/000-default-ssl.conf

 

# 20.07.31 추가

mv 명령어를 사용하는 이유에 대해 질문을 받아서 작성합니다. 물론 이 내용을 이해하지 못하여도 사용에 지장이 없습니다.

Apache 는 가장 처음으로 로딩하는 파일을 기본 사이트로 취급합니다. 기본 사이트는 지정한 ServerName 에 모두 해당하지 않을 경우, 연결되는 사이트입니다.
Apache 의 conf 로딩 순서는, 알파벳 순서에 따릅니다. 그리고 숫자를 더 우선시 합니다.
따라서 위의 mv 명령어를 사용하지 않고, 당신의 도메인이 d 보다 앞단계 일 경우 (예를 들어 apple.com) 이 도메인 conf가 먼저 불러와지게 되고 기본 사이트가 됩니다.

우리는 위의 default-ssl 을 기본 사이트로써 동작하기를 원하기 때문에, 로딩 우선순위를 높이기 위해서, 이름을 000-default-ssl.conf 로 변경하는 것입니다.

 

이 파일에도 ServerName localhost 를 추가해주세요.

# vi /etc/apache2/sites-available/000-default-ssl.conf

 

# a2ensite 000-default-ssl.conf

 

- 설정 확인

# apache2ctl -S

 

- 설정 적용

# service apache2 reload

 

7-2) PHP 7.2 설치

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


# 20.08.15 부연 설명 추가.

이 글에서는 PPA나 개별저장소, 소스설치가 아니라, Ubuntu 공식 저장소에서 지원하는 패키지로만 설치합니다.
Ubuntu 18.04 LTS 는 장기적으로 사용할 수 있게 출시된 버전이며, 2028년 4월까지 업데이트가 제공됩니다.

Ubuntu SecurityTeam 은 공식 지원하는 모든 패키지에 대해서 Auditing, Tracking, Reporting, Fixing, Testing 을 수행합니다.
https://wiki.ubuntu.com/SecurityTeam

All binary packages in main and restricted are supported by the Ubuntu Security team for the life of an Ubuntu release.  (https://wiki.ubuntu.com/SecurityTeam/FAQ)

기본 저장소에서 제공하는 php7.2 는 Main 패키지이며, security 채널로써 빠르고 우선적으로 관리됩니다. https://packages.ubuntu.com/bionic/php/

https://packages.ubuntu.com/bionic/all/php7.2/download

미래에는 PHP 7.2 보다 높은 버전의 PHP 가 개발될 것입니다.

하지만 공식저장소에서 제공하는 php7.2 를 사용한다면 약 10년간 안정적(Stable)이고 안전한(Secured) 환경을 사용할 수 있을 것입니다.
이것은 Ubuntu의 핵심 개발팀인 SecurityTeam이 보증합니다.


 

# apt install php

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

- 설치된 PHP 버전 확인

# php -v

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

 

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

- 다국어 처리모듈

#apt install php-mbstring

- 이미지 처리모듈

#apt install php-gd

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

#apt install php-curl php-xml

- 수학 연산 확장 모듈

#apt install php-bcmath

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

#apt install php-oauth

- MySQL 연동 모듈 (mysqli, pdo-mysql 관련 함수를 사용할 수 있게됨)

#apt install php-mysql

- Composer 설치 (PHP 패키지 의존성 관리 프로그램)

#apt install composer

 

더 설치하고 싶은 PHP 모듈이 있다면 아래 명령어 입력 후 선택하여 설치하면 된다.

#apt-cache search php- | grep ^php- | grep module

 

PHP 보안 설정

ubuntu php 패키지에서 php 를 해석하는 확장자가 너무 많이 설정되어 있다.

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

.php .phar .phtml  확장자 파일이 기본적으로 php를 해석할 수 있게 되어있다.
과거 16.04 패키지 보다 많이 개선되었지만 여전히 잠재적 문제를 포함하고 있다.

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

 

.php 를 제외한 나머지의 접근을 차단하자.
아래 그림의 위치에 추가한다.

/etc/apache2/mods-available/php7.2.conf
1
2
3
<FilesMatch ".+\.ph(p3|p4|p5|p7|ar|t|tml)$">
    Require all denied
</FilesMatch>

 

적용을 위해서 아파치 재시작
PHP 가 Apache 의 모듈로 동작하는 방식이므로 PHP 의 변경사항이 생기면 Apache 를 재시작 해 주어야 한다.

#service apache2 restart

 

PHP Default timezone 설정하기

PHP 의 Date 관련 함수에서 사용할 기준 시간을 지정하는 작업입니다.
이 값을 설정하지 않으면 시스템 timezone 을 사용합니다.
PHP Default timezone 을 설정하는 것은 필수는 아니지만 매우 권장하는 작업입니다. 설정해주세요.

동일한 작업을 2개의 파일에 적용해 주어야 합니다.

- 이것은 Apache2 + PHP 일때 참조하는 파일입니다.

#vi /etc/php/7.2/apache2/php.ini

* 편집 가이드

vi 에디터 진입 후 ->     /timezone 엔터 i -> 편집 -> 적절한 위치에 Asia/Seoul 입력 -> 저장

 

- 이것은 cron이나 console에서 PHP를 실행할때 참조하는 파일입니다. 동일하게 timezone 을 설정해 주세요.

#vi /etc/php/7.2/cli/php.ini

 

date.timezone 값을 찾아서 주석을 제거하고 시간을 설정해주세요.

q17

이 값을 찾아서

 

q18

이렇게 변경.

 

변경사항 적용하기

#service apache2 restart

 

phpinfo 파일 생성

php 환경설정 정보를 볼 수 있는 파일이다. 이 정보가 노출되더라도 보안에 위협이 되지는 않는다. (그런데 굳이 알려줄 필요도 없으므로 외부에 노출하지 않는 것을 권장)

# echo "<?php phpinfo(); ?>" > /var/www/html/myphpinfo.php

웹 브라우저에서 http://서버의아이피/myphpinfo.php 로 접속해 보자.

 

위와 같이 설정되어 있으면 정상이다.

 

8) MySQL 설치

당신이 만약 DB클라우드 서비스(예를들어 RDS)를 사용할 예정이면, 이 단계를 건너 뛰어도 됩니다. (바로 아래 클라이언트 프로그램은 설치하세요)
반대로, DB 전용 서버를 구축하려면 위의 7번을 건너뛰고 이 단계만 진행하면 됩니다.

MySQL 명령어 클라이언트 프로그램 설치 - 외부 DB를 사용하든 안하든 설치하는 것이 좋습니다.

#apt install mysql-client

위의 패키지를 설치하면 console 환경에서 mysql 명령어를 사용할 수 있게 된다.

 

MySQL 서버 설치

#apt install mysql-server

설치된 버전 확인

#mysqladmin version

MySQL 5.7.24 버전이 설치되었다. (여러분의 버전은 이것보다 높을 것입니다.)

MySQL에 플러그인이라는 개념이 생겼다. 그 중 하나가 서버사이드(auth_socket) 인증이다.

기본 설정으로 MySQL 의 root 사용자는 auth_socket 인증을 사용하도록 설정되어 있으며, 따라서 리눅스 root 사용자는 비밀번호 입력없이 MySQL root 사용자로 로그인 할 수 있다.
추가적으로, auth_socket 이 설정된 사용자는 비밀번호 설정이 되지 않는다. (정확히 말하자면 비밀번호 설정은 되는데 그 값을 저장하지 않는다. 즉, 절대로 비밀번호 로그인 불가능)
다시 말해서, 기본적으로 root 사용자로 비밀번호 로그인을 할 수 없다는 것이다. (auth_socket 인증을 사용하도록 설정되어 있으므로)

 

굳이 기본 설정을 건드리지는 않겠다. 리눅스 root 사용자는 mysqlmysqladmin 이라는 명령어를 통해 DBMS(DB 관리 프로그램;MySQL)을 제어할 수 있다.

 

데이터베이스 초기화 작업 실행

다음의 명령어 실행하자. 잘못 입력 했을 경우 한번 더 실행하면 된다.

/usr/bin/mysql_secure_installation

기본값이 NO 이기 때문에 귀찮더라도 y 를 입력하자.

모두 y 이고, password strength 는 0 으로 설정하고, 비밀번호는 설정하자.

 

잘못한 것 같으면 위 명령어를 다시 실행하면 된다.

 

기본 언어셋 설정(중요)

이 단계를 건너뛰면 DB가 latin1 으로 생성되며 추후 DB작업에 문제가 생길 수 있다.

utf8mb4 속성은 utf8확장이다. 기존의 모든 utf8과 상위 호환된다. (utf8 에서 utf8mb4 로의 변환은 손실이 일어나지 않습니다.)
요즘 스마트폰에서 사용되는 이모티콘 문자(emoji)를 저장할 수 있다.

자세한 설명은 이곳에(https://blog.lael.be/post/917) 있습니다.

/etc/mysql/mysql.conf.d/override.cnf 파일을 생성하고 아래의 내용을 저장한다.

#vi /etc/mysql/mysql.conf.d/override.cnf
/etc/mysql/mysql.conf.d/override.cnf 에 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
 
query_cache_type = ON
query_cache_limit = 4M
query_cache_size = 64M
 
max_allowed_packet = 64M
 
slow_query_log         = 1
slow_query_log_file    = /var/log/mysql/mysql-slow.log
long_query_time = 5
 
sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

 


그누보드5 사용하실 분만 하는 추가작업

그누보드5 사용하실 분만 하는 추가작업 >

[TIP] 그누보드5는 현재 MySQL 5.7 버전과 호환성 문제가 있습니다. 다음의 작업으로 해결할 수 있습니다.

그누보드 소스에서 다음의 함수를 수정.

lib/common.lib.php 1557째줄 근처의 sql_password 함수를 아래와 같이 변경합니다.

1
2
3
4
5
6
7
8
9
function sql_password($value)
{
    // mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes
    // mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes
    // $row = sql_fetch(" select password('$value') as pass ");
 
    // return $row['pass'];
    return '*' . strtoupper(sha1(sha1($value, true), false));
}

 

그누보드5 사용하실 분만 하는 추가작업 >


 

mysql 환경설정 문법 테스트 (mysql config file configtest)

반드시 아래의 명령어로 입력할 것.

# mysqld --verbose --help | grep configtest

오류메세지가 출력되지 않는다면 정상이다.
설정파일 오류가 없다면 mysql 을 재시작하여 적용하도록 하자.

 

변경사항 적용

# service mysql restart

 

변경사항 적용 확인

# mysqladmin variables | grep character

 

9) APM(Apache + PHP + MySQL) 정상 설치 확인

위의 APM 을 모두 사용하는 프로그램을 설치해보자.

널리사용되는 데이터베이스 웹 관리프로그램인 phpmyadmin 을 설치해보자.

이 웹소프트웨어의 공식사이트는 https://www.phpmyadmin.net/ 이다.

# cd /var/www/html/
# wget https://files.phpmyadmin.net/phpMyAdmin/4.8.3/phpMyAdmin-4.8.3-all-languages.zip
# unzip phpMyAdmin-4.8.3-all-languages.zip
# mv phpMyAdmin-4.8.3-all-languages mydbadmin
# rm phpMyAdmin-4.8.3-all-languages.zip

브라우저를 열고
http://서버의아이피/mydbadmin 접속

phpmyadmin 로그인 화면이 뜰 것이다.

 

Ubuntu 의 MySQL 관리 계정 확인

# ll /etc/mysql/debian.cnf
# cat /etc/mysql/debian.cnf

debian-sys-maint 사용자는 MySQL 시스템 서비스에서 MySQL 을 제어할 때 사용하는 계정입니다.
최고 관리 권한을 가지고 있습니다.

예를 들어서 #service mysql stop  명령을 내릴 경우, mysql 프로세스를 강제종료(kill)하는 것이 아니라, 이 관리 계정으로 로그인해서 shutdown 명령을 실행하는 것입니다.

비슷하게 #service mysql reload  같은 동작도 외부에서 MySQL 프로세스를 reload 하는 방법이 없으므로, 이 관리 계정으로 로그인해서 reload 명령을 실행하는 것입니다.

< 그림 : debian.cnf 에 표시된 비밀번호가 올바르지 않아서 reload 명령을 실행하지 못한 경우 >

 

debian-sys-maint 계정으로 로그인 해보자.

 

나만의 최고 관리자 계정 생성

먼저 비밀번호 복잡도 규칙을 수정한다.

비밀번호 규칙 설명

* LOW : 8글자 이상
* MEDIUM : 8글자 이상 + (1대문자, 1소문자, 1숫자, 1특수문자 포함)
* STRONG : MEDIUM 조건 + 비밀번호의 부분이 사전 단어가 아니어야함.

“관리자” 계정을 생성한다.
“관리자” 계정이다. 이 계정은 절대로 웹 프로그램(게시판이나 블로그 프로그램)에서 사용하면 안된다.

“사용자 추가” 클릭

 

사용자명 : dbadmin   (또는 원하는 관리자 아이디) (사이트 이름이나 메일 아이디는 쓰지 마세요)
호스트명 : 로컬 (localhost)
전체적 권한 : 모두 체크

 

phpmyadmin 로그아웃 후 새로 생성한 관리자 아이디로 로그인 하세요.


* dbadmin : 내가 생성한 이 DB 서버의 최고 관리자 계정
* root : 리눅스 root 사용자용 계정
* debian-sys-maint : 시스템에서 끄기, 새로고침, 업그레이드 등 작업시에 사용하는 계정

root 계정은 auth_socket 인증이라서 비밀번호 설정이 안됩니다. (비밀번호 로그인 자체가 안됨)


debian-sys-maint 계정 비밀번호를 바꾸시려면 phpmyadmin  에서 -> 권한 수정 -> 암호변경 메뉴를 이용하세요.
비밀번호는 되도록 자동생성 비밀번호로 사용하세요. 비밀번호 최대길이 제한은 없으므로 불안하다면 정말 긴 문자를 입력해도 됩니다. (모든 문자 입력 가능하지만 스페이스(공백)와 # 문자는 사용할 수 없습니다.)
변경한 비밀번호는 /etc/mysql/debian.cnf 에 적어두세요.


앞으로 데이터베이스 사용자 추가, 관리는 dbadmin 계정으로 로그인하여 처리하세요.

 

10) 방화벽 설정 및 ipv6 끄기

아직 ipv6를 사용하는것은 권장하지 않습니다. ipv6기능을 끄면 문제가 생기지는 않지만, ipv6기능을 켜면 문제가 생길 수도 있습니다.

#vi /etc/sysctl.conf

맨 밑에

1
2
3
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

추가.

 

설정파일 적용

#sysctl -p

 

검사

#cat /proc/sys/net/ipv6/conf/all/disable_ipv6

1 이면 disable 된 상태이다.

q30

 

iptables 를 사용해서 리눅스 방화벽 설정하기 (접근 제어) : https://blog.lael.be/post/7982

당신이 클라우드 호스팅을 이용중이고, 호스팅에서 클라우드 방화벽을 지원한다면 이 작업을 건너뛰고 클라우드 방화벽을 사용하길 권장합니다.

TCP 80TCP 443TCP 22 번 포트를 Allow 하면 됩니다.
IP 제한을 걸 수 있다면 TCP 22번을 자신의 아이피(MY IP)만 허용하도록 설정하세요.

 

11) 기본사이트 관련 파일 정리

폴더 이동

# cd /var/www/html

목록 보기

# ls -l

 

index.html, mydbadmin, myphpinfo.php 3개의 파일이 있을건데, 이름을 바꾸거나, 이동하거나, 삭제하는 것을 추천합니다.
지금 작업하지 말고, 이 블로그 글을 모두 읽고난 후에 작업하세요. 이 파일을 그대로 놓아두어도 큰 문제가 발생하지는 않습니다.

 

12) 실제 사용 테스트 (실제로 사용해 보는 예제)

1] 도메인 준비하기

무료 도메인은 발급 받으려면 https://blog.lael.be/post/6070 글로 이동하세요.
유료 도메인을 구매 하려면 https://blog.lael.be/post/6357 글로 이동하세요.

유료, 무료 모두 사이트가입 -> 도메인발급 까지 5분이면 됩니다. 도메인을 반드시 준비해주세요.

자신의 PC 에 설치한 가상머신이나 회사 내부 사설망의 서버에도 도메인 연결이 가능합니다. 무엇을 하든 반드시 도메인을 준비해주세요.

다음의 예제들은 도메인이 있다고 가정하고 진행합니다.

도메인을 발급 받은 후(또는 도메인 구매 후), 네임서버 설정에서 IP 주소(A 레코드)를 설정하세요.

 


본문의 예제에서는 방금 발급받은 myuser1.ga 라는 도메인을 사용해서 진행하겠습니다.

- 도메인 연결 확인
서버 컴퓨터에서 다음을 입력합니다.

# ping myuser1.ga

ping 의 결과에 본인이 설정한 IP 가 표시되면 도메인의 IP 주소 설정이 제대로 된 것입니다.
만약 IP 주소가 올바르지 않게 표시된다면 도메인-IP 연결설정을 다시 확인해보고, 잠시(5분 ~ 2시간) 후 다시 확인 해보세요.


2] 일반 사용자 계정 생성

일반 사용자 추가 - 보통 도메인의 앞단어를 사용합니다.

#adduser myuser1

(참고로 위의 추가와 반대동작을 하는 계정삭제 명령어는 - 계정을 삭제하고 홈디렉토리도 삭제함 -

#userdel -r myuser1

입니다.)

보통 웹루트는 홈디렉토리에 하지 않습니다.
(일반적으로 www, htdocs, public_html 라는 이름을 웹루트로 사용합니다.)
저는 주로 www 이름을 사용합니다. 사용자변경 후 www 디렉토리를 생성하고 빠져나오기

#su -l myuser1
#mkdir www
#exit

 

3] 웹사이트 Apache 환경설정파일 작성

사이트 생성 파일 작성할 때, 실수가 생기는 경우가 많아서, 환경설정 생성기를 만들었습니다.
자신의 환경에 맞추어 입력하시면 됩니다. 브라우저 즐겨찾기에 등록 후 필요할 때 마다 쓰시면 됩니다.

아래의 링크를 클릭해서 환경설정 파일을 생성하세요.

Apache2 환경설정 생성기
https://webmaster.cafe/tools/apache-conf-generator/

 

위에서 생성한 설정 구문을 아래의 위치에 넣어주세요.

/etc/apache2/sites-available/[[사이트주소]].conf

 

사이트 켜기

오타를 방지하기 위해서 a2ensite 앞몇단어 + 탭  을 입력해주세요.

# a2ensite myuser1.ga.conf

 

참고 : 사이트 끄는 명령어

# a2dissite myuser1.ga.conf

 

변경사항 적용

# service apache2 reload

 

무료 인증서를 발급 받으시려면

HTTP사이트 구동 -> letsencrypt 인증서 발급 -> 발급받은 인증서를 사용해서 HTTPS 사이트 구동을 진행하세요.

설정이 어렵진 않지만 몇번 반복해야하는 단계가 있습니다.

< 오류 없이 사이트가 접속되면 성공 >

참고 : 사이트 주소와 연결되는 환경설정 파일을 보는 명령어

# apache2ctl -S

 

 

4] 데이터베이스 생성

* phpmyadmin 환경설정

phpmyadmin 웹소프트웨어의 환경설정을 진행합니다. 설정하면 프로그램 화면이 조금 더 깔끔해집니다.
phpmyadmin 이 설치된 폴더로 이동한 후에 config.sample.inc.php 파일 이름을 config.inc.php 로 바꿉니다.

 

config.inc.php 파일을 열어서 아래의 내용으로 변경해줍니다.

config.inc.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
/**
* All directives are explained in documentation
* at <https://docs.phpmyadmin.net/en/latest/config.html>.
*/
 
$i = 0;
$cfg = array();
 
$cfg['blowfish_secret'] = 'RkyE=T6t6KjX65KPC7/XNQ\Bk9EhBXar'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
$cfg['NavigationTreeEnableGrouping'] = false;
$cfg['MaxNavigationItems'] = '200';
$cfg['FirstLevelNavigationItems'] = '200';
$cfg['ShowDatabasesNavigationAsTree'] = false;
$cfg['NumRecentTables'] = 0;
 
// add new
$i++;
$cfg['Servers'][$i]['host'] = 'localhost';
 
// add new
/*
$i++;
$cfg['Servers'][$i]['host'] = '123.250.250.250';
// $cfg['Servers'][$i]['port'] = '3306';
*/
 
// add new
/*
$i++;
$cfg['Servers'][$i]['host'] = 'mydb.cluster-cf1onrqhtz3u.ap-northeast-2.rds.amazonaws.com';
// $cfg['Servers'][$i]['port'] = '3306';
*/

 

위에서 생성한 phpmyadmin 웹페이지로 이동한 후에, 자신이 생성한 관리자계정(dbadmin) 으로 로그인하세요.

 

아래 그림과 같이 새로운 DB 사용자를 추가해 주세요.

동명의 데이터베이스를 생성하고 모든 권한을 부여“에 체크하면,
사용자 아이디를 만들때같은 이름으로 데이터베이스를 만들고 접근권한 설정도 해줍니다. (거의 항상 체크하는 옵션임)

만약 데이터베이스 사용자가 올바르게 추가(생성)되었는지 테스트하고 싶다면 phpmyadmin 로그아웃 후 생성한 아이디(위의 그림에서는 myuser1)로 로그인 해보세요.

 

5] 원하는 웹 소프트웨어 설치

이 예제에서는 전세계 CMS 의 60% 를 차지하는 워드프레스(WordPress)를 설치해보겠습니다.

일반적으로 많이 사용하는 소프트웨어가 안전하고, 디자인 파일이 많고, 문제가 생겼을 때 참고할 자료가 많습니다.

점유율 참조 : https://w3techs.com/technologies/history_overview/content_management

워드프레스 공식사이트 : https://wordpress.org/download/

 

생성한 일반 사용자 계정으로 로그인 (이 글 예시의 경우 myuser1 으로 로그인)

웹루트로 이동

# cd www

wordpress 다운로드

# wget https://wordpress.org/latest.zip

위의 명령어는 항상 wordpress 최신버전을 다운받습니다.

 

압축해제

# unzip latest.zip

 

다운받은 설치파일 삭제

# rm latest.zip

 

워드프레스 구성파일을 wordpress 폴더에서 꺼내기

# mv wordpress/* .

 

사용하지 않는 wordpress 폴더 삭제

# rmdir wordpress

 

웹사이트 접속 후 설치 진행!

웹브라우저에서 내 도메인 주소로 접속해보자.

필요한 정보는 이미 알고 있으므로, 편하게 설치를 진행해보세요.

 

6] 완성

완성! 적당히 테마 선택하시고 꾸미시면 됩니다.

워드프레스의 세계로!

 

이제 여러분이 원하는 웹 소프트웨어를 다운 받아서 설치/ 구동해보세요!

 


선택 작업

동시 접속자 수 설정하기

- Ubuntu Apache 에서 프로세스가 동시 처리가능한 갯수는 150개 입니다. 1000개의 처리 요청이 있다면 150개는 프로세서가 즉시 처리하고, 나머지 850개는 대기열에서 대기하다가 순서대로 처리됩니다.
CPU 나 Memory 사용량이 높지 않은데, 사이트가 5초 대기한 후에 접속된다면 이 부분을 설정해야 합니다.

이 프로세스 제한을 늘려서 더 많은 사용자가 빠르게 이용할 수 있도록 해봅시다.

조언

  • 서버 세팅 초기에 설정하지 마세요. 동시 접속이 늘어나서 사이트 접속이 느려졌다고 느낄 때 하세요. 반드시 설정해야되는 작업은 아닙니다.
  • 일반적으로 동시 접속(최근 3분간 활성사용자) 450명(설정값의 3배)이 넘지 않으면 이 작업을 할 필요가 없습니다.
  • 서버의 메모리가 4GB 또는 그 이상일 때에만 설정하세요. 이 작업을 하면 Apache 가 더 많은 메모리를 사용하게 됩니다.

 

실행모드 확인

# a2query -M

prefork 라고 뜰겁니다.

 

 

prefork 관련 동시접속 설정

# vi /etc/apache2/mods-available/mpm_prefork.conf

당신의 서버 메모리가 4GB 또는 그 이상(4GB or more)라면 아래 숫자를 적용해보세요.

1
2
3
4
5
6
7
8
<IfModule mpm_prefork_module>
    StartServers             10
    MinSpareServers       10
    MaxSpareServers      20
    MaxRequestWorkers     300
    ServerLimit           300
    MaxConnectionsPerChild   0
</IfModule>

설정 변경 후 Apache 를 재시작하면 적용됩니다.

 

규칙

StartServer 와 MinSpareServers 는 같은값이어야 합니다.
MaxSpareServer 는 MinSpareServers 의 2배이어야 합니다.
ServerLimit 의 기본값은 256 입니다.
MaxRequestWorkers 는 ServerLimit 을 넘을 수 없습니다.
만약 MaxRequestWorkers 값이 256 이 넘는값을 설정하려면 같은 값으로 ServerLimit 도 설정해주세요.

반응형
LIST