Ubuntu 16.04 LTS 웹서버 세팅방법 (Nginx + PHP7-FPM + MariaDB)

HYEONG HWAN, MUN/ 11월 28, 2015/ 미분류/ 258 comments

https://blog.lael.be/post/2600

Last updated : 2017-06-12

[주의] 기존의 Ubuntu 14.04 세팅방법 글은 : https://blog.lael.be/post/4886 로 이전되었습니다. 글 비밀번호ubuntu 입니다.
[주의] 이 글은 Ubuntu 16.04 LTS 에 맞추어 작성되었습니다.
[정보] 회사 내에 전문 담당자가 없거나 리눅스에 서투르신 경우, 작업의뢰를 신청하세요. 프리랜서 이전/세팅 대행 : https://www.xetown.com/freelancer/3456 . 당신의 요청이 합당하다면 저분이 의뢰를 받아주실 겁니다.

#16.10.04 무료 보안인증서(SSL) 적용방법이 추가됨

무료 보안인증서 설치방법이 추가되었습니다. HTTPS 사용을 원하신다면, 본문을 다 읽으신 후 다음의 글로 이동해주세요.

https://blog.lael.be/post/5107


* Nginx 가 아닌 Apache 로 PHP 웹서버를 구축하시려면 https://blog.lael.be/post/73 글로 이동하세요. (쉽고 편함)

* Ubuntu 에서 JSP 웹서버 세팅을 원하시면 https://blog.lael.be/post/858 글로 이동하세요.

* Ubuntu 에서 PHP와 JSP를 동시 구동하고 싶으시면 https://blog.lael.be/post/1023 글로 이동하세요.

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


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 에게 반환하는 독립 실행 프로그램이다.

 


이제 실제로 세팅해 보도록 하겠다.

이 글은 Ubuntu 16.04 LTS (코드네임 : Xenial) 기준으로 작성되었다.

0) root 권한으로 변경

기본으로 주어진 계정이 root 가 아닐 경우에만 0번을 따라하세요.
본문의 모든 명령어는 root 의 권한에서 실행해야합니다. 자신에게 주어진 계정이 root 계정이 아니라면 다음의 명령어로 root 로 전환해 주도록 합시다.

자신의 계정 보기

# whoami

sudo 명령어 실행. root 권한으로 root 로 로그인하는 명령어를 실행한다.

# sudo su

자신의 계정 보기

# whoami

b6

기본 계정의 UserID 는 그림과 다를 수 있음. 위 예시에서 기본 아이디는 ubuntu 이다.

sudo 명령어를 사용할 수 있는 계정은 root 와 동급이니 비밀번호 관리에 신중해야한다. 기본 계정의 비밀번호를 어려운 것으로 변경해주도록 하자.

# passwd ubuntu

b7

 

1) 쉘 기본 언어값 변경

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

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

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

# apache2

이미 영어메시지가 출력된다면 1번을 건너뛰고 2번 단계로 넘어가도록 하자.

k1
k2

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

 

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

한줄만 써도 되는데, 쉘 언어값이 바뀌지 않으면 두줄을 적도록 하자.

k3

k4

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

 

2) 리눅스 버전체크

#uname -a
Linux Laelblog-dev 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

 

3) Ubuntu 버전체크

#cat /etc/issue
Ubuntu 16.04.1 LTS \n \l

a1

조금 더 자세하게 운영체제 버전정보를 알아보고 싶다면

# lsb_release -a

a2

4) 하드용량체크

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        49G  1.6G   45G   4% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            2.0G   12K  2.0G   1% /dev
tmpfs           396M  392K  395M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            2.0G     0  2.0G   0% /run/shm
none            100M     0  100M   0% /run/user

a3

위의 서버에서 현재 사용가능한 용량은 45GB 이다.

 

5) 메모리 체크

# free -m
             total       used       free     shared    buffers     cached
Mem:          3952        194       3758          0         13        105
-/+ buffers/cache:         76       3876
Swap:         1020          0       1020

3952M의 전체메모리중 현재 194M을 사용하고 있고 3758M가 비어있다.

k7

 

6) CPU 코어수 확인

cpu정보 프로세스를 읽어서 processor 항목이 몇개인지 갯수를 셉니다.

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

k8

위의 사진은 6 core 를 뜻합니다.

한번 정도는 다음의 명령어를 확인해 보세요. CPU 정보를 알 수 있습니다.

#cat /proc/cpuinfo | grep processor
#cat /proc/cpuinfo

k9



 

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

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

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

 

패키지 목록 갱신.

#apt-get update

 

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

#apt-get upgrade

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

 

8) 시스템 시간 설정

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

물론 초기 설치할 때 Asia/Seoul 을 설정했다면 이 작업을 할 필요는 없다. 하지만 또 한다고 해서 문제되지는 않는다.

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

#dpkg-reconfigure tzdata

GUI 환경이 나올 텐데, 순서대로 Asia - Seoul 을 선택하면 된다.

 

v1

a4

이 서버의 시각은 현재 한국기준(KST) 2016년 08월 08일 22:28:07 이다.

 

9) Hostname 설정 (선택)

이 단계는 권장하는 단계이나 건너뛰어도 운영에 큰 문제가 없다.

이 서버에 이름을 정하는 것이다. 이름을 잘 정해 두어야 나중에 다중 서버작업을 할 때 헷갈리지 않는다.

v3

위의 뜻은 “li599-115 서버에 root 사용자” 라는 뜻이다.

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

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

 

#vi /etc/hostname

빈 파일일 건데(또는 기존 hostname이 쓰여있을것임.) 원하는 이름으로 바꾼다.

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

 

적용한다.

#hostname -F /etc/hostname

 

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

k11

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

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

 

- hostname 을 FQDN 으로 설정하는 것을 권장하지만, 외부와 연결이 없는 서버이거나 자신이 쓰고 싶은 이름이 있다면 (팀명이나, 회사명, 서비스명 등) 그것으로 해도 된다.

예를 들어 myserver1, new1111 같이 자신이 하고 싶은대로 정했다고 한다면, 서버의 /etc/hosts 에 해당 이름을 등록해두도록 하자.

127.0.0.1    myserver1

k12

 

추가) 메일 발송프로그램 설치하기

많은 프로그램에서 mail() 함수를 사용한다. 이 함수는 서버에 sendmail 에게 메일발송을 요청한다.

메일문의, 가입시 환영메일, 비밀번호 찾기 메일, 이메일인증 등 널리 사용된다. 서버가 메일 발송을 할 수 있게 sendmail 을 설치하자.

# apt-get install sendmail

이것은 오직 웹사이트에서 메일을 보내기 위한 것이다.

아이디@당신의도메인.com 같은 것을 하고 싶다면 절대로 직접 구축하려고 하지 말고 구글앱스, 네이버웍스, 도메인 구입처, 클라우드 메일호스팅 을 사용하도록 하자.

 

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

qv3

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

 

 

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

이 글에서는 Nginx, PHP, MariaDB 를 모두 최신버전으로 설치할 것이다.

우분투 공식 저장소에는 stable 버전이 존재한다. stable 버전이란 “기능추가 없이 보안과 안정성 패치만 하는 버전” 을 뜻한다. Xenial 저장소의 경우 Nginx 는 1.10.0 이, PHP 는 7.0.8 가 담겨져 있다.

최신버전을 설치하기 위해서 APT 소스리스트 파일에 최신버전이 담겨있는 저장소를 추가해주어야 한다.

 

# vi /etc/apt/sources.list

 

파일 맨 끝에 다음의 줄 추가. (더블클릭하면 전체 선택됨)


# Nginx
deb http://nginx.org/packages/mainline/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ xenial nginx

# MariaDB
deb http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu xenial main

sourcelist-161028

 

- 각 저장소 보안키 다운로드 후 시스템에 등록

보안키 정보는 /etc/apt/trusted.gpg 에 저장된다.

 

nginx 보안키 다운로드 후 적용.

# cd /root
# wget http://nginx.org/keys/nginx_signing.key
# apt-key add nginx_signing.key
# rm nginx_signing.key

 

MariaDB 보안키 다운로드 후 적용.

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

 

PHP 저장소 추가 및 보안키 등록

여기서는 ppa(Personal Package Archive)라는 개인패키지 저장소를 이용할 것이다.

ondrej 사용자의 php-7.0 저장소를 사용할 것이다.

ondrej 는 Debian 에서 일하고 있으며, Ubuntu 제작자 중 한명이다.

 

k14

< Debian이나 Ubuntu에서 가끔 이분의 이름을 볼 수 있을 것이다 >

 

보안키/etc/apt/trusted.gpg.d/ondrej_ubuntu_php.gpg 에 저장되고

저장소 추가 구문/etc/apt/sources.list.d/ondrej-ubuntu-php-xenial.list 에 저장된다.

# apt-get install software-properties-common
# add-apt-repository ppa:ondrej/php

k15

엔터키 한번 눌러주면 된다. (맥의 경우 return 키)

 

추가된 보안키 목록 보기

# apt-key list

k16

nginx 저장소키, mariadb 저장소키, Ondřej Surý 님의 개인저장소(Launchpad PPA)키가 등록되어 있는 것을 알 수 있다.

 

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

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

# apt-get update

 

10) Nginx 설치

k17

<https://en.wikipedia.org/wiki/Nginx>

글 작성일인 2016년 08월 08일 현재 최신버전은 1.11.3 이다.

 

- Nginx 설치

Nginx 공식 저장소에서 배포하는 최신버전을 설치해 보도록 하자.

# apt-get install nginx

 

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

# service nginx restart

 

- nginx 버전체크

# nginx -v

a5

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

 

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

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

k12

 

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

 

11) PHP-FPM 설치

- PHP7-FPM 최신버전 설치

# apt-get install php7.0-fpm

 

- 콘솔 PHP 버전확인

# php -v

 

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

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

# php-fpm7.0 -v

a9

- 널리쓰이는 PHP 모듈 설치

 

# apt-get install php7.0-gd php7.0-curl php7.0-mbstring php7.0-xml php7.0-mcrypt

설치가 완료되면 자동으로 PHP-FPM 프로그램이 재시작되며 모듈이 로드된다.

 

11-2) PHP Default timezone 설정하기.

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

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

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

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

 

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

k21

이 값을 찾아서

 

k22

이렇게 변경.

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

# service php7.0-fpm restart

 

스크린샷 2015-07-30 오전 11.01.06

phpinfo 페이지에서 Default timezone 이 위 화면과 같이 설정되어 있으면 정상이다.

 

 

12) MariaDB 설치

스크린샷 2015-11-29 오후 11.39.02

<https://en.wikipedia.org/wiki/MariaDB>

 

당연히 MariaDB 10.1 을 설치할 것이다.

# apt-get install mariadb-server-10.1 mariadb-client-10.1

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

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

 

서비스 상태확인

# service mysql status

a10

표시할 정보가 많으면 more 가 나올 수도 있는데, Q 나 Control+C 를 입력하여 more를 종료한다.

 

PHP-FPM 에 DB 연동관련 모듈설치

# apt-get install php7.0-mysql

 

13-1) 기본 언어셋 설정(중요)

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

# vi /etc/mysql/conf.d/mariadb.cnf

 

(vi 에디터 사용방법을 모른다면 ftp 클라이언트를 사용하여 서버에 로그인 후 해당파일을 수정하고 덮어쓰기하여라.)

다음의 파일을

a11

아래와 같이 변경한다.

a12

 


# MariaDB-specific config file.
# Read by /etc/mysql/my.cnf

[client]
# Default is Latin1, if you need UTF-8 set this (also in server section)
default-character-set = utf8mb4

[mysqld]
#
# * Character sets
#
# Default is Latin1, if you need UTF-8 set all this (also in client section)
#
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci

 

변경사항 적용

#service mysql restart

 



 

14) 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

 

#16.10.10 설정 가이드가 추가됨

환경설정을 쉽게할 수 있도록 환경설정 생성기를 작성하였습니다. (강조를 위해 빨간색 사용)

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

- Nginx 에서 PHP 확장자에 대해서 PHP-FPM 프로그램으로 요청을 전달하게 설정하기

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

 

NGINX 공식 가이드(https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/)에 따라 작성되었습니다.

다음의 구문은 (2017년 4월 현재까지) 알려진 모든 취약점을 테스트 완료 하였습니다.
또한 PHP-FPM 5.3.9 부터 limit_extensions 이라는 속성이 추가되었으며 기본적으로 .php 파일만 실행되도록 설정되어 있습니다.

 


server {
    listen       80 default_server;
    server_name  localhost;
    root   /usr/share/nginx/html;

    location / {
        index  index.php index.html;
    }

    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }

        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

 

# fastcgi_params  도 가이드대로 변경 (https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/)

# vi /etc/nginx/fastcgi_params

아래와 같이 변경


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         $document_root$fastcgi_script_name;
fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
fastcgi_param   PATH_INFO               $fastcgi_path_info;
fastcgi_param   PATH_TRANSLATED         $document_root$fastcgi_path_info;
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;

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

 

- Nginx 재시작

# service nginx restart

 

15-1) 연동테스트1

# vi /usr/share/nginx/html/phpinfo.php

 


<?php
phpinfo();

 

웹브라우저에서 다음을 입력해서 phpinfo 페이지를 보도록 하자.

http://111.222.333.444/phpinfo.php

 

a13

<이 페이지에서 컨트롤+F 누르고 “nginx” 와 “php-fpm” 단어로 검색해본다>

 


 

15-2) 연동테스트2

nginx 와 php-fpm , 그리고 mariadb 를 모두 사용하는 프로그램을 실행시켜보자.

phpmyadmin 공식사이트 : https://www.phpmyadmin.net/

 

설치 못하시는 분이 꽤 있으셔서 따로 설치법을 적습니다.

여러 설치방법이 있겠지만 저는 다음과 같이 설치합니다.

 

압축해제 프로그램 설치

# apt-get install unzip

 

압축파일 다운로드

# cd /usr/share/nginx/html

 

k25

