Fogeaters, Light The World.

09

2016-Jan

한번에 끝내는 Ubuntu 웹서버세팅

작성자: title: MoonBlonix IP ADRESS: *.148.87.98 조회 수: 1905

출처 : http://blog.lael.be/post/73


이 글에서는 자동화되고 무결성이 보장되며, 유지보수 관리되는 설치방법을 설명하고 있습니다.

아래의 방법대로 설치한 후에 언제든지

1
apt-get update
1
apt-get upgrade

명령을 사용하면, 항상 빠르고 안전한 최신버전의 소프트웨어를 사용하실 수 있습니다.

 

최종수정 : 2015-10-20


* 이 글은 Ubuntu 에 PHP 웹서버를 세팅하는 방법을 소개하고 있습니다.

* PHP를 최신버전으로 구축하고 싶다면 http://blog.lael.be/post/2600 글로 이동하세요. (Nginx + PHP7-FPM + MariaDB)

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

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

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


현재 배포된 Ubuntu 버전은 아래와 같습니다.

사용자 삽입 이미지

운영체제의 수명이 긴 LTS 버전을 설치하도록 합시다. (버전숫자가 높다고 더 좋다는 뜻은 아님)

Ubuntu 운영체제에 관해서는 http://en.wikipedia.org/wiki/Ubuntu_(operating_system) 를 참조하세요.

 

설치는 Ubuntu 14.04 LTS를 기준으로 합니다.

(Ubuntu 16.04 LTS 버전이 출시 될 2016년 4월이 되면 다시 바꾸겠습니다.)

 

일반 사업체에서 사용할 수 있도록 안정적인 세팅법을 알려드리겠습니다.

 


#14.12.21 추가.

웹 서버의 선택.

IT는 가만히 있지 않고 매우 빠르게 발전합니다.

이 글에서 설명하고 있는 설치법은 2014년 12월 현재까지도 안정적입니다.

 

다만 요즘 인기있는 구성에 대해서 설명해 드리고자 합니다.

과거에는(현재에도) HTTP 웹 서버에 PHP, JSP 같은 프로그래밍 언어의 해석 모듈을 로딩해서 사용했습니다.

이 글에서 설명할 Apache 2 with mod_php 같은 방식이고,  Apache tomcatEclipse Jetty 도 모두 웹서버가 프로그래밍 언어 해석 모듈을 탑재하고 있는 경우입니다.

조금 더 전문적인 용어로 말하자면 웹컨테이너(http 만 담당), 어플리케이션 컨테이너(php, jsp등 해석 담당) 가 한 곳에 있는 것입니다.

 

아주 단순한 논리인데, 이 둘을 나누어 두면 어떨까 하는 것입니다. 그리고 둘을 특화 시키는 것입니다.

웹컨테이너(Web container) 프로그램과 어플리케이션 컨테이너(Application container) 프로그램으로 나누고

웹컨테이너 프로그램은 단순하게 내용 전송만 하고, 어플리케이션 컨테이너 프로그램 프로그램 해석만 하는 것입니다.

사람들이 둘을 나눠봤는데 성능이 향상하는 것을 확인했습니다.

 

웹컨테이너 프로그램 중 유명한 것은 Nginx 이고,

어플리케이션 컨테이너 프로그램 중 유명한 것은 PHP-FPM 입니다.

 

동작원리는 Nginx 가 사용자의 URL을 확인해서 파일의 끝이 .php나 .jsp 로 끝나면

php-fpm 이나 tomcat 에게 해당 파일 경로를 넘겨 주고 결과를 기다립니다.

php-fpm 은 넘겨받은 경로의 php를 실행하고 실행결과를 nginx 에게 넘겨줍니다.

 

다음은 그림판으로 뚝딱 그린 대략적인 흐름입니다.

 

nginx

이를 활용하면 한 nginx 서버에서 여러 버전의 php를 구동할 수도 있고, jsp 등등의 언어를 동시에 처리할 수 도 있게 설정할 수 있습니다.

nginx는 기본적인 http 컨텐츠 전송 기능과, 요청을 다른 프로그램에게 전달해 주는 proxy 기능을 수행합니다.

 

 

요즘 구성가능한 서버 방식은 다음과 같습니다.

- Nginx + PHP-FPM (이 방식을 사용하여 설정을 잘 하면 가장 월등한 동접처리가 가능합니다. 다만 일부 범용 프로그램에서 호환이 안됩니다. )

nginx는 가벼운 대신 모듈이 많지 않습니다. nginx는 .htaccess 파일을 해석할 수 없습니다.

 

- Apache + PHP-FPM (apache 는 아주 많은 확장 모듈이 있습니다. 기본 내장된 mod_proxy 모듈을 사용해서 nginx와 동일한 역할을 할 수 있도록 할 수 있습니다.)

다만 기본으로 처리하는 것이 많아서 nginx 보다 약간은 느립니다. (0.01초 정도 차이) 당신의 웹프로그램이 이러한 처리모듈을 필요로 할 수 있습니다.

 

