맨 앞의 영문 한 글자는 보통 "K", "S" 중의 한 글자가 되는데 K(Kill)로 시작하면 해당 서비스를 죽이는 역할을 하고, S(Start)는 해당 서비스를 시작하게 하는 역할을 하게 된다. 그래서 rc0.d(종료레벨)의 파일들은 모두 K로 시작하게 된다.
geen02
2013년 3월 28일 목요일
2013년 1월 29일 화요일
How to Install Ruby 1.9.3 and Rubygems 1.8.24 on CentOS 6.2
yum install libyaml
### Ruby-1.9.3 ###
cd /root/pkg
wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p320.tar.gz
tar xvzf ruby-1.9.3-p320.tar.gz
cd ruby-1.9.3-p320
./configure --prefix=/home/apps/ruby
make && make install
ln -s /home/apps/ruby/bin/* /usr/local/bin
ruby --version
### Rubygems-1.8.24 ###
cd /root/pkg
wget http://rubyforge.org/frs/download.php/76073/rubygems-1.8.24.tgz
tar xvzf rubygems-1.8.24.tgz
cd rubygems-1.8.24
ruby setup.rb
ln -s -f /home/apps/ruby/bin/* /usr/local/bin
### Passenger (requires gcc) ###
gem install passenger
passenger-install-apache2-moduleI
### Modify httpd.conf ###
cp /home/apps/ruby/lib/ruby/gems/1.9.1/gems/passenger-3.0.19/ext/apache2/mod_passenger.so /home/apps/apache/modules/
vi /home/apps/apache/conf/httpd.conf
라인 추가
LoadModule passenger_module modules/mod_passenger.so
Include conf/extra/httpd-passenger.conf
### httpd-passenger.conf 파일 생성 ###
vi /home/apps/apache/conf/extra/httpd-passenger.conf
라인 추가
PassengerRoot /home/apps/ruby/lib/ruby/gems/1.9.1/gems/passenger-3.0.19
PassengerRuby /home/apps/ruby/bin/ruby
### Vhost 생성 ###
vi /home/apps/apache/conf/vhost/redmine
## default setting ##
<VirtualHost *>
ServerName jyyeom-01.cafe24test.com
ServerAlias 192.168.49.234
DocumentRoot "/home/redmine/www/public/"
ErrorLog "|/usr/sbin/cronolog /home/apps/apache/logs/vhost/redmine-err.%y%m%d"
CustomLog "|/usr/sbin/cronolog /home/apps/apache/logs/vhost/redmine-acc.%y%m%d" combined
<Directory "/home/redmine/www/public/">
AllowOverride all
Options Indexes ExecCGI FollowSymLinks -MultiViews
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
/etc/init.d/httpd.conf graceful
### Install Bundler ###
gem install bundler
ln -s -f /home/apps/ruby/bin/* /usr/local/bin
gem install passenger
### redmine 설치 ###
cd /root/pkg
wget http://rubyforge.org/frs/download.php/76722/redmine-2.2.2.tar.gz
tar xfz redmine-2.2.2.tar.gz -C /home/redmine/
cd /home/redmine/
mv redmine-2.2.2/ www
chown -R nobody.nobody www
DB 생성
mv config/database.yml.example config/database.yml
수정 for DB 정보
vi Gemfile
source 'http://rubygems.org'
gem 'rails', '3.2.11'
gem "jquery-rails", "~> 2.0.2"
gem "i18n", "~> 0.6.0"
gem "coderay", "~> 1.0.6"
gem "fastercsv", "~> 1.5.0"
gem "builder", "3.0.0"
gem "mysql", "~> 2.8.1"
gem "ruby-openid", "~> 2.1.4"
gem "rack-openid"
gem "net-ldap", "~> 0.3.1"
### 테이블 생성 및 초기 데이터 입력 ###
rake generate_secret_token
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake redmine:load_default_data
### 서버 가동 ###
ruby script/rails server webrick -e production
2013년 1월 23일 수요일
로그 서비스 - logrotate
설정파일을 본다.
-----------------------------------------------------------------
centos[root /var/log]# vi /etc/logrotate.conf
centos[root /var/log]# vi /etc/logrotate.conf
# see "man logrotate" for details
2 # rotate log files weekly
3 weekly //일주일에 한번 백업 받겠다. 최소단위가 daily
4
5 # keep 4 weeks worth of backlogs
6 rotate 4 // 한달치 date만 백업받겠다. daily면 4일치만 보관.
7
8 # create new (empty) log files after rotating old ones
9 create
10
11 # uncomment this if you want your log files compressed
12 #compress // 압축하겠다. 주석처리 되었으니 압축 안하겠다.
13
14 # RPM packages drop log rotation information into this directory
15 include /etc/logrotate.d //이 폴더 안에 있는 것들도 백업해라.
16
17 # no packages own wtmp -- we'll rotate them here
18 /var/log/wtmp { // 요기 있는 파일을 이런 조건으로 백업한다. 괄호 안이 우선 적용
19 monthly // 달 단위로 백업해라.
20 minsize 1M // 이 사이즈가 되면 백업해라.
21 create 0664 root utmp //퍼미션 소유주 그룹을 이렇게 만들어라.
22 rotate 1
23 }
--------------------------------------------------------------------
rotate 4 의미는
2 # rotate log files weekly
3 weekly //일주일에 한번 백업 받겠다. 최소단위가 daily
4
5 # keep 4 weeks worth of backlogs
6 rotate 4 // 한달치 date만 백업받겠다. daily면 4일치만 보관.
7
8 # create new (empty) log files after rotating old ones
9 create
10
11 # uncomment this if you want your log files compressed
12 #compress // 압축하겠다. 주석처리 되었으니 압축 안하겠다.
13
14 # RPM packages drop log rotation information into this directory
15 include /etc/logrotate.d //이 폴더 안에 있는 것들도 백업해라.
16
17 # no packages own wtmp -- we'll rotate them here
18 /var/log/wtmp { // 요기 있는 파일을 이런 조건으로 백업한다. 괄호 안이 우선 적용
19 monthly // 달 단위로 백업해라.
20 minsize 1M // 이 사이즈가 되면 백업해라.
21 create 0664 root utmp //퍼미션 소유주 그룹을 이렇게 만들어라.
22 rotate 1
23 }
--------------------------------------------------------------------
rotate 4 의미는
1주일 후
messages -> messages.1 로 백업하고
messages -> 0byte로 초기화
그 다음 1주일 후
messages.1 -> messages.2 로 백업하고
messages -> messages.1 로 백업하고
messages -> 0byte로 초기화
그 다음 1주일 후
messages.2 -> messages.3 로 백업하고
messages.1 -> messages.2 로 백업하고
messages -> messages.1 로 백업하고
messages -> 0byte로 초기화
그 다음 1주일 후
messages.3 -> messages.4 로 백업하고
messages.2 -> messages.3 로 백업하고
messages.1 -> messages.2 로 백업하고
messages -> messages.1 로 백업하고
messages -> 0byte로 초기화
그 다음 1주일 후
messages.4 -> messages.5 로 백업하고
messages.3 -> messages.4 로 백업하고
messages.2 -> messages.3 로 백업하고
messages.1 -> messages.2 로 백업하고
messages -> messages.1 로 백업하고
messages -> 0byte로 초기화
........... 하는데 messages.4 까지만 보관하겠다. 즉 5는 생성과 동시에 삭제. 또는 생성 안할 수도..? 여튼 5는 없다.
create 0664 root utmp 를 보면
-----------------------------------------------------------------
centos[root /root]# ls -l /var/log/wtmp
-rw-rw-r-- 1 root utmp 127872 10월 18 10:26 /var/log/wtmp
centos[root /root]# ls -l /var/log/wtmp
-rw-rw-r-- 1 root utmp 127872 10월 18 10:26 /var/log/wtmp
------------------------------------------------------------------
퍼미션이나 소유주가 명령대로 설정되어 있다.
include /etc/logrotate.d
예를 들어 하나를 보자.
------------------------------------------------------------------
centos[root /etc/logrotate.d]# cat vsftpd.log
/var/log/vsftpd.log {
# ftpd doesn't handle SIGHUP properly
nocompress // 압축하지마.
missingok // 혹시 파일이 없어도 그냥 넘어가. nomissingok가 기본.
}
/var/log/xferlog {
# ftpd doesn't handle SIGHUP properly
nocompress
missingok
}
---------------------------------------------------------------
# ftpd doesn't handle SIGHUP properly
nocompress
missingok
}
---------------------------------------------------------------
별다른 설정이 없으니 주 1회, 한달치... 등등 위에 있는 설정을 따른다.
실행방법
----------------------------------------------------------------
centos[root /var/log]# logrotate /etc/logrotate.conf
----------------------------------------------------------------
----------------------------------------------------------------
직접 실행해야 하면 번거로우니 cron...에 등록되어 있다.
----------------------------------------------------------------
centos[root /etc]# ls cron.daily/
00webalizer 0logwatch cups makewhatis.cron prelink tmpwatch
0anacron certwatch logrotate mlocate.cron rpm
------------------------------------------------------------------
centos[root /etc]# ls cron.daily/
00webalizer 0logwatch cups makewhatis.cron prelink tmpwatch
0anacron certwatch logrotate mlocate.cron rpm
------------------------------------------------------------------
실습해보자.
-------------------------------------------------------------------
centos[root /etc/logrotate.d]# vi test.log
1 /var/log/newtest {
2 daily
3 compress
4 rotate 2
5 missingok
6 sharedscripts // end 사이에 적는 명령어를 실행한다.
7 postrotate // post 니까 백업후 명령어를 실행해라.
8 service vsftpd restart 2> /dev/null // 에러는 출력하지마.
9 touch /tmp/test.txt
10 endscript
11 }
1 /var/log/newtest {
2 daily
3 compress
4 rotate 2
5 missingok
6 sharedscripts // end 사이에 적는 명령어를 실행한다.
7 postrotate // post 니까 백업후 명령어를 실행해라.
8 service vsftpd restart 2> /dev/null // 에러는 출력하지마.
9 touch /tmp/test.txt
10 endscript
11 }
ifempty // 용량이 0이여도 백업받겠다.
-------------------------------------------------------------------
-------------------------------------------------------------------
다른 파일을 살펴보자.
-------------------------------------------------------------------
centos[root /etc/logrotate.d]# vi httpd
1 /var/log/httpd/*log {
2 missingok
3 notifempty
4 sharedscripts
5 postrotate
6 /sbin/service httpd reload > /dev/null 2>/dev/null || true
7 endscript
8 }
-------------------------------------------------------------------
/dev/null 2>/dev/null 실행 결과나 에러나 둘다 출력하지 마숑.
centos[root /etc/logrotate.d]# vi httpd
1 /var/log/httpd/*log {
2 missingok
3 notifempty
4 sharedscripts
5 postrotate
6 /sbin/service httpd reload > /dev/null 2>/dev/null || true
7 endscript
8 }
-------------------------------------------------------------------
/dev/null 2>/dev/null 실행 결과나 에러나 둘다 출력하지 마숑.
|| true || 참이 될때까지 실행. &&는 거짓이 될때까지 실행.
2013년 1월 16일 수요일
반드시 알아야할 MySQL 특징 세 가지
Overview
MySQL 요구가 전보다 급증하고 있습니다. 이제 친숙해서 사용하는 간단한 소용량 DBMS 이 아닌, 많은 대형 업체에서도 사용되고 있기 때문에 많은 이슈가 되고 있습니다. 트위터, 페이스북, 구글, 야후 뿐만 아니라 최근들어 SNS 열풍으로 국내에도 MySQL 관련하여 엄청난 붐이 시작되려는 찰나인 듯 하네요.
KTH에 입사를 한 당시에 주력 DB는 Oracle이었습니다. 그러나 라이선스 비용 문제로 주력 DB 선정을 위한 저울질이 시작되었고, 그중 일반 개발자에게도 친숙한 MySQL을 선택했습니다.
MySQL 세가지 특성?
MySQL 3.X 버전으로 광고 시스템을 만든 적이 있습니다. 꽤나 오래된 얘기..
지금 생각하면 당시 광고 시스템에서 DB에 날리는 쿼리는 간단하기는 했지만, 상당한 트래픽을 무난히 견디는 것을 보고 감탄을 금치 않았습니다. 와~! 이거 물건인데? 제 첫 사용 소감이었습니다.하지만 “과연 MySQL에 대한 중요한 특성을 잘 알고 있었을까?” 라는 생각이 들었습니다.그때부터였다. MySQL이라는 녀석과 진지한 악수를 한번 해보고 싶다는 생각을 한 것이.. 그래서 여기저기 해외 사례도 기웃거리고, 서적도 진지하게 읽기 시작했죠. 읽으면서 틈틈이 벤치마킹도 수행해보고 나름의 지식 베이스를 늘려갔습니다.
지금 생각하면 당시 광고 시스템에서 DB에 날리는 쿼리는 간단하기는 했지만, 상당한 트래픽을 무난히 견디는 것을 보고 감탄을 금치 않았습니다. 와~! 이거 물건인데? 제 첫 사용 소감이었습니다.하지만 “과연 MySQL에 대한 중요한 특성을 잘 알고 있었을까?” 라는 생각이 들었습니다.그때부터였다. MySQL이라는 녀석과 진지한 악수를 한번 해보고 싶다는 생각을 한 것이.. 그래서 여기저기 해외 사례도 기웃거리고, 서적도 진지하게 읽기 시작했죠. 읽으면서 틈틈이 벤치마킹도 수행해보고 나름의 지식 베이스를 늘려갔습니다.
- 단일 코어에서 Nested Loop Join 처리
- 다양한 스토리지 엔진
- 데이터 복제(Replication) 기능
1) 단일 코어에서 Nested Loop Join 처리
MySQL에서는 모든 SQL 처리를 단일 코어에서 Nested Loop Join 방식으로만 데이터를 처리합니다. 병렬 처리라는 것은 없습니다. 물론 일부 3rd스토리지 엔진을 플러그인으로 설치를 하면 병렬 처리가 가능하다고는 하지만, 기본적인 스토리지 엔진에는 단일 코어 수행합니다. 그렇기 때문에 MySQL 입장에서는 CPU코어 개수를 늘리는 Scale-Out보다는 오히려 단위 처리량이 좋은 CPU로 Scale-Up을 하는 것이 훨씬 유리합니다.
게다가 모든 데이터 처리를 Nested Loop Join(이하 NL join)으로 처리합니다. NL join이란 선행 테이블(A)의 조건 검색 결과 값 하나하나를 엑세스 하면서 연결할 테이블(B)에 대입하여 조인하는 방식입니다. 프로그램적으로 풀자면 2 중 While문과 유사하다고 볼 수 있습니다. 처리할 데이터가 적으면 수행 속도가 빠르지만, A테이블 또는 B테이블 중 하나라도 연산을 해야할 데이터가 많아지만 쿼리 효율이 기하급수적으로 떨어집니다.
출처 : http://dev.mysql.com/doc/refman/5.5/en/nested-loop-joins.html
Outer Join이든, Sub Query든, Inner Join이든 모두 NL-Join으로만 처리합니다. DW 또는 데이터 분석 도구보다는 단순 처리를 위한 OLTP 프로세싱에 적합한 DBMS입니다.
2) 다양한 스토리지 엔진
MySQL은 다양한 스토리지 엔진을 지원합니다. MyISAM, InnoDB, Archive, Memory, NDB, Federated 등 기본 엔진 뿐만 아니라 3rd Party 스토리지 엔진도 간단하게 플러그인 형식으로 설치를 할 수 있습니다.
제가 자주 사용하는 스토리지 엔진 세 가지(MyISAM, InnoDB, Archive) 세 가지에 관한 간단한 비교 표입니다.
- MyISAM Storage Engine인덱스만 메모리에 올려서 테이블 잠금으로 데이터를 처리하는 스토리지 엔진으로 단순 백그라운드에서 로그 수집에 적합합니다. 동시 다발적으로 데이터 변경 작업을 수행하는 로직에는 절대 적합하지 않습니다. 특히 인덱스가 걸려있는 상태에서 대용량(500만 건 이상) 데이터 처리 시 단순 입력 상태에서도 테이블 잠금이 빈번하게 발생할 수 있다는 점을 명심하시기 바랍니다.
- Archive Storage Engine원시 로그 수집에 최적인 스토리지 엔진입니다. 트랜잭션, 인덱스 모두 지원하지 않지만, 테이블에서 데이터 처리를 행 단위 잠금으로 수행하기 때문에 동시 다발적으로 데이터 입력 상황에도 상당히 좋은 퍼포먼스를 제공합니다. 게다가 메모리에서 데이터 압축을 수행하면서 실제적으로 디스크에 기록하기 때문에, InnoDB 대비 꽤 좋은 디스크 용량 효율이 있습니다. 게다가 파티셔닝을 지원하기 때문에 추후 로그 정리 시에도 상당히 간단하죠.
- InnoDB Storage Engine현재 Oracle에서 가장 밀고 있는 스토리지 엔진으로 In-Memory 특성을 가지고 있습니다. 메모리에 인덱스/데이터 모두 올려서 데이터를 처리하기 때문에 데이터 접근 속도가 상당히 빠릅니다. 메모리가 많이 허용되면 엄청난 퍼포먼스를 발휘하는 엔진이죠. 게다가 트랜잭션을 제공하고, 동시 데이터 처리 시에도 행 단위 잠금으로 처리하기 때문에 실제적으로 InnoDB Storage Engine은 OLTP 성 대용량 처리에 가장 적합한 스토리지 엔진이라고 볼 수 있습니다.
위 세가지 엔진을 능숙하게 사용할 수만 있다면 서버 효율성을 상당 수준 이끌어 낼 수 있다고 생각하는데요. 그래서 간단하게 선정 기준을 다음과 같이 만들어 보았습니다.(지극히 개인적인 생각입니다.)
3) 데이터 복제(Replication) 기능
MySQL은 물리적으로 독립적인 디스크 영역에 데이터를 복제(Replication)하여 데이터를 이중화할 수 있습니다. 하단 그림은 가장 대표적인 MySQL Replication Master-Slave구조를 나타낸 그림입니다. 마스터에서 데이터 변경이 작업이 일어나면, 해당 내역이 자동으로 슬레이브로 비동기적으로 전송되어 실제 마스터의 데이터 복사본을 유지하는 것을 의미합니다.
특정 데이터 디스크 Fail시에도 다른 물리적으로 독립적인 디스크에 데이터가 존재하기 때문에, DB 버그가 아니라면 유실은 거의 없습니다. 게다가 디스크 읽기 분산이 가능하기 때문에 읽기 트래픽이 상당히 큰 서비스에 큰 효율을 갖습니다. 대신 데이터 반영은 오직 하나의 노드, 마스터에서만 가능하기 때문에 쓰기 관련된 부하 분산이 불가능합니다. 그리고 마스터 자체 장애는 쓰기 관련 전체 장애로 발생한다는 점도 꼭 기억하세요.
마치며..
MySQL DBMS 사용 시 반드시 알아야하는 세가지 특성!! 꼭 잊지마세요.^^
차근차근 각 특성들을 상세하게 정리해서 공유드리도록 하겠습니다.
읽어주셔서 감사합니다.
차근차근 각 특성들을 상세하게 정리해서 공유드리도록 하겠습니다.
읽어주셔서 감사합니다.
출처 : http://gywn.net/2011/12/mysql-three-features/
[Apache 튜닝]apache prefork 와 worker 방식
Apache Multi-Processing Modules(MPM, 다중처리모듈)의 Prefork 와 Worker 방식의 비교
==> apache 서버가 클라이언트에게서 받아들인 요청을 처리하기 위해 "자식 process" 에게 분배하는 방식
==> apache 서버가 클라이언트에게서 받아들인 요청을 처리하기 위해 "자식 process" 에게 분배하는 방식
Prefork 방식
- 하나의 자식 프로세스가 하나의 쓰레드를 갖는 구조로, 자식 프로세스는 1024까지 늘일 수 있다.
- 한개의 자식 프로세스는 한 개의 연결을 담당한다.
- 프로세스가 생성되는 구조이므로 당연히 worker보다는 많은 메모리를 사용함.
- 프로세스간 메모리를 직접 공유하지 않으므로, 메모리 공간이 독립적이어서 안정적임
- 한개의 자식 프로세스는 한 개의 연결을 담당한다.
- 프로세스가 생성되는 구조이므로 당연히 worker보다는 많은 메모리를 사용함.
- 프로세스간 메모리를 직접 공유하지 않으므로, 메모리 공간이 독립적이어서 안정적임
httpd.conf에서 httpd-mpm.conf 파일을 include 시켜야 한다.
httpd-mpm.conf 파일에서
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
옵션 설명
StartServer: 아파치서버의 자식 프로세스 개수 지정
MinSpareServers, MaxSpareServers :
부하가 적어서 MinSpareServers 개수 보다 적었을 경우 최소한 이 개수 만큼 유지하려고 아파치가 노력하고
부하가 증가하여 프로세스 개수가 많아질 경우에 MaxSpareServers 개수 이하로 줄이려고 아파치는 노력한다.
즉, 절대적인 수치가 아니다.
부하가 적어서 MinSpareServers 개수 보다 적었을 경우 최소한 이 개수 만큼 유지하려고 아파치가 노력하고
부하가 증가하여 프로세스 개수가 많아질 경우에 MaxSpareServers 개수 이하로 줄이려고 아파치는 노력한다.
즉, 절대적인 수치가 아니다.
MaxClient : 초기 시작시 실행가능한 최대 아파치 자식 프로세스의 개수를 지정
worker방식의 MaxClient 와는 전혀 다른 의미가 다르지만 결국 클라이언트의 요청을 처리하는 용량을 말하므로 사실상 유사.
worker방식의 MaxClient 와는 전혀 다른 의미가 다르지만 결국 클라이언트의 요청을 처리하는 용량을 말하므로 사실상 유사.
MaxReqeustPerChild :클라이언트들의 요청 개수를 제한.
만약 자식 프로세스가 이 값만큼의 클라이언트 요청을 받았다면 이 자식 프로세스는 자동으로 죽게 된다.
0 인 경우 무한대임.
만약 자식 프로세스가 이 값만큼의 클라이언트 요청을 받았다면 이 자식 프로세스는 자동으로 죽게 된다.
0 인 경우 무한대임.
Maxclient 를 늘리기 위한 설정 ( Prefork 방식일 경우 )
1) apache 1.x 버전
Apache 소스 디렉토리/src/include/httpd.h 에서
define HARD_SERVER_LIMIT 256 ----> 512 혹은 1024 등으로 변경 저장후 컴파일
1) apache 1.x 버전
Apache 소스 디렉토리/src/include/httpd.h 에서
define HARD_SERVER_LIMIT 256 ----> 512 혹은 1024 등으로 변경 저장후 컴파일
2) apache 2.x~ 2.2.x 버전
apache소스디렉토리/server/mpm/prefork/prefork.c 에서
define DEFAULT_SERVER_LIMIT 256 ----> 512 혹은 1024 등으로 변경후 재부팅
apache소스디렉토리/server/mpm/prefork/prefork.c 에서
define DEFAULT_SERVER_LIMIT 256 ----> 512 혹은 1024 등으로 변경후 재부팅
Worker 방식- 자식 프로세스들이 여러개의 쓰레드를 갖을 수 있으며, 각 쓰레드는 한번에 한 연결을 담당함.
- Prefork보다 메모리 사용량이 적음. 통신량이 많은 서버에 적절함.
- 쓰레드 간에 메모리 공간을 공유함. 리소스 경합이 발생하지 않도록 주의 필요. 특히 PHP를 쓰는 경우 유의하여야 함.
- Prefork보다 메모리 사용량이 적음. 통신량이 많은 서버에 적절함.
- 쓰레드 간에 메모리 공간을 공유함. 리소스 경합이 발생하지 않도록 주의 필요. 특히 PHP를 쓰는 경우 유의하여야 함.
httpd.conf에서 httpd-mpm.conf 파일을 include 시켜야 한다.
httpd-mpm.conf 파일에서
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
옵션 설명
StartServers(Default 3) : 시작시에 생성되는 서버 프로세스의 개수, 자식 프로세스의 수는 부하에 따라 동적으로 변경되기 때문에 이 값은 큰 의미가 없다.
ServerLimit (default : 16)
- 구성 가능한 child 프로세스의 제한 수.
- 이 ServerLimit 값이 필요 이상 높게 설정 된다면, 불필요한 공유 메모리가 할당 되므로 적절한 설정 필요.
- MaxClient 와 ThreadPerChild 에서 요구한 프로세스 수보다 높게 설정하지 말 것.
- 구성 가능한 child 프로세스의 제한 수.
- 이 ServerLimit 값이 필요 이상 높게 설정 된다면, 불필요한 공유 메모리가 할당 되므로 적절한 설정 필요.
- MaxClient 와 ThreadPerChild 에서 요구한 프로세스 수보다 높게 설정하지 말 것.
MaxClient (default : ServerLimit * ThreadsPerChild)
- 동시에 처리될 최대 커넥션(request)의 수
- MaxClients 수치를 초과한 후 온 요청들은 ListenBackLog에 의해 큐잉됨
- ThreadsPerChild 옵션과 매우 긴밀하게 작용함
- 동접자가 많을 경우, 이 MaxClient값을 증가시켜야 함.
- OS의 FD(File Descriptor)값을 증가 시켜 MaxClient 의 상한값을 증가시키도록 할 것.
MinSpareThreads(default 75) : 최소 thread 개수
- 만약 서버에 idle 쓰레드가 충분하지 않다면 child 프로세스는 idle 쓰레드가 MinSpareThreads 보다 커질때까지 생성된다.
- 만약 서버에 idle 쓰레드가 충분하지 않다면 child 프로세스는 idle 쓰레드가 MinSpareThreads 보다 커질때까지 생성된다.
MaxSpareThreads(default 250) : 최대 thread개수
- 만약 서버에 너무 많은 idle 쓰레드가 존재하면 child 프로세스는 idle 쓰레드가 MaxSpareThreads 수보다 작아질 때까지 죽는다
ThreadPerChild : 개별 자식 프로세스가 지속적으로 가질 수 있는 Thread의 개수
- 만약 서버에 너무 많은 idle 쓰레드가 존재하면 child 프로세스는 idle 쓰레드가 MaxSpareThreads 수보다 작아질 때까지 죽는다
ThreadPerChild : 개별 자식 프로세스가 지속적으로 가질 수 있는 Thread의 개수
MaxRequestPerChild : 자식 프로세스가 서비스할 수 있는 최대 요청 개수
ThreadLimit (default : 64)
- child 프로세스의 라이프주기 동안 ThreadsPerChild 의 최대 설정값을 설정한다.
- ThreadLimit 가 ThreadsPerChild 보다 훨씬 높게 설정된다면, 여분의 미사용 공유 메모리가 할당될 것이다.
- ThreadLimit 과 ThreadsPerChild 모두 시스템이 감당할 수 있는 값 보다 높게 설정하면,
아파치가 기동되지 않거나 시스템이 불안정하게 될 수 있다.
- 이 값은 최대 예상 ThreadsPerChild 의 설정보다 높게 설정하면 안된다.
- ThreadLimit 가 ThreadsPerChild 보다 훨씬 높게 설정된다면, 여분의 미사용 공유 메모리가 할당될 것이다.
- ThreadLimit 과 ThreadsPerChild 모두 시스템이 감당할 수 있는 값 보다 높게 설정하면,
아파치가 기동되지 않거나 시스템이 불안정하게 될 수 있다.
- 이 값은 최대 예상 ThreadsPerChild 의 설정보다 높게 설정하면 안된다.
Maxclient 를 늘리기 위한 설정 ( Worker 방식일 경우 - 2.x버전에 한정됨)
1) Maxclient 는 StartServers * ThreadsPerChild 로 정해짐
( MaxClient = StartServer * ThreadsPerChild )
=> worker 방식은 각각의 자식프로세스별로 여러개의 thread를 생성해서 요청을 처리하기 때문
2) Maxclient 를 늘리기 위한 설정
apache소스디렉토리/server/mpm/worker/worker.c 파일 을 수정
( define DEFAULT_SERVER_LIMIT 16 값을 늘려준다 )
1) Maxclient 는 StartServers * ThreadsPerChild 로 정해짐
( MaxClient = StartServer * ThreadsPerChild )
=> worker 방식은 각각의 자식프로세스별로 여러개의 thread를 생성해서 요청을 처리하기 때문
2) Maxclient 를 늘리기 위한 설정
apache소스디렉토리/server/mpm/worker/worker.c 파일 을 수정
( define DEFAULT_SERVER_LIMIT 16 값을 늘려준다 )
* 참고1.
대부분 prefork 방식이 기본적으로 사용되며, 사용자가 많은 경우에는 worker방식을 사용한다.
요즘 몇 몇 사이트에서 사용자 폭주로 인하여 worker 방식을 사용하는 경우가 간혹 있다.
요즘 몇 몇 사이트에서 사용자 폭주로 인하여 worker 방식을 사용하는 경우가 간혹 있다.
*참고2.
apache 설치 시에 아래와 같이, 반드시 --with-mpm=worker 옵션을 설정 하고 설치한다.
이 옵션을 주지 않을 경우, Default인 Prefork방식으로 설치된다(Linux에 한함)
이 옵션을 주지 않을 경우, Default인 Prefork방식으로 설치된다(Linux에 한함)
================================================================
./configure --prefix=/home/paint/apache-2.2.15 --enable-mods-shared=all --enable-module=so --enable-so --with-mpm=worker
================================================================
./configure --prefix=/home/paint/apache-2.2.15 --enable-mods-shared=all --enable-module=so --enable-so --with-mpm=worker
================================================================
* 참고3.
현재 worker 모듈 설치 되었는지 확인하는 방법
- "httpd -l" 명령으로 현재 설치된 Apache가 worker방식으로 설치되었는지 확인할 수 있다.
============================================
# httpd -l
Compiled in modules:
core.c
worker.c <----------------------요거임
http_core.c
mod_so.c
core.c
worker.c <----------------------요거임
http_core.c
mod_so.c
============================================
또는, httpd -V 명령으로 확인 가능하다. (V는 대문자)
============================================
# httpd -V
Server version: Apache/2.2.15 (Unix)
Server built: Jun 30 2010 16:59:45
Server's Module Magic Number: 20051115:24
Server's Module Magic Number: 20051115:24
Server loaded: APR 1.4.2, APR-Util 1.3.9
Compiled using: APR 1.4.2, APR-Util 1.3.9
Architecture: 32-bit
Server MPM: Worker <------------------------요거
threaded: yes (fixed thread count)
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/worker"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/home/paint/apache-2.2.15"
-D SUEXEC_BIN="/home/paint/apache-2.2.15/bin/suexec"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/home/paint/apache-2.2.15"
-D SUEXEC_BIN="/home/paint/apache-2.2.15/bin/suexec"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
=============================================
출처 : http://blog.naver.com/sugyoo?Redirect=Log&logNo=20119924250
2013년 1월 6일 일요일
PHP 5.3 설치... 중 발생하는 오류 처리
원 설치 옵션
PHP-5.3.15 다운로드(bz2로 다운로드)
[root@localhost]# wget http://kr1.php.net/distributions/php-5.3.15.tar.bz2
[root@localhost]# ./configure --prefix=/home/apps/php --with-apxs2=/home/apps/apache/bin/apxs --disable-debug --enable-sockets --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-exif --with-curl --with-gd=/usr --with-gdbm --enable-gd-native-ttf --enable-gd-jis-conv --with-freetype-dir=/usr --with-png-dir=/usr --with-jpeg-dir=/usr --with-xpm-dir=/usr --with-gettext --with-iconv --enable-pcntl --with-readline --with-openssl --with-bz2 --with-zlib --with-mcrypt --with-mhash --enable-mbstring=all --enable-mbregex --enable-libxml --with-xmlrpc --enable-ftp --enable-dba --disable-ipv6 --with-libdir=lib64 --with-pear --with-mysql=shared,/home/db/mysql
QDBM 문제
yum install gdbm-devel gd-devel
yum install libXpm libXpm-devel
yum install libtool-ltdl-devel
설치
libXpm 문제
설치 옵션 중
--with-libdir=lib64
추가
libmcrypt 문제
wget http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6
http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
yum reinstall libmcrypt.x86_64
yum reinstall libmcrypt-devel.x86_64
cp -R /home/apps/php/lib /home/apps/php/lib64
2013년 1월 3일 목요일
VirtualBox에 설치된 CentOS 6.3에 Putty를 이용한 접속하는 방법
Assumption
VirtualBox : 4.2.6
CentOS : 6.3
HDD : VDI 50GB
"새로만들기"로 CentOS VM 설치
설치 완료 후 ifconfig 확인
만약, lo만 뜬다면
# ifconfig -a
로 확인하여 eth0가 있는지 확인 후,
# ifup eth0
로 네트워크 활성화
# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /root/ifcfg-eth0.old
# sed -i 's/ONBOOT="no"/ONBOOT="yes"/g' /etc/sysconfig/network-scripts/ifcfg-eth0
# diff /root/ifcfg-eth0.old /etc/sysconfig/network-scripts/ifcfg-eth0
# ping google.com
인터넷이 되는지 확인
가상머신 종료
VirtualBox 설정에서 NIC 추가
어댑터2 -> 호스트 전용 어댑터 선택 -> 고급 -> 모두 허용
VM 가동 후 eth1 활성화
# cp /etc/sysconfig/network-script/ifcfg-eth0 /etc/sysconfig/network-script/ifcfg-eth1
# vim /etc/sysconfig/network-script/ifcfg-eth0
수정 IPADDR="192.168.56.101" #Host Computer의 VirtualBos Host-Olny Network의 IP가
192.168.56.1이기 때문에...
Putty에서 192.168.56.101로 접속
VirtualBox : 4.2.6
CentOS : 6.3
HDD : VDI 50GB
"새로만들기"로 CentOS VM 설치
설치 완료 후 ifconfig 확인
만약, lo만 뜬다면
# ifconfig -a
로 확인하여 eth0가 있는지 확인 후,
# ifup eth0
로 네트워크 활성화
# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /root/ifcfg-eth0.old
# sed -i 's/ONBOOT="no"/ONBOOT="yes"/g' /etc/sysconfig/network-scripts/ifcfg-eth0
# diff /root/ifcfg-eth0.old /etc/sysconfig/network-scripts/ifcfg-eth0
# ping google.com
인터넷이 되는지 확인
가상머신 종료
VirtualBox 설정에서 NIC 추가
어댑터2 -> 호스트 전용 어댑터 선택 -> 고급 -> 모두 허용
VM 가동 후 eth1 활성화
# cp /etc/sysconfig/network-script/ifcfg-eth0 /etc/sysconfig/network-script/ifcfg-eth1
# vim /etc/sysconfig/network-script/ifcfg-eth0
수정 IPADDR="192.168.56.101" #Host Computer의 VirtualBos Host-Olny Network의 IP가
192.168.56.1이기 때문에...
Putty에서 192.168.56.101로 접속
피드 구독하기:
글 (Atom)