'리눅스'에 해당되는 글 9건

  1. 2009.11.03 :: 다수 웹서버에서 PHP 세션 공유 2
  2. 2009.07.06 :: CentOS 5 에서 MySQL 5.1 사용하기..
  3. 2008.07.10 :: 10TB 스토리지.. 2
  4. 2008.05.19 :: grep,egrep,sed,awk사용법(정규표현식) 1
  5. 2008.04.16 :: RoundCube Webmail 5
  6. 2007.11.23 :: 리눅스 커널 파라메터 2
  7. 2007.08.21 :: CentOS 4.5 yum update시 missing error. 2
  8. 2007.03.10 :: 스토리지... 8
  9. 2006.12.06 :: 최근 막아야 되는 봇 리스트 2
리눅스 2009. 11. 3. 13:34
L4, LVS, DNS RR 등으로 여러대의 웹서버를 운영하다보면
늘 고민하게 되는게 세션 공유일 것 같다.

물론 L4의 Metric 중에 Hash를 이용하면 어느정도 해결 될 수 있는 문제이지만,
가끔 클라이언트가 다른 서버로 세션이 할당되는 경우를 볼 수 있다.

나 또한 이 문제로 많은 고민을 했고, 여러 많은 HOW를 보았지만 썩 마음에 드는것이 없었다.
아마 세션 공유를 위해서 사용되는 방법은 아래의 3가지가 가장 보편적이지 않을까 싶다.

1. NFS, Samba
특정 서버의 디렉토리를 다수의 웹서버에서 Network를 통해 공유하는 것이다.
그럼 한곳의 디렉토리에 모든 세션 파일이 존재할 것이고 문제는 해결이 된다.
그렇지만 NFS나 Samba는 Write 효율성이 상당히 떨어지는 데몬이다.
세션은 그 특성상 read/write가 매우 빈번히 일어나기 때문에 효율성 면에서는 좋지 않다.
(개인적으로 이 방법을 사용하다가 피본적이 있다-_-;;)

2. DBMS
세션 데이터를 DBMS와 연동하여 DB에 저장하는 방식이다.
보편적으로 주로 사용되는 방법이지만, 접속자가 매우 많은 환경에서는
DB서버에 부하가 늘어날 수 밖에 없는 구조이다.
또한 DBMS에서 생기는 lock도 무시못할 변수로 떠오를 수 있다.

3. Daemon
말 그대로 데몬을 이용하여 세션을 공유하는 방식이다.
세션서버를 따로 구축하기에 제일 적절한 방법이 아닐까 싶다.

늘 그렇지만.. 난 언제나 서론이 참 길다.
오늘은 sharedance 라는 데몬을 소개하고자 한다.
지인의 소개로 알게된 데몬인데..
약 2년정도를 15대의 웹서버에 적용해서 사용하고 계신다는데.. 별 문제는 없으시다고 한다.
그래서 현재 우리 회사에서도 적용중인 데몬이다.

1. 세션 서버 구성
이 데몬은 세션 서버로 사용될 서버에만 설치해주면 된다. 웹서버에는 설치할 필요가 없다.
sharedance의 최신버전은 http://sharedance.pureftpd.org/ 여기서 구할 수 있으며,
RPM으로 구하고 싶다면 http://rpm.pbone.net/ 에서 sharedance로 검색하면 된다.

1-1. RPM 설치
설치 끝났다. 참 쉽다. -_-

1-2. config 설정
sharedance의 환경설정 파일은 /etc/sysconfig/sharedance 에서 해주면 된다.
설정할 내용이 많은 것도 아니고, 달랑 2개면 된다.
SHAREDANCE_DIR="/var/lib/sharedance"
SHAREDANCE_OPTIONS="--expiration=1800 --timeout=1800"
SHAREDANCE_DIR 은 세션 파일이 저장될 디렉토리를 의미한다.
SHAREDANCE_OPTIONS 는 데몬을 시작할때 사용할 옵션을 지정해주는 것이다.
어떤 옵션들이 있는지 보고 싶다면 sharedanced --help 라고 치면 나온다.

1-3. sharedance 시작
[root@localhost]# /etc/init.d/sharedance start
이제 sharedance 사용 준비가 모두 완료 되었다.


2. Client 설정 (웹서버)
웹서버는 크게 설정하거나 설치할 내용이 없다.
단순히 php.ini에서 sharedance의 handler 파일만 호출해주도록 설정하면 된다.

2-1. handler 파일 준비
이 파일을 직접 만들 필요는 없고, sharedance 에서 제공하는 파일을 그대로 가져다 쓰면 된다.
세션서버에서 sharedance를 RPM으로 설치했다면,
/usr/share/doc/sharedance-0.6/php/ 에 핸들러 파일이 존재할 것이다.
[root@localhost]# ls /usr/share/doc/sharedance-0.6/php
session_handler.php  sharedance.php  test_session.php  test_sharedance.php
필요한 파일은 session_handler.php와 sharedance.php 파일이다.
이 2개의 파일을 웹서버로 전송한다.

2-2. handler 파일 복사 및 설정
세션서버에서 전송받은 핸들러 파일을 적당한곳에 잘 복사해두면 된다.
필자는 편의상 서버 운영에 필요한 파일을 한곳에 몰아서 관리하고 있기 때문에
/etc/sadmin/httpd/sharedance 에 복사를 했다.

