14. 웹사이트 Apache 환경설정파일 작성
1) 클라우드 호스팅 과 같은 가상호스팅일 경우 다음과 같은 방법으로 진행한다.
국내 클라우드 서버호스팅 비교(Virtual Private Server Review)
#16.12.20 설정 가이드가 추가됨
환경설정을 쉽게하도록 도와주는, 환경설정 생성기가 추가되었습니다.
https://blog.lael.be/demo-generator/apache/my-example-site.com.php
다음의 내용을 작성한다.
아래 예제에서는 사이트 환경설정파일명을 lael.be 로 가정하고 진행한다.
당신의 도메인, 사용자 아이디, 별도의 구분단어로 설정해서 사용하도록 하자.
#vi /etc/apache2/sites-available/lael.be.conf
HTTPS 사이트
HTTPS 관련 구문을 설정합니다.
인증서 파일과, 인증서 키파일, 인증서 체인파일을 미리 가지고 있어야합니다.
/etc/apache2/sites-available/macaronics.go.conf
<VirtualHost *:80> ServerName macaronics.go ServerAlias www.macaronics.go <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^ - [E=protossl] RewriteCond %{HTTPS} on RewriteRule ^ - [E=protossl:s] RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] </IfModule> </VirtualHost> <VirtualHost *:443> ServerName macaronics.go ServerAlias www.macaronics.go DocumentRoot /home/macaronics/www <Directory /home/macaronics/www> Options FollowSymLinks MultiViews AllowOverride All require all granted </Directory> AssignUserID macaronics macaronics ErrorLog ${APACHE_LOG_DIR}/macaronics.go-error.log CustomLog ${APACHE_LOG_DIR}/macaronics.go-access.log combined Header always set Strict-Transport-Security "max-age=31536000" 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/macaronics/ssl/mysite_ssl.crt" SSLCertificateKeyFile "/home/macaronics/ssl/mysite_ssl.key" SSLCertificateChainFile "/home/macaronics/ssl/mysite_ssl.certchain.crt" </VirtualHost>
https://www.sslshopper.com/ssl-checker.html#hostname=blog.lael.be (SSL Chain test - 인증서가 올바르게 설치되어 있는지)
https://www.ssllabs.com/ssltest/analyze.html?d=blog.lael.be (SSL Algorithm test - 안전한 암호화 통신이 설정되어 있는지)
Chain test 는 모두 Valid 이어야하고, SSL Algorithm test 는 A 이상이면 정상적인 운영이 가능하다.
라엘이가 여러 설정 값에 대해서 테스트를 해 보았고, 최적의 권장설정 값을 위와 같이 적어두었으니 그대로 쓰면 된다.
위의 설정값으로 SSL을 설치하면 A+등급을 받을 수 있을 것이다.
.
인증서 적용 테스트는 위의 사이트를 이용하여라.
인증서 체인 파일이란 “인증서에 대한 인증서” 파일이다.
< 그림 : 이 블로그는 위의 단계를 거쳐 인증된다. 이것을 체인 인증 이라고 한다. >
대통령이 당신을 인증할 때 직권으로 인증하는 것이 아니라, 대통령 -> 서울시장 -> 강남구청장 -> 삼성동장 -> 당신 의 단계를 거친다. 검증하려면 모든 단계의 보증 증서를 제공해야 하는 것이다.
인증서 파일에는 삼성동장 -> 당신 의 정보가 들어있고, (암호화 통신시 공개됨)
인증서 키 파일에는 암호화 통신을 위한 정보가 들어있고 (은행 보안카드 로 비유. 외부에 공개되지 않음.)
인증서 체인 파일에는 대통령 -> 서울시장, 서울시장 -> 강남구청장, 강남구청장 -> 삼성동장 의 정보가 들어있다. (체인 인증이라고 한다. 연결고리 인증)
인증서 체인을 올바르게 작성하지 않으면 Firefox 브라우저와 Android Chrome 브라우저에서 “인증서 정보부족” 오류가 발생하게 된다.
15. 사이트 활성화 및 적용
명령어는
#a2ensite 사이트환경설정파일명
입니다.
#a2ensite macaronics.go
(참고로 사이트 비활성화는
#a2dissite macaronics.go
입니다.)
- 아파치 설정 다시 불러오기(적용을 위해)
#service apache2 reload
우분투 자작 NAS – 13강, SSL 인증서와 HTTPS 접속
HTTPS 연결의 필요성
한국의 웹 환경을 생각해보자. 보안이 필요하다 싶은 곳은 전부다 액티브X로 도배가 되어있다. 요즘은 액티브X를 없앤다고 하는데 액티브X를 사용하지는 않지만 똑같은 프로그램을 액티브X가 아닌 다른 방식으로 설치하는 식이다. 결국 똑같다. 해외의 웹 환경을 경험해보면 좋은 비교가 된다. 해외 직구를 위해 결제라도 하나 해보게 되면, 너무 확연하게 차이가 남을 즉시 느낄 수 있을 것이다. 보안 프로그램 설치? 없다. HTTPS 보안 연결 하나로 끝이다. 개인 웹서버에 HTTPS 연결을 설정한다면 그와 비슷한 수준의 보안이 보장될 수 있다.
개인 웹서버에 HTTPS 연결이 무슨 필요나 할 수도 있겠지만, ownCloud에서는 HTTPS 연결을 권장하고 있다. 비교적 털릴 것이 없는 보통 사람이라고 해서 보안에 신경쓰지 않아도 되는 것은 아니다. HTTPS에 대한 복잡한 논의들이 있지만, 일단 보안에 굉장히 취약한 자작 NAS를 위해 HTTPS 연결을 설정해보자.
무료 SSL 인증서
무료로 SSL 인증서를 발급해 주는 곳은 몇 군데 있다. StartSSL, WoSign, Let’s Encrypt 등. 나는 세 군데 모두에서 SSL 인증서를 발급받아 보았다. 각기 장단점이 있는데 간략하게 적어본다.
StartSSL
- 인증서 기간은 1년이다. 1년마다 재발급.
- 무료로 발급해 주기는 하지만 관리할 때에는 유료다.
- 분실했을 때 재발급은 유료다.
- 그래서 작년에 한번 분실하고서는 쓸 수가 없었다.
- 더 잘 찾아보지 않아서 그럴수도 있는데, 그 이후로는 쓸 수가 없게 되었다.
WoSign
- 인증서 기간을 1~3년까지 지정할 수 있다.
- 중국 쪽 업체라 그런지 대인배 마인드로 무료 지원이 굉장히 넓다.
- 몇몇 브라우저에서 인증서를 신뢰할 수 없다고 뜬다.
- 특히 모바일에서는 대부분 인증서를 신뢰할 수 없다고 뜬다. 이게 가장 치명적인 단점이다.
Let’s Encrypt
- 인증서 기간은 90일이다. 연장하는 방법은 간단하다.
- 얼마전까지는 비공개로 초대장이 있어야 사용할 수 있었는데 지금(2016년 3월 중순 기준)은 퍼블릭 베타이다.
- 웹사이트에서 인증서를 받는 StartSSL이나 WoSign과는 달리 콘솔로 서버에 접속해서 받아야 한다. 해서 웹서버를 임대했거나 웹서버를 구축하지 않았다면 사용할 수 없다.
그래서 선택은 Let’s Encrypt다. 이 사이트에 대한 더 자세한 정보를 소개한다.
Let’s Encrypt
Lets’ Encrypt는 HTTPS를 사용하기 위해 SSL을 구매해야 하는 부분이 HTTPS 보급에 방해된다고 생각해서 SSL을 무료로 제공해서 HTTPS를 보급하기 위해 작년 말에 만들어졌다. 초기에는 Mozilla, Cisco, Akamai, EFF, id entrust 등이 모여서 ISRG(Internet Security Research Group)라는 새로운 SSL 인증기관을 만들어서 올해 SSL을 무료로 제공하겠다고 발표했다. 지금은 이 Lets’ Encrypt에 Facebook, 워드프레스를 만드는 Automattic, shopify 등 많은 회사가 스폰서로 참여하고 있다.
Let’s Encrypt를 이용해 HTTPS 설정하기
우리가 지금까지 구축한 서버의 환경은 운영체제가 Ubuntu Server 14.04 LTS 이고, 웹 서버는 Apache2 를 이용하고 있다. 같은 환경이 아니면 설치 방법이 달라질 수 있으니 유의해야 한다. 설치과정은 Let’s Encrypt 사이트의 Getting Started 문서를 따라 진행된다.
서버에 Let’s Encrypt 설치
먼저 git 패키지를 설치한다. 설치되어 있지 않으면 GitHub에서 소스를 내려받을 수 없다.
~$ sudo apt-get install git
콘솔을 이용하여 서버에 SSH로 접속을 한 후 다음 명령어를 순서대로 입력한다.
~$ git clone https://github.com/letsencrypt/letsencrypt
~$ cd letsencrypt
~$ ./letsencrypt-auto --help
한줄 한줄 순서대로 설명을 하면,
1) GitHub에 있는 Let’s Encrypt 소스를 내려받고, (letsencrypt 디렉토리에 내려받는다)
2) letsencrypt 디렉토리에 들어가서,
3) letsencrypt-auto 를 실행한다.
세 번째 줄을 입력하게 되면, 알아서 의존성 관련 패키지들을 다운받고 설치한다. 꽤 많다.
여기까지 왔으면 거의 다 했다.
인증서 받고 적용하기
이제 다음 명령을 사용하면 끝이다(?).
~$ ./letsencrypt-auto
자신이 설정한 가상호스트에 따라서 목록은 많을 수도 있고 적을 수도 있다. HTTPS를 설정하고자 하는 도메인을 체크한 후, OK를 누른다.
이메일을 입력하라는 창이 뜨는데 이메일을 잘 기입한다. 마지막으로는 Easy와 Secure가 뜰 것이다.
Easy는 HTTP와 HTTPS 연결 모두를 허용하는 것이고,
Secure는 HTTPS 연결만 되도록 하는 것인데, 상황에 따라 결정하면 될 것이다.
나는 후자를 선택했다.
일단은 이게 끝이다. 간단해서 좋다.
만약 가상호스트 설정에서 HTTPS 연결을 위한 설정을 해놨다면 알아서 수정을 해놨을 것이다.
이전에 설정해 놓지 않았다면, /etc/apache2/sites-available 디렉토리에 들어가서 파일 목록을 확인해 보라.
가상호스트 파일의 이름이 owncloud.conf 인 경우, owncloud-le-ssl.conf 가 새로 생겼을 것이다. 알아서 HTTPS 연결을 위한 설정 파일을 생성해 준다. (새로 생성한 파일 끝에는 -le-ssl가 붙는다)
출처 : https://blog.xianchoi.kr/615
16. 연동테스트
apache 와 php, 그리고 mariadb 를 모두 사용하는 프로그램을 실행시켜보자.
phpmyadmin 공식사이트 : https://www.phpmyadmin.net/
설치 못하시는 분이 꽤 있으셔서 따로 설치법을 적습니다.
여러 설치방법이 있겠지만 저는 다음과 같이 설치합니다.
압축해제 프로그램 설치
# apt-get install unzip
압축파일 다운로드
# cd /home/macaronics/www/
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://192.168.78.131/dbmyadmin/
[TIP] 간혹 방금 설치한 디비의 root 비밀번호가 기억이 안나는 분들도 있을 것이다. 이 경우에는 다음의 명령어를 사용하여 mariadb 를 재설치 하도록 하자.
- 제거
# apt-get purge mariadb-server
- 설치
# apt-get install mariadb-server
또는 비밀번호를 재 설정 해보자.
mysql> use mysql;
Database changed
mysql> UPDATE user SET password=PASSWORD('변경할패스워드') where user='root'; Query OK, 0 rows affected (0.14 sec) Rows matched: 1 Changed: 0 Warnings: 0
mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.11 sec)
mysql> quit
- 재부팅
복잡한 세팅이 끝났으니 한번 숨을 고르고 가자.
# reboot
재부팅 후에 phpinfo 페이지와 phpmyadmin 가 잘 실행된다면 “재부팅이 가능한 서버” 라고 볼 수 있다.
17. Apache 추가 보안 설정
- 기본 언어셋 설정
#vi /etc/apache2/conf-available/charset.conf
기본 언어값 UTF-8 에 대해서 주석처리되어 있을 텐데 주석(#)을 제거해 준다.
- 추가 보안 설정
#vi /etc/apache2/conf-available/security.conf
매우 권장하는 보안설정이므로 Ubuntu Apache 패키지 제작자가 미리 써두었다.
이미 다 쓰여 있으니까 주석(#) 만 제거하자.
- 아파치 설정 다시 불러오기(적용을 위해)
#service apache2 reload
18. SSH 기본 포트번호 변경
#이 작업은 무작위 대입공격(Brutu force attack)의 시도를 차단해줍니다.
보통 IP주소 : 22번 포트를 스캔해서 ssh와 연결되면 무작위 로그인 시도를 하는 프로그램이 엄청 많은데,
포트번호만 바꾸어주어도 방어가 되거든요.
!! IPTABLES 방화벽, SSH 포트번호 변경, Fail2ban 중에서 하나만 적용하세요!!
1) 나는 KS 클라우드 or 아마존 클라우드를 사용하고 있어! -> 클라우드 방화벽 쓰세요 !!
2) 나는 허용된 IP만 서버에 접속하게 할거야 -> IPTABLES !!
3) 나는 사용자의 IP를 특정지을 수 없는데 무차별대입 공격은 방어할거야 -> Fail2ban !!
4) 나는 나만 아는 포트번호로 서버에 접속할 거야 -> SSH 포트변경!!
[개인 프로젝트, 회사의 서비스 -> IPTABLES]
[웹호스팅 -> Fail2ban 또는 SSH 포트변경]
SSH 기본 포트번호인 22번을 다른 번호로 바꿉니다.
기억하기 쉬운 숫자로 변경하세요.
#vi /etc/ssh/sshd_config
Port 22 를 찾아서 임의의 숫자 : 10022, 34522 등 기억하기 쉬운 숫자로 설정.
포트번호는 10000번 이상의 숫자를 선택하시길 권장합니다.
#service ssh restart
옵션) 방화벽 적용하기
방화벽의 중요성을 알고 싶다면
# tailf /var/log/auth.log
를 입력해보도록 하자. (Control + C 를 눌러 프로그램 종료)
별도의 방화벽 설정이 없었다면 벌써 중국에서 서버에 로그인 시도를 하고 있을 것이다.
이러한 무차별 로그인 시도를 다음 중 어느 하나를 사용해서 막을 수 있다.
가장 편한 것은 fail2ban 이다. (한줄만 타이핑하면 방어됨)
(https://blog.lael.be/post/858#fail2ban) 로 이동해서 설정하세요.
* 접속자의 IP 가 고정되어 있으면 방화벽 설정을 통해, 특정 아이피에서만 서버에 접속할 수 있도록 설정해주세요.
현재 방화벽 설정 보기. (List)
#iptables -L
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
이제 현재 상태에 대해서 방화벽 설정파일을 다시 생성해보도록 하자.
#iptables-save > 151214.rules
SFTP나 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. 443 포트 접근 허용 (-s 옵션이 없으므로 누구나 허용)
8. 차단
9. 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 -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
#iptables-restore < 151214.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 된 상태이다.
재부팅
#reboot
재부팅 후에 방화벽 규칙이 유지가 되면 성공이다.
#iptables -L
19. 계정별 트래픽 양 제한하기. Apache Mod Cband install.
- 2015.06.01. Ubuntu 14.04 LTS 테스트 완료.
- 순간속도(대역폭), 총 전송량(쿼터), 동시접속연결을 제한하는 모듈입니다.
장애가 일어날 것 같은 값들을 Hard Boundary 로 정해놓으면 장애가 일어날 것 같은 환경에서 서버가 잘 돌아가는 것을 볼 수 있을 것입니다.
저도 서버 서비스의 장애를 막기 위해서 실 서비스에 이것을 사용하고 있습니다.
다만 저 같은 경우 분산처리를 해 두었기 때문에 개별 서버에 적용한 제한치보다 실제 서비스는 더 높은 처리를 보여줍니다. (100의 제한을 건 서버 5대에 분산처리하면 전체적으로 500의 제한이 걸린 것 처럼 보이겠죠?)
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회만 치환되어야 함.
찾기 : remote_ip , 바꾸기 : client_ip 4회 치환되어야 함.
3-2] 설치 계속 진행.
#./configure
#make
#make install
4] cband 모니터링 페이지 생성
#vi /etc/apache2/mods-available/cband.conf
<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 를 사용하여라.
<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)}'
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 예제 설정법.
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 300 ServerLimit 300 MaxConnectionsPerChild 0 </IfModule>
lale.be 님의 글에 추가 및 편집하였다.
댓글 ( 5)
댓글 남기기