Ubuntu 18.04 LTS 에서 웹서버(NGINX + PHP-FPM + MariaDB) 구성하기

HYEONG HWAN, MUN/ 1월 22, 2019/ 미분류/ 40 comments

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


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

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

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


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

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

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

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

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


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

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

* 리눅스 설치 후 기초 원격접속 설정을 하려면 이 글로 이동하세요.
리눅스 서버 ssh 원격접속 설정하기 : https://blog.lael.be/post/7678

* VI 에디터(리눅스 편집기) 사용하는 방법https://blog.lael.be/post/7321

* Ubuntu 클라우드 서버호스팅을 찾는 중이라면 https://blog.lael.be/post/44 글로 이동하세요.

* 서버에 파일을 업로드하고 싶다면 filezilla 를 사용해보세요. https://filezilla-project.org/

 

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

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


Nginx

공식사이트는 http://nginx.org/ 이다. 엔진엑스 라고 부른다.
Igor Sysoev (이고르 시소에브) 라는 러시아 개발자가 개발했으며, 이 소프트웨어의 주요 개발 목표는 “동시접속 처리에 특화된 웹서버 프로그램” 이다.

 

- Nginx 가 Apache 보다 동시접속 처리에 좋은 이유

Nginx 는 Apache 에서 널리 사용되는 기능만 구현하였다. 즉 기능이 많지 않다. 동작이 단순하다.
Nginx 자체는 별로 많은 연산을 하지 않는다. 주로 전달자 역할만 하며 이런 이유로 Reverse Proxy Tool 이라고도 부른다.

 

- Nginx 와 Apache 중 어떤 웹서버를 선택해야할까?

당신의 취향이다.
둘은 분명히 장단점이 있다. 다 되는 Apache 를 선택할 것이냐, 동시접속처리를 잘하는 Nginx를 선택할 것이냐는  본인의 판단에 달려있다.
다만 동시연결수 250이상 (동시접속자 환산 700명정도?) 라면, 서버를 증설하거나, Nginx 환경으로 바꾸어야 할 것이다.

 

PHP-FPM

NginxPHP 를 해석할 수 없기 때문에 외부 프로그램의 도움을 받아야 한다.
PHP-FPMNginx 로 부터 전달 받은 경로의 PHP 파일을 실행시키고 그 실행 결과를 Nginx 에게 반환하는 독립 실행 프로그램이다.

 


1) 쉘 기본 언어값 변경

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

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

# qwerty

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

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

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

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

k3

 

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

 

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

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

당신이 클라우드 서버(예를 들어 AWS, Linode 등등)를 사용 중이라면 이 단계를 건너 뛰세요. (이미 클라우드 사업자들이 적절히 빠른 서버를 사용하도록 처리해 두었을 것입니다.)

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

 

APT 서버 변경하는 방법

# vi /etc/apt/sources.list

내용을 다 지우고 다음의 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 라는 우분투에 내장된 프로그램을 이용해서 프로그램을 쉽게 설치/제거 할 수 있습니다.

 

패키지 목록 갱신.

#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

 

- 참고 : 가상서버(클라우드서버)는 실제 물리서버의 시간으로 자동으로 동기화됩니다.
즉 가상서버(클라우드서버)를 사용하는 경우 시간교정을 설정할 필요가 없습니다.

 

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

이 단계는 필수 단계가 아닙니다.

이 단계를 설정하면, 메일발송(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)를 하지않고 로컬로 보낸다.


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

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


7) APT 소스리스트 파일에 NGINX, PHP, MariaDB 저장소 추가

이 글에서는 NGINX, PHP, MariaDB 를 모두 최신버전으로 설치할 것이다.
우분투 공식 저장소에는 stable 버전이 존재한다. stable 버전이란 “기능추가 없이 보안과 안정성 패치만 하는 버전” 을 뜻한다.
최신버전을 설치하기 위해서 APT 소스리스트 파일에 최신버전이 담겨있는 저장소를 추가해주어야 한다.

APT 설정 관리도구 설치

# apt install software-properties-common

 

nginx 저장소 추가