핸들러 파일이 세션서버를 이용할 수 있도록, 핸들러 파일을 약간 수정해야 된다.
그렇지만 그리 어려운 내용은 아니기 때문에 쉽게 수정할 수 있다.
[root@localhost]# vi /etc/sadmin/httpd/sharedance/session_handler.php
define('SESSION_HANDLER_HOST', '192.168.0.100');
이 부분은 세션서버를 지정해주는 부분이다.
만약 세션서버가 같은 서버에서 돌고 있다면 localhost로 지정하면 될 것이고,
다른 서버에서 돌고 있다면 그 서버의 ip 혹은 host를 적어주면 된다.

[root@localhost]# vi /etc/sadmin/httpd/sharedance/sharedance.php
define('SHAREDANCE_DEFAULT_PORT', 1042);
define('SHAREDANCE_DEFAULT_TIMEOUT', 10);
이 부분은 세션서버의 listening port와 timeout 시간을 설정해주는 부분이다.
만약 세션서버에서 데몬의 포트가 다르게 설정되어 있다면 이곳에서 수정을 해주면 된다.

2-3. php.ini 설정
이제 모든 준비가 끝났으므로 웹서버의 PHP에서 session을 이용할때
sharedance의 핸들러를 통해 세션서버와 통신하도록 설정해주기만 하면 된다.
[root@localhost]# vi /etc/php.ini
...
auto_prepend_file = /etc/sadmin/httpd/sharedance/session_handler.php
...
session.save_handler = user
php.ini 수정이 모두 끝났으면 웹서버를 재시작하여 변경된 php.ini의 내용을 reload 시킨다.

3. sharedance 확인
모든 설정과 준비가 끝났다.
세션서버에 세션파일이 잘 생성 되는지 확인을 해보자.
[root@localhost]# ls /var/lib/sharedance
01c6hof0u872jp3grka4ifo3u4  4u44789jq4vtjt7l2fp3t1ime6  e7d6nq244j27l8bllif792pp25
...
...
위와 같이 세션파일이 생성이 된다면, 정상적으로 웹서버와 세션서버가 통신하고 있는 것이다.
posted by 티니
:
리눅스 2009. 7. 6. 09:54
회사에 새로운 솔루션이 도입이 되면서, DBMS의 파티셔닝 테이블을 필요로 했다.
그리고 MySQL은 5.1부터 파티셔닝 테이블을 지원한다.
그러나...
CentOS 5에서는 MySQL 5.0 버전을 지원하고 있는 관계로 그냥 사용할 수가 없다.

물론 간단히 소스컴파일 해서 사용하면 되지 않겠냐고 말하는 분들 있겠지만..
과감히 이런 멘트를 날려준다.
'아직도 컴파일이 멋지다고 생각하는가? 가장 좋을거라 생각하는가? 착각이다'
최적의 환경에서, 최적의 빌드옵션으로 빌드 할 자신 없다면 관둬라
불필요한 컴파일로 성능저하나 안일어나면 다행이다.

서론이 길었다.
그럼 어떻게 해야될까? 나의 repo tree를 뒤적뒤적 찾아보니...
오! thanks for Remi!!
MySQL 5.1을 지원해주고 있는 repository를 찾았다. (덤으로 PHP 5.2까지..)
바로 설치에 들어가보자 고고싱..

1. Remi의 yum repository 세팅
[root@localhost]# wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
[root@localhost]# wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
[root@localhost]# rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm
/etc/yum.repos.d 안에 remi.repo 파일과 epel.repo 파일이 생성이 된다.
이제 사용할 준비가 완료 되었다. (너무 쉬운가?!)

2. MySQL 설치
[root@localhost]# yum --disablerepo \* --enablerepo remi install mysql
[root@localhost]# yum --disablerepo \* --enablerepo remi install mysqlclient15 mysqlclient15-devel
[root@localhost]# yum --disablerepo \* --enablerepo remi install mysql-server mysql-libs mysql-devel
remi의 repo를 enable 시켜줌과 동시에 모든 repo를 disable 시켜주는 이유는
centos base repo의 mysql(5.0)과 remi의 mysql(5.1)이 중복되지 않게 하기 위해서이다.

그리고 두번째 라인의 mysqlclient15 패키지는.. PHP에서 사용하는 라이브러리가 들어있다.
완전히 독립적인 DB 서버의 경우는 설치하지 않아도 되지만,
APM이 하나의 서버에서 운영되는 경우에는 반드시 설치해야 의존성 에러를 피할 수 있다.

자 설치가 다 끝났다. 이제 잘 쓰자.
참 쉽죠잉~?!
posted by 티니
:
리눅스 2008. 7. 10. 11:47

작년초 구입했던 6TB DAS 용량이 거의 풀인 관계로...
이번엔 10TB DAS를 구입했다.

헤더는 147GB SAS 2.5' 10k * 4EA로 구성되어 있고, RAID-10으로 묶어둔 상태이다.
바디는 뭐 말할것두 없이 RAID-5이고...

OS는 CentOS 5.2 x86_64 버전을 설치 했다.

헤더에 OS 설치하고, 바디 파티션 세팅하기에 앞서 이거저거 생각하다보니.. 음...-_-
ext3는 8TB 밖에 지원이 안되네.. 흠흠..
그래서 xfs를 사용하기로 결정했다. (ext4가 어여 stable이 되었으면 좋겠건만...)