- Apache + mod_php (이 글에서는 이 방식을 설명할 것입니다.)

Apache와 PHP 프로그램을 따로 구동하지 않고 Apache가 PHP 해석 모듈을 로드하여 동작합니다.

 

어차피 동접 3000, 4000 정도 될 때는 위 중 어느 방식으로 구성하더라고 서버가 뻗게 되 있습니다.

100명 이하의 동접이 일어날 때는 셋다 똑같으니 아무거나 쉬운 방식으로 설치하세요.

다만 nginx 환경은 여러 범용 프로그램 사용에 제약이 있을 수 있습니다. (사용하려면 삽질을 많이 해야한다는 뜻)

 

+ 비유를 하자면 Windows XP와 Windows 7 과 Windows 10 이 있는데, 웹서핑이나 문서작업 하는 입장에서는 셋다 똑같다고 느낍니다.

오히려 XP가 가장 빠를지도 모릅니다. 다만 요즘 나온 Diablo 3나 Starcraft 2 같은 게임을 구동할 때는 당연히 Windows 10 이 가장 좋은 성능을 보여줄 겁니다.

 

+ Nginx + PHP-FPM 구성은 원하시는 분이 있으면 글 포스팅을 하도록 하겠습니다.


 

1) 리눅스 버전체크

#uname -a
Linux li599-115 3.16.7-x86_64 #3 SMP Fri Nov 14 16:55:37 EST 2014 x86_64 x86_64 x86_64 GNU/Linux

2) Ubuntu 버전체크

#cat /etc/issue
Ubuntu 14.04.1 LTS

3) 하드용량체크

#df -h
 Filesystem            Size  Used Avail Use% Mounted on
 /dev/mapper/LaelServer02-root
 37G  739M   35G   3% /
 tmpfs                 244M     0  244M   0% /lib/init/rw
 varrun                244M   72K  244M   1% /var/run
 varlock               244M     0  244M   0% /var/lock
 udev                  244M  148K  244M   1% /dev
 tmpfs                 244M     0  244M   0% /dev/shm
 lrm                   244M  2.7M  242M   2% /lib/modules/2.6.28-11-server/volatile
 /dev/sda5             228M   14M  202M   7% /boot

대략 다 더하면 40G가 나온다.

 

 

 

4) 메모리 체크

#free -m
              total       used      free     shared    buffers     cached
Mem:           988        703        285          0        137        393
-/+ buffers/cache:        172        816
Swap:         1881          0       1881

988M의 전체메모리중 현재 703M을 사용하고 있고 285M가 비어있다.

 

4-1) CPU 코어수 확인

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

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

스크린샷 2015-04-08 오전 12.42.54

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

한번 정도는 다음의 명령어를 확인해 보세요.

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

 

5) 자잘한 업글

apt 목록 갱신

apt란 Advanced Packaging Tool 을 뜻합니다.

우리는 apt 라는 우분투에 내장된 프로그램을 이용해서 프로그램을 쉽게 설치/제거 할 수 있습니다.

 

패키지 목록 갱신.

#apt-get update

 

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

#apt-get upgrade

6) 시스템 시간 설정

이것을 하지 않으면 영국 시간을 불러올 것이다.

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

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

#dpkg-reconfigure tzdata

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

 

v1

v2

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

 

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

스크린샷 2015-10-08 오전 2.31.05

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

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

 

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

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

127.0.0.1    myserver1

스크린샷 2015-10-17 오전 12.51.37

 

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

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

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

# apt-get install sendmail

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

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

 

 

8) Apache2 설치

#apt-get install apache2

14.04LTS 에서는 apache 2.4 가 설치된다.  이것은 apache 2.2보다 성능이 많이 향상되었고 nginx와 비슷한 성능을 보여준다.
설치가 완료되면 자동적용 및 시작된다.

버전체크

apache2 -v

스크린샷 2015-04-08 오전 1.06.21

 

확인해본다.
http://256.123.213.213 (서버의아이피)
웹브라우져에 기본 설명페이지가 뜨면 성공.
(참고로 기본으로 보여지는 파일은 /var/www/html/index.html 이다.)
기본 파일을 지운다.
#rm /var/www/html/index.html
기타 주로 사용되는 모듈을 활성화, 필요없는 모듈은 비활성화 한다.
아래 모듈에 대한 자세한 설명은… 생략한다.
사용에 문제가 발생하지 않는 최상의 방식이라고 이해하면 된다.
#a2enmod rewrite
#a2enmod headers
#a2dismod autoindex

 

#15.12.20 추가 보안패치. (.git, .svn, .env 등 dot로 시작하는 파일폴더 보호)

# vi /etc/apache2/apache2.conf

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

1
2
3
4
5
# deny file, folder start with dot
<DirectoryMatch "^\.|\/\.">
    Order allow,deny
    Deny from all
</DirectoryMatch>

 

9) PHP 5.x 설치

--

PHP 7.0 관련 안내.