https://www.phpmyadmin.net/ 사이트로 이동 후 위의 그림과 같이 입력하여 최신버전을 설치할 수 있도록 하자.

이 글에서는 글 작성 시각 현재 최신버전인 4.5.2 를 설치할 것이다. phpmyadmin 은 매우 견고하게 만들어진 프로그램으로써 4.5.2를 설치해도 보안취약점이 있지는 않겠지만 최신버전을 설치하는 습관을 기르도록 하자. (혹시나 말하지만, Alpha나 Beta 같은 개발자-최신버전을 설치하라는 뜻이 아니라 널리 사용되어 검증된 Release Channel 최신버전 를 사용하라는 것이다.)

# wget https://files.phpmyadmin.net/phpMyAdmin/4.5.2/phpMyAdmin-4.5.2-all-languages.zip

 

압축해제

# unzip phpMyAdmin-4.5.2-all-languages.zip

 

폴더 이름변경

# mv phpMyAdmin-4.5.2-all-languages dbmyadmin

 

다운받은파일 삭제

# rm phpMyAdmin-4.5.2-all-languages.zip

 

http://111.222.333.444/dbmyadmin/

 

k26

 

[TIP] 간혹 방금 설치한 디비의 root 비밀번호가 기억이 안나는 분들도 있을 것이다. 이 경우에는 다음의 명령어를 사용하여 mariadb 를 재설치 하도록 하자.
- 제거
# apt-get purge mariadb-server-10.1
- 설치
# apt-get install mariadb-server-10.1

 

 

- 재부팅

복잡한 세팅이 끝났으니 한번 숨을 고르고 가자.

# reboot

재부팅 후에 phpinfo 페이지와 phpmyadmin 가 잘 실행된다면 “재부팅이 가능한 서버” 라고 볼 수 있다.

 


16) 웹 사이트 구동예제

원래 표준명령어는 useradd 이지만, ubuntu는 사용하기 좋게 adduser 를 지원한다.
리눅스 관련 서적을 보면 둘다 계정생성용 명령어라고 되어있다.
쉬운 설정을 위해 adduser를 사용

다음의 예제에서는 myuser1 이라는 사용자(user) 와 웹주소(ServerName) 사용예제를 설명합니다.

각자 본인의 도메인으로 변경해서 실행하세요.

#adduser myuser1

 

(참고로 위와 반대동작을 하는 계정삭제 명령어는 다음과 같다. (계정을 삭제하고 홈디렉토리도 삭제함)

#userdel -r myuser1

보통 웹루트는 홈디렉토리에 하지 않습니다.
저는 주로 www 디렉토리를 사용합니다.사용자변경 후 www 디렉토리를 생성하고 빠져나오기

#su -l myuser1
#mkdir www
#exit

 

- php pool 파일 만들기 및 nginx server 구문을 추가하기

PHP-FPM Pool 파일 작성
# vi /etc/php/7.0/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 server 구문 작성
# vi /etc/nginx/conf.d/my-example-site.com.conf

워드프레스 Nginx 설정예제 https://codex.wordpress.org/Nginx 페이지를 많이 참조했습니다.

- 일반적인 PHP 사이트 일때 (그누보드 등)


# Template 1. Normal PHP Site.

server {
    listen       80;
    server_name  my-example-site.com www.my-example-site.com my-second-domain.net;
    root   /home/myuser1/www;

    #set same size as post_max_size(php.ini or php_admin_value).
    client_max_body_size 10M;

    access_log /var/log/nginx/my-example-site.com.access.log main;
    error_log  /var/log/nginx/my-example-site.com.error.log warn;

    location / {
        index  index.php index.html;
    }

    # Allow Lets Encrypt Domain Validation Program
    location ^~ /.well-known/acme-challenge/ {
        allow all;
    }

    # Block dot file (.htaccess .htpasswd .svn .git .env and so on.)
    location ~ /\. {
        deny all;
    }

    # Block (log file, binary, certificate, shell script, sql dump file) access.
    location ~* \.(log|binary|pem|enc|crt|conf|cnf|sql|sh|key)$ {
        deny all;
    }

    # Block access
    location ~* (composer\.json|contributing\.md|license\.txt|readme\.rst|readme\.md|readme\.txt|copyright|artisan|gulpfile\.js|package\.json|phpunit\.xml)$ {
        deny all;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        log_not_found off;
        access_log off;
    }

    # Block .php file inside upload folder. uploads(wp), files(drupal), data(gnuboard).
    location ~* /(?:uploads|default/files|data)/.*\.php$ {
        deny all;
    }

    # Add PHP handler
    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }

        fastcgi_pass unix:/run/php/myuser1.sock;
        fastcgi_index index.php;
        fastcgi_buffers 64 4k; # default 8 4k

        include fastcgi_params;
    }
}


 

- 워드프레스, 드루팔, 코드이그나이터, 라라벨 등 일 때

위의 예제 설정값에서 index.php 파일이 요청을 받도록 한줄만 더 추가해주면 됩니다.

k27

 


# Template 2. WordPress, Drupal, CodeIgniter, Laravel.

server {
    listen       80;
    server_name  my-example-site.com www.my-example-site.com my-second-domain.net;
    root   /home/myuser1/www;

    #set same size as post_max_size(php.ini or php_admin_value).
    client_max_body_size 10M;

    access_log /var/log/nginx/my-example-site.com.access.log main;
    error_log  /var/log/nginx/my-example-site.com.error.log warn;

    location / {
        index  index.php index.html;
        try_files $uri $uri/ /index.php?$args;
    }

    # Allow Lets Encrypt Domain Validation Program
    location ^~ /.well-known/acme-challenge/ {
        allow all;
    }

    # Block dot file (.htaccess .htpasswd .svn .git .env and so on.)
    location ~ /\. {
        deny all;
    }

    # Block (log file, binary, certificate, shell script, sql dump file) access.
    location ~* \.(log|binary|pem|enc|crt|conf|cnf|sql|sh|key)$ {
        deny all;
    }

    # Block access
    location ~* (composer\.json|contributing\.md|license\.txt|readme\.rst|readme\.md|readme\.txt|copyright|artisan|gulpfile\.js|package\.json|phpunit\.xml)$ {
        deny all;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        log_not_found off;
        access_log off;
    }

    # Block .php file inside upload folder. uploads(wp), files(drupal), data(gnuboard).
    location ~* /(?:uploads|default/files|data)/.*\.php$ {
        deny all;
    }

    # Add PHP handler
    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }

        fastcgi_pass unix:/run/php/myuser1.sock;
        fastcgi_index index.php;
        fastcgi_buffers 64 4k; # default 8 4k

        include fastcgi_params;
    }
}


 

HTTPS 적용예제
아래와 같이 사용하려면 반드시 보안인증서(SSL)을 미리 발급받아서 가지고 있어야 합니다.

# Template 3. HTTPS Example.

server {
    listen       80;
    server_name  my-example-site.com www.my-example-site.com;

    return       301 https://$server_name$request_uri;
}


server {
    listen       443 ssl http2;
    server_name  my-example-site.com www.my-example-site.com;
    root   /home/myuser1/www;

    #set same size as post_max_size(php.ini or php_admin_value).
    client_max_body_size 10M;

    ssl_certificate /home/myuser1/ssl/mergedssl.crt;
    ssl_certificate_key /home/myuser1/ssl/ssl.dec.key;
    ssl_dhparam /home/myuser1/ssl/dhparam.pem;
    
    # Enable HSTS. This forces SSL on clients that respect it, most modern browsers. The includeSubDomains flag is optional.
    add_header Strict-Transport-Security "max-age=31536000";
    
    # Set caches, protocols, and accepted ciphers. This config will merit an A+ SSL Labs score.
    ssl_session_cache shared:SSL:20m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5';
    
    access_log /var/log/nginx/my-example-site.com.access.log main;
    error_log  /var/log/nginx/my-example-site.com.error.log warn;

    location / {
        index  index.php index.html;
        try_files $uri $uri/ /index.php?$args;
    }

    # Allow Lets Encrypt Domain Validation Program
    location ^~ /.well-known/acme-challenge/ {
        allow all;
    }

    # Block dot file (.htaccess .htpasswd .svn .git .env and so on.)
    location ~ /\. {
        deny all;
    }

    # Block (log file, binary, certificate, shell script, sql dump file) access.
    location ~* \.(log|binary|pem|enc|crt|conf|cnf|sql|sh|key)$ {
        deny all;
    }

    # Block access
    location ~* (composer\.json|contributing\.md|license\.txt|readme\.rst|readme\.md|readme\.txt|copyright|artisan|gulpfile\.js|package\.json|phpunit\.xml)$ {
        deny all;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        log_not_found off;
        access_log off;
    }

    # Block .php file inside upload folder. uploads(wp), files(drupal), data(gnuboard).
    location ~* /(?:uploads|default/files|data)/.*\.php$ {
        deny all;
    }

    # Add PHP handler
    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }

        fastcgi_pass unix:/run/php/myuser1.sock;
        fastcgi_index index.php;
        fastcgi_buffers 64 4k; # default 8 4k

        include fastcgi_params;
    }
}


 

nginx 및 php-fpm 재시작.

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

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

 

17) 보안설정

- PHP 가 아닌 파일 실행 차단 (이미 적용되어 있음. 취약하지 않음.)

위의 세팅에는 2중 보안이 되어있기 때문에 취약하지 않다.

nginx 에서 한번 필터링을 하고(if 구문), php-fpm 에서 한번 더 확장자 검사(PHP 5.3.9 이상버전은 .php 만 실행됨)를 한다.

 

https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/ 가장 하단의 Note 3번 항목을 참조하세요.

http://php.net/manual/kr/install.fpm.configuration.php#security-limit-extensions 페이지의 security.limit_extensions 항목을 참조하세요.

 

- 기본 사이트 차단

어느 하나의 웹 호스트로 해당되지 않으면 default 파일로 연결된다.

이것을 아예 차단해 보자. 즉 유효한 도메인의 요청이 아니면 응답을 하지 않는다.

 

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

server {
    listen       80 default_server;
    server_name  localhost;
    root   /usr/share/nginx/html;

    # Deny all except me.
    set $my_auth 0;

    if ($remote_addr = 12.34.56.78) {
        set $my_auth 1;
    }
    
    if ($remote_addr = 30.123.456.12) {
        set $my_auth 1;
    }

    if ($remote_addr = 222.111.166.111) {
        set $my_auth 1;
    }

    if ($my_auth = 0) {
        return 444;
    }




    location / {
        index  index.php index.html;
    }

    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }

        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}


 

# service nginx reload

 

그 외에 딱히 중요한 보안 이슈는 없는듯 하다.



옵션) 방화벽 적용하기.

* 접속자의 IP 가 고정되어 있으면 방화벽 세팅을 해보세요.

iptables 를 사용해서 리눅스 방화벽 설정하기 (접근 제어)