자.. 우선 fdisk로 확인을 해보자..
[root@str3 ~]# fdisk -l
Disk /dev/sda: 292.3 GB, 292326211584 bytes
255 heads, 63 sectors/track, 35539 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          33      265041   83  Linux
/dev/sda2              34         425     3148740   83  Linux
/dev/sda3             426         686     2096482+  83  Linux
/dev/sda4             687       35539   279956722+   5  Extended
/dev/sda5             687        1991    10482381   83  Linux
/dev/sda6            1992        2252     2096451   82  Linux swap / Solaris
/dev/sda7            2253        2513     2096451   82  Linux swap / Solaris
/dev/sda8            2514        2774     2096451   83  Linux
/dev/sda9            2775        2839      522081   83  Linux
/dev/sda10           2840       35539   262662718+  83  Linux
 
WARNING: GPT (GUID Partition Table) detected on '/dev/sdb'! The util fdisk doesn't support GPT. Use GNU Parted.
 
 
Disk /dev/sdb: 10494.4 GB, 10494484152320 bytes
255 heads, 63 sectors/track, 1275881 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
 
   Device Boot      Start         End      Blocks   Id  System

흠흠... fdisk에서 졸라 큰 파티션(10494.4GB/10TB)을 발견했다고 경고를 한다.
걍 쌩까자-_-);; 쟤는 맨날 저런다-_-;;

이제 파티션을 구성해야겠지?
지난번 6TB DAS 세팅할때도 말했지만.. fdisk에선 2TB 이상 지원 못한다.
그러니 parted 유틸리티를 이용하자.
[root@str3 ~]# parted /dev/sdb
GNU Parted 1.8.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
 
Model: DELL PERC 6/E Adapter (scsi)
Disk /dev/sdb: 10.5TB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
 
Number  Start  End  Size  File system  Name  Flags
(parted) mkpart
Partition name?  []?
File system type?  [ext2]? xfs
Start? 0
End? 10.5TB
(parted) p
Model: DELL PERC 6/E Adapter (scsi)
Disk /dev/sdb: 10.5TB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number  Start   End     Size    File system  Name  Flags
 1      17.4kB  10.5TB  10.5TB
(parted) quit
Information: Don't forget to update /etc/fstab, if necessary.

자.. 이제 파티션을 생성했으니.. 파일시스템을 생성해서 사용하기만 하면 된다.
그러나 여기서 잠깐!
이 상태에서는 xfs 파일시스템을 생성할 수가 없다.
왜냐하면, redhat 에서는 기본적으로 xfs를 서포트하고 있지 않기 때문이다.
따라서 몇가지 xfs 관련 패키지를 설치해주어야 된다.
[root@str3 ~]# yum -y install xfsprogs xfsdump kmod-xfs
Setting up Install Process
...
...
Complete!

패키지를 모두 설치했으면, 이제 파일시스템을 생성해보자.
[root@str3 ~]# mkfs -t xfs /dev/sdb1
meta-data=/dev/sdb1              isize=256    agcount=32, agsize=80066559 blks
         =                       sectsz=512   attr=0
data     =                       bsize=4096   blocks=2562129888, imaxpct=25
         =                       sunit=0      swidth=0 blks, unwritten=1
naming   =version 2              bsize=4096 
log      =internal log           bsize=4096   blocks=32768, version=1
         =                       sectsz=512   sunit=0 blks, lazy-count=0
realtime =none                   extsz=4096   blocks=0, rtextents=0

정상적으로 파일시스템이 생성되었다.
이제 마운트하고 잘 쓰자 -_-);;
posted by 티니
:
리눅스 2008. 5. 19. 09:11

grep : 패턴을 이용한 search => regular expression을 잘 만드는 것이 필요하다.

  grep option(s) pattern filename(s)

OS/tdir] grep -n dba /etc/group       # -n : 파일 안에서의 패턴이 발견된 라인 및 라인 번호
OS/tdir] grep
-v dba /etc/group           # -v  : 패턴이 발견되지 않은 라인
OS/tdir] grep -n dba
/etc/group /etc/passwd          # 파일을 여러개 나열...
OS/tdir] grep
-i the ~/tdir/*                 # -i : 대소구분 무시(ignore) => the 대소구분 없이
OS/tdir] grep
-li the ~/tdir/*                 # -l : 패턴이 들어있는 파일 이름만... 
OS/tdir] grep
-c the ~/tdir/*                 # -c : 패턴이 들어있는 라인 번호만...

[패턴을 좀더 정교하게 표현하려면 regular expression을 사용해야 한다]

^      : ^패턴            : 패턴으로 시작하는 모든 라인 찾기
$      : 패턴$           : 패턴으로 끝나는 모든 라인 찾기
.       : d...              : d로 시작하는 4자리 character 찾기
*      : [a-d]*          : a, b, c, d로 시작하는 character 찾기
[]    : [Dd]atabase  : Database 또는 database 찾기
[^]   : [^D]             : D가 나타나지 않는 라인 찾기

OS/tdir] grep -i ^the ~/tdir/*              # the로 시작하는 라인 찾기
OS/tdir] grep -i
meal.$ ~/tdir/*          # meal.으로 끝나는 라인 찾기
OS/tdir] grep
c...d ~/tdir/*                # c로 시작하고 d로 끝나는 5자리 character 찾기

================================================================

▒  egrep(expression grep) : searches  files  for  a pattern of characters
                                           and prints all lines that contain that pattern.

 

OS/tdir] egrep '(a|A)d+' /etc/passwd   # ad 또는 Ad가 포함된 라인 찾기
OS/tdir] vi grep_test                               # 아래 내용을 추가하세요... 붙여넣기... ^^

An Oracle database is a collection of data treated as a unit.
The purpose of a database is to store and retrieve related information.
A database server is the key to solving the problems of information management.

OS/tdir] egrep 'Oracle|purpose' grep_test   # Oracle 또는 purpose가 포함된 라인 찾기

===============================================================

sed : stream editor => file을 열지 않고 data를 편집하는 기능

  sed [-options] [address] command file... [>newfile]

 

# sed '/pattern/d' filename # file에서 패턴이 포함된 라인을 지우고 그 결과를 화면에 표시
                                          #
원본 파일에는 아무런 변화가 없다.

OS/tdir] cp grep_test sed_test
OS/tdir] cat sed_test
OS/tdir] sed
'/purpose/d' sed_test                  # purpose 라는 단어가 들어간 라인 삭제

 # sed '#d' filename      : # 라인만 삭제
# sed
'$d' filename      : 마지막 라인 삭제
# sed
'#,$d' filename   : # 라인부터 마지막 라인까지 지우기
# sed
'#,#d' filename   : # 라인부터 # 라인까지 지우기  

OS/tdir] sed '1d' sed_test     # 1 라인만 삭제
OS/tdir] sed
'$d' sed_test     # 마지막 라인만 삭제

OS/tdir] sed '/purpose/d' sed_test > set_out     # sed 처리 결과를 sed_out 으로 저장
OS/tdir] cat set_out

OS/tdir] sed '/purpose/p' sed_test             # 패턴이 포함된 라인이 두번 출력(print)된다.
OS/tdir] sed
-n '/purpose/p' sed_test        # 패턴이 포함된 라인만 출력된다.

OS/tdir] sed 's/$/  Oracle/' sed_test       # 각 라인의 마지막에 원하는 글자 추가

OS/tdir] sed 's/  */#/g' sed_test              # space를 찾아서 #기호로 변환한다.
OS/tdir] sed '
s/  */-/g' sed_test              # space를 찾아서 -기호로 변환한다.
                                                                      # * 기호 앞에 space가 두개라는 점에 유의