PHP제작자가 PHP에 온갖 신기능을 넣어서 PHP6 를 만들었습니다. 그런데 신기능을 너무 많이 넣고 빼는 바람에 코드가 망했습니다. 쓸 수 없는 코드가 된 것이죠.

그래서 깔끔하게 PHP6를 폐기하고 PHP7 을 개발하였습니다.

PHP7은 제거한다던 기능을 제거하고 코드 동작을 개선하였습니다.

현재 PHP7을 실서비스에 적용하는 것을 권장하지 않는데, 이게 버그 때문이 아니라 하위호환이 안되기 때문입니다.

mysql_query() 같은 제거하기로 예고되었던 함수가 깔끔히 제거되었고, 몇몇 warning 이 나던 코드가 error 로 바뀌어 응답이 중단됩니다.

PHP 표준에 맞추어 개발된 코드는 잘 동작하겠지만 그렇지 않은 코드는 동작을 안할 겁니다.

당신이 신규서비스 개발자라면 PHP7 환경에서, 그렇지 않고 기존 오픈소스 이용자시려면 PHP5의 환경을 구축하시기 바랍니다. 2016년 중순까지는 PHP5를 사용하시길 권장합니다.

참고로 제 블로그는 현재 PHP7으로 구동되고 있습니다.

 

PHP7 을 설치하고 싶다면 이글(http://blog.lael.be/post/2407) 로 잠깐 이동하세요. 이후 10번의 DB 설치를 진행하시면 됩니다.

--

#apt-get install php5
자동으로 아파치 중단시키고  설정파일에 php를 등록시키고 재 구동시킨다.(바로 적용됨)
14.04 에서는 php 5.5.9 가 설치된다.
#apt-get install php5-cli
콘솔에서 php를 실행시키기 위해서 위와 같이 실행
기타 주로 사용되는 모듈을 설치한다.

- 암호화 모듈

#apt-get install php5-mcrypt

 

- 이미지처리 모듈

#apt-get install php5-gd

 

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

#apt-get install php5-curl

 

-추가로 설치하고 싶은 모듈이 있으면

#apt-cache search php5-

라고 입력해서 설치가능한 패키지를 검색후 install 하도록 하자.
스크린샷 2015-06-01 오전 1.43.51

 

- 아파치 재시작(적용을 위해서)

#service apache2 restart
버전체크
#php -v
PHP 5.5.9-1ubuntu4.5 (cli) (built: Oct 29 2014 11:59:10)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

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

 

10 - 1) Mysql 설치 (또는 MariaDB 설치)

mysql 과 mariadb 는 완전 호환된다.

사용 방법이 아예 똑같다. 명령어도 똑같고 환경설정 파일 위치도 똑같다.

아무거나 하나 선택해서 설치하여라. 요즘엔 MariaDB를 많이 사용한다.

 

가) Mysql 설치

#apt-get install mysql-server-5.6
#apt-get install mysql-client-5.6

 

나) MariaDB 설치 (추천)

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

-----------

#10.23 추가 : PHP7 설치하신 분은 이미 패키지에 mysqli 및 pdo_mysql 이 포함되어 있으니 아래의 php5-mysql 패키지를 설치하시면 안됩니다.

PHP5 설치하신 분만 다음의 명령어를 실행해서 php5-mysql 패키지를 설치해주세요.

#apt-get install php5-mysql

php5 연동모듈 설치. 완전 호환되기 때문에 mysql 이라고 해도 mariadb 사용가능.

 

MYSQL 콘솔 클라이언트 버전체크
#mysql -V
mysql  Ver 14.14 Distrib 5.5.32, for debian-linux-gnu (x86_64) using readline 6.2
또는
mysql  Ver 15.1 Distrib 5.5.40-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
MYSQL 서버 버전체크
나중에 phpmyadmin 을 설치해서 보시거나 콘솔에 접속해서 SELECT VERSION();  쿼리를 실행해서 살펴보자.
SELECT VERSION();
스크린샷 2015-07-29 오후 6.00.47
또는
스크린샷 2015-07-29 오후 6.00.55

10 - 2) 기본 언어셋 설정(중요)

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

#vi /etc/mysql/my.cnf

 

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

 

[mysqld] 항목에 다음 2 줄을 추가한다.
character-set-server = utf8
collation-server = utf8_general_ci

 

#2015.04.08 변경.

2015년도 부터는 아래와 같이 utf8mb4 속성을 사용하세요.

이 속성은 utf8확장입니다. 기존의 모든 utf8과 상위 호환됩니다.

 

utf8mb4 속성은 스마트폰 이모티콘 문자(emoji)를 저장할 수 있습니다.

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

character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

 

스크린샷 2015-04-08 오전 1.19.05

 

변경사항 적용

#service mysql restart

11) PHP 권한 설정