# vi /etc/apt/sources.list.d/nginx.list

아래 내용으로 생성해주세요. (더블클릭하면 전체 선택됨)


# Nginx
deb [arch=amd64,arm64] http://nginx.org/packages/mainline/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx


nginx 저장소 인증키 추가

# curl -sS http://nginx.org/keys/nginx_signing.key | apt-key add -

OK 라는 글자가 나오면 정상이다.

 

MariaDB 저장소 추가

# vi /etc/apt/sources.list.d/mariadb.list

아래 내용으로 생성해주세요. (더블클릭하면 전체 선택됨)


# MariaDB
deb [arch=amd64,arm64] http://ftp.kaist.ac.kr/mariadb/repo/10.3/ubuntu bionic main
deb-src http://ftp.kaist.ac.kr/mariadb/repo/10.3/ubuntu bionic main


MariaDB 저장소 인증키 추가

# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

imported 관련 메세지가 나오면 정상이다.

 

PHP 저장소 추가 & 저장소 인증키 추가

# add-apt-repository ppa:ondrej/php

엔터키 한번 눌러주면 된다.

 


저장소 추가 구문은 /etc/apt/sources.list.d/ 에 위치한 nginx.listmariadb.listondrej-ubuntu-php-bionic.list 에 저장되어 있습니다.
저장소 인증키는 /etc/apt/trusted.gpg 파일에 저장되어 있습니다.

 

추가된 저장소 인증키 목록 보기

# apt-key list

nginx signing key, MariaDB Signing Key, Launchpad PPA for Ondřej Surý 가 등록되어 있는 것을 확인 할 수 있다.

 

- APT 소스패키지 정보 업데이트

신규 저장소를 추가하였고, 저장소 인증키도 등록했으니, APT 패키지 정보를 갱신해보도록 하자.

# apt update

 


 

8) NGINX 설치

nginx 설치

# apt install nginx

 

자동으로 설치되고, 실행되고, 재부팅시 자동실행 되게 설정된다.

# service nginx restart

nginx 설치버전 확인

# nginx -v

 

당신이 설치한 버전은 이것보다 높을 것이다.

 

- 동작여부를 직접 확인해본다.

웹브라우저를 켜고 http://123.456.123.456 (서버의 아이피) 에 접속해보자.

k12

 

Welcome to nginx! 문구가 뜨면 정상이다. (이 파일의 위치는 /usr/share/nginx/html/index.html 이다.)

 

 

9) PHP-FPM 설치

- PHP7-FPM 최신버전 설치

# apt install php7.3-fpm

 

- 콘솔 PHP 버전확인

# php -v

 

- PHP-FPM 프로그램 버전확인

ondrej 님이 왜 패키지명php7.3-fpm 이라고 해두고, 실행파일명php-fpm7.3 으로 정했는지 이해가 가지 않지만, 아무쪼록 php-fpm7.3 파일을 실행해 보도록 하자.

# php-fpm7.3 -v

 

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

- 다국어 처리모듈

#apt install php7.3-mbstring

- 이미지 처리모듈

#apt install php7.3-gd

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

#apt install php7.3-curl php7.3-xml

- 수학 연산 확장 모듈

#apt install php7.3-bcmath

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

#apt install php7.3-mysql

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

#apt install composer

 

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

#apt-cache search php7.3

 

 

PHP Default timezone 설정하기.

이 값을 설정하지 않으면 시스템 timezone 을 사용합니다.

PHP Default timezone 을 설정하는 것은 필수는 아니지만 매우 권장하는 작업입니다. 설정해주세요.

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

# vi /etc/php/7.3/fpm/php.ini
# vi /etc/php/7.3/cli/php.ini

 

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

k21

이 값을 찾아서

 

k22

이렇게 변경.

설정 적용을 위하여 php-fpm 재시작.

# service php7.3-fpm restart

 

10) MariaDB 설치

- MariaDB 콘솔 프로그램 설치

# apt install mariadb-client

콘솔에서 mysql, mysqldump, mysqladmin 같은 명령어를 사용할 수 있게 된다.

 