OS/tdir] # 한번에 여러 가지 편집 수행
OS/tdir] sed
-e 's/database/DATABASE/g' -e 's/information/INFORMATION/g' sed_test

===============================================================

awk : 패턴 검색과 처리를 위한 언어

=> 명령어의 이름은 개발자인 Alfred V. Aho, Peter J. Weinberger, Brian W. Kernighan 3인의
    머리글자를 사용해서 만든 것이다.

  awk '{ action}' filename

OS/tdir] ls -l | awk '{print $0}'              # 전체 필드가 모두 나타나도록...

drwxr-xr-x   2   prof9i4  dba          512  4월   25일  15:44   a_dir
drwxr-xr-x   2   prof9i4  dba          512  4월   18일  23:53   b_dir

     $1     $2     $3   $4        $5  $6   $7     $8    $9
                                        $0                                            

 

OS/tdir] ls -l | awk '{print $1}'                    # 1번 필드만 나타도록...
OS/tdir] ls -l | awk '{print $1, $9}'               # 1번과 9번 필드만 나타나도록...
OS/tdir] ls -l | awk '{print $3 "\t" $4 "\t" $9}'                # Tab 키가 적용된 결과...
OS/tdir] ls -lt | awk '{print $9, "is using", $5, "bytes"}'     # text 추가
OS/tdir] ls -lt | awk '
$5 <= 200 {print $0}'   # 5번 필드가 200 이하일 경우 출력

posted by 티니
:
리눅스 2008. 4. 16. 12:35
RoundCube Webmail은 오픈소스중 알려져 있는 많은 웹메일 중에 하나이다.

나 또한 최근까지 다람쥐 메일이라고 불리우는 Squirrel Mail을 사용했는데,
오랫동안 개발되어 온 만큼 많은 플러그인이 존재하기 때문에 여러 기능이 있다는 강점이 있으나
역시 보기좋은 떡이 먹기에도 좋다고.. 90년대틱한 디자인이 영 마음에 안들었었다.

그러다 어느날 우연히 RoundCube 라는 프로그램을 발견했고,
잠깐의 삽질 끝에 깔끔한 디자인의 괜찮은 프로그램을 사용할 수 있게 되었다.
또한 또하나의 강점으로 Ajax를 지원하며, UTF8이 기본으로 지원되고 있다.

그러나 아직 개발이 꾸준히 일어나고 있는 중이라 그런것인지
stable 이라는 딱지에 맞지 않게 버그도 심심치 않게 발견할 수 있었고,
가장 큰 문제점인 euc-kr이 제대로 지원되지 않는다는 문제가 있었다.