웹 서비스 구동시 발생할 수 있는 Nobody 퍼미션 관련 문제를 해결하기 위해 관련 프로그램을 설치한다.
이 세팅을 하면 shell의 권한과 sftp의 권한과 web의 권한이 동일하게 취급되며 보안도 좋게된다.
자세한 설명은 http://blog.lael.be/post/138 를 참조하도록 하고 여기서는 명령어만 나열한다.
순서대로 쓰면 된다.
#apt-get install apache2-mpm-itk
#chmod 711 /home
#chmod -R 700 /home/*

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

 

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

 

- PHP7 을 설치하신 분은 11-2 로 넘어가세요.

 

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

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

스크린샷 2015-04-11 오후 12.51.40

.php .php3 .php4 .php5 .pht .phtml  확장자 파일이 php를 해석할 수 있게 되어있다.

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

 

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

 

1
2
3
4
<FilesMatch ".+\.ph(p3|p4|p5|t|tml)$">
Order Deny,Allow
Deny from all
</FilesMatch>

 

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

스크린샷 2015-04-11 오후 12.54.54

 

--------------------------------------------

적용을 위해서 아파치 재시작

#service apache2 restart

 

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

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

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

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

 

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

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

이 값을 찾아서

 

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

이렇게 변경.

 

#service apache2 restart

 

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

phpinfo 페이지에서 Default timezone 이 설정되어 있으면 정상.

 

 

12) 계정생성 및 동작테스트

원래 표준명령어는 useradd 이지만    ubuntu는 사용하기 좋게 adduser 를 지원한다.
리눅스 관련 서적을 보면 둘다 계정생성용 명령어라고 되어있다.
쉬운 설정을 위해 adduser를 사용
#adduser lael.be --force-badname
(참고로 위와 반대동작을 하는 계정삭제 명령어는 - 계정을 삭제하고 홈디렉토리도 삭제함 -
#userdel -r lael.be
입니다.)
보통 웹루트는 홈디렉토리에 하지 않습니다.
저는 주로 www 디렉토리를 사용합니다.사용자변경 후 www 디렉토리를 생성하고 빠져나오기
Blonix 메모 -> www디렉토리라는게 /home/니계정/www 를 말하는거다. 라즈베리에서는 그냥 /www 를 만드는 수가 있으니까 그냥 루트권한으로 저기다 직접 디렉토리 만들어버리는걸 추천한다.
#su -l lael.be
#mkdir www
#exit

13) 웹사이트 Apache 환경설정파일 작성

다음의 내용을 작성한다.

Blonix 메모 -> 이거 뭔가 이상하다. 이 부분은 일단 그냥 무시하고 제일 밑에 내가 추가로 단 댓글을 확인

 

/etc/apache2/sites-available/lael.be.conf 에 저장한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<VirtualHost *:80>
    #main domain
    ServerName lael.be
 
    #additional domain
    ServerAlias www.lael.be
    ServerAlias my-anotherdomain.com
 
    #document Root
    DocumentRoot /home/lael.be/www/
 
    #additional setting
    <Directory /home/lael.be/www/>
        Options FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        # 14.04 rules
        require all granted
    </Directory>
 
    AssignUserID lael.be lael.be
 
    ErrorLog ${APACHE_LOG_DIR}/lael.be-error.log
    CustomLog ${APACHE_LOG_DIR}/lael.be-access.log combined
</VirtualHost>

ServerAlias 는 사용안하면 빼도 되는 줄이다.

#15.09.16 추가

당신이 만약 SSL(https) 를 적용하고자 한다면 lael.be.conf 파일 하단에 다음의 코드를 추가하세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<VirtualHost *:443>
    #main domain
    ServerName lael.be
 
    #additional domain
    ServerAlias www.lael.be
    ServerAlias my-anotherdomain.com
 
    #document Root
    DocumentRoot /home/lael.be/www/
 
    #additional setting
    <Directory /home/lael.be/www/>
        Options FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        # 14.04 rules
        require all granted
    </Directory>
 
    AssignUserID lael.be lael.be
 
    ErrorLog ${APACHE_LOG_DIR}/lael.be-error.log
    CustomLog ${APACHE_LOG_DIR}/lael.be-access.log combined
    SSLEngine on
 
    SSLProtocol all -SSLv2 -SSLv3
 
    SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
 
    SSLHonorCipherOrder on
 
    SSLCertificateFile "/home/lael.be/ssl/mysite_ssl.crt"
    SSLCertificateKeyFile "/home/lael.be/ssl/mysite_ssl.key"
    SSLCertificateChainFile "/home/lael.be/ssl/mysite_ssl.certchain.crt"
 
</VirtualHost>

https://www.sslshopper.com/ssl-checker.html#hostname=blog.lael.be  (체인 인증서 테스트용)

https://www.ssllabs.com/ssltest/analyze.html?d=blog.lael.be (SSL 보안설정 테스트용)

라엘이가 여러 설정 값에 대해서 테스트를 해 보았고, 최적의 권장설정 값을 위와 같이 적어두었으니 그대로 쓰면 된다.

위의 설정값으로 SSL을 설치하면 A등급을 받을 수 있을 것이다.

스크린샷 2015-10-08 오전 1.55.20

.

인증서 적용 테스트는 위의 사이트를 이용하여라.