당신이 만약 DB 클라우드 서비스(RDS 같은 서비스)를 사용할 예정이면, 10번 나머지 단계건너 뛰어도 됩니다.


 

- MariaDB 서버 설치

# apt install mariadb-server

설치시에 데이터베이스 root 사용자의 비밀번호를 설정한다.

설치가 완료되면 MariaDB 가 실행되며, 재부팅시에도 자동 시작되도록 설정된다.

 

서비스 상태확인

# service mysql status

 

 

설치된 버전 확인

#mysqladmin -p version

 

MariaDB 10.3.14 버전이 설치되어 있다.

 

 

기본 언어셋 설정(중요)

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

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

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

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

#vi /etc/mysql/mariadb.conf.d/override.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

query_cache_type = ON
query_cache_limit = 4M
query_cache_size = 64M

slow_query_log         = 1
slow_query_log_file    = /var/log/mysql/mysql-slow.log
long_query_time = 5

skip-log-bin

sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

 

 

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

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

# mysqld --verbose --help | grep configtest

오류메세지가 출력되지 않는다면 정상이다. ([Note] Plugin ‘FEEDBACK’ is disabled. 메세지는 무시해도 된다.)
설정파일 오류가 없다면 mysql 을 재시작하여 적용하도록 하자.

 

변경사항 적용

# service mysql restart

 

변경사항 적용 확인

# mysqladmin -p variables | grep character

 

 



 

11) Nginx 와 PHP-FPM 연결

현재 상태에서 Nginx 프로그램은 기본적으로 nginx 사용자 권한으로 실행되고,

PHP-FPM 프로그램은 기본적으로 www-data 사용자 권한으로 실행된다.

둘의 사용자 권한을 www-data 로 일치시키자. 이 사용자는 운영체제 설치시 자동으로 생성되는 특수목적 사용자이다.

nginx 의 설정값만 바꾸면 된다.

 

- Nginx 사용자 권한 변경

# vi /etc/nginx/nginx.conf

첫줄의 user  nginx; 를 user  www-data; 로 바꿉니다.
둘째줄의 worker_processes 1; 를 worker_processes auto; 로 바꿉니다. (고사양 서버에서 성능이 더 좋아집니다.)

# service nginx restart

 

#환경설정 자동생성기

아래의 내용을 진행하면서 설정에 어려움이 있다면 환경설정 자동생성기를 사용해보세요.

https://webmaster.cafe/tools/nginx-conf-generator/

- Nginx 와 PHP-FPM 연동 설정

- fastcgi 파라미터 설정
nginx 변수를 php-fpm 변수로 넘겨주는(parameter) 작업입니다.

예를 들어 다음과 같은 구문은

fastcgi_param REQUEST_METHOD $request_method;

nginx 의 $request_method 변수를 php-fpm 에 REQUEST_METHOD 이름으로 넘겨준다는 뜻입니다.

넘겨준 변수 값은 PHP 에서 $_SERVER[‘REQUEST_METHOD’] 를 통해 확인 할 수 있습니다.

 

# vi /etc/nginx/fastcgi_params

 

해당 fastcgi_params 파일 내용은 아래의 내용과 같이 바뀌어야 한다. (더블클릭시 전체 선택됨)

이 작업을 하지 않으면 wordpress 등의 소프트웨어에서 짧은URL(rewrite) 기능을 사용할 수 없게된다.


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_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  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

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;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_path_info;
fastcgi_param  PATH_INFO          $fastcgi_path_info;

 

- 기본사이트 설정

명시적으로 지정하지 않은 도메인 요청에 대해서 연결될 사이트를 정의한다.

# vi /etc/nginx/conf.d/default.conf

 

이 글의 예시에서는 “지정하지 않은 도메인 요청에 대해서 응답하지 않게” 하도록 하겠다.
기존의 default.conf 내용을 지우고 아래의 5줄을 입력한다.


server {
    listen       80 default_server;
    server_name  localhost;
    return 444;
}

만약 기본사이트 설정을 다르게 하고 싶다면, https://webmaster.cafe/tools/nginx-conf-generator/ 페이지를 방문하여 살펴보도록 하자. 4가지의 예시를 적어두었다.

