운영체제의 수명이 긴 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 tomcat, Eclipse Jetty 도 모두 웹서버가 프로그래밍 언어 해석 모듈을 탑재하고 있는 경우입니다.
조금 더 전문적인 용어로 말하자면 웹컨테이너(http 만 담당), 어플리케이션 컨테이너(php, jsp등 해석 담당) 가 한 곳에 있는 것입니다.
아주 단순한 논리인데, 이 둘을 나누어 두면 어떨까 하는 것입니다. 그리고 둘을 특화 시키는 것입니다.
웹컨테이너(Web container) 프로그램과 어플리케이션 컨테이너(Application container) 프로그램으로 나누고
웹컨테이너 프로그램은 단순하게 내용 전송만 하고, 어플리케이션 컨테이너 프로그램 프로그램 해석만 하는 것입니다.
사람들이 둘을 나눠봤는데 성능이 향상하는 것을 확인했습니다.
웹컨테이너 프로그램 중 유명한 것은 Nginx 이고,
어플리케이션 컨테이너 프로그램 중 유명한 것은 PHP-FPM 입니다.
동작원리는 Nginx 가 사용자의 URL을 확인해서 파일의 끝이 .php나 .jsp 로 끝나면
php-fpm 이나 tomcat 에게 해당 파일 경로를 넘겨 주고 결과를 기다립니다.
php-fpm 은 넘겨받은 경로의 php를 실행하고 실행결과를 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 8 이 있는데, 웹서핑이나 문서작업 하는 입장에서는 셋다 똑같다고 느낍니다.
오히려 XP가 가장 빠를지도 모릅니다. 다만 요즘 나온 Diablo 3나 Starcraft 2 같은 게임을 구동할 때는 당연히 Windows 8 이 가장 좋은 성능을 보여줄 겁니다.
+ 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가 나온다.
—
다른 예
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 19G 2.5G 15G 15% /
udev 486M 4.0K 486M 1% /dev
tmpfs 198M 252K 198M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 495M 0 495M 0% /run/shm
/dev/sda3 80G 1.4G 75G 2% /home
이건 다 더하면 100G 가 나온다.
사용자 영역은 /home 이므로 약 75G 사용가능하다.
/home 이 따로 없으면 / 파티션 공간을 보면 된다.
즉 첫째 예시의 여유공간은 35G, 둘째 예시의 여유공간은 75G 이다.
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가 비어있다.
5) 자잘한 업글
apt 목록 갱신
apt란 Advanced Packaging Tool 을 뜻합니다.
우리는 apt 라는 우분투에 내장된 프로그램을 이용해서 프로그램을 쉽게 설치/제거 할 수 있습니다.
#apt-get update
현재 운영체제에 설치되어있는 프로그램 최신버전패치
#apt-get upgrade
6) 시스템 시간 설정
이것을 하지 않으면 영국 시간을 불러올 것이다.
물론 초기 설치할 때 Asia/Seoul 을 설정했다면 이 작업을 할 필요는 없다. 하지만 또 한다고 해서 문제되지는 않는다.
– 데비안 패키지 재설정 TimeZone Data 를 실행한다.
#dpkg-reconfigure tzdata
GUI 환경이 나올 텐데, 순서대로 Asia – Seoul 을 선택하면 된다.


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

위의 뜻은 “li599-115 서버에 root 사용자” 라는 뜻이다.
글 쓰는 지금 단어를 빨리 생각해보았는데 newhistory 라는 것이 떠오르더라.
이제 이 서버는 newhistory 라는 이름으로 만들 것입니다.
#vi /etc/hostname
빈 파일일 건데(또는 기존 hostname이 쓰여있을것임.) 원하는 이름으로 바꾼다. newhistory
권장하는 단어는 이 서버에 연결될 대표 도메인이다. 예를 들어 lael.be 같은 것.
적용한다.
#hostname -F /etc/hostname
서버에 재 접속하면 적용된 것을 확인 할 수 있을 것이다.