한글 문제는 곧 케릭터셋 문제에 있으리라 확신했고, 고쳐보고자 마음먹고 소스를 뒤적뒤적...
그러다가 디폴트 케릭터셋 처리 코드에 버그가 있음을 발견했고,
이 문제를 roundcube.net (http://trac.roundcube.net/ticket/1484991) 에
문제되는 부분과 패치된 부분의 코드를 현재 포팅해놓은 상태이다.

그 외에도 euc-kr을 처리하려면 패치를 조금 더 해야되는데..
생각보다 꽤 많은 코드에 ISO-8859-1 값이 Static으로 박혀 있었다.
물론 몽땅 다 replace 시켜주면 되겠지만.. 나의 귀차니즘이 어디가겠나?-_-
최소한의 패치로 처리할 수 있는 방법을 선택했다.
현재 tini4u.net에서 테스트중이고, 별 문제는 없는것 같은데.. 시간이 지나봐야 알 것 같다.

아래는 euc-kr 처리를 위한 패치부분이다.
FileName: roundcube/program/include/rcube_imap.php

--- Original Code
+++ Patch Code

=> Line number : 217
-  $this->default_charset = $ch;
+  $this->default_charset = $cs;

=> Line number : 2362
- return rcube_charset_convert($input, !empty($fallback) ? $fallback : 'ISO-8859-1');
+ return rcube_charset_convert($input, !empty($fallback) ? $fallback : 'euc-kr');

euc-kr 패치가 적용되기 전 화면
사용자 삽입 이미지


euc-kr 패치가 완료된 후 화면
사용자 삽입 이미지
posted by 티니
:
리눅스 2007. 11. 23. 14:19
# 커널이 할당할 수 있는 파일 핸들 최대값 조정 (max 65535)
# 128M -> 8192
# 256M -> 13684
# 512M -> 32768
# 1G -> 65536
# 2G -> 131072
fs.file-max = 65535

# 동시 사용자가 몰릴 경우에 대비해 received host대한 충분한 backlog 수치를 늘려주는 것이 좋음
net.core.netdev_max_backlog=2500

# 소켓 수신 큐 최대값과 기본값 조정.

# 일반적인 경우의 대용량 Serving을 위한 설정. 기본 값이 변경되는 경우 아파치 등의 웹서버 설정을 특별히 해줄 필요는 없다고 함.
net.core.rmem_default = 65536
net.core.rmem_max = 8388608

# 소켓 출력 큐 최대값과 기본값 조정.
# 일반적인 경우의 대용량 Serving을 위한 설정으로 더 적은 시스템콜로 웹페이지를 네트웍 스택에 보낼 수 있음.
# 기본 값이 설정되는 경우 아파치 등의 웹서버 설정을 특별히 해줄 필요는 없다고 함.

net.core.wmem_default = 65536
net.core.wmem_max = 8388608

# TCP layer의 수신 버퍼를 상향 조정
# 대량의 데이터를 클라이언트로 전송하는 경우에는 이 값을 추천. 
net.ipv4.tcp_rmem = 4096 87380 8388608

# TCP layer의 송신 버퍼를 상향 조정 대량의 데이터를 클라이언트로 전송하는 경우에는이 값을 추천.
net.ipv4.tcp_wmem = 4096 65536 8388608

# The tcp_mem variable defines how the TCP stack should behave when it comes to memory usage.
# TCP스택이 메모리를 어떻게 사용할지에 대한 메모리 페이지 단위 설정.
# 순서대로 min pressure max설정이다. tcp_wmem과 tcp_rmem설정에 따른 적정한 크기를 할당한다.
# IA32는 4KB가 한 개의 페이지이다.
# ※ 이 설정 값은 네트워크 성능에 영향을 큰 영향을 줄 수 있으므로 주의가 요구된다.
# {min} {pressure} {max}
net.ipv4.tcp_mem = 4096 4096 4096

# 유저 파일 핸들에 할당되지 않은 커넥션에 대해 몇번을 제거 시도를 할 것인지를 정하는 파라메터.
# 하이로드의 웹서버인 경우 이 값을 7이하로 떨어뜨릴 경우 “TCP: too many of orphaned sockets”와
# “Out of socket memory”에 대한 커널 메시지가 나타날 수 있다.
net.ipv4.tcp_orphan_retries = 7

# 클라이언트의 소켓으로부터 RST을 받아 TIME_WAIT 상태로 가는 경우 즉시 소켓을 종료시킴.
# 웹서버와 같은 유형의 서버에서는 소켓을 열고 닫는 회수가 많으므로 이 쪽을 튜닝하면
# net.ipv4.tcp_max_tw_buckets 값을 줄이는 설정을 해도 됨. 파일 서버와 같은 경우는 이 값을 기본값으로 놓는 것이 좋음.
net.ipv4.tcp_rfc1337 = 1

# SPECWeb99의 권고는 인트라넷 네트워크에서만 사용하는 네트웍인 경우 selective  acknowledgements를 off 시킴으로써 성능이 향상된
다고 함. SPECWeb99의 테스트는 완전한 1-2hop 이내의 네트워크 토폴로지를 가정하였으므로 일반적으로는 이 부분을 on으로 해주는 좋다
는 권고.

# ※ 외부 접속을 받는 네트워크에선 on으로 해야함.
net.ipv4.tcp_sack = 1

# SPECWeb99의 권고는 인트라넷 네트워크에서만 사용하는 서버인 경우 timestamps 생성를 off 시킴으로써 성능이 향상됨.
# SPECWeb99의 테스트는 완전한 1-2hop 이내의 네트워크 토폴로지를 가정하였으므로 일반적으로는
# 이 부분을 on으로 해주는 좋다는 권고. tcp_window_scaling 부분 참조
# ※ 외부 접속을 받는 네트워크에선 on으로 해야함
net.ipv4.tcp_timestamps = 1

# tcp_sack와 tcp_timestamps의 경우와 같은 튜닝 관점이다.
# 단, rmem, wmem과 tcp_rmem, tcp_wmem의 버퍼 상향 조정시에는
# tcp_timestamps와 함께 on 설정을 해주어 윈도크기를 조절하도록 하는 것이 좋다고 권고함.
net.ipv4.tcp_window_scaling = 1

# KEEPALIVE 시간을 줄이면 비정상적으로 stale된 접속을 해제하는 시간을 줄일 수 있음.
net.ipv4.tcp_keepalive_time = 1300

# 소켓의 listen backlog 값 조정으로 동시접속이 몰릴 경우에 대한 최적화
net.ipv4.tcp_max_syn_backlog = 8192

# FIN_TIMEOUT 대기 시간을 줄이면 끊어진 소켓의 소거 시간을 줄일 수 있음.
net.ipv4.tcp_fin_timeout = 30

# 새 접속에서 사용할 수 있는 포트의 사용 가능 범위를 확장.
net.ipv4.ip_local_port_range = 16384 65536

# DOS 공격 중의 하나인 SYN flooding 공격을 막아주도록 On으로 변경.
# 방화벽으로부터 보호되고 있어도 위 공격에 대한 대비책이 없다면 켜주는 것이 좋으나 성능에 영향이 있으며,
# 이 부분을 켜주는 것 보다는 tcp_
net.ipv4.tcp_syncookies = 1

# off상태면 두 네트웍 인터페이스간 IP 패킷 전달을 해제합니다. 
net.ipv4.ip_forward = 0

# 웹서버와 같은 유형의 서버에서 high load에서는 사용자 소켓의 종료 진행에서
# TIME_WAIT 상태가 되는데 이 것의 양이 60초간 지속 된다는 것을 가정하고 이 값을 충분히 높여 주는 것이 좋음.
net.ipv4.tcp_max_tw_buckets = 2000000

# Linux 2.4에서 주의해야할 점.
# 주어진 경로에 대한 ssthread 값이 라우팅 테이블에 캐시되는데 이 값으로 윈도 값 설정이 감소하게 되면
# 이후 10분간의 모든 다른 커넥션에 이 값을 사용하게 되므로 웹서버등에서는 켜주는 것이 좋을 것 같다. 
net.ipv4.route.flush = 1

# 가상 메모리 하부 시스템의 성능 향상. 
# 가상 메모리 및 버퍼 메모리 관리에 대한 성능을 높여줌.
vm.bdflush = 100 1200 128 512 15 5000 500 1884 2

# 브로드캐스브, 멀티캐스트 주소에 ICMP ECHO 요청을 막음. smurf 공격 방지용
#
net.ipv4.icmp_echo_ignore_broadcasts = 1

# SRR 옵션으로 패킷들을 수용한다. IP source routing 을 제어한다. 보통 호스트로
# 향하게 하는 것을 권장한다. TRUE (router) FALSE (host)
#
net.ipv4.conf.all.accept_source_route = 0

#net.ipv4.conf.all.send_redirects=0
#net.ipv4.conf.all.accept_redirects=0
# DOS 공격 중 하나인 IP Spoofing을 Source Route 를 검사해서 방지합니다.
# 방화벽에서 막아주거나 외부에 노출되어 있지 않은 서버 등 공격의 우려가 없다면 끄는 것이 좋음.
# 알 수 없을 경우 on으로 설정해둡니다.
# RFC182에 따른 IP spoof 방지를위한 설정(커널 2.2이상 버전)
#
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.lo.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1

# Log Spoofed Packets, source Routed Packets, Redirect packetes
# ip주소를 스푸핑한다고 예상되는 경우 로그에 기록하기
#
net.ipv4.conf.all.log_martians = 1

# 공유 메모리 최대값 조정
kernel.shmmax=3800000000

# 세마포어 최대값 조정 
# 의미: {배열당 최대 SEM 수}{최대SEM시스템넓이}{SEMOP호출당최대OP수}{최대배열수} 
# 공식: {최대SEM시스템넓이} = {최대 배열 수} x {배열당 최대 SEM 수} (DB2 튜닝문서에 따름)
kernel.sem=1000 32000 32 512

# 메시지큐 시스템 크기 조정
kernel.msgmni = 1024
posted by 티니
:
리눅스 2007. 8. 21. 19:24
오늘 CentOS 4.5 plus 미러를 enabled 시켜서 사용하는 시스템을
yum으로 업데이트 시키다 보니 아래와 같은 문제가 발생했다.
[root@localhost]# yum update
Loading "fastestmirror" plugin
Setting up Install Process
Setting up repositories
Loading mirror speeds from cached hostfile
Reading repository metadata in from local files
Parsing package install arguments
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Package perl-libwww-perl.noarch 0:5.805-1.1.1 set to be updated
--> Running transaction check
--> Processing Dependency: perl(Compress::Zlib) for package: perl-libwww-perl
--> Finished Dependency Resolution
Error: Missing Dependency: perl(Compress::Zlib) is needed by package perl-libwww-perl

가끔씩 패키지 버전이 올라가면서 문제가 생기는 일이 발생하기에
아무생각없이 yum list perl* 을 날렸는데....
얼레.. Zlib 패키지가 없다??

한참을 삽질하다가 결국 센트 메인테이너에게 질문을 날렸고.. 급 후회를 했다 ㅜ.ㅜ
A: please read this http://bugs.centos.org/view.php?id=2255
A: you probably have a non-CentOS libwww-perl
A: whoops
A: it is indeed a bug ;)
A: workaround is in that bugreport