인증서 체인 파일이란 “인증서에 대한 인증서” 파일이다.

대통령이 당신을 인증할 때 직권으로 인증하는 것이 아니라, 대통령 -> 서울시장 -> 강남구청장 -> 삼성동장 -> 당신 의 단계를 거친다. 검증하려면 모든 단계의 보증 증서를 제공해야 하는 것이다.

인증서 파일에는 삼성동장 -> 당신  의 정보가 들어있고, (암호화 통신시 공개됨)

인증서 키 파일에는 암호화 통신을 위한 정보가 들어있고 (은행 보안카드 로 비유. 외부에 공개되지 않음.)

인증서 체인 파일에는 대통령 -> 서울시장 -> 강남구청장 -> 삼성동장 의 정보가 들어있다. (암호화 통신시 공개됨)

인증서 체인을 올바르게 작성하지 않으면 Firefox 브라우저와 Android Chrome 브라우저에서 “인증서 정보부족” 오류가 발생하게 된다.

 

14) 사이트 활성화 및 적용

#a2ensite lael.be
(참고로 사이트 비활성화는
#a2dissite lael.be
입니다.)
- 아파치 설정 다시 불러오기(적용을 위해)
#service apache2 restart

15) Apache 추가 보안 설정

- 기본 언어셋 설정
#vi /etc/apache2/conf-available/charset.conf
기본 언어값 UTF-8 에 대해서 주석처리되어 있을 텐데 주석(#)을 제거해 준다.
v5
- 추가 보안 설정
#vi /etc/apache2/conf-available/security.conf
매우 권장하는 보안설정이므로 Ubuntu Apache 패키지 제작자가 미리 써두었다.
이미 다 쓰여 있으니까 주석(#) 만 제거하자.
v6
v7
v8

옵션) SSH 기본 포트번호 변경

#이 작업은 무작위 대입공격(Brutu force attack)의 시도를 차단해줍니다.
보통 IP주소 : 22번 포트를 스캔해서 ssh와 연결되면 무작위 로그인 시도를 하는 프로그램이 엄청 많은데,
포트번호만 바꾸어주어도 방어가 되거든요.
!! IPTABLES 방화벽, SSH 포트번호 변경Fail2ban 중에서 하나만 적용하세요!!
!! 나는 허용된 IP만 서버에 접속하게 할거야 -> IPTABLES !!
!! 나는 사용자의 IP를 특정지을 수 없는데 무차별대입 공격은 방어할거야 -> Fail2ban !!
!! 나는 나만 아는 포트번호로 서버에 접속할 거야 -> SSH 포트변경!!
[개인 프로젝트, 회사의 서비스 -> IPTABLES]
[웹호스팅 -> Fail2ban 또는 SSH 포트변경]
SSH 기본 포트번호인 22번을 다른 번호로 바꿉니다.
기억하기 쉬운 숫자로 변경하세요.
v9

 

옵션) 방화벽 적용하기.