258 Comments

  1. 기다리고 기다리던 내용의 포스팅을 하시는군요!
    손꼽아 기다렸습니다. 라엘님의 포스팅에 다시한번 감사드립니다.
    저번에 아파치로 구축을하였지만, 요즘 각종 대형사이트에서 nginx로 전환하는 모습을 보면서.
    이왕 구축할꺼 nginx로 길들여보는게 좋다 생각을 했습니다.
    허나, 저와같은 서버에 대한 지식이 없는사람들은 nginx와 php7 등을 설치하고는 싶으나,
    방법을 모르는게.. 참 현실이라고할까요..
    많은 시도를해보았지만.
    역시나 허당이였습니다. 이런 보물같은 정보를 포스팅해주셔서 감사합니다.

    (너무 두서없이 적었군요 ㅜ)

    1. 헉 아직 글 다 안썼는데 댓글을 다셨군요.
      서둘러 완성하도록 하겠습니다.

  2. 제가 글 쓸때까지 서버세팅을 안하고 버티시는(?) 블로그팬 분께 바친다.
    -> 접니다. 미리 감사드립니다. 전 댓글로 문의?드리고
    자주 방문한 블로그팬입니다.

    감사합니다.

    1. 글이 반갑고, 좋아서 댓글을 쓰다보니 혹여나 실례가 되지 않았나 싶네요.
      저도 윗분 처럼 서버의 S 도 모르는 사람입니다.

      강의 하나 하나 보고 따라하고 있습니다.

      주옥같은 포스팅 감사합니다.

      1. 하하 지금도 글쓰고 있습니다.
        최신버전을 설치하려고 하니 손이 많이 가네요.

  3. 감사합니다. 잘 보겠습니다. ^^

  4. 계속 업데이트 중이시네요.
    귀한 지식 나눔 감사드립니다.

    운영중인 사이트와 블로그를 둘다 그누5 + 아미나 사용중인데
    이번에 이 강좌 따라해 보고 블로그는 혼자 쓰기 때문에 셋팅을 XpressEngine로 운영할까 하는 마음이 커지네요.
    물론 블로그는 내용이 좋아야 되겠지만요.

    1. 글 수정이 안되네요.
      워드프레스로 결정했습니다.
      감사합니다.

      1. 커뮤니티용은 아미나, 이윰, 배추빌더 쓰시고, 블로그나 게시판없는 일반사이트는 워드프레스 쓰셔요

  5. 혹시, php7 버전이 RC8인지요?

    버전이 궁금합니다 ㅎㅎ

    1. nightly 라고 날마다 업데이트 되는 최신버전입니다.

  6. 금요일이 기다려 지네요.
    AWS EC2도 신청해 놓았습니다.

    안녕히 주무세요.

  7. 항상 기다리고 있습니다. ㅎㅎ

    캡챠를 어떻게 푸는지 모르고 있다가 확대해보니 연산자가 나오네요 -_-;;;

    눈이 나쁜 편이 아닌데 + 와 = 이 구분이 안되더라구요;;;;;

    1. 확인해봤는데 폰트문제였습니다. 맥만 사용하다보니 잘 몰랐네요.
      윈도우에서도 잘 보이도록 바꾸었습니다.

  8. 우왕… 멋집니다.

    여기다가 nginx의 HTTP2세팅까지 적용한다면 적용한다면!

    +_+!!

    1. HTTP2 는 기본적으로 SSL 환경에서 동작합니다.
      따라서 인증서가 있으셔야 해요.

      우선 제 블로그에는 적용시켜 두었습니다.

  9. 좋은 글 정말 감사합니다!!

    혹시 시간이 되시면 Nginx에서 사용 가능한 Memcache나 varnish, Apc cache의 설정 방법에 대한

    강의도 올려주실 수 있으신가요?

    해외에서 찾아보고 적용해보고있는데, 제대로 된건지, 어느걸 사용해야되는지 잘 모르겠네요…

    감사합니다.

    1. PHP5.5 이상부터는 opcache 가 내장되어 있어서 APC는 설치할 필요가 없고요,
      Varnish 세팅법은 http://blog.lael.be/post/2363 에 적어두었으며,
      memcache 는 아직 필요성이 있는지 모르겠네요.

  10. 따라하다 보니
    세번째 파일이 없는데
    # vi /etc/init.d/php7-fpm

    이것 새로 만들어 주어도 되나요?

    1. 네 php5-fpm 패키지에서 복사하지 않고 새로 만들어도 됩니다. 단 실행할 수 있도록 755 퍼미션을 맞춰주어야 합니다.

      1. 서버 구축과 리눅스는 거의 처음이라서
        아마존 EC2로 했는데 잘 된것인지 모르겠네요.
        http://52.192.191.65

        라엘님같이 멋진 블로그를 꿈꾸며 안되면 될때까지 따라해 보겠습니다.
        감사합니다.

        1. 아마존 쓰기 조금 어려울텐데 잘 쓰시네요.
          서버 지우고 설치하는 것을 몇번 반복하시면 조금 익숙해질 것입니다.

  11. 우와 완성 되었군요 새벽이나 내일 고전해봐야겠어요 감사합니다!!!

  12. 드디어 1차 버전이 완성되었네요.

    1. 정말 정말 감사합니다.

      현존 최신 조합이네요.

      정말 고생하셨습니다.

      그리고 다시 한번 감사드립니다.

  13. php7-fpm 설정하는부분에서 아래와같은 부분은 없는데 생긴거같습니다.

    알려주신대로 따라해서 빈페이지만 뜨는군요 ㅜ

    DAEMON_ARGS=”–daemonize –fpm-config /usr/local/php7/etc/php-fpm.conf”
    CONF_PIDFILE=$(sed -n ‘s/^pid[ =]*//p’ /etc/php7/fpm/php-fpm.conf) << 이게 없는부분인데 생긴거같아요
    PIDFILE=${CONF_PIDFILE:-/run/php7-fpm.pid}

    1. 기존 nginx1.9.7+php5.6.15+mariadb10.1 에서 따라했습니다. 근데 빈페이지가..

      빠짐없이 했는데 왜그럴가요, 이전 댓글처럼 없던 부분들도 생겨서 혼란스럽습니다 ㅜ

      1. 운영체제가 우분투 14.04 가 아닌경우 기존 설정파일에서 적당히 경로를 맞추어 주어야합니다.
        phpinfo 는 실행되시나요?

        1. 우분투 14.04 입니다. phpinfo도 인식이안됩니다. ㅜ.ㅜ

  14. 선생님. php7 릴리즈 되었다는 소식을 가지고 왔습니다.
    http://php.net/archive/2015.php

  15. 이 글을, 제가 글 쓸때까지 서버세팅을 안하고 버티시는(?) 블로그팬 분께 바친다.

    헉 들켜버렸네요 ㅠㅠ 라엘님 글 항상 잘보고 따라합니다 감사합니다

  16. 이제 캡챠가 잘 보이는군요. ㅎㅎ

    PHP7도 정식 출시가 되었고 더 좋은 강좌가 될 것 같습니다.!

  17. 위에서 이 명령어를 치면 포스트 내용과는 다르게 빈 내용인데 제가 잘못한 건가요? ㅠㅠ

    vi /usr/local/php7/etc/php-fpm.d/www.conf

    1. 새로고침 해서 다시 봐보셔요. 글 수정중입니다.

      1. 아 내용이 바꼈군요.ㅠㅠ

        감사합니다. ^^

  18. 다 잘 마쳤는데, 워드플레스를 이전하니 500 서버에러가 떠 버리네요..ㅠㅠ

    워드프레스 설치는 잘되는데 이전에서 왜 문제가 생기는지 모르겠네요.

  19. 다 설정했는데 php-fpm이 작동을 안해서 뭔가 곰곰히 봤는데
    poo.d/*.conf 파일에 L1: [사용자]를 빼먹어서 실행 안됬네요;
    그런데 다 설정하고 텍스트큐브 설치했더니 문법이 안맞는게 있어서 다운그레이드를 생각중이에요.

    1. 저도 텍스트큐브를 쓰다가 업데이트가 너무 느려서 재작년에 워드프레스로 옮겼습니다.
      널리쓰이는 플랫폼이라 빠르고 확장이 자유롭고 검색엔진 색인도 잘되네요.

  20. 깔끔함 그 자체네요…..감사합니다….^^
    북마크……

  21. 안녕하세요^^
    기존 우분투+apache 셋팅환경을
    우준투+nginx로 변경하는건 문제가 될수 있을까요???
    apache를 지우고 nginx를 설치하면 되는지요???

    1. 새로 설치한 후에 데이터 이전하는게 더 쉬울거에요.

  22. 좋은글 감사합니다~

  23. 정보글 정말 감사합니다.
    잘 보고 따라하니 초 저사양 서버 (VPS) 에서도 잘 굴러가는군요.

    다만 본문중 add-apt-repository 부분에서 에러가 나서 한참 헤맸습니다.
    일부 리눅스 배포판에는 이 명령어가 기본적으로 설치가 되지 않았는지,
    apt-get install software-properties-common 와
    apt-get install python-software-properties 를 이용해 간신히 해결했습니다.
    이 부분도 같이 기재해주시면 저같이 해메는 사람이 줄어들것 같네요.

    1. 감사합니다.
      add-apt-repository 는 software-properties-common 패키지 안에 포함되어 있습니다.
      해당 부분 추가하도록 하겠습니다.

  24. 먼저 글 감사합니다

    가상 서버를 계약 후 어떤 웹서버를 사용할까 고민하던 중 글이 보여
    바로 결심하고 설치하여 기본 설정은 완료하였습니다.

    본 문서를 기본으로 직접 테스트하여 나중을 위해 제 blog에 기록용으로 설치 부분까지
    작성하였습니다. http://blog.naver.com/bluebamus/220733807417

    혹 문제가 되면 댓글로 알려주세요 ^^
    앞으로 자주 방문해 올리시는 글을 탐독해야할것 같습니다

    그리고 혹시나하여 제가 설치한 서버 정보를 알려 드립니다

    저는 일본 conoha의 우분투 14.04 64bit에 설치하였으며 지금은 기본 서버 설치만 해 놓은 상태이며
    가상 호스팅을 통해 기존 아파치 + mysql의 site를 이전할 예정입니다.

    이 부분은 포스팅에 없기에 따로 검색해 설정해야 할것 같네요

    이렇게 기술문서라 할만큼 작성해 주신 포스팅 덕분에 많은 도움받고 가게 됩니다.

    혹 현 blog에서 rss를 통해 메일로 새로운 글 소식을 받거나 이웃을 맺을 수 있는지 알고 싶네요 ^^

    1. 안녕하세요. 자체 구축 솔루션(워드프레스 독립형)이라서 이웃맺는 기능은 없는 것 같고요.
      블로그에서 RSS 기능을 지원하니 구독을 하시면 새 글을 받아보실수 있을것입니다.
      감사합니다.

  25. 본문의 가상 호스팅 설정 부분을 따라하는데 여간 어렵네요
    타 문서와 비교해 보면서도 이해하는데 쉽지 않더라고요

    혹시 nginx의 가상호스팅 설정 방법이나 proxy 설정에 대한 정보를 좀 더 알려주실 수 있으실런지요 ^^

    1. 본문 예제를 살짝 바꾸었습니다. 다시 시도해보세요.

  26. 항상 최신화 시켜주셔서 감사드립니다.

    AWS EC2를 새로 설치해서 15번까지 성공했습니다.

    하지만 html은 실행이 되는데 php는 파일이 다운로드 됩니다.

    16번을 따라 하기전에 질문드립니다.

    1. 코노하 기준으로 2번 반복하여 정상 작동하는 것을 확인했습니다.
      문제가 발생한다고 하시니 EC2에서의 정상동작여부도 확인해보도록 하겠습니다.
      감사합니다.

    2. EC2에서도 정상적으로 잘 동작하는 것을 확인했습니다. 설치환경을 다시 확인해보세요.
      AMI를 ubuntu/images/hvm-io1/ubuntu-xenial-16.04-amd64-server-20160627 로 선택하셔야 할거에요.

      1. 확인해 주셔서 감사합니다.
        리눅스버전
        Linux sdk 3.13.0-74-generic #118-Ubuntu SMP Thu Dec 17 22:52:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
        우분투 버전
        Ubuntu 14.04.5 LTS \n \l

        AMI 확인해 보겠습니다.
        그리고 새로 올려주신것으로 천천히 따라해 보려고 합니다.

        거듭 감사드립니다.

  27. 안녕하세요?

    님께 간단한 도움(Help) 전자메일을 보내고 싶은데 어떻게 해야 하는지요?

    1. 상단의 Contact 페이지를 클릭하시고 관련정보를 확인하시면 됩니다.

  28. 우분투 root 계정이 아니라 사용자 계정을 만들어서 sudo 권한을 준 경우를 가정해서 글을 써 주셨더라면 제 같은 문외한도 2-3일 시간 낭비를 하지 않았을 것 같습니다. 제 같은 문외한을 위해서 (앞으로 이 글을 보약처럼 마실 분들을 위해서) sudo를 적절한 명령어 앞에 적어 주시는 것이 좋을 듯 싶습니다. 초보를 위하여! 부탁드리는 말씀입니다. 따라가다가 에러 발생했을 때 난감했습니다. 그 이유를 다른 사이트를 통해 알게 되면서 라엘님의 글이 보석이라고 여기게 되었습니다. 보석이 진흙 속에 파묻혀 있으면 곤란하지 않겠습니까? 감사합니다.

    1. 해당사항을 본문에 반영하도록 하겠습니다. 감사합니다.

  29. vultr에서 phpMyAdmin을 설치하고나서
    http://111.222.333.444/dbmyadmin/ 을 실행하면 아래처럼 403에러가 뜹니다.
    혹시 무엇을 점검해야 할까요?

    403 Forbidden
    —————–
    nginx/1.11.3

    1. 403 이 발생할 이유가 딱히 떠오르지 않는군요.
      # chmod -R 777 /usr/share/nginx/html/dbmyadmin
      을 입력해보시고 다시 확인해 보세요.

      그래도 안되면 서버를 다시 생성한 후 다시 따라해보세요.

      1. 계속 root로 접속해 프로그램을 설치해 이게 문제인가 싶어서
        별도 사용자 계정으로 들어가 root 권한을 얻고 실행하니 문제없이 접근이 됩니다.
        root로 설치 시 document root는 권한이 달라지는지 …

        암튼 해결했습니다.

    2. 저는 dbmyadmin도 다 뜨고 모두 성공했습니다. 그런데 인증서 확인할 때만 404 에러가 뜹니다. 사이트 접속을 아예 못하네요. 그 원인을 찾으려고 라엘님 것 따라 10번 이상 재설치했는데, 여전히 해결책 못 찾았습니다. 다시 지금도 고민중입니다.

  30. 인증서 설치 성공했고, 워드프레스까지 설치했습니다. 잘 됩니다. 감사합니다.

  31. phpinfo.php 실행시에 phpinfo()가 실행되지 않습니다
    그 외 html텍스트는 읽어줍니다.. 그대로 여러번 따라 했는데 뭐가 문제일까요?

    1. php 의 pool 파일에서 지정한 값과 nginx 의 fastcgi_pass 값을 다시 한번 확인하신 후 경로를 동일하게 맞추어주세요.

  32. 라엘님이 수고하셔서 만든 글에 도움이 많이 되었습니다.
    그러나 허점이 보입니다.

    그 허점이란 제가 비전문가이다 보니 세세한 부분에 의문이 생깁니다. 그 의문을 문의합니다.
    답변 부탁드립니다.

    vi /etc/php/7.0/fpm/pool.d/myuser1.conf와 관계된 것입니다.

    php-fm을 깔고 디렉토리에 들어가보니 www.conf 파일이 있더군요.
    그 파일명을 새로만든아이디.conf로 바꾸면 됩니까?
    바꾸고 나서 라엘님이 아래 써 놓은 내용으로 수정했습니다.
    그러다 보니 www.conf 와 새사용자아이디.conf 두 개 파일이 그 디렉토리에 있게 되었습니다.
    이렇게 된 것이 정상인가요?

    또 하나의 질문은 수정된 내용 속에 보면

    listen = /run/php/myuser1.sock

    이것과 관계해서 문의드립니다.
    myuser1.sock를 제가새로만든아이디.sock으로 바꾸었는데

    위 php 디렉토리에 보면 php7.0-fpm.sock가 있습니다.
    제가새로만든아이디.sock 파일을 php 디렉토리에 만들어야 하지 않을까요?
    그리고 제가새로만든아이디.sock 파일과 함께 php7.0-fpm.sock 파일이 같은 디렉토리에 있어야 하나요?
    아니면 둘 중 하나만 있어야 하나요?

    위 질문에 대해서 의문이 생깁니다. 답변 부탁 좀 드립니다.

    1. www.conf 파일을 지우신 후에 본문을 참조하여 myuser1.conf 를 만드시면 됩니다.
      php7.0-fpm.sock 은 www.conf 설정파일에 의해 생성되는 파일이므로 www.conf 를 지우시면 php7.0-fpm.sock 도 사라질 것입니다.

  33. 위의 질문에서 제가 헷갈린 것이 있습니다. phpinfo.php가 아니라 dbmyadmin에 관한 것입니다.

    example.com/dbmyadmin이 뜨지 않아(root path를 변경한데 원인이 있음) 제가 워드프레스를 깔고자 하는 디렉토리에 심볼릭링크를 걸어 옮겼습니다. 이렇게 해도 되는지 여쭈어 봅니다. 다시 말하면, dbmyadmin을 /usr/share/nginx/html/dbmyadmin에 가르쳐주신 대로 만들고 나서, var/www/example.com/html에 심볼릭링크를 걸었더니 dbmyadmin이 뜹니다.
    이렇게 한 이유는 nginx 밑에 example.com.conf 파일에서 phymyadmin(phpinfo.php)에 관한 설정을 할 수 있는 능력이 없어서입니다. 혹 example.com.conf 파일에 서로 엇갈리는 root 규정이 들어갈 수 있다면 만드는 법( server나 location 설정 방법을 좀 가르쳐 주세요. 위와 같이 만들어도 마리아db와 phpmyadmin이 제대로 작동하는지도 여쭈어 봅니다.

    1. 제대로 동작합니다. 심볼릭 링크 말고 그냥 파일을 복사하거나, 한번 더 업로드하거나, 이동하는건 어떨까요.

  34. 안녕하세요^^
    라엘님 덕분에 서버 세팅을 무사히 마무리한 1인 입니다ㅎ
    다만
    제가 라엘님 문서 기준으로 서버를 세팅하면서 다른 문서를 몇가지 참조했는습니다.
    1)# adduser myuser1 sudo를 통해 sudo권한과 sudo 그룹에 등록했습니다.
    2)# vi /etc/group/을 확인 하였더니 myuser1그룹과 sudo 그룹에 함께 있더군요.

    라엘님 문서의 ‘PHP-FPM Pool 파일 작성’부분에서 의문이 있습니다.
    아래와 같이 되어 있는데…
    두가지 질문이 있습니다^^;
    1)첫번째 group에서 우선은 myuser1그룹으로 등록했지만 sudo 그룹으로 등록해도
    상관없는지요.
    2)listen.group부분은 www-data 그대로 등록하면 되는지요~

    답변해주시면 정말정말 감사하겠습니다~

    [myuser1]

    user = myuser1
    group = myuser1

    listen = /run/php/myuser1.sock

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

    1. 1) 그렇게 하여도 상관없습니다.
      2) php-fpm 은 user = myuser1, group = myuser1 권한으로 실행됩니다.
      이때 실행에 필요한 변수를 nginx 로 부터 전달받는데 nginx 가 www-data 권한으로 실행되고 있으므로 listen.group 는 www-data 로 설정해야 합니다.
      listen.group 을 myuser1 으로 설정하면 nginx 로부터 php 실행변수를 못받게 됩니다. (실행안됨)

      1. 와 감사합니다^^
        즐거운 주말 되세요~!

  35. 정리 정말 잘 해주셨네요. 덕분에 편하게 셋팅하였습니다. 감사합니다.

  36. 좋은 글 너무너무 감사합니다.

    혹시 우분투 16.06에 Php5.6 버전을 설치하려면 add-apt-repository ppa:ondrej/php 레포를 추가, 업데이트를 한후 apt-get install php5 php5-fpm …. 이런식으로 하면 되는건지요?

    제가 뭘 잘못한건지 php7이랑 5 버전이 같이 설치가 되어버립니다 ㅠㅠ

    1. 레포를 추가한 후
      #apt-get install php5.6 php5.6-fpm 처럼 입력하면 됩니다.

      1. 답변 정말 감사합니다!

        알려주신대로 설치를 해보았습니다. php5.6버전으로 설치는 잘되는데 몇가지 패키지 설치시에 문제가 발생합니다.

        예를들어 php5.6-apcu 패키지를 설치하면 대신에 php-apcu 라는 패키지가 설치되며, 자동으로 5.5 5.6 7.0 7.1 가 다 설치되어버립니다.

        php -v 로 확인해도 7.0으로 나타나네요 ㅠㅠ. 5.6버전용 apcu로만 설치할 방법이 없을까요?

  37. 찾던 자료네요~~ ^^
    지금까지 라엘님 블로그 보면서 댓글 단적은 없는거 같은데, 이 포스트는 댓글 안달고 넘어갈 수가 없네요.
    티스토리 사용중인데, 워드프레스 전환 준비하면서 라엘님 블로그 보며 많이 배우고 있습니다.

    1. 안녕하세요. 하루 빨리 워드프레스에서 글을 쓰는 날이 오기를 기대합니다.
      웹패널을 체험해 보시는것 같은데, 저라면 https://whmcs.luatic.co.kr/cart.php?gid=1 여기서 제일 싼 상품 (1년에 30,000원)짜리 신청해 보겠습니다.
      Cpanel 관리툴이 제일 좋아요. 그리고 기능을 잘 다루지 못하는 상태에서 자동화툴을 도입한다면 보안취약점이 생길수도 있습니다.

  38. 안녕하세요. 아침에 댓글을 남겼는데 보이지 않아 혹시나 하는 마음에 다시 올려봅니다.

    작성하신 포스팅은 매우 도움이 되고 있습니다.
    모르는 부분도 반복하면서 공부하고 있구요.
    정말 감사드립니다.

    다름이 아니라 모든 과정을 마치고 나니 dbmyadmin에 접속이 되지 않습니다.
    php로 확인해보니 localhost로는 접속이 됩니다.
    초보다 보니 많이 헤매고 있네요.

    바쁘신 와중에 확인해주셔서 감사드리며 포스팅 다시한번 감사드립니다.

    1. 댓글은 제가 공개설정하지 않으면 작성한 PC에서만 보입니다.

      https://blog.lael.be/demo-generator/nginx/default.conf.php 페이지의 기본사이트 설정을 확인해 주시기 바랍니다.

      1. 답변 감사드립니다.
        말씀해주신 부분까지는 잘 됩니다.
        문제는 /etc/nginx/conf.d/my-example-site.com.conf 에서 생깁니다.
        이 과정만 거치면 사이트가 정상적으로 작동하지 않네요.
        다시 한 번 더 해보겠습니다.
        감사합니다.

        1. 해결했습니다. 아주 단순한 문제였지만 리눅스를 처음 접하고 코드 이해가 없다보니 발생한 것이었습니다. 윗분 말씀처럼 심볼릭링크(바로가기?)를 만들어서 해결했습니다.

  39. 안녕하세요. 설치 후 문의사항이 있어 여쭈어봅니다.

    없는폴더일때
    404 Not Found
    nginx/1.11.5

    없는파일일때
    File not found.

    이렇게 출력이 되는데
    404에러와 없는파일 출력문구를 제 입맛에 맞게 고치거나
    메인으로 리다이렉트 시킬 수 있을까요?

  40. 안녕하세요 라엘님~
    vi /etc/nginx/conf.d/default.conf
    실행하고 작성후 nginx 재시작을 하면
    Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.
    이문구가 뜨고 웹사이트 연결이안됩니다

    심볼릭 링크때문인거같은데 해결방법좀알려주세요..

    1. 두개 열어둔 다음에,
      한 창에서는 #tailf /var/log/nginx/error.log
      다른창에서는 #service nginx restart
      를 입력해보세요.
      제 생각에 default.conf 에 오타를 입력했을거라 추측됩니다.

  41. 한가지 여쭙겠습니다.
    abc.com.conf 를 만들었고
    abc.com/bbs 라는 폴더를 서브도메인으로
    사용하고싶습니다.

    /etc/nginx/conf.d/bbs.abc.com.conf를 하나 더 만들어주고 안에 경로에 맞게 고치고 적용하면 서브도메인으로 연결이 되는건가요?

    아니라면 서브도메인 설정법이 궁금합니다.
    네임서버는 dnszi 쓰고있구요^^

    1. 이해하신 내용이 맞습니다. 별도의 conf 파일을 만들고 독립도메인 세팅처럼 설정하시면 됩니다.

  42. 안녕하세요. 설정시 문의가 있어 글 남깁니다.
    우분투 16.04 + PHP7.0 으로 설정 후에 잘 돌아가는것을 확인하였고.

    PHP5.5 에서만 돌아가는 프로그램이 있어
    추가적으로 apt-get 으로 php5.5 관련 프로그램 설치 후

    adduser 로 계정을 하나 추가한 뒤
    그 계정은

    /etc/php/5.5/fpm/pool.d/myuser1.conf
    로 설정파일도 만들어주고

    etc/nginx/conf.d/추가.conf
    도 만들고 프로그램도 깔아주고
    돌아가긴 하는데 관리자 로그인이 안된다던지 하는 현상이 있어서
    phpinfo(); 로 빈화면만 나오네요

    소스보기를 하면 phpinfo(); 소스가 그대로 보이구요.

    혹시 제 설정이 잘못되어서 어떤 문제가 발생한거라면
    우분투16.04에 7과 5.5를 같이 설치해서 구분해서 사용하는 방법이 있을까요?

    1. 본문의 php7용 php pool 을 만든것과 같이 php5용 php pool 을 만들고 nginx 에서 연동하면 됩니다.
      phpinfo(); 소스가 보이는 상황을 해결하기 위해서는 php.ini 의 short_open_tag 값을 변경하세요.

      1. 빠른 답변 감사합니다.
        로그인이 안되는것은 프로그램 config 파일에 문제가 좀 있었나봅니다.
        잘 돌아가네요^^

        근데 혹시 5.5와 7.0을 분리해서 설정은 했습니다만
        한 서버에 버전이 두개가 돌아갈 시에 추후에 어떤 문제가 발생할 일은 없는지요?

        1. 전혀 문제가 없습니다. 환경설정 파일도 다르고 프로세스도 독립적이기 때문입니다.
          다만 콘솔이나 cron에서 php 명령어를 실행할때 어느 php 버전으로 실행할지 숙지하시기 바랍니다.
          쉘에서 #php -v ,#php7.0 -v ,#php5.5 -v 를 입력해서 확인해보세요.

          1. 답변 감사드립니다.

            저는 크론을 실행할때
            5 */1 * * * /usr/bin/php /home/user/cron.php
            이런식으로 실행하는데 버전을 따로 지정해서 크론을 주는 방법을 잘 모르겠습니다.

            5.5 / 7.0 버전 구분을 해서 실행하는 방법을 알 수 있을까요?

            1. which php5.5 를 입력해보니
              /usr/bin/php5.5 라고 나옵니다.

              5 */1 * * * /usr/bin/php5.5 /home/user/cron.php
              5 */1 * * * /usr/bin/php7.0 /home/user/cron.php

              이런식으로 구분해서 크론을 설정하면 맞는걸까요??

                1. 빠른 답변 감사드리며, 도움주셔서 감사합니다.
                  ^^

  43. 정말 감사합니다.
    xe 를 사용할려고 합니다.
    rewrite 설정을 하고 싶은데 어떻게 해야하는지 궁금합니다.

  44. 안녕하세요.
    며칠 째 지웠다 설치했다 반복중입니다.
    내부 아이피에서는 잘 작동하는데요

    라엘님이 따라하고 쉽고 최고로 잘 정리해놓으셨는데 제가 기초가 부족하여
    민폐를 드려 죄송합니다.ㅠㅠ

    약간의 힌트라도 주시면 감사하겠습니다.

    좋은 주말 되세요.

    1. 어느 부분이 안되는지 안적어 주셨네요.
      팀뷰어 설치하시고 상단의 문의하기(contact)로 적어주시면 되게 해드릴께요.

      1. 메일 드렸습니다.
        감사합니다.^^

  45. 해결해 주셔서 감사합니다.
    잘 사용하겠습니다.
    편안한 밤 되세요

  46. 좋은글 잘 보았습니다. 개인적인 바램은 Nginx의 컴파일 설치도 있으면 좋겠습니다 ^^;;
    그리고 ubuntu와 centos 의 다른점은 무엇인가요?
    주워듣기로는.. centos 의 경우 실서버(실제 서비스를 할때)에 많이 사용된다고 들었는데요.
    강좌(설명)을 해주시는분들을 보면 대게 ubuntu에서 많이 알려주시더라구요.

    궁금했던 부분이라서..^^;

    1. 안녕하세요. 저는 소프트웨어 개발/운영에 대해 가장 중요한 부분은 “유지/보수” 라고 생각합니다.
      굳이 유지/보수가 힘들고, 운영에 잠재적 문제를 발생시키는 컴파일 설치를 설명하지는 않을 것입니다.

      실운영은 자신에게 편한 OS 를 사용하시면 됩니다. OS별 성능차이는 거의 없습니다.
      (굳이 비교하시려면 배포판별 리눅스 커널 버전이나, 파일시스템 타입을 보시면 됩니다.)
      중요한 것은 Nginx 이지, Ubuntu 나 CentOS 가 아닙니다.

  47. 안녕하세요! 라엘님 블로그 글을 보면서 개인서버를 준비중입니다.
    마리아DB를 설치하는 부분에서 오류가 발생하는데 왜 그런건지 도저히 모르겠습니다.
    우분투 버전은 ubuntu-16.04.1-server-amd64 입니다.

    ———-오류는 다음과 같습니다.———-
    root@develkarmy:~# apt-get install mariadb-server-10.1 mariadb-client-10.1
    패키지 목록을 읽는 중입니다… 완료
    의존성 트리를 만드는 중입니다
    상태 정보를 읽는 중입니다… 완료
    몇몇 패키지를 설치할 수 없습니다. 요청한 상황이 불가능할 수도 있고,
    불안정 배포판을 사용해서 일부 필요한 패키지를 아직 만들지 않았거나,
    아직 Incoming에서 나오지 않은 경우일 수도 있습니다.
    이 상황을 해결하는데 다음 정보가 도움이 될 수도 있습니다:

    다음 패키지의 의존성이 맞지 않습니다:
    mariadb-server-10.1 : 의존: mariadb-server-core-10.1 (>= 10.1.20+maria-1~trusty) 하지만 %s 패키지를 설치하지 않을 것입니다
    E: 문제를 바로잡을 수 없습니다. 망가진 고정 패키지가 있습니다.
    ———————————————–

    계속해서 이러한 오류가떠서 구글에 영문,한글로 의존성오류를 검색해보고 온갖 방법을 써보는데 해결이 되지 않습니다. 혹시 조언해주실 만한 해결책이 있으시면 감사하겠습니다.

    1. 해결했습니다.
      마리아db저장소를 다음과같이 변경했더니 잘 됩니다!
      # MariaDB Repository
      deb http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu xenial main

  48. 와… 이때까지 바왔던 how to install 글중 국내, 해외를 바도 이렇게 상세 하면서도 친절한 글은 역대급 이라고 생각 합니다.
    감사합니다.

    1. 감사합니다! 기초 환경은 만들었으니 이제 멋진 것을 만들어주세요!

  49. 안녕하세요
    덕분에 설치를 완료하였습니다.

    그런데 linode에서는 왜 메일이 안갈까요 ㅠ
    똑같이 설치한 digitalocean에서는 메일이 바로 가는데,
    유독 linode에서만 메일 발송이 안되네요..
    smtp 설치해도 안되고, 구글smtp를 이용해도 안되고..

    daum과 네이버에는 가는데, gmail에만 안가네요 ㅠ

    디지털오션에서는 전부 다 가고,
    linode에서는 gmail에는 안가네요..
    무슨차이인지 원…’

    디지털 오션에서는 두개다 바로 메일이 발송되는데;
    대충 어떤 부분을 찾아보면 될까요?ㅠ

    1. 아.. 해결했습니다.
      감사합니다.

  50. 안녕하세요 위 설명대로 php5를 설치하여 사이트를 운영중에
    PHP7.0으로 업그레이드가 필요하여 추가적으로 PHP7.0을 설치하였습니다.

    설치 후 설정부분에서 꼬였는지 작동이 잘 안되어 5와 7을 지우고
    재설치를 하려고 PHP 인스톨 명령어 그대로해서 apt-get purge 만 붙여주었습니다.

    삭제가 잘 안되는것 같고 재설치시에도 문제가 발생하는데요.
    혹시 설치 된 PHP 깔끔하게 삭제하고 다시 원하는 버전을 설치하는 방법을 알 수 있을까요?

    재설치시 CLI 폴더가 안 생기는등 몇가지 문제가 있었거든요ㅠㅠ

    1. 환경설정 파일이 남아있을수도 있습니다.
      /etc/php 폴더명을 /etc/php-old 로 바꾼후에 apt-get purge 후에 apt-get install 해보세요.

  51. phpmyadmin에서 403 에러나는분들을 위해 남깁니다.

    저는 default.conf에서

    location /phpmyadmin {
    index index.php;
    }

    추가하고 해결했습니다

    1. 웹 완전 초보입니다 ㅠ
      저도 같은 부분에서 403 에러가 나는데 정확히 어떻게 해야하는 건가요 ㅠ?

  52. php5.6 으로 설치했는데
    502 에러 뿜어 냅니다. ㅠ,.ㅠ

    제가 사용하는 빌더라 php7을 아직 지원을 안해서 5.6을 사용 하려고 합니다.
    조언 부탁드립니다.

    1. 502 는 nginx 설정파일과 php-fpm 경로문제 인것 같습니다.
      nginx 의 환경설정파일을 살펴보세요.

      또는 /var/log/nginx/사이트명.error.log 파일을 열어보아도 됩니다.

  53. ubuntu 16.04 + nginx + php7 환경입니다.

    phpmyadmin 로그인하면, 404 페이지가 뜨고
    404 url: http://sysdev/index.php?token=a9148bbbe90c97d686619626489dac54
    인증 토큰값이 sysdev/phpmyadmin/index.php? 이렇게 가야 하는데 phpmyadmin이 url 경로에서 빠져서 404가 뜹니다.

    404이후에 http://sysdev/phpmyadmin 으로 접속하면 이미 로그인상태로 되어있고, 정상 사용이 가능한데 매번 로그인 할때마다 404가 뜨고 다시 재접을 해야 하니 불편하네요.. 404를 없내는 방법이 뭘까요?

    1. 안녕하세요. 도메인을 sysdev.dev 로 바꿔서 해보셔요.

  54. 안녕하세요 라엘님~
    라엘님 덕분에 쉽게 서버셋팅은 했습니다~

    ubuntu 16.04 + nginx + php5.6 환경에 클라우드 플레어 사용하고있습니다.
    https://도메인명.com/dbmyadmin 으로 접속하면 정상적인 로그인 화면이 나옵니다.
    아이디와 패스워드 입력하면
    http://도메인.com:80/index.php?token=~~~~~~~~~~~~~~~~~~
    이렇게 뜨고 접속이 안됩니다. 구글링도해보고 이래저래 해보다가 도저히 안되서 질문 남깁니다
    그외 다른부분은 정상작동이됩니다~
    /etc/nginx/conf.d/도메인.con.conf 파일과 default.conf파일 모두 라엘님이 알려준 방법으로 설정해서 다른부분은 다 정상작동됩니다… 오로지 dbmyadmin 만 접속이안되내요~

    1. 대단히 많은 세팅을 해 보앗는데 혜인사랑님과 같은 문제 상황을 재현할 수 없었습니다.
      https://www.phpmyadmin.net/ 에서 최신버전을 받아서 다시 설치해보세요.

  55. 최신버전으로 설치했습니다 위와같이 com:80/index.php?token~ 이렇게는 안뜨는데 로그인이 안되내요~^^
    차근차근 다시 해보겠습니다~^^ 감사합니다~

  56. Block .php file
    이 부분에서 XE 에서 게시판 분류가 하위 xml.php 파일에서 카테고리 정보를 불러오는데 deny 되어있어서 못 불러오는 문제점이 있습니다.;

    1. 곧 해당 문제점을 수정하여 글에 반영하겠습니다.
      감사합니다.

  57. 정말 감사합니다.
    내용이 따라하기 쉬워서
    막히는 부분없이 수월하게 설치했습니다.

    1. 축하드려요! 이제 첫발을 딛었습니다!

  58. nginx 웹서버 본 세팅글을 보고 아주 잘 쓰고 잇습니다.
    정말 감사합니다.

    error 로그에서
    an upstream response is buffered to a temporary file
    이런 warn 메세지를 엄청 뿌려대고 있는데 어찌해야하면 좋을까요?
    아무리 구글링 검색해서 설정하고 reload 해도 마찬가지네요.

    또 log 파일 rotate 관련 포스트도 해주셨으면 감사하겠습니다. ㅠㅠ

    1. 해당 에러로그는 무시하셔도 됩니다. 좀더 테스트 해보고 해당 메시지가 안나타나는 설정법을 적도록 하겠습니다.
      그리고 nginx log rotate 는 자동으로 설정되므로 따로 설정할 필요가 없습니다.

      1. 무시하고 있는데 생각보다 에러가 많이 나오네요

  59. 안녕하세요 제가 아마존 웹서비스에서 ubuntu로 설치를 하여 진행하였는데요
    파일 권한 부분은 어거지로 해결은 햇는데 권장사항을 어떻게해야될까요
    그리고
    $con=mysqli_connect(“xxx.xxxx.xxxx”,”root”,”password”,”db”);
    mysqli_query($con, “set names utf8”);
    if (mysqli_connect_errno($con))
    {
    echo “Failed to connect to MySQL: ” . mysqli_connect_error();
    }
    이렇게 mysql접속할려는데 접속이 안됩니당..

    1. 아마존 RDS 방화벽 설정에서 해당 서버의 접속이 허용되어 있는지 확인해보세요.

  60. 먼저 정말 쉽게 잘 따라하게 해주셔서 감사합니다.
    윈도우 환경에서 사용할때는 php.ini를 수정해서 사용했었는데 이 글을 따라하다보니 궁금중이 생깁니다.
    수정해야 하는 php.ini이 두개라는 것과 /etc/php/7.0/fpm/pool.d/myuser1.conf 이 프로세스 설정파일에 수동으로 지정을 하라는게 햇갈리네요.
    /etc/php/7.0/fpm/pool.d/myuser1.conf의 내용을 보면 php.ini에 작성하던 문법이라고 하나요? 그게 다르기도 하고 익숙한 post_max_size도 php_admin_value[post_max_size] 이렇게 쌓여있으니 이해하기가 힘드네요.
    설명하기 힘드시다면 혹시 참조할수 있는 사이트가 있을까요?
    예를 들어 opcache.file_cache = /tmp/opcache로 설정하고 싶은데 두개의 php.ini을 건드려야 하는건지 myuser1.conf를 건드려야 하는건지 모르겠습니다.

    1. 안녕하세요?
      먼저 php.ini 파일을 두개 수정하는 이유는
      하나는 웹PHP 에서 로드하는 환경설정 파일이고,
      다른 하나는 서버콘솔PHP 에서 로드하는 환경설정 파일입니다.

      PHP 설정 수정을 원하시면 .conf 파일에서 작업하지 마시고, 사용에 익숙한 php.ini 파일을 수정하시면 됩니다.
      php.ini 은 서버 전체값이 변하는 것이고, .conf 파일은 해당 사이트에서만 특별히 바꿀 값을 적으시면 됩니다.

      1. 답변 감사합니다!
        그렇다면 웹PHP에서 사용하는 /etc/php/7.0/fpm/php.ini 하나만 수정해서 사용하면 되는게 맞나요?

        1. 네 맞습니다. 해당 파일의 값을 수정한 후에 php7.0-fpm 을 restart 하시면 적용될거에요.

  61. 정리를 이렇게도 잘해놓으시면 어떡하나요..
    덕분에 무사히 세팅 마쳤습니다. 감사합니다~

    1. 감사합니다! 정말 중요한 것에 힘을 더 쓰셔야죠!

  62. 안녕하세요 귀중한 자료 정말 감사합니다.
    현재 방화벽 설치 전까지 진행했습니다. phpinfo 나 phpmyadmin 까지 성공적으로 따라했습니다.
    저는 세개 사이트를 이전하려고 하는데요 제가 너무나 초보라서 잊부터 어떻게 해야할지 질문 올립니다.

    1. myuser1 계정 생성

    2, /etc/php/7.0/fpm/pool.d/myuser1.conf 파일 생성

    3. /etc/nginx/conf.d/aaa.com.conf , /etc/nginx/conf.d/bbb.com.conf, /etc/nginx/conf.d/ccc.com.conf
    각각 루트 폴더를 /home/myuser1/www/aaa; /home/myuser1/www/bbb; /home/myuser1/www/ccc; 설정

    4. phpmyadmin 에서 myuser1 계정 추가

    5. phpmyadmin 에서 myuser1 접속 각각 aaa, bbb, ccc, 디비 생성

    6. 각 디비에서 백업파일로 가져오기 실행 디비파일이 크면 max upload filesize, post max size 조정

    7. ftp 설치

    8. myuser1 로 ftp 접속 각각 루트 폴더에 데이터 업로드

    9. data 폴더 dbconfig.php db 아이디 패스워드 수정

    이런식으로 진행하면 될까요? 제가 너무 초보여서 죄송합니다 도움 주시면 정말 감사하겠습니다.

    1. 네 해당 순서대로 진행하시면 정상적으로 이용 가능합니다.
      본인에게 가장 쉬운 방법이 가장 좋은 방법입니다.

  63. 설치와 이전을 무사히 마쳤습니다. 로그인이 안되는 오류가 있었는데 소유자와 퍼미션을 변경하고 해결이 되엇습니다.

    죄송하지만 한가지 큰 질문이 있습니다.
    구글 api와 연동되는 플러그인이 실행되면 mysqld 기 시피유의 3~4퍼센트를 점유하면서 타임아웃이 되곤 합니다.
    원래 서버에서는 20초에서 30초 정도 실행이 되다가 페이지가 새로고침이 되었는데 지금은 페이지가 타임아웃이 되고도 5분에서 10분 정도 실행이 되고 있습니다.
    시간이 오래 걸리고 랙이 생겨서 그렇지 기능은 정상적으로 작동하고 있습니다.

    혹시 짐작가시는 부분이 있다면 답변 주시면 정말 감사하겠습니다.
    정말 훌륭한 가이드로 정말 편하게 웹서버를 만들어서 다시한번 감사드립니다.

    1. 안녕하세요. 사용하시는 개별 소프트웨어의 플러그인 오류 사항은 자세히 알 수 없습니다.
      해당 플러그인의 개발자에게 문의하시면 더 정확한 답을 얻을 수 있을 것 같습니다.
      감사합니다.

      1. 이것 저것 수정하던 중 my.ini에서 max_allowed_packet=128M key_buffer_size=8M

        이렇게 수정하니 고쳐졌습니다. 감사합니다.

  64. service nginx restart
    명령어 입력시
    Failed to restart nginx.service: Unit nginx.service is masked.
    라는 메시지가 출력 되는 경우가 있는데
    이럴경우
    systemctl unmask nginx.service
    를 하시면됩니다.

    ps. 나중에 다시 찾아올 나를 위해

    1. 내용 감사합니다!
      nginx 를 우분투 소스라이브러리에서 다운받아 설치하면 unmask 해주어야 하더라구요.

  65. 너무 자세히 설명해주시고 설정화일도 쉽게 만들수 있게 해주셔서

    무사히 설치 후 잘 사용하고 있습니다.

    사용도중에 한가지 이상한 점이 있어서 여쭤 보려고 합니다.

    제가 유저를 만들어서

    예를 들면 user1.kr 로 연결 시켰습니다.

    그런데 user1.kr/aklsdjflkwef/sdfwe 이런식으로 접속하면

    www 최상위 폴더의 index.php 를 읽어서 뿌려줍니다.

    index.php 화일이 없으면 404 error를 보내주는데.. 화일이 있으면 user1.kr 로 접속한것과 같은 화면이 나옵니다.

    conf 화일을 아무리 찾아봐도 방법을 못 찾겠습니다.

    저만 잘못된 것인지 최근 업데이트 하면서 바뀐 내용이 있는지 궁금합니다.

    1. 설정파일에서 try_files $uri $uri/ /index.php?$args; 부분을 제거해주세요. 해당 구분은 모든 유효하지 않은 요청을 index.php로 보냅니다.

      1. 답장 너무 감사합니다.
        적용하니 바로 되네요!

  66. 안녕하세요 아파치에서 처음으로 nginx로 갈아탔는데요
    위에서부터 쭉 보고 따라했는데 phpinfo.php파일이 전혀 열리지가 않습니다

    server {
    listen 80;
    server_name localhost;

    #charset koi8-r;
    #access_log /var/log/nginx/log/host.access.log main;

    location / {
    root /usr/share/nginx/html;
    index index.php index.html index.htm;
    }

    location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
    return 404;
    }

    fastcgi_pass unix:/run/php/php7.1-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    }
    }

    이런식으로 작성을 따라서 했는데 전혀열리지 않습니다

    1. 안녕하세요. NGINX 환경설정 생성기 를 사용하여 다시 설정해보세요.

      1. 안녕하세요 빠른 답변 정말감사드립니다

        제가 저번주부터 꾸준히 공부하면서 적용중인데 도저히 phpinfo파일을 못띄워서요
        nginx 1.13 버전을 사용중이고
        php*는 7.1 버전을 사용중인데
        방화벽도 꺼져있고 우분투 16.04만 딱깔고 위작업을 따라 진행했는데 php와 연동이 전혀안됩니다
        php관련된 파일이 잘못된나 싶어서 살펴봤는데 user와 group 모두 www-data로 설정되있고 listen 또한 /run/php/php7.1-fpm.sock; 이것으로 설정되있습니다
        어떤게 문제인지 원인을 모르겠습니다 어제도 해결을 못해서 오늘질문드립니다!

        항상 좋은글 감사합니다

        1. 오류 내용이 http://서버 아이피/phpinfo.php 접속하였을때
          Access denied. 이것만 딱 떠있습니다

            1. 자꾸질문드려서 죄송합니다
              제가 이글에있는 모든걸 따라했고 설정값도 똑같이 했는데 잘안됩니다
              nginx에서 php파일을 읽어야지 워드프레스를 설치하는데 phpinfo가 안나와서 여태작업을 못하고있습니다

  67. 안녕하세요.
    기초적인 것이지만 궁금하여 댓글을 남깁니다.
    하나의 서버 공간에 3개의 워드프레스 사이트(다른 도메인을 가진)를 운영한다고 하였을 때,
    루트 이외의 계정을 몇 개 더 만드는 게 맞을까요?
    사이트당 하나씩 유저를 만들어야 하나요?
    아니면 하나의 유저가 세 개의 사이트를 관리 가능한가요?

    1. 저는 도메인으로 아이디를 분리합니다.
      예를 들어서 www.hello.com 과 apple.hello.com, baby.hello.com 으로 운영한다면
      hello 유저를 만들고 /home/hello/www, /home/hello/apple, /home/hello/baby 폴더 생성 후 연결합니다.

      3개의 도메인이 아예 형태가 다르다면 3유저를 생성하는게 덜 헷갈릴겁니다.

      1. 말씀해 주신대로 hello라는 유저를 생성하여 www.hello.com을 운영할 경우, /home/hello/www/로 웹루트를 연결한 뒤 워드프레스를 설치할 때 궁금한 점이 있습니다.
        웹 루트에 filezilla로 워드프레스 폴더를 업로드를 하는 경우,
        워드프레스 폴더를 hello 유저로 업로드 하는 것이 맞겠지요???

        1. /home/hello/www/index.php 가 위치하도록 적절히 조정하시면 됩니다.

  68. 안녕하세요. 항상 아주 큰 도움을 받고 있습니다.
    다름이 아니라, 위의 모든 과정을 마치고 나니 phpmyadmin에 접속이 되지 않는군요!
    이 상황을 심볼릭 링크를 이용하여 해결했다는 댓글을 보았으나, 그방법에 대해 제가 잘 모르는 관계로…
    그냥 저는 user의 웹루트에 phpmyadmin 디렉토리를 한번 더 붙여 넣었습니다.
    그랬더니 example.com/phpmyadmin으로 접속이 가능했습니다.
    그렇다면
    phpmyadmin을 처음에 설치 했던 위치(/usr/share/nginx/html)의
    phpmyadmin폴더는 삭제 해도 무방하겠지요??

  69. 안녕하세요.

    죄송한데 한가지만 여쭤 보겠습니다.

    잘못된 경로 혹은 잘못된 php 화일로 접속시도할 때

    404 403 에러페이지 대신에 바로 웹루트로 이동시키려고 합니다.

    그래서 /etc/nginx/conf.d/ 접속 설정 파일에

    error_page 403 404 = 301 http://$server_name;

    이렇게 한줄 추가했더니 작동은 되더라구요..

    근데 저렇게 하는게 맞는 표현인지 모르겠습니다.

    그리고 워드프레스 설치한 곳에서는

    try_files $uri $uri/ /index.php?args;

    이것 때문에 403 404 에러가 워드프레스 기본으로 넘어가는데

    php 화일의 경우 404 에러 페이지가 나타납니다.

    그래서 error_page 404 /index.php?args; 한줄 추가했더니

    워드프레스 기본화면으로 돌아가는데

    저것도 맞는 표현인지 모르겠습니다.

    nginx location 정규식 이런거 찾아봐도 잘 이해가 안되서.. 질문 드립니다.

    1. 해당 방법도 맞는 것 같습니다. 사용하셔도 됩니다.
      다만 저라면 에러페이지를 만들어서 처리할 것 같습니다. 해당페이지에는 메인페이지로 이동하는 코드를 넣어두고요.
      크게 문제 생길 것 같지 않으니 되는 코드중에 가장 편한 방법으로 적용해보세요.

      1. 네. 무슨말씀인지 알겠습니다.
        항상 친절한 답변 감사합니다.

  70. 위 글의 16) 웹 사이트 구동예제
    Nginx server 구문 작성 하는 부분에서
    HTTPS 적용하는 설정 파일 내용에도
    워드프레스 홈페이지에 필요한 보안 구문들이 들어가 있나요????

    1. 네 모두 동일하게 적용되어있습니다.

    2. http://bit.ly/2tOs2Fv ( www.thewordcracker.com의 Nginx에서 실행되는 워드프레스의 보안 강화하기)
      이 사이트에 나온 내용 중 에서 설정 파일에 더 적용해 볼만한 점들이 있을까요???

      1. 굳이 더 적용하시려면 서버 설정 변경하지 마시고 워드프레스 플러그인 “WP Hide & Security Enhancer” 을 사용해보세요.

  71. [default.conf 설정 후 restart 오류 나는 경우]
    nginx -t -c /etc/nginx/nginx.conf 하신 다음 에러 라인 찾고
    /etc/nginx/sites-enabled/default 과 default.conf이 중복되는 부분을 삭제해주면 됩니다

  72. sendmail 을 설치하려고 하니 아래와 같이 나옵니다.
    리눅스 버전문제인것 같은데 해결방법이 무엇일까요??
    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    You might want to run ‘apt-get -f install’ to correct these:
    The following packages have unmet dependencies:
    linux-generic : Depends: linux-headers-generic (= 4.4.0.81.87) but 4.4.0.79.85 is to be installed
    linux-image-extra-4.4.0-81-generic : Depends: linux-image-4.4.0-81-generic but it is not going to be installed
    linux-image-generic : Depends: linux-image-4.4.0-81-generic but it is not going to be installed
    Recommends: thermald but it is not going to be installed
    sendmail : Depends: sendmail-base but it is not going to be installed
    Depends: sendmail-bin but it is not going to be installed
    Depends: sendmail-cf but it is not going to be installed
    Depends: sensible-mda but it is not going to be installed
    E: Unmet dependencies. Try ‘apt-get -f install’ with no packages (or specify a solution).

    1. 순서대로
      #apt-get update
      #apt-get autoremove
      #apt-get upgrade 또는 #apt-get install sendmail
      해보세요.

      1. 댓글 확인이 늦었습니다!!
        알려 주신대로 입력했더니 두번째 명령어에서 에러가 나오네요!
        Reading package lists… Done
        Building dependency tree
        Reading state information… Done
        You might want to run ‘apt-get -f install’ to correct these.
        The following packages have unmet dependencies:
        linux-image-extra-4.4.0-81-generic : Depends: linux-image-4.4.0-81-generic but it is not installed
        linux-image-generic : Depends: linux-image-4.4.0-81-generic but it is not installed
        Recommends: thermald but it is not installed
        E: Unmet dependencies. Try using -f.
        이 경우 어떻게 해야할까요?
        linux-image-4.4.0-generic 이것을 삭제해야하나요??

        1. root 의 권한에서
          #apt-get autoremove 하시고
          #reboot 으로 재부팅 해보세요.
          위의 단계를 2번 반복하세요. (autoremove 와 reboot)

          1. apt-get autoremove는 역시나 위와 같은 에러메세지가 나오고,
            서버를 reboot 시키니, 커널패닉이 발생하였네요.
            이전에 커널 업데이트 과정에서 서버용량이 부족하여 잘못 설치 되는 일이 있었는데,
            sendmail 덕분에 이 문제를 제대로 발견하게 되어 다행인거 같습니다.
            인터넷에 찾아보니 쓰지않는 커널 버전을 정리하고 용량을 좀더 확보시킨상태에서 다시 sendmail설치를 진행해보도록하겠습니다.
            항상 친절한 답변 주셔서 감사드립니다.

  73. 안녕하세요 라엘님.
    저는 문과 출신의 완전 초보자입니다. 일때문에 웹사이트 운영할 필요가 있어서 몇개월째 준비 중이고, 얼마뒤 오픈을 목표로 열일하고 있습니다. 문제는 제가 컴퓨터에 대해 무식하다는 점이죠. ㅠㅠ

    저희는 오프라인 비즈니스와 별개로 그와 연관된 중소규모 커뮤니티 사이트를 운영하려고 계획 중입니다. XE 기반의 홈페이지로, 현재 개발자에게 의뢰해서 개발 중에 있는데 거의 최종 단계에 도달해 있습니다. 그리고 그와 별도로 위키 사이트도 운영하려고 합니다. 실제 위키 사이트의 경우 일반 웹호스팅 업체를 통해 제가 혼자 설치해서 운영 중에 있습니다.

    다만 일반 웹 호스팅의 경우 DB를 여러개 설정할 수 없고, 다양한 제약 요소들이 있더라구요. 그래서 세팅과 이용이 자유로운 VPS를 알게되었고, vps 서버를 통해 사이트를 운영해보고자 마음 먹었습니다. 하지만 모든 기본 설정들을 혼자서 해야하기 때문에 시험삼아 아우어플랜이란 국내 업체에서 최저사양을 결제하여 연습중에 있습니다.

    우분투 16.4 기반에 Ngine X, PHP 7.0, Mariadb를 설치하려고 궁리하던 중에 라엘님 블로그까지 오게 되었구요. (여기 포스팅 이상의 설명을 보질 못했습니다.ㅠ) 제가 진짜 까막눈이라 설명에 대한 이해 없이 그져 따라하면서 세팅해 봤습니다. 결과적으로 2번째 다시 했을 때, phpmyadmin 로그인까지 가능했네요. ㅠ

    1. 문제는 제가 미디어위키 파일과 XE 웹데이터를 ftp로 업로드하고 설치하려는데 404 에러만 뜨고 작동이 되지 않는 거였습니다. 아무래도 설정 중에 뭔가 빠졌거나, 뭔가 엉뚱한 디렉토리에 업로드한 것 같은데.. 감을 못잡겠습니다. ㅠ

    2. php.ini 파일 두개에서 timezone을 서울로 세팅하는 부분을 정확히 따랐는데, phpinfo 화면에서는 ‘평양’으로 뜨네요;;;;; Asia/Seoul을 기입한 것이 정확한데 혹시 빠진 무엇인가가 있을까요?ㅠ

    3. sudo라는 명령어가 ~어떤 사용자에게 관리자 권한을 부여하는 정도로 이해했는데요. 저는 root 계정으로 이것저것 설정하고 실행했습니다. 초기 세팅에는 특별히 문제가 되는 부분이 없을 런지요?

    쓰다보니 글이 너무 길어진 듯합니다. 뭔가 혼자 해보는데 진행이 너무 안되서 머리속에서 궁금증이 폭발하다보니 그렇게 되었습니다. 부디 양해해주시기를 부탁드립니다. 좋은 포스팅 알찬 내용 정말 감사드립니다.

    1. 안녕하세요?
      1. 도메인이 있으신건가요? 도메인이 없다면 https://blog.lael.be/post/6070 로 이동하여 도메인을 발급받으세요.
      그 후 본문의 예시와 같이 설정이 잘 되었는지 확인해보세요.
      2. 저는 겪어보지 못했지만, 그런 시간설정 오류가 있는 경우가 있다고 합니다. 재부팅을 해보세요. 또한 XE 에서 설치 후 자동으로 시간보정을 해서 정상동작할 수 있습니다.
      3. root 계정으로 작업하시면 됩니다. 일부 클라우드호스팅의 경우 sudo 계정없이 root 계정을 부여하기도 합니다.

  74. 라엘님 안녕하세요.
    자꾸 질문만 드려서 죄송합니다.

    다름이 아니라 NGINX 환경설정 생성기에서
    default.conf 기본사이트 사용안함 (모두 차단)을 사용하여
    명시된 도메인명으로 접속해야만 해당 웹사이트를 볼수 있도록 하여
    ip 주소로 입력하면 ‘페이지가 작동하지 않음’ 이라고 표시되고 있습니다.

    그런데 https://ip주소 입력하면 /etc/nginx/conf.d/ 에서 설정한 최상위 사이트로 접속이 되고 있습니다.

    그래서 default.conf 에 추가로
    server {
    listen 443 default_server;
    server_name localhost;
    root /usr/share/nginx/html;

    return 444;
    }
    넣었더니 도메인 접속도 아예 안되네요.
    어떻게 해야 되는지 조언 부탁드립니다.

    1. 설정이 정확하다고 생각될땐 재부팅을 해보세요. 대부분의 문제가 해결됩니다.

      1. 답변 감사합니다.
        원래 설정으로 하면 접속은 가능합니다.

        제가 한 질문은

        123.123.123.123 이라고 입력하면 접속이 되지 않지만
        https://123.123.123.123 으로 했을때 접속이 가능한 부분인데

        라엘님 홈페이지도 https//ip주소로 접속 해봤는데 접속이 되고 있습니다.
        명시되지 않은 ssl 접속도 차단하는 방법이 있을까요?

        1. https 기본주소 차단하는 방법은 없습니다.
          http 와 달리 https 는 필수적으로 보안인증서를 설정해주어야 하기 때문입니다.

  75. 라엘님 덕분에 쉽게 배우고 있습니다. ^^

    iptable(방화벽) 적용하려고 하는데 자신의 아이피는 내부 아이피를 넣어야 하나요? 아니면 외부 아이피를 넣어야 하나요?

    내부 아이피는 192.168.XXX.XXXX 이런 식인데 마지막 주소는 계속 변하는 것 같고 외부 아이피는 고정이네요.

    1. 안녕하세요. 서버가 내부에 있고 아이피가 192.168.x.x 로 설정되어 있다면 내부아이피를 넣으시고, 그 외에 클라우드 서버호스팅, 웹호스팅을 받고 있다면 외부아이피를 적으시면 됩니다.

      1. 가상 서버 사용자인데 그러면 외부 아이피를 넣으면 되겠군요?

        감사합니다. ^^

  76. 안녕하세요. 글 잘보고 서버 설치 잘하였습니다.

    한가지 궁금한점이 있는데요.

    설치 이후 나중에 php로 sfrp 접속하여 파일을 삭제할일이 있을것같아서요

    기존에는 ftp_connect 함수를 사용하였었는데요.

    ssh2_connect. 함수를 사용할려고 하니깐 페이지 실행이 아예 안되는것같아서요.

    혹시 모듈을 설치하여야 하는건지 해야된다면,
    어떻게 설치를 하여야 하는지 여쭈어봅니다.
    감사합니다.!!

    1. sftp는 php native 함수로 사용하지 마시고, https://github.com/phpseclib/phpseclib 라이브러리를 포함해 보세요.
      샘플 코드는 다음과 같습니다. composer 를 사용하지 않은 단순 인클루드 방식입니다.
      set_include_path(‘../phpseclib’);
      require ‘Net/SFTP.php’;
      $sftp = new Net_SFTP($host);
      if (!$sftp->login($login,$password)) {
      exit(‘Login Failed’);
      }
      $listdata = $sftp->rawlist(‘./’);
      print_r($listdata);
      입니다.

  77. 잘읽었습니다 여기서 제가 궁금한게 있어서 문의드립니다.

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

    이말은 DB서버가 없얻고 기본 서버메모리 2G가 이상도 저걸 사용하면 된다는 말씀이신지요?

    1. 네. 1코어 1GB의 저사양 서버가 아니라면 해당 부분을 사용하시면 됩니다.

  78. 안녕하세요 라엘님,

    예전에 가상서버에 아파치로 홈페이지를 구성했습니다.

    그런데 이 같은 서버에 gitlab이나 django를 배포하려고 nginx를 따로 구분해서 쓸 수는 없나요?

    gitlab과 django 때문에 가상서버를 하나 더 구매해야되너 고민중입니다

    1. 해당프로그램들은 웹서버와 같은 포트를 사용합니다. 따라서 새로 구축하는게 좋습니다.

      1. 감사합니다:) 그럼 gitlab과 django도 서버를 따로 운영해야 하는건가요..? 그리고 이 페이지에 있는 설정을 다 한 후 git 서버 구축 설정을 해도 문제가 없는지 궁금합니다

        1. git 서버 설정법은 글을 따로 작성하였으니 그 글을 보시면 됩니다.
          https://blog.lael.be/post/5476

          1. 라엘님 nginx와 결합하여 django 독립된 서버로 쓰려면 이 페이지 끝까지 적용한 다음에 쓰면 될까요..?

            1. 최적의 사용법을 모르겠습니다.
              다만 이 사이트의 설치글이 잘 되어있는 것 같습니다. https://tutorial.djangogirls.org/ko/django_start_project/

  79. 가이드 보고 잘 사용하다가
    오랫만에 apt-get update // upgrade 명령으로 패키지 업그레이드 하는데
    kaist 쪽 mariadb 업데이트할떄 404에러 메세지가 뜨며 업그레이드가 되질 않내요

    # MariaDB
    deb http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu/ xenial main

    소스주소는 위처럼 되어있고

    에러메세지는 아래와 같습니다.

    Err:1 http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu xenial/main amd64 libmariadbclient18 amd64 10.1.27+maria-1~xenial
    404 Not Found
    Err:2 http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu xenial/main amd64 libmysqlclient18 amd64 10.1.27+maria-1~xenial
    404 Not Found
    Ign:3 http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu xenial/main i386 mysql-common all 10.1.27+maria-1~xenial
    Ign:4 http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu xenial/main i386 mariadb-common all 10.1.27+maria-1~xenial
    Err:5 http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu xenial/main amd64 mariadb-client-core-10.1 amd64 10.1.27+maria-1~xenial
    404 Not Found
    Err:6 http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu xenial/main amd64 mariadb-client-10.1 amd64 10.1.27+maria-1~xenial
    404 Not Found
    Err:7 http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu xenial/main amd64 mariadb-server-core-10.1 amd64 10.1.27+maria-1~xenial
    404 Not Found
    Err:8 http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu xenial/main amd64 mariadb-server-10.1 amd64 10.1.27+maria-1~xenial
    404 Not Found

    이런식으로 kaist & mariadb 쪽 업그레이드할떄 위처럼 404 에러가 발생합니다.

    1. apt-get update 가 안된것 같습니다.
      apt-get upgrade 는 반드시 apt-get update 후에 진행하세요.

      1. E: Failed to fetch http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu/pool/main/m/mariadb-10.1/mariadb-server-10.1_10.1.27+maria-1~xenial_amd64.deb 404 Not Found

        E: Unable to fetch some archives, maybe run apt-get update or try with –fix-missing?

        방금 다시 update 이후 upgrade 하였을떄 동일하게 메세지가 발생합니다.

        1. 방금 테스트 해보았고 정상동작하는 것을 확인하였습니다.
          현재 kaist 서버의 mariadb 최신버전은 mariadb-server-10.1_10.1.28+maria-1~xenial_amd64.deb 입니다.
          apt-get update 를 다시 시도한 후 업데이트 해보세요.

          1. 어제까지 안되던게 오늘 다시 시도하니 정상적으로 업데이트 되내요.
            댓글 감사합니다.

  80. 안녕하세요 추석연휴 잘보내고 계신지요.
    NGINX관련 글을 보다가 이렇게 보게 되었습니다.

    정말 잘 정리해두셨고 최고의 글입니다!

  81. 안녕하세요 라엘님 궁금한게 있어서 문의드립니다

    php pool 파일 만들기 및 nginx server 구문을 추가하기 이부분을 root계정으로 사용하면 안해도 되는건가요?

    따로 계정을 만들지 않고 root 계정에 /usr/share/nginx/html 여기로 사용할려고합니다

    php pool 파일 만들기 및 nginx server 구문을 추가하기 이부분을 사용안해도 보안이나 다른거에 대해서 문제점

    이 발생하지는 않겠죠?

    1. 가이드대로 만드는걸 추천합니다. 권한 문제가 생길 수도 있습니다.

  82. 유저계정을 aaa 로만들어서 사용할려고하면

    vi /etc/nginx/conf.d/default.conf 여기에서 root /usr/share/nginx/html; 이부분을

    root : /home/aaa/www; 이렇게 바꿔서 사용하면되는건가요?

    유저계정을 만들었는데..디폴트값이 기본이라서 저렇게 변경해서 사용하면 되는건지 궁금합니다

    1. 아니요 default 파일은 그대로 두고 새로운 파일을 만들어서 진행하여야 합니다.

      1. 새로운 파일이라면 /etc/nginx/conf.d/aaa.conf 이렇게 만들어서 default.conf파일하고 같은

        내용으로 구축하면되나요?

  83. ondrej 님 퇴사하신건가요 ppa 추가가 안되네요 유저나 팀이 존재하지 않는다고..
    Cannot add PPA: ‘ppa:~ondrej/ubuntu/php’.
    ERROR: ‘~ondrej’ user or team does not exist.

    https://launchpad.net/~ondrej/+archive/ubuntu/php
    여기서 ‘복사’해서 ‘붙여넣어도’ 안되고 원인이 뭘까요..

    1. 물결표 왜 넣으신건가요.
      본문에 쓰여진 명령어 복사 붙여넣기해서 입력하시면 됩니다.

  84. vi /etc/nginx/conf.d/default.conf 위에 포스팅처럼 수정하였습니다

    그리고 유저계정을 book으로 만들고

    vi /etc/nginx/conf.d/book.conf 파일을 따로 만들어서

    root : /home/book/www; 이부분을 변경후 저장하고 재부팅을 했는데도

    자꾸 default.conf(/usr/share/nginx/html) 여기값으로 지정되어있습니다.

    어떻게 수정을 해야 book.conf 로 실행이 될까요? default.conf 파일을 지우면되나요?

    1. 여기 보고 수정해보세요. default.conf 파일은 그대로 두고 새로 파일을 하나 만드세요.
      https://blog.lael.be/demo-generator/nginx/default.conf.php 페이지를 사용하면 쉽게 내용을 만들수 있습니다.

  85. 주옥같은글 감사합니다!

  86. 안녕하세요 라엘님!
    몇달전에 이 글을 참고하여 웹서버를 설치하고 잘 운영중입니다.
    요즘따라 해외에서 이상한 ip로 접속이 많아져서 geoip모듈을 이용하여 한국을 제외한 모든 국가의 접속을 차단하려합니다.
    nginx -V명령어를 실행하면 다른 모듈은 나와도 geoip모듈만 나오지가 않습니다.
    국내, 해외글을 참고해서 ./configure –with-http_geoip_module을 했는데도 작동을 안하는 것 같습니다.

    혹시 라엘님이 알고계시는 설치 방법이 있으신가요? 다른 분들은 저 명령어를 실행하면 geoip모듈이 보인다는데
    저는 보이지가 않아요. 요즘 이것때문에 너무 골머리가 아프네요ㅠ

    1. 안녕하세요!
      #apt-get install php7.0-geoip
      #service php7.0-fpm reload
      하신 후에
      공통 php 파일에
      if (geoip_country_code_by_name($_SERVER[‘REMOTE_ADDR’]) != ‘KR’) exit;
      한줄 추가해보세요.

      1. 빠른 답변 감사드립니다. 해결 하였습니다!
        nginx설치시 ./configure –with-http_geoip_module 명령어를 추가하여 설치하는게 맞았습니다.
        원인은 아래의 구문을 *.conf의 location위치에 if문 구절만 추가했어야하는데 통으로 추가해서 중복에러가 난거같습니다.
        location / {
        try_files $uri $uri/ /index.php?$args;
        index index.php index.html index.htm;
        if ($allowed_country = no) {
        return 444;
        }
        }

        알려주신 답변도 참고하겠습니다 감사합니다: D

  87. 라엘님
    서버 논리하드 날려서
    다시 셋팅해야 하는데
    Ubuntu 16.04.3 LTS 이버전으로 해도 상관없나요?ㅠㅠ

    차라리 최근에 올려주신 아마존에서 할까요?
    EC2 1년 체험 가능한데 ㅠㅠ

    1. 앞부분이 Ubuntu 16.04 이면 모두 가능합니다.
      EC2 1년 체험 종료일을 확인해보셔요.

  88. 안녕하세요 라엘님
    사이트를 운영을 하고 싶은 고등학생입니다
    라엘님의 글은 정말로 도움됬습니다!

    위의 셋팅 후 워드프레스를 설치 하려고하는데
    에러가 발생해서 계속 설치가 안되네요
    혹시 라엘님은 워드프레스을 어떻게 설치하셨는지 알려주실수 있으신가요”?

    1. 안녕하세요. 질문의 범위가 넓기 때문에 답변은 불가능합니다.
      워드프레스 직접구축하는 방법에 대해서 따로 글을 작성하도록 하겠습니다.

  89. 안녕하세요 많은 도움 받고 갑니다.
    혹시 fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    이 구문이 무슨 역할을 하는지 궁금합니다. 이것떄문에 php파일이 전부 access denied가 떠서 삽질좀 했네요
    해당 구문 삭제 후 해결이 됬습니다.

    1. nginx 에서 php-fpm 프로세스로 실행에 필요한 몇가지 서버 변수를 넘겨줍니다.
      위의 fastcgi_param 구문이 실행되면, php-fpm 에서 $_SERVER[‘PATH_TRANSLATED’] = $document_root$fastcgi_path_info 가 정의됩니다.
      이 구문을 삭제하셨으면 $_SERVER[‘PATH_TRANSLATED’] 은 설정되지 않았을 것입니다.
      access denied 오류는 사용 중이신 php 프로그램의 문제라고 생각됩니다.

  90. //초보,
    저도 같은 문제로 고민하다가 제가 설정한 세팅중에 php.ini 에서 php 경로정보를 감추기 위해 했던 세팅과 충돌이 나는거였습니다.

    /etc/php/7.2(자신의 버전에 맞게 수정)/fpm(cli도 마찬가지)/php.ini에서 cgi.fix_pathinfo를 0으로 설정하셨는지 확인해 보세요.
    제가 찾아본 정보로는 해당 값을 원래 기본값으로 두면 해결이 됩니다.

    cgi.fix_pathinfo 를 0으로 설정하는게 저는 보안세팅에 더 맞다고 생각하는데, 이렇게 되면 1값으로 둬야 하는데 다른분들과 의견을 나누고 싶습니다.

  91. MariaDB를 설치해놓고 서비스 상태 확인은 # service mysql status로 하네요. 이건 어떻게 된 건가요?

    1. MariaDB는 MySQL과 호환성을 여러 목표중 하나로 나왔습니다.
      그래서 기존의 MySQL을 통제하는 쉘 명령을 그대로 씁니다.

  92. Nginx로 가상호스트를 구성하려 합니다. (Apache의 Virtual Host)
    서버는 1개, 도메인은 여러개, 각 도메인마다 관리하는 우분투 계정도 그에 맞게 따로 만들고요.

    웹 검색을 해서 찾아보면,
    보통 Site-Available, Site-Enable 디렉토리로 관리하는 개념이던데,
    라엘님의 글에선 위의 개념으로 안해도 가상호스트를 운영할 수 있는거 같아 보여요.

    글 내용처럼 그냥 nginx.conf 하단에 include /etc/nginx/conf.d/*.conf; 해주고,
    여러 도메인명.conf를 만들고, php pool에서도 마찬가지로 각 도메인별로 만들어주면 여러 도메인을 운영할 수 있는데, [Site-Available, Site-Enable의 관리법]과 이것과 어떤 차이인지, 개념이 잘 안섭니다.

    싱글 사이트는 덕분에 아주 잘 세팅하고, 응용해서 최적화 세팅을 계속 적용해보는 중입니다.
    나중에 제 홈페이지도 정식 오픈하게 되면 라엘님에게 고마움을 글을 꼭 적고 싶어요. 감사합니다.

    1. 안녕하세요!
      site-available 과 site-enabled 방식은,

      site-available 폴더에는 여러개의 conf 파일들을 작성합니다.
      nginx.conf 에는 include /etc/nginx/site-enabled/*.conf; 이런식으로 enabled 폴더의 conf 파일을 불러오게 작성합니다.
      site-enabled 는 바로가기 파일이 저장됩니다. site-available 의 conf 파일 중 원하는 것만 바로가기(ln -s) 만들어서 저장합니다.

      이 방식이 더 고급스럽지만 (원하는 사이트만 켤 수 있고) 많이 헷갈리고 번거롭습니다. (available 에 conf 파일 만들고 enabled 에 그 파일 바로가기 만들고)
      전 간단하고 이해하기 쉬운 방식이 좋아서 본문과 같이 작성하였습니다!

      1. 제 낮은 눈높이에 맞춰서 친절히 설명해 주셨네요. 정말 감사합니다. ㅎㅎㅎ
        [site-enabled/avaiable] 방식은 그냥 임의로 정해진 방식일 뿐이었군요.

        답글 보기전까지 조금 걱정한 부분은,

        ‘Nginx 프로그램 구조상 정해진 디렉토리명과 방식을 해야 가상호스트를 할 수 있는건가?’
        ‘아닐텐데? 라엘님 방식이 더 합리적이고, 나도 해보니 더 편한데?’
        ‘내가 모르는 어떤 제약과 조건 때문에 그러나?’

        이었거든요.
        답답함이 속시원하게 해결되었습니다. 감사합니다.

  93. 개발중인 웹 서비스의 서버가 자주 터져서(….)
    서버를 옮기는 김에 처음으로 엔진엑스로 셋팅했는데 자세한 설명해주셔서 한번에 성공했습니다!
    감사해요!
    빨리 완성해서 라엘님한테도 소개하고 싶네요!

  94. 안녕하세요 라엘님
    워드프레스 설치법에 대하여 알고 싶습니다.
    혹시 실례가 안되신다면 포스팅을 해주실수 있나 여쭤보고싶습니다.

    1. 우와 완전 오래 기다리시네요. 지금 쓰도록 하겠습니다.

  95. 안녕하세요?
    아마존 AWS EC2에서 Ubuntu Server 16.04 LTS (HVM), SSD Volume Type 이미지를 이용해 우분투 서버 인스턴스를 생성한 다음 라엘님의 https://blog.lael.be/post/2600 글을 따라서 엔진엑스 웹서버를 구축해보았습니다. 인스턴스에 도메인을 연결한 상태에서 16번까지 완료하고 http 접근이 정상적으로 가능함(웰컴 투 엔진엑스), dbmyadmin 접근 가능함을 확인하였고 17번과 옵션 보안설정은 하지 않았습니다. 그리고 https://blog.lael.be/post/5107 글을 따라서 https를 적용하였습니다. 인증서 발급 성공까지 따라했고, 엔진엑스 적용방법의 구문을 https://blog.lael.be/post/2600 16번 항목의 3번째 https 예제에 맞게 수정해 넣은 후 dhparam.pem 파일을 생성했는데요. 이후 엔진엑스 리로드, php-fpm 리로드하고 나서 현재 https 접근이 가능하나 메인 도메인으론 403 Forbidden 그리고 메인도메인/dbmyadmin으론 404 Not found 페이지만 보입니다.

    주소는 disfemi.com 입니다. 무엇이 잘못된 것일까요? 제가 체크해보거나 시도해볼 방법이 있을까요? 죄송하지만, 도움 부탁드립니다. 서버 구축 가이드 글은 전부다 따라해보았지만, 유일하게 마지막 단계까지 근접한 글이 엔진엑스 편입니다 ㅜㅜ 이번만큼은 성공하고 싶습니다.

      1. 403 Forbidden은 home/사용자계정/www/ 디렉토리 내에 index.php 또는 index.html 등 인덱스 파일이 존재하지 않아서 나타나는 문제였습니다. 그리고 dbmyadmin은 기존 설치 경로에 있는 것을 복사하여 www/ 디렉토리 아래로 복사 붙여넣기 하니 정상 작동됩니다.

  96. 라엘님 안녕하세요
    /etc/nginx/conf.d/defalt.conf

    여기
    443추가 예제가 있나요?

    https://ip로 접속하니까

    구동중인 엉뚱한 도메인 으로 넘어가네요.

    1. 방법이 있긴한데 이론을 조금 알아야해서 따로 글을 써야할것 같아요.

  97. 안녕하세요. 우분투 16.04 + nginx 글을 따라하며 워드프레스 사이트를 구축하고 있는 사람입니다.

    예전에 아마존 AWS에 설치해서 블로그 잘 운영하다가 이번에 구글 클라우드로 이전하게 되어 다시 따라하고 있는데요. 설정에 어려움을 겪고 있습니다. 통계 관련 프로그래밍 경험이 있어 따라하는 건 가능한데 제반 지식이 부족하다 보니 문제를 해결하지 못하고 있습니다. 제가 겪고 있는 상황을 설명드리면 다음과 같습니다.

    해당 글 16번 (“웹사이트 구동예제”) 까지는 잘 됩니다. 그런데 워드프레스만 설치하면 문제가 생깁니다.

    서버 네임은 제 도메인으로 설정하고, 예시해 주신 루트 폴더 /html/myuser/html 에 워드프레스를 설치했는데요. 이렇게 하고 도메인에 구글 클라우드 서버 ip를 연결한 다음에 도메인으로 접속하면 cannot reach to this website라고 오류가 뜹니다. ip로 접속하면 welcome to nginx 첫 화면이 잘 뜨구요. 워드프레스 메인화면은 안 뜨네요. 예전에 AWS에 구축했을 때는 바로 워드프레스 세팅을 시작했던 것 같은데요. 설치 경로 문제인 것 같은데 어떻게 해야 할 지 짐작이 잘 안 됩니다.

    감사합니다.

    1. cannot reach to this website 라는 메세지는 처음보는 메세지입니다.
      도메인의 서버의 IP 를 잘못 설정했거나, DNS 적용 딜레이가 있는것으로 추정됩니다.

  98. Pingback: Ubuntu 16.04 (Nginx + PHP7-FPM + MariaDB) 세팅Virtualbox + Ubuntu 18.04.1 + Docker 로 시도중 (2018-09-20) | kiWOONne

  99. 안녕하세요 잘 보았습니다 서버 공부에 도움이 되었습니다 ^^

    1. 감사합니다! 유익한 글 더 작성하도록 하겠습니다!

  100. Pingback: 서버 빠르게 구축하는 법 – Angelfalse's Library

  101. Pingback: Cafe24 가상서버 Ubuntu 14.04.4, Nginx, PHP7.0-FPM, MySQL 설치 – Bsidesoft doc

  102. Pingback: 워드프레스 최적화를 위한 18개월간의 고민, 그 노하우를 담다. | 꿈꾸는섬

  103. 그동안 LAMP만 고집스레 쓰다가 Lael님 포스팅을 보고 용기를 내어 설정을 마무리했습니다. 일목요연하게 정리해주셔서 큰 도움이 되었습니다. 감사합니다!

  104. Pingback: LEMP 환경에서 워드프레스 설치하기 – happyblogging.net

  105. Pingback: 0. 아마존 웹 서비스로의 입문기 – Spectre's Blog

  106. @라엘 이제 해결이 되었습니다. 일단 라엘님 쭉 따라했구요
    IP주소접속시는 잘 되는데, 유독 도메인접속시에만 로그인 문제와 자동등록이미지(캡차)가 안뜨는 문제가 있어서, apache2 로그를 유심히 보니, 퍼미션 에러가 있어서,
    /home/myuser1/www 의 퍼미션을 기존에는 www-data:www-data 를 myuser1:myuser1 으로 바꾸니 해결이 되었습니다.
    IP주소접속, 도메인(ssh까지) 모두 잘 됩니다.
    이제 계속 또 테스트를 해봐야겠네요 감사합니다.

    1. 안녕하세요. 저도 테스트를 최소 10번은 해보고 쓰는거라서 본문대로 했을 때 안될리는 없을겁니다.
      감사합니다!

  107. 재설치 3번째 동시접속 약 300명에서 400명 정도될때 부터 엄청난 502 bad gateway를 뿜내요.
    메모리 CPU 충분한데 계속해서 그러네요
    기존에 아파치 사용할때는 문제없었는데 nginx로 바꾸고나서 502에러가 엄청납니다.

    1. 502면 php쪽 문제입니다. 에러로그를 보고 수정해보세요.

  108. 안녕하세요.
    apt-get install php7.0-gd php7.0-curl php7.0-mbstring php7.0-xml php7.0-mcrypt
    이부분 실행하면 아래와 같은 메시지가 뜨는데 전에는 없었던걸로 기억하는데 그냥 무시해도
    될까요?

    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    Some packages could not be installed. This may mean that you have
    requested an impossible situation or if you are using the unstable
    distribution that some required packages have not yet been created
    or been moved out of Incoming.
    The following information may help to resolve the situation:

    The following packages have unmet dependencies:
    php7.0-curl : Depends: libcurl3 (>= 7.18.0) but it is not installable
    php7.0-gd : Depends: libgd3 (>= 2.1.1) but it is not going to be installed
    Depends: libxpm4 but it is not installable
    php7.0-mcrypt : Depends: libmcrypt4 but it is not installable
    E: Unable to correct problems, you have held broken packages.

  109. Pingback: [Ubuntu] Let's Encrypt 를 사용하여 무료로 SSL 사이트를 구축하는 방법 | LEE-Hands

  110. 도저히.. 알 수가 없어서 ㅜㅜ 도움을 부탁드립니다..
    NGINX 에서 지정한 아이파만 특정폴더(하위폴더포함)의 접근 허용하고
    그외는 모두 제한을 하려고 conf 를 작성했는데요.. 이게 먹히지를 않아.. 도움을 부탁드리려 합니다..

    1. 관리자 폴더를 허용한 아이피만 접근가능 하게 하는 내용인데요
    deny all 은 먹히는데 allow 아이피는 통과를 못하고 전부가 막혀 버립니다.

    location ^~ /adm/ {
    allow 123.123.123.123;
    allow 124.124.124.124;
    deny all;
    return 403;
    }

    2. 첫번쨰가 안되서 새로 작성 한 소스 입니다.
    이것도 역시 똑같은 증상 입니다.. 모두 막혀버리고 allow 아이피가 안되네요..
    이것저것 조금씩 바꾸다 보니.. 서버가 아이피 인식을 못하나(?)라는 이상한 의심도 하게 됩니다 ㅜㅜ

    #Index Connect Access IP
    location = /adm/ {
    allow 123.123.123.123;
    allow 124.124.124.124;
    deny all;
    access_log off;
    log_not_found off;

    include fastcgi_params;
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
    return 404;

    }
    fastcgi_pass unix:/run/php/test_test.sock;
    include mime.types;
    }

    1. 서버가 트래픽을 직접받나요? 앞단에 Loadbalancer가 있는지, 또는 CloudFlare 같은것이 있는지 궁금하네요.
      만약 있다면 설정법이 조금 달라집니다.

      1. 빠른 피드 감사합니다!
        플라우드플레어 > 아마존 라이트세일 사용중에 있습니다. 로드 밸런스는 없습니다
        홈페이지에서 아이피를 찍어 보면 정상 아이피로 나오는데
        클라우드 플레어에서 > 서버 상에서 접속자의 아이피가 다르게 나올 수 있나요?

        1. 먼저, nginx 프로그램이 인식하는 ip 를 살펴보세요.
          root 사용자로 /var/log/nginx 폴더로 이동하시고, 어느 하나의 accesslog 파일을 살펴보세요. 각 라인의 첫번째 항목이, nginx 가 인식하는 ip 입니다.
          만약 해당 ip 가 cloudflare 의 ip를(주로 104. 으로 시작) 가리키고 있다면,
          제 블로그의 https://blog.lael.be/post/8989 글을 살펴보시고, 적절한 조치를 취해보세요.

          1. 감사합니다! 아직 멍 한 상태지만
            알려주신 대로 차근차근 해결해 보겠습니다.
            생각지도 못한데서 일이 생겨서.. 고생 많이 헀는데
            여기서 많이 배우고, 또 많이 도움만 받고 있네요 ㅜㅜ
            일단 전 문제해결하러 달리겠습니다 ^^
            좋은 하루 되세요!

  111. Pingback: 우분투에서 nginx+php7.0+mariaDB 설치하기 – Linsoo

red123에 답글 남기기 응답 취소

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

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