8) Apache2 설치
#apt-get install apache2
14.04LTS 에서는 apache 2.4 가 설치된다. 이것은 apache 2.2보다 성능이 많이 향상되었고 nginx와 비슷한 성능을 보여준다.
설치가 완료되면 자동적용 및 시작된다.
확인해본다.
웹브라우져에 기본 설명페이지가 뜨면 성공.
(참고로 기본으로 보여지는 파일은 /var/www/html/index.html 이다.)
기본 파일을 지운다.
#rm /var/www/html/index.html
기타 주로 사용되는 모듈을 활성화, 필요없는 모듈은 비활성화 한다.
아래 모듈에 대한 자세한 설명은… 생략한다.
사용에 문제가 발생하지 않는 최상의 방식이라고 이해하면 된다.
#a2enmod rewrite
#a2enmod headers
#a2dismod autoindex
9) PHP 5.x 설치
#apt-get install php5
자동으로 아파치 중단시키고 설정파일에 php를 등록시키고 재 구동시킨다.(바로 적용됨)
14.04 에서는 php 5.5 가 설치된다.
#apt-get install php5-cli
콘솔에서 php를 실행시키기 위해서 위와 같이 실행
기타 주로 사용되는 모듈을 설치한다.
– 암호화 모듈
#apt-get install php5-mcrypt
– 이미지처리 모듈
#apt-get install php5-gd
아파치 재시작(적용을 위해서)
#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
#apt-get install mysql-client-5.5
나) MariaDB 설치 (추천)
#apt-get install mariadb-server-5.5
#apt-get install mariadb-client-5.5
—————-
#apt-get install php5-mysql
php5 연동모듈 설치. 완전 호환되기 때문에 mysql 이라고 해도 mariadb 사용가능.
버전체크
#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
10 – 2) 기본 언어셋 설정(중요)
이 단계를 건너뛰면 DB가 latin1 으로 생성되며 추후 DB작업에 문제가 생길 수 있다.
#vi /etc/mysql/my.cnf
(vi 에디터 사용방법을 모른다면 ftp 클라이언트를 사용하여 서버에 로그인 후 해당파일을 수정하고 덮어쓰기한다.)
[mysqld] 항목에 다음 2 줄을 추가한다.
character-set-server = utf8
collation-server = utf8_general_ci
*Fine Tuning 의 max_allowed_packet 을 256M 로 변경
(DB한 행의 데이터 크기 제한이라고 보시면 됩니다)
[mysqldump]에도
max_allowed_packet 을 256M으로
변경사항저장
#service mysql restart
11) PHP 권한 설정
웹 서비스 구동시 발생할 수 있는 Nobody 퍼미션 관련 문제를 해결하기 위해 관련 프로그램을 설치한다.
이 세팅을 하면 shell의 권한과 sftp의 권한과 web의 권한이 동일하게 취급되며 보안도 좋게된다.
순서대로 쓰면 된다.
#apt-get install apache2-mpm-itk
#chmod 711 /home
#chmod -R 700 /home/*
(/home/* 안에 아무파일도 없을 경우 마지막 구문은 에러가 날 수 있다. 에러가 나더라도 무시하면 된다.)
12) 계정생성 및 동작테스트
원래 표준명령어는 useradd 이지만 ubuntu는 사용하기 좋게 adduser 를 지원한다.
리눅스 관련 서적을 보면 둘다 계정생성용 명령어라고 되어있다.
쉬운 설정을 위해 adduser를 사용
#adduser lael.be --force-badname
(참고로 위와 반대동작을 하는 계정삭제 명령어는 – 계정을 삭제하고 홈디렉토리도 삭제함 –
#userdel -r lael.be
입니다.)
보통 웹루트는 홈디렉토리에 하지 않습니다.
저는 주로 www 디렉토리를 사용합니다.사용자변경 후 www 디렉토리를 생성하고 빠져나오기
#su -l lael.be
#mkdir www
#exit
13) 웹사이트 Apache 환경설정파일 작성
다음의 내용을 작성한다.
/etc/apache2/sites-available/lael.be.conf 에 저장한다.
<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
</VirtualHost>
ServerAlias 는 사용안하면 빼도 되는 줄이다.
14) 사이트 활성화 및 적용
#a2ensite lael.be
(참고로 사이트 비활성화는
#a2dissite lael.be
입니다.)
– 아파치 설정 다시 불러오기(적용을 위해)
#service apache2 reload
15) Apache 추가 보안 설정
– 기본 언어셋 설정
#vi /etc/apache2/conf-available/charset.conf
기본 언어값 UTF-8 에 대해서 주석처리되어 있을 텐데 주석(#)을 제거해 준다.
– 추가 보안 설정
#vi /etc/apache2/conf-available/security.conf
매우 권장하는 보안설정이므로 Ubuntu Apache 패키지 제작자가 미리 써두었다.
이미 다 쓰여 있으니까 주석(#) 만 제거하자.
16) SSH 기본 포트번호 변경
SSH 기본 포트번호인 22번을 다른 번호로 바꿉니다.
기억하기 쉬운 숫자로 변경하세요.
보안 ) 방화벽 적용하기.
당연한 이야기지만 Ubuntu 에도 방화벽이 있습니다.
무척 당연한 이야기지만 방화벽을 사용하면 서버 보안이 매우 많이 향상됩니다.
현재 방화벽 설정 보기. (List)
#iptables -L
INPUT (서버로 들어오는 것 관리), FORWARD (서버에서 내부망으로 연결관리;잘 안씀), OUTPUT (서버에서 나가는 것 관리)
로 이루어져 있다.
보통 FORWARD와 OUTPUT은 건들이지 않고 INPUT 만 수정한다.
policy ACCEPT 라는 뜻은 아무 조건도 해당하지 않았을 때 ACCEPT 하라는 것이다.
먼저 현재 방화벽 설정을 파일로 저장한다. 언제든 현재의 상태로 되돌릴 수 있기 위해서 이다.
#cd ~
#mkdir firewall_rules
#cd firewall_rules
#iptables-save > 150123.rules 현재 날짜 쓰세요.
이제 방화벽을 복구해 보자
#iptables-restore < 150123.rules
#iptables -L
방화벽 설정방법에 2가지 방식이 있는데,
1) 하나는 policy DROP 으로 하고 허용할 규칙을 추가해 주는 것이다.
2) 다른 하나는 policy ACCEPT 로 하고 허용할 규칙과 차단할 규칙을 추가해 주는 것이다.
라엘이는 2번의 방식을 설명하겠다.
—
2번의 방식
—
규칙 : 아이피 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

이제 현재 상태에 대해서 방화벽 설정파일을 생성하자.
적당한 저장폴더로 이동해서,
#iptables-save > 150123.rules
FTP나 vi, cat 으로 해당 150123.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번(www) 포트일 때 -> –dport 80
아래는
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번의 조건에 의해서 당신의 연결이 끊기지는 않겠지만 새로운 연결은 차단될 것이다.
-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 -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

#iptables-restore < 150123.rules
#iptables -L
!!!반드시 현재 쉘 연결을 끊지 말고!!!
현재 연결은 1번 조건에 의해서 반드시 허용이기 때문에 괜찮다.
새로 연결창 띄워서 테스트해 보아라.
만약 원하는대로 동작하지 않는다면 다시 .rules 파일을 수정하고 iptables-restore 하여라.
방화벽 설정이 머리가 아프다면
iptables -F 로 초기화 하고 내일 다시 시도해 보아라.
이 설정은 신기하게도 재부팅 되면 초기화 된다.
설정을 지속시키도록 하자.
iptables-persistent 설치

#apt-get install iptables-persistent
Yes (엔터), Yes (엔터)
/etc/iptables 라는 폴더가 생성되고
rules.v4, rules.v6 가 생성된다.
부팅시 실행되는 파일을 갱신하자.
#iptables-save > /etc/iptables/rules.v4
ipv6 차단하기
#vi /etc/sysctl.conf
맨 밑에
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
추가.
설정파일 적용
#sysctl -p
검사
#cat /proc/sys/net/ipv6/conf/all/disable_ipv6
1 이면 disable 된 상태이다.

기타 ) 계정별 트래픽 양 제한하기, 전송 속도 제한하기.
— Ubuntu 12.04 LTS 버전의 경우 설치방법
(14.04 LTS에서는 테스트해보지 못했습니다. 곧 테스트 해서 아래 코드를 검증하도록 하겠습니다.)
트래픽 제한이나 전송 속도 제한이 필요한 경우.
서버를 운영하다보면 DDOS나 비슷한 경우가 생길 때가 있다. 어떤 이벤트 오픈일 이라던가 다운로드 트래픽이 몰린다거나, 동영상 강좌서비스를 한다던가…
기본적으로 CPU는 최선의 노력을 하려고 한다. 100의 일을 할 수 있고 1000의 요청이 오면 과로(overwork)해서 150의 일을 처리한다.
처리하다가 효율이 급격히 떨어지고 다른 서비스가 장애가 발생하기 시작한다.
이것을 문제를 해결하는 방식이 두가지가 있는데,
첫째) 서비스 다운.
하루 트래픽이 평소 100GB 발생한다고 하자. 그럼 트래픽 제한을 200GB 정도로 걸어둔다.
서버는 트래픽이 200GB가 될때까지 고강도의 일을 한다. 하지만 200GB이 초과되면 요청을 거부하고 휴식에 들어간다.
이것은 매우 지혜로운 방법이다. 저를 포함한 여러분 대부분이 구동할 서비스는 비정상적인 상황에서 서비스를 중단해서 서버를 살리는 것이 최선의 방안이다.
둘째) 속도 제한.
라엘이의 경우 트래픽 제한은 하지 않고 속도 제한만 한다. 속도 제한만 해도 트래픽 제한의 효과가 있기 때문이다.
속도를 1MB/s 로 제한을 걸면 하루 트래픽이 최대 86400MB로 설정되는 효과가 있다.
CPU가 100의 일을 할 수 있고 1000의 요청이 오면, 기존에는 최선을 다해서 서비스를 처리했는데
그것에 속도제한을 걸어버린다. 즉 1000의 요청이 왔고 100을 처리할 수 있어도 50씩 처리하게 한다.
서비스가 느려지긴해도 다운되진 않는다. CPU도 여유롭게 일을 하기 때문에 무리가 생기지도 않는다.
여러분의 서버에 1GB 정도의 압축파일을 올리고 동시에 100명이 다운받게 해 보아라. 아마 Apache 뿐만 아니라 Mysql 도 장애가 걸릴 것이다.
그런데 속도제한을 걸면 1000명이 다운받아도 좀 느릴뿐 장애가 발생하진 않는다.
1] 아파치 확장 개발 라이브러리 다운로드
#apt-get install apache2-prefork-dev
2] apache cband module 다운로드
mod-cband-0.9.7.5.tgz
현재 공식사이트가 닫혀있다.
위를 클릭해서 다운받도록 하자.
3] 압축을 풀고 설치
#tar -xzvf mod-cband-0.9.7.5.tgz
#cd mod-cband-0.9.7.5
#./configure
#make
#make install
4] 아파치 모듈 켜기
#a2enmod cband
5] 적용을 위해서 아파치 재시작
#service apache2 restart
6] 설정하기.
https://www.linux.co.kr/home/lecture/?leccode=10588
위의 링크 글을 참조하여 이미 생성해서 사용중인 sites-available 안의 virtualhost 파일을 수정한다.
끝
출처 : http://blog.lael.be/post/73