접속자의 IP 가 고정되어 있으면 아래와 같이 방화벽 세팅을,
웹호스팅 서비스와 같이 접속자의 IP를 특정할 수 없으면 fail2ban 을 (http://blog.lael.be/post/858#fail2ban) 사용하세요.

저의 경우 몇대의 단독 VPN 서버가 있으며(즉 어느 위치에 있든지 고정IP 로 활동할 수 있음) 해당 IP 를 방화벽 예외로 설정해 두곤 합니다.

당연한 이야기지만 Ubuntu 에도 방화벽이 있습니다.
무척 당연한 이야기지만 방화벽을 사용하면 서버 보안이 매우 많이 향상됩니다.

현재 방화벽 설정 보기. (List)

#iptables -L

스크린샷 2015-12-15 오전 1.58.42

INPUT (서버로 들어오는 것 관리), FORWARD (서버에서 내부망으로 연결관리;잘 안씀), OUTPUT (서버에서 나가는 것 관리)
로 이루어져 있다.

보통 FORWARD와 OUTPUT은 건들이지 않고 INPUT 만 수정한다.
policy ACCEPT 라는 뜻은 아무 조건도 해당하지 않았을 때 ACCEPT 하라는 것이다.

먼저 현재 방화벽 설정을 파일로 저장한다. 언제든 현재의 상태로 되돌릴 수 있기 위해서 이다.

#cd ~
#mkdir firewall_rules
#cd firewall_rules
#iptables-save > 151214.rules                 현재 날짜 쓰세요.

이제 방화벽을 복구해 보자.

#iptables-restore < 151214.rules
#iptables -L

>>설정 시작.
규칙 : 아이피 111.222.111.222 에 대해서 destination port 가 22 이면 ACCEPT 하여라.

#iptables -A INPUT -s 111.222.111.222/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

아이피 바꾸지 마시고 위의 예시 (111.222.111.222) 그대로 입력하세요.

#iptables -L

스크린샷 2015-12-15 오전 2.04.49

 

이제 현재 상태에 대해서 방화벽 설정파일을 다시 생성해보도록 하자.

#iptables-save > 151214.rules

 

FTP나 vi, cat 으로 해당 151214.rules 를 열어보자.

열고나서 코드의 뜻을 대충 해석해보아라. (간단하다.)

하단 *filter 부분에

-A INPUT -s 111.222.111.222/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

가 보이는가?

 

여러분은 이곳에 아래의 코드를 집어넣어야 한다.

순서가 중요하다. IF-ELSE 같이 동작하기 때문에 조건에 맞으면 바로 지정된 동작을 한다.

211.105.192.168 아이피만 지정하고 싶을 때 -> -s 211.105.192.168/32

211.105.192.* 아이피 그룹을 지정하고 싶을 때 -> -s 211.105.192.0/24

211.105.*.* 아이피 그룹을 지정하고 싶을 때 -> -s 211.105.0.0/16

목적지 포트가 22번(ssh) 포트일 때 -> -dport 22

목적지 포트가 80번(http) 포트일 때 -> -dport 80

목적지 포트가 443번(https) 포트일 때 -> -dport 443

 

아래는

1. 이미 연결된 것은 허용

2. ping 허용

3. loopback 허용

4. 111.222.111.222 의 22번 포트 접근 허용

5. 123.111.123.111 의 22번 포트 접근 허용

6. 80 포트 접근 허용 (-s 옵션이 없으므로 누구나 허용)

7. 차단

8. FORWARD 차단

의 코드이다.

아까 생성한 .rules 파일을 열어서 아래의 코드를 그림과 같이 코드를 추가하여라. 이때 반드시 당신의 아이피를 추가하여라.

추가가 잘못되어도 어차피 1번의 조건에 의해서 당신의 연결이 끊기지는 않겠지만 새로운 연결은 차단될 것이다.

 

1
2
3
4
5
6
7
8
9
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 111.222.111.222/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 123.111.123.111/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

스크린샷 2015-01-23 오전 2.18.26

#iptables-restore < 151214.rules
#iptables -L

!!!반드시 현재 쉘 연결을 끊지 말고!!!

현재 연결은 1번 조건에 의해서 반드시 허용이기 때문에 괜찮다.

 

새로 연결창 띄워서 테스트해 보아라.

만약 원하는대로 동작하지 않는다면 다시 .rules 파일을 수정하고 iptables-restore 하여라.

방화벽 설정이 머리가 아프다면

# iptables -F

로 초기화 하고 내일 다시 시도해 보아라.

 

이 설정은 재부팅이 되면 초기화 된다.

설정을 지속시키도록 하자.

iptables-persistent 설치

스크린샷 2015-01-23 오전 3.13.35

#apt-get install iptables-persistent

Yes (엔터), Yes (엔터)

 

/etc/iptables 라는 폴더가 생성되고

rules.v4, rules.v6 가 생성된다.

 

부팅시 실행되는 파일을 갱신하자.

#iptables-save > /etc/iptables/rules.v4

 

ipv6 차단하기

#vi /etc/sysctl.conf

맨 밑에

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

추가.

 

설정파일 적용

#sysctl -p

 

검사

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

1 이면 disable 된 상태이다.

스크린샷 2015-12-15 오전 2.19.35
재부팅

#reboot

 

Cloud Init Bug로 인해 일부 클라우드에서 문제가 발생할 수도 있습니다.

일부 Cloud Hosting 에서 의 IPv6 를 Disable 한 경우, 또는 아무것도 하지 않아도 cloud-init-nonet error 가 뜨면서 IP 정보를 가져오지 못하는 경우가 있습니다. (ConoHa 클라우드 및 KS클라우드에서 확인 했음.)

이 경우 ipv6 dhcp 관련 구문을 주석처리 해 주어야 합니다.

# vi /etc/network/interfaces

스크린샷 2015-12-15 오후 3.39.09

 

재부팅

#reboot

 

재부팅 후에 방화벽 규칙이 유지가 되면 성공이다.

#iptables -L

 


 

옵션) 계정별 트래픽 양 제한하기. Apache Mod Cband install.

- 2015.06.01. Ubuntu 14.04 LTS 테스트 완료. 

- 속도나 트래픽제한 툴입니다. 혼자 사용하는 서버라면 이 모듈은 설치하지 마세요.

 

Mod Cband 는 Apache2 모듈입니다.

다음의 기능이 가능합니다.

1) 대역폭 제한 (Bandwidth limit)

2) 동시 접속자 제한 (Concurrent user)

3) 트래픽 제한 (Transfer quota)

통계 용도로만 사용할 수도 있다.

 

현재 공식사이트가 닫혀있어서 대체할 만한 다운로드 경로를 적는다.

1) mod cband 공식사이트 : http://cband.linux.pl/  (안열림.)

2) mod cband 메인 개발자 블로그 : http://dembol.org/blog/mod_cband/ (다운로드 링크가 동작안함)

3) source forge 링크 : http://sourceforge.net/projects/cband/files/ (최신버전이 아님)