왜 질문하기전에 bugs.centos.org를 검색하지 않았을까.....
가장 기초적인 실수를 해서 그런지 얼굴이 다 화끈거렸다.
내가 늘 강조하는게 '질문하기전 검색부터' 인데...

결론적으로는...
http://mirror.centos.org/centos-4/4.5/fasttrack/
위 URL에 있는 CentOS-fasttrack.repo 파일을 /etc/yum.repos.d/ 안에 넣어주면 되는것..
[root@localhost]# cd /etc/yum.repos.d/
[root@localhost]# wget http://mirror.centos.org/centos-4/4.5/fasttrack/CentOS-fasttrack.repo
[root@localhost]# yum update


그리고 저사람이 나에게 마지막으로 날린 결정적인 한마디...
'엔드유저도 아닌 당신이 이런 실수를 할지 몰랐다. 요즘 바쁜가보다.'
.....
부끄러워서 할 말을 잃었다... ㅠ_ㅠ
posted by 티니
:
리눅스 2007. 3. 10. 21:00
이번에 회사에서 6TB DAS 스토리지 2대를 구입했다. (모델명: Dell社의 MD1000)

원래 3월 6일에 입고 예정이었던 스토리지가 3월 7일과 3월 8일에 양일에 걸쳐 도착했다.
그리고 델 엔지니어가 3월 9일에 도착해서 스토리지를 뜯었다.
(도착하는것부터가 아주 짜증나게 만드는 델-_-..)