- Nginx 재시작

# service nginx restart

 

 

12) 방화벽 설정 및 ipv6 끄기

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

#vi /etc/sysctl.conf

맨 밑에


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

 

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

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] 웹사이트 Nginx 환경설정파일 작성

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

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

Nginx 환경설정 생성기
https://webmaster.cafe/tools/nginx-conf-generator/my-example-site.com.php

 

 

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

/etc/nginx/conf.d/[[사이트주소]].conf

 


- php pool 파일 만들기

PHP-FPM Pool 파일 작성
# vi /etc/php/7.3/fpm/pool.d/myuser1.conf

PHP Pool 파일은 리눅스 사용자당 하나 만들어두고, nginx Conf 파일은 사이트당 하나 만들어서 운영하도록 하자.

 

자주 쓰이는 PHP 설정 값들도 적어두었으니 변경을 원한다면 주석(;)을 제거후 바꾸도록 하자.

첫번째 줄의 대괄호[] 는 주석이 아니라 PHP Pool의 이름이니 사이트마다 중복되지 않게 적도록 하자.
만약 PHP실행프로세스 이름(php pool name)이 중복된다면, 중복된 이름의 어느하나만 실행되고 나머지는 무시된다.

php.ini 파일은 default timezone 이외에 값을 수정하지 않으며, 필요한 값은 이 프로세스 설정파일에 수동으로 지정한다.


[myuser1]

user = myuser1
group = myuser1

listen = /run/php/myuser1.sock

listen.owner = myuser1
listen.group = www-data

pm = dynamic
pm.max_children = 9
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4

php_admin_value[session.cookie_httponly] = 1

;php_flag[display_errors] = off
;php_admin_value[error_log] = /var/log/fpm-php.www.log
;php_admin_flag[log_errors] = on

;catch_workers_output = yes

;php_admin_value[memory_limit] = 128M
;php_admin_value[max_execution_time] = 120
;php_admin_value[max_input_time] = 300

;php_admin_value[post_max_size] = 25M
;php_admin_value[upload_max_filesize] = 25M

 

- DB 서버가 분리되어 있으며 php-fpm 이 구동되는 서버램이 2GB 이상일 경우 아래의 값을 사용한다.


[myuser1]

user = myuser1
group = myuser1

listen = /run/php/myuser1.sock

listen.owner = myuser1
listen.group = www-data

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

php_admin_value[session.cookie_httponly] = 1

;php_flag[display_errors] = off
;php_admin_value[error_log] = /var/log/fpm-php.www.log
;php_admin_flag[log_errors] = on

;php_admin_value[memory_limit] = 128M
;php_admin_value[max_execution_time] = 120
;php_admin_value[max_input_time] = 300

;php_admin_value[post_max_size] = 25M
;php_admin_value[upload_max_filesize] = 25M

 

nginx 및 php-fpm 재시작.

실제 운영중에는 되도록 reload 명령어를 사용하되, 원하는 변경이 되지 않으면 restart 를 하도록 하자.

# service nginx reload
# service php7.3-fpm reload

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

웹루트로 이동

# cd www

그 위치에 적절한 웹소프트웨어를 설치하여 실행합시다.

[[ 내용 보충할 것 : phpmyadmin 설치방법, wordpress 설치방법 ]]

# 1차 글 완성 : 2019년 02월 16일
# 2차 글 완성 : 2019년 05월 15일