4) 현존하는 것 중에서 가장 최선의 선택 : https://fossies.org/linux/www/apache_httpd_modules/mod-cband-0.9.7.5.tgz/

5) 라엘이 블로그 백업용 파일 (4번과 완전히 동일한 파일) mod-cband-0.9.7.5.zip

 

1] mod cband 는 apxs 라는 아파치 확장 개발 라이브러리를 필요로 합니다.
#apt-get install apache2-dev

 

2] apache cband module 다운로드
#wget https://fossies.org/linux/www/apache_httpd_modules/mod-cband-0.9.7.5.tgz

 

 

3] 압축을 풀고 설치
#tar -xzvf mod-cband-0.9.7.5.tgz
#cd mod-cband-0.9.7.5

 

3-1] 패치.

apxs 가 업데이트 되면서 변수명이 몇개 바뀌었다.

#vi src/mod_cband.c

찾기 : remote_addr      ,    바꾸기 : client_addr       1365번째줄1회만 치환되어야 함.

스크린샷 2015-06-01 오후 4.27.42

 

찾기 : remote_ip       ,    바꾸기 : client_ip     4회 치환되어야 함.

 

 

3-2]  설치 계속 진행.
#./configure
#make
#make install

스크린샷 2015-06-01 오후 4.32.29

 

 

4] cband 모니터링 페이지 생성
#vi /etc/apache2/mods-available/cband.conf

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<IfModule mod_cband.c>
    <Location /cband-status>
        SetHandler cband-status
        AuthName "adminpage"
        AuthType Basic
        AuthUserFile /home/.htpasswd
        require valid-user
    </Location>
    <Location /cband-status-me>
        SetHandler cband-status-me
        Order deny,allow
        Deny from all
        Allow from all
    </Location>
</IfModule>

 

#htpasswd -c -m /home/.htpasswd admin

 

5] 아파치 모듈 켜기
#a2enmod cband

 

6] 적용을 위해서 아파치 재시작
#service apache2 restart

 

7] 확인

웹브라우져로

서버아이피/cband-status-me

서버아이피/cband-status

에 들어가 보자.

지금은 모두 무제한이므로 아무 항목이 뜨지 않을 것이다.

 

8] 설정하기.

https://www.linux.co.kr/home/lecture/?leccode=10588

위의 링크 글을 참조하여 이미 생성해서 사용중인 sites-available 안의 virtualhost 파일을 수정한다.

 

9] 설정 예제.

각 사이트의 <virtualhost> 구문에 Cband 설정 값을 추가한다. 다 쓸 필요는 없다. 필요한 제한만 두도록 하자.

 

당신이 웹호스팅을 운영중이라면 CBandLimit 구문과 CBandPeriod 구문을 사용하여라.

 

당신이 동영상 사이트나, 자료실을 운영중이라면 CBandSpeed 와 CbandExceededSpeed 를 사용하여라.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<VirtualHost *:80>
    #main domain
    ServerName lael.be
    #something
    #~~~
    #~~~
     
    <IfModule mod_cband.c>
        #4주동안 6GB 전송량 제한을 둠. 초과시 503 Service 에러페이지가 뜸.
        CBandLimit 6G
        CBandPeriod 4W
        #트래픽 조각. 이 상황의 경우 1주일마다 1.5GB 가 보급된다.
        #트래픽이 CbandPeriod 기간동안 골고루 사용되기를 원할때 설정한다.
        CBandPeriodSlice 1W
         
        #동영상(flv, mp4)이나 자료실 서비스를 하고 싶을때에만 아래의 속도제한 구문작성
        CBandSpeed 500kbps 10 30
        CBandExceededSpeed 128kbps 5 15
        #CBandScoreboard /var/www/scoreboard/domain.com.scoreboard
    </IfModule>
 
</VirtualHost>

 


 

옵션 ) 서버 동시접속자 설정 변경하기. (15.11.20 추가)

다음의 페이지를 많이 참조했습니다. (http://www.zarafa.com/wiki/index.php/Apache_tuning)

문의주시는 분들 중에 간혹 의도치않은 대박(?)이 일어나신 분들이 있더라. 동시접속 튜닝법을 설명하고자 한다.

 

몇가지 배경지식 설명.

- http 웹페이지는 stateless(connectionless) 입니다. 즉 페이지 불러올 때에만 서버와 연결하고 다 불러와지면 연결을 끊습니다.

- 1개의 연결당 평균 메모리 소모량은 20MB 입니다. (라엘이가 관리하는 여러서버의 평균값을 내보았음)

- Ubuntu Apache 의 기본 동시접속자 제한은 150개 입니다. 1000개의 동시접속이 연결되면 150개는 즉시 처리진행되고, 나머지 850개는 대기열에서 대기하다가 차례대로 처리됩니다.

1] 서버 연결당 얼마나 메모리를 소모하는지 확인
1
ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Proccess Size (MB): "x/((y-1)*1024)}'

스크린샷 2015-11-22 오전 12.59.26

2] 서버에 여유 메모리 자원이 얼마나 있는지 확인

서버를 재부팅한 후에 아파치를 종료후 서버의 메모리를 확인해본다.

# free -m

 

3] 하드웨어 자원을 고려한 가용 동시연결수 계산

여유 메모리 / 1연결당 메모리     하면 된다.

2000MB free memory 가 있고, 1연결당 20MB 를 사용한다면 = 100개의 동시연결 가능. (300~500 동시접속자 처리가능)

 

4] 사이트의 필요 동시연결수 계산

450명의 사용자가 있고 3초주기로 페이지 이동이 일어난다고 가정하자. 페이지 출력 실행시간은 2초라고 가정하자.

필요 동시연결수 = 450 / 3 * 2 = 300

 

5] 동시연결수 설정 변경.
# vi /etc/apache2/mods-available/mpm_prefork.conf

MaxRequestWorkers 값을 수정해야 합니다.

ServerLimit 라는 옵션의 기본값이 256이기 때문에 MaxRequestWorkers 값이 256보다 작으면 따로 적을 필요가 없으며, 256보다 크면 그와 같은 값으로 ServerLimit 도 설정해야 합니다.

동시연결 제한 300 예제 설정법.

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

 

profile
profile

title: MoonBlonix

2016.01.10 17:28
*.148.87.98

출처 :: http://zzaps.tistory.com/242



먼저, 웹 담당 계정 webmaster 를 만듭니다. 사실 원하는 이름 아무거나 해도 됩니다.

새로운 계정 만드는 방법은 root 권한으로 아래처럼 할 수 있습니다.


$ adduser webmaster


/home 아래에 webmaster 라는 디렉토리가 생깁니다.

webmaster 로 로그인을 한번 해보고 잘 되면 아래에  www 디렉토리를 하나 만들어 둡시다.

이 디렉토리를 루트 디렉토리로 사용할 겁니다. 위치는 /home/webmaster/www 이죠.

www 디렉토리 안에 들어가서 테스트용 index.php 를 만드는데, 속 내용은 아무거라도 괜찮으니 적어줍니다.


이제 여기를 루트 디렉토리로 사용해라~~ 라고 apache 에게 알려줘야겠군요.


설정 파일 두군데를 손봐 줘야합니다.


/etc/apache2/apache2.conf


쭈  ~욱 내려가다 보면 아래 부분을 발견할 수 있습니다.

<Directory /var/www/>

        Options Indexes FollowSymLinks

        AllowOverride None

        Require all granted

</Directory>


/var/www 라고 되어있는 부부을 /home/webmaster/www 이라고 수정을 합시다. 당근 저장하고...


그다음! 


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


이름에 default 라는 단어가 보이죠? 가장 기본적인 설정파일이라는 뜻같군요.

우선 000-default.conf 를 000-default.conf.ori 로 복사를 해 둡시다. 나중에 혹시 문제가 생기면 초기값으로 돌아갈 때  써 먹을수 있을지도....


vi든, nano 든 000-default.conf 를 열어서 다음 부분을 찾습니다.


DocumentRoot /var/www/html


몇 줄 안 내려가서 보입니다.


역시 /var/www/html 을 /home/webmaster/www 이라고 수정을 하고 저장합니다.


이제 아파치를 재시작하고 브라우저에서 접속해보면 /home/webmaster/www/index.php 가 보이는 것을 확인할 수 있습니다.


$ sudo service apache2 restart


이제 서버의 기본 웹 사이트는 webmaster 계정이 작업을 하고 관리를 하면 되겠습니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 [Web] 클라우드 IDE + 2 title: MoonBlonix 2017-06-25 15126
12 AVR 타이머/카운터 인터럽트 레지스터 file + 2 title: MoonBlonix 2016-01-12 2048
11 [아두이노] L293D 모터드라이버를 이용한 DC모터 제어 file + 1 title: MoonBlonix 2016-01-11 1932
10 리눅스 보안 기초 + 1 title: MoonBlonix 2016-01-11 1704
9 라즈베리파이 각종 강좌(외부링크) title: MoonBlonix 2016-01-10 1687
8 라즈베리파이 기초작업 (절전모드, 시간, 한글, 계정변경, 관리자권한 등) title: MoonBlonix 2016-01-10 1910
» 한번에 끝내는 Ubuntu 웹서버세팅 + 1 title: MoonBlonix 2016-01-09 1905
6 AVR 128 기동하기 title: MoonBlonix 2016-01-09 2041
5 라즈베리파이 무선랜 설정 (고정IP) file title: MoonBlonix 2016-01-09 1853
4 라즈베리파이 무선랜 설정 (유동IP) title: MoonBlonix 2016-01-09 1664
3 네임서버, DDOS 공격차단, 트래픽 감소 -> CloudFlare title: MoonBlonix 2016-01-08 1995
2 도메인 네임 서버와 DNS - Domain Name System에 대해 title: MoonBlonix 2016-01-08 1642
1 cURL 이용한 웹프로그래밍 title: MoonBlonix 2015-12-13 1815