다 뜯어놓고 하는말이 지들이 해줄 수 있는건 '뜯어주는것과 RAID 세팅까지만' 이란다-_-;;
(어짜피 첨부터 바라지도 않았으니 별로 신경 안쓴다)
그래서 걍 레이드나 잡으라고 하고 커피나 한잔 홀짝홀짝..

헤더에 있는 300G HDD 2개는 RAID-1로 구성해서 미러링을 하도록 하고..
스토리지의 500G HDD 15개는 RAID-5로 구성해서 14개는 돌리고 1개는 Hot Spare로..

RAID 세팅도 끝났으니 이제 OS 인스톨링...

두둥..
헤더가 /dev/sda로 잡혀야 되는데 /dev/sdb로 잡힌다..
기존 스토리지와 반대로 잡혀 있어서 추후 헷갈릴까봐 이래저래 삽질했었으나..
별 소득 없이 그냥 쓰기로 결정..
첫번째 테클은 이렇게 넘어갔다.

꽤나 크리티컬한 테클은 바로 여기서부터...
리눅스 부팅하고 root로 들어가서 fdisk -l 했더니 아래와 같이 잘 잡혀있는것을 확인..
[root@str1 ~]# fdisk -l
Disk /dev/sda: 6494.2 GB, 6494258987008 bytes
255 heads, 63 sectors/track, 789548 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

fdisk에선 2TB 이상의 파티션을 지원못하니까.. parted를 이용해서 생성해야 된다.
[root@str1 ~]# parted /dev/sda
GNU Parted 1.6.19
Copyright (C) 1998 - 2004 Free Software Foundation, Inc.
This program is free software, covered by the GNU General Public License.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 
Using /dev/sda
(parted) mklabel gpt
(parted) p
Disk geometry for /dev/sda: 0.000-6193408.000 megabytes
Disk label type: gpt
Minor    Start       End     Filesystem  Name                  Flags
(parted) mkpart
Partition type?  [primary]?                                              
File system type?  [ext2]?                                               
Start? 0                                                                 
End? 6193408                                                             
(parted) p                                                               
Disk geometry for /dev/sda: 0.000-6193408.000 megabytes
Disk label type: gpt
Minor    Start       End     Filesystem  Name                  Flags
1          0.017 6193407.983  ext2
(parted) quit                                                            
Information: Don't forget to update /etc/fstab, if necessary.

자 여기까지.. 파티션을 만들어 주는 과정에는 전~~~혀 아~~무 문제 없이 잘!! 됐다.
그러나 나의 스트레스 신경을 Power on 해주신 멋진 분!!
[root@str1 ~]# mkfs -t ext3 /dev/sda1
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
792756224 inodes, 1585512439 blocks
36325948 blocks (2.29%) reserved for the super user
First data block=0
Maximum filesystem blocks=1589641216
48386 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544
 
Writing inode tables: done                           
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information:
SCSI error : <0 2 0 0> return code = 0x6000000
end_request: I/O error, dev sda, sector 12643992930
SCSI error : <0 2 0 0> return code = 0x6000000
end_request: I/O error, dev sda, sector 12661234252
...
...
done

This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

아니 왜! 기존에 쓰던 장비도 아닌데 I/O 에러가 뜨냔 말이다 -_-;;
그것두 두대 스토리지 동일하게... -_-;
여하튼 내 경험상 저건 파일시스템이 깨졌을때 나오는 메시지니까..
다시한번 파티션 날리고 동일하게 재생성...
[root@str1 ~]# parted /dev/sda
GNU Parted 1.6.19
Copyright (C) 1998 - 2004 Free Software Foundation, Inc.
This program is free software, covered by the GNU General Public License.
 
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 
Using /dev/sda
(parted) p                                                               
Disk geometry for /dev/sda: 0.000-6193408.000 megabytes
Disk label type: gpt
Minor    Start       End     Filesystem  Name                  Flags
1          0.017 6193407.983  ext3                             
(parted) rm 1                                                            
(parted) p                                                               
Disk geometry for /dev/sda: 0.000-6193408.000 megabytes
Disk label type: gpt
Minor    Start       End     Filesystem  Name                  Flags
(parted) mkpart
Partition type?  [primary]?                                              
File system type?  [ext2]?                                               
Start? 0                                                                 
End? 6193408                                                             
(parted) p                                                               
Disk geometry for /dev/sda: 0.000-6193408.000 megabytes
Disk label type: gpt
Minor    Start       End     Filesystem  Name                  Flags
1          0.017 6193407.983  ext3
(parted) quit                                                            
Information: Don't forget to update /etc/fstab, if necessary.