40 Comments

  1. 수고하십니다.

    php7.3 인데
    예제 곳곳에 7.0으로 복사되어 온게 잇네요

    fastcgi_pass unix:/run/php/php7.0-fpm.sock;

    이런거요

    1. 안녕하세요. 본문은 계속 수정할 예정입니다.
      마리아디비 오류는.. 아무래도 mariadb에서 제공중인 자동설치 스크립트에 오류가 있는걸로 보이네요.
      수동설정 방법으로 다시 설명해야할것 같네요.

  2. 고생많으십니다.
    항상 감사합니다.

    전 알려주신 아마존리눅스로 사용하고 있습니다~

    1. 안녕하세요~
      새해엔 Computist 가 되셨군요!
      올해에 할 공부 응원해드리고, 니로의 퇴원을 축하드립니다!

  3. access log 맽끝 main 이랑 combined 차이가 무엇인가요?

    1. 로그 파일에 적히는 형식입니다. main 이랑 combined 를 많이 사용합니다.
      직접 형식을 지정할 수도 있습니다.

  4. 안녕하세요 라엘님, 글 잘 봤습니다.
    저는 라즈베리파이 3 b+에 설치를 하고 있는데 글 중간에 막히는 부분이 있었습니다.
    나름대로 해결방법을 찾아서 공유해봅니다.

    문제 1. “12) MariaDB 설치”에서 다운로드에 실패했다는 오류가 발생했습니다.
    해결 1. apt install mariadb -> apt install mariadb-server
    로 명령어를 입력해주니 정상적으로 설치가 되었습니다.

    문제 2. “14) Nginx 와 PHP-FPM 연결”에서 phpinfo파일을 만들고 확인하려는데 502오류가 발생했습니다.
    해결 2. default.conf의
    fastcgi_pass unix:/run/php/php7.0-fpm.sock; -> fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    으로 변경해주니 해결되었습니다.

    1. 우영님 안녕하세요?
      얼마전에 오픈한 dev 도메인을 사용하시는군요!
      알려주신 부분은 확인하고 반영하겠습니다. 감사합니다!

      1. 넵 dev 도메인 공개하자마 혹해서 사버렸어요!
        항상 라엘님 글 보고 도움 잘 받고 있습니다. 감사합니다 😀

  5. apt install mariadb말고 apt install mariadb-server 하면 잘됩니다. =_=b

  6. 안녕하세요. 라엘님 항상 도움되는 내용 올려 주셔서 감사합니다.

    Php 설정에서 cli 까지 수정해야 하는 특별한 이유가 있나요?
    다른 사이트에서 참고하면서 공부할때는 설정할때 cli에 대한 언급이 없었거든요~

    1. 아하!
      php 웹소프트웨어중 cron을 필요로 하는 것들이 있어요. (예를들어 laravel의 scheduler 같은것들)
      이 cron에서 실행되는 php는 php-cli 로 동작합니다.
      따라서 저는 이 상황을 위해 날짜 타임존 값을 설정하도록 가이드합니다.

  7. 안녕하세요
    블로그 글과 코멘트 글 참고하여 차근차근 따라해서 워드프레스까지 설치했습니다. 감사합니다

    그런데 막히는 부분이 있어서요…
    16) 웹사이트 구동예제 에서 adduser로 생성한 myuser1 사용자계정으로 파일질라 ftp 접속이 안됩니다.

    ubuntu 계정으로는 ftp 접속은 되는데(아마존 EC2 ppk파일이용), myuser1 로 소유자/그룹 권한 775, 755이 부여된 www 디렉토리 안에 파일/폴더 생성 및 수정작업이 안되네요. 파일 다운로드는 가능하고요.

    www 폴더내 모든 하위 폴더/파일의 소유자/그룹은 myuser1/myuser1 로 부여했고요.

    그래서 www 폴더에 ftp를 통한 파일작업을 위해서는 myuser1 계정으로 ftp 접속이 가능해야 할 것 같은데 접속자체가 안되네요(id, password 이용접속)

    블로그내 사용자계정 관련 셋팅이 아래 같은데 ftp관련해서 수정해야 할 부분이 있나요?

    # vi /etc/nginx/nginx.conf
    nginx user : www-data

    # vi /etc/php/7.0/fpm/pool.d/myuser1.conf
    php-fpm pool user : myuser1
    php-fpm pool group : myuser1
    listen = /run/php/myuser1.sock
    listen.owner : myuser1
    listen.group : www-data

    주말없이 며칠동안 머리싸매다가 도저히 해결기미가 안보여서 질문드려요…
    어떻게 해야 하나요 도와주세요

    1. 안녕하세요?
      FTP 설치글도 작성해 두었습니다.
      https://blog.lael.be/post/8404 글을 참고해주세요.

      1. vsftp 를 첨 다뤄보는데 덕분에 잘 설치해서 셋팅했고 ftp 전송 잘 됩니다 감사합니다
        꾸벅 (^^)(__)(^^)

  8. nginx와 mariaDB 설치시 i386 애러가 나는 경우가 있네요.
    저같은 경우는 아래와 같이 처리 하였습니다.

    # Nginx
    deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ bionic nginx
    deb-src [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ bionic nginx

    # MariaDB
    deb [arch=amd64] http://ftp.kaist.ac.kr/mariadb/repo/10.3/ubuntu bionic main
    deb-src [arch=amd64] http://ftp.kaist.ac.kr/mariadb/repo/10.3/ubuntu bionic main

    1. 아하. 이 내용을 가이드에 반영해야겠네요.
      감사합니다!

  9. 안녕하세요 라엘님, 간만에 여쭤보고 싶은게 있어서 들렸습니다!

    현재 서버를 로드밸런싱으로 구성해서 라이믹스를 사용하는데
    “11) Nginx 와 PHP-FPM 연결”의 fastcgi_params 설정부분에서
    fastcgi_param HTTPS $https if_not_empty;을 fastcgi_param HTTPS ON;
    으로 설정해서 https 사용설정 시 무한 리다이렉트에 안빠지는 것을 알았습니다.

    그래서 fastcgi_param HTTPS $https if_not_empty;의 의미를 알고싶은데 알려주실 수 있나요?
    나름대로 찾아봤는데 딱히 이렇다 싶은 답을 찾지를 못했습니다.

    1. 안녕하세요!
      PHP 에서 $_SERVER 변수 중에, $_SERVER[‘HTTPS’] 라는 값이 있는데,
      정상적인 값은 *HTTP 일 경우 : 정의 안됨(undefined), *HTTPS 일 경우 $_SERVER[‘HTTPS’] = ‘ON’ 이 정의되야 합니다.
      로드밸런서를 사용하는, 다음의 특수한 경우에 문제가 있을 수도 있습니다.
      어플리케이션 로드밸런서나 TLS 로드밸런서의 경우, 로드밸런서 – 실제서버 는 plain HTTP 로 통신하고, 로드밸런서에서 https 인증서를 입혀서 응답을 하게 됩니다.
      http 일 경우 https 로 이동시키는 코드가 보통, if ($_SERVER[‘HTTPS’] != ‘ON’) 이런 조건으로 동작하는데, 서버 입장에서는 HTTP 요청이라서 이 조건이 무조건 true 가 됩니다. 이 경우, 계속 https 이동 redirect 가 발생하게 됩니다.
      해결 방법은 위 댓글처럼 $_SERVER[‘HTTPS’] = ‘ON’ 으로 강제 지정하거나(이 경우 http->https 이동 코드는 동작안하겠죠?),
      $_SERVER[‘HTTPS’] 값 대신에 $_SERVER[‘REQUEST_SCHEME’] 값을 사용하도록 코드를 고쳐야 합니다.

      1. 감사합니다 많은 도움이 되었습니다.
        항상 좋은 포스트를 공유해주셔서 정말 감사드립니다!

  10. 본문 내용대로 명령어를 수행했는데 mysql character set이 변경이 안되서
    도움을 부탁드리려고 글을 올리게 되었습니다.

    mysqld –verbose –help | grep configtest
    해당 명령어를 수행하면

    2019-08-24 2:58:13 0 [Warning] Could not increase number of max_open_files to more than 1024 (request: 4187)
    2019-08-24 2:58:13 0 [Warning] Changed limits: max_open_files: 1024 max_connections: 151 (was 151) table_cache: 421 (was 2000)
    2019-08-24 2:58:13 0 [Note] Plugin ‘FEEDBACK’ is disabled.
    2019-08-24 2:58:13 0 [Warning] Could not open mysql.plugin table. Some options may be missing from the help text

    위와 같은 에러가 발생합니다.

    mysqladmin -p -u root variables | grep character
    해당 명령어를 입력하면

    | character_set_client | latin1 |
    | character_set_connection | latin1 |
    | character_set_database | latin1 |
    | character_set_filesystem | binary |
    | character_set_results | latin1 |
    | character_set_server | latin1 |
    | character_set_system | utf8 |
    | character_sets_dir | /usr/share/mysql/charsets/ |
    | session_track_system_variables | autocommit,character_set_client,character_set_connection,character_set_results,time_zone

    이와 같이 변경이 안된 상태로 출력이 됩니다.

    혹이 이와 같은 경우 어떻게 하면 해결할 수 있을까요?

    1. mysql 재시작이나, 운영체제 재부팅 해보세요.

      1. 여러번 재부팅을 해도 결과가 같네요
        검색을 해보니 os의 limit 제한을 풀어야 한다는데
        이해가 잘 되지 않아 질문 드렸습니다 ^^

        계속 방법을 검색해 보고 있는데
        혹 다른 방법 중 제가 테스트 해볼게 있을까요?

      2. nginx를 제대로 사용하려면 소스 설치를 해야한다고 해서
        nginx만 메뉴얼을 보고 소스 설치 후 나머지만 따라했었습니다.

        혹시나 해서 iwinv에서 신규 서버로 테스트를 해보니
        본문과 같이 패키지 설치를 하면 문제가 없고
        소스 설치를 하면 워닝이 위와같이 뜨네요

        혹시 nginx 소스 설치 (추천하실만한 성능향상 모듈을 포함)
        버전으로된 설치 메뉴얼을 알려주실 생각은 없으신지요?

        nginx를 배우려 하니 컴파일이 필수인것 같은데
        알려주신 방법을 제대로 쓰려고 하니
        생각보다 장벽이 너무 높은것 같아 죄송스럽지만
        어렵게 부탁을 드려봅니다

        혹 저와 같은 경험을 하실 분들을에게
        제 글이 도움이 되셨길 바라며 댓글을 남겨 봅니다.

        1. 누가 소스설치를 권했는지 모르겠지만..
          이 글대로 작업하는게 더 빠르고, 더 최적화되어있고, 더 안전하고, 더 유지보수가 잘됩니다.
          그리고 nginx 는 모듈도 몇종류 없어서 소스설치로 얻을수 있는 이득이 거의 없어요.

          1. 말씀 감사합니다.
            생각해보니 문제 없이 사용하는게 최고의 방법이라는 생각이 들었어요
            본문에 알려주신 방법대로 그대로 사용하려고 마음먹었습니다
            댓글 너무 감사드립니다 ^^

  11. 안녕하세요
    개인서버를 만들고싶어만하다가 교양수업으로 서버만들기를 듣고나서 용기가 생겨서 직접만들어 보려고 하는와중에 들어왔는데 정말 보물천지네요
    수업에는 코노하에 가상으로 만들었고 이번엔 집에 남는 데스크탑에 만들어서 친구들과 같이 사용 하려고 해볼려고합니다.
    그렇게 알아보는와중에 아파치 php Mysql 이렇게 세트였는데 요즘엔 바뀌는 추세이다를 보고 일일이 비교하면서 확인해보고있는데요
    한번에 할때 다알아보고 바꾸는거없이 하고싶어서요
    nginx가 빠르긴하지만 php의 속도에선 거의 속도차이가 안나고 동적?인것엔 약하다해서 아파치로 결정하고
    데이터 관련을 알아보는데 MariaDB가 요즘 괜찮다해서 아파치 php MariaDB를 깔고싶은데
    이곳 글목록엔
    아파치 php Mysql
    ngix php-FPM MariaDB
    이렇게 두가지방법을 올려두셨더라구요
    이렇게의 조합이 좋아서 이런 조합으로만 글쓰신것인가 궁금해서 덧글남깁니다.
    좋은글들 너무 감사합니다. 흥미로 시작하는 사람에겐 정말 좋은 글들이네요.

    1. 안녕하세요. 좋은 도전이 되길 바랍니다.
      사람마다 선호하는 구성이 다른데, 대부분 저 두가지 구성으로 선택합니다.
      Apache + PHP + MySQL 을 선택해보세요. 정말 빠르고 좋습니다.
      일 접속자 2만명 까지는 아무거나 선택하시고, 그보다 방문자가 높거나, 계층형 서버를 구성하려면 NGINX 로 하세요.

      1. 그렇군요 아직 아무것도 몰라서요 혼자 고민하다 댓글 남기길잘했네요.
        교양수업 목표가 만든 웹까지 들어가는거까지라 ㅋㅋ 한참 초보입니다.
        구글링하다가 정말 시원하고 세세하게 정리된글 감사합니다.
        친절하게 댓글도 달아주시고 꼭 성공해보겠습니다.
        감사합니다.

  12. 안녕하세요.

    이전글을 참조하여 Ubuntu 18.04 LTS 에 APM을 설치했는데 이번에 nginx+php-fpm+mariadb를 설치해도 무방한가요?

    만약 가능하다면, 두 개의 다른 서버를 각각, 한 컴퓨터로 운영할 수 있는지 궁금해서 댓글 남겨봅니다.

    1. 동일한 서비스를 하는 프로그램끼리 충돌하게 되고, 어느 하나만 실행되게 됩니다.
      조합을 바꾸려면 새로운 서버를 발급받은 후 시도해주세요.

  13. 안녕하세요 너무나 도움되는 알찬 포스팅 감사합니다!! 이 글을 보고 따라해보려하는데 라엘님이 추가 보충할 내용 phpmyadmin, wordpress 이라고 써놓으신 건 이후 작성 계획이 없으신지 묻고싶습니다! 그냥 https://blog.lael.be/post/7264 이 글의 마지막부분과 같이 그대로 따라하면 될까요??

    1. 맞습니다! 따라해보고 워드프레스 설치해보세요!

  14. 안녕하세요 라엘님 자꾸 에러가 나서 글 남깁니다.
    라이트세일에서 Ubuntu 18.04+Nginx+Mariadbf 를 깔려고 합니다

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

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

    # mysqld –verbose –help | grep configtest

    입력하면 여기서 이게 자꾸 뜨네요

    [Note] Plugin ‘FEEDBACK’ is disabled.

    어떻게 해야할지 모르겠네요

    1. 해당 값은 에러가 아닙니다. 무시하셔도 됩니다. 본문에도 기입해 두겠습니다.

  15. 안녕하세요 라엘님 궁금증이 생겨 글을 남기게 되네요
    라이트 세일에서 root 계정으로 10) mariadb를 설치하게되면 비밀번호 설정이 나오지를 않습니다.

    따로 비밀번호랑 DB이름을 생성해야하는 게 맞죠?

    1. 설치할 때 생성하게 되어 있습니다.
      혹시 방금 생성한 mysql(mariadb) 비밀번호가 기억나지 않는다면, /etc/mysql/debian.cnf 에 적혀진 아이디 비밀번호를 사용해서 사용해보세요.
      관련 사용법은 https://blog.lael.be/post/7264 글을 참조해주세요.

      1. MariaDB 10.4로 깔아서 비밀번호 설정이 나오지를 않았습니다. 10.3 버전은 비밀번호 설정이 나왔습니다.

        MariaDB 10.4 STABLE 버전이 있어서 깔아봤는데 그냥 깔리네요 이건 따로 비밀번호를 설정해야하더군요

        나중에 시간되시면 10.4 버전도 해주시면 감사하겠습니다. 좋은 하루 되세요

  16. 잘 읽고 다 잘 따라했습니다:)

    Phpmyadmin과 워드프레스 설치해보고 싶은데

    Apach php mysql 설치과정대로 같이 맞춰가도 문제 없이 진행할 수 있을까요?

    1. 구축 성공을 축하드립니다!
      응용프로그램은 이전에 보셨던 글 가이드대로 따라하시면 됩니다.
      워드프레스, phpmyadmin 설치만 성공하시면 대부분의 소프트웨어 설치해서 사용하실 수 있을거에요.

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>
*
*