[root@str1 ~]# mkfs -t ext3 /dev/sda1
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
792756224 inodes, 1585512439 blocks
36325948 blocks (2.29%) reserved for the super user
First data block=0
Maximum filesystem blocks=1589641216
48386 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000, 214990848, 512000000, 550731776, 644972544
 
Writing inode tables: done                           
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
 
This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

얼레? 이번엔 또 문제 없이 잘 생성이 되네 그려?-_-;;
(이넘이 대체 나한테 무슨 원한이 있길래 ㅡ.ㅡ;;;)
아무 문제 없이 잘 진행되었지만 찝찝한 기분을 떨쳐버릴 수가 없는 관계로..
디스크에 read/write 테스트를 통해서 괜찮은지 확인하려고 badblocks를 이용..
[root@str1 ~]# badblocks -svw /dev/sda1
badblocks: 파일이 너무 큽니다 while trying to determine device size

헉쓰-_-;;;;;
파티션이 너무 크신감 -_-a..
어쩔 수 없이 e2fsck의 -c 옵션을 이용.. non-destructive read-write 테스트로 시도..
[root@str1 ~]# e2fsck -cvk /dev/sda1
e2fsck 1.35 (28-Feb-2004)
Checking for bad blocks (read-only test):
... [1번부터 15번까지 열심히 진행-.-]
...
...
Pass 1: Checking inodes, blocks, and sizes
 
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
 
/dev/sda1: ***** FILE SYSTEM WAS MODIFIED *****
 
      11 inodes used (0%)
       1 non-contiguous inode (9.1%)
         # of inodes with ind/dind/tind blocks: 0/0/0
24909500 blocks used (1%)
       0 bad blocks
       1 large file
 
       0 regular files
       2 directories
       0 character device files
       0 block device files
       0 fifos
       0 links
       0 symbolic links (0 fast symbolic links)
       0 sockets
--------
       2 files

뭐.. 테스트상으로는 대략 아무 문제가 없으니 일요일부터 데이터 이전작업을 할 계획..
그러나 여전히 찜찜한 기분은 떨쳐 버릴수가 없단 말이지... 쩝..
posted by 티니
:
리눅스 2006. 12. 6. 22:44
약 2개월간의 데이터 수집끝에 최근 아파치 access 로그에 남는 referer 수집이 대략적으로 끝났다.
이 referer를 참고해서 검색엔진들의 봇을 막을 수 있을 것이다.
(물론 이것은 일시적이고 한정적이기 때문에, 계속해서 추가되어져야 되겠지만 말이다.)

액세스 로그를 분석했을 경우 나오는 리스트
웹로그 분석기로 분석한 이름 = 실제로 액세스 로그에 남는 이름
MS Internet Explorer = MSIE
Firefox = Firefox
Opera = Opera
Netscape = Netscape
Firbird (Old Firefox) = Firbird
K-Meleon = K-Meleon
Nokia Browser (PDA/Phone browser) = Nokia
Konqueror = Konqueror
Safari = Safari
Curl = Curl
Wget = Wget
Unknown robot (identified by 'robot') = NaverBot
Yahoo Slurp = Yahoo! Slurp
ConveraCrawler = ConveraCrawler
EchO! = BonEcho
GigaBot = GigaBot
findlinks = findlinks
MSNBot = MSNBot
Unknown robot (identified by 'bot/' or 'bot-') = msnbot-media
Alexa (IA Archiver) = Alexa Toolbar
Python-urllib = Unknown (딱 한번 긁혔던데 로그가 지워져서 모르겠음-_-;)
SurveyBot = SurveyBot
psbot = psbot
Googlebot = Googlebot
Feedfetcher-Google = Feedfetcher-Google
OufoxBot = OufoxBot
Netcraft = Netcraft

대충 보면 알겠지만 MSIE부터 Wget까지는 정상적인 브라우저들이다.
봇의 시작은 NaverBot 부터..
이게 굉장히 웃긴게 웹로그 분석기(awstats 기준)에서 보여주는 이름과
실제로 액세스 로그에 남는 이름이 서로 다른것들이 가끔씩 있다.
따라서 웹로그 분석기에서 출력해주는 이름을 가지고 막으면 대략 낭패를 볼 수 있으므로
주의를 해야할 것이다.

현재 tini4u.net 서버는 아래와 같이 차단하고 있다.
## No Get.
BrowserMatch "WebZIP" go_out
BrowserMatch "Teleport" go_out
BrowserMatch "NamoWebEditor" go_out
BrowserMatch "WebSymmetrix" go_out
BrowserMatch "GetRight" go_out
BrowserMatch "WebCopier" go_out
BrowserMatch "FlashGet" go_out
BrowserMatch "Nimo" go_out
BrowserMatch "Googlebot" go_out
BrowserMatch "MSNBot" go_out
BrowserMatch "msnbot-media" go_out
BrowserMatch "Yahoo" go_out
BrowserMatch "Feedfetcher-Google" go_out
BrowserMatch "Alexa" go_out
BrowserMatch "OutfoxBot" go_out
BrowserMatch "Netcraft" go_out
BrowserMatch "Gigabot" go_out
BrowserMatch "findlinks" go_out
BrowserMatch "NaverBot" go_out

하나의 사이트에서도 여러개의 봇을 운영하는것을 느꼈는가?
검색엔진 잔인하다-_-;;

추가 -> BonEcho는 현재 Gentoo Linux에서 테스트로 사용중인 FireFox의 Compatible Name 이라고 하는군요.
posted by 티니
: