검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/기타 프로그램
참조 원문 : How to install HotShots on Fedora 19 and Ubuntu 13.04

  리눅스용 캡쳐 프로그램을 찾던 중 아주 마음에 들진 않지만 그나마 좀 쓸만해 보이는 Hotshots라는 유틸리티를 발견하여 소개합니다. 눈에 띄는 특징은 아래와 같습니다.
  • 전체화면 캡쳐, 멀티 모니터 캡쳐, 창 캡쳐, 사각형 캡쳐, 자유 캡쳐 지원
  • 엄청나게 다양한 이미지 포맷으로 저장 가능
  • 이미지를 FTP 서버나 네 종류의 클라우드 이미지 호스팅 서비스로 전송 가능
  • 내장 이미지 편집기
  • 편집기에서 캡쳐한 이미지 안에 다른 이미지 불러오기 가능

우분투에서 설치하는 방법
  1. sudo add-apt-repository ppa:dhor/myway
  2. sudo apt-get update
  3. sudo apt-get install hotshots
  4. /usr/bin/hotshots 파일을 실행하거나 대시보드에서 실행

페도라에서 설치하는 방법
  1. 이곳에서 최신 버전의 소스 코드 다운로드
  2. unzip 명령어로 압축 해제
  3. yum install libqxt-devel
  4. cd HotShots-버전/build
  5. cmake .(cmake 후 한 칸 띄고 점(.) 입력)
  6. make
  7. make install(root 권한 필요)
  8. /usr/local/bin/hotshots 파일을 실행하거나 메뉴에 직접 추가 후 실행

메인 화면

설정 화면

편집기



웹 페이지 전체를 캡쳐할 수 있는 파이어폭스 플러그인 Awesome Screenshot
  사실 저는 스크롤링 윈도우 캡쳐가 지원되는 프로그램을 찾고 있었던 터라 위 프로그램이 그렇게 마음에 들진 않았습니다. 그래서 계속 다른 프로그램을 계속 찾고 있던 도중 뜻밖의 해결 방법을 찾을 수 있었습니다. 바로 Awesome Screenshot라는 파이어폭스 플러그인을 사용하는 겁니다. 생각해보면 캡쳐 대상이 웹 페이지니 웹 브라우저를 이용하는 것이 최적의 방법인 것 같습니다. 캡쳐 속도도 당연하다면 당연히 최고입니다. 강력히 추천해 드립니다. 아래는 Awesome Screenshot가 제공하는 기능입니다.
  • 현재 웹 브라우저에 보이는 부분만 캡쳐, 페이지 전체 캡쳐 지원
  • 현재 사이트와 역할이 유사한 사이트 검색(캡쳐 기능과 무관)
  • 캡쳐한 그림에서 원하는 부분만 남기기(Crop)
  • 사각형, 원, 화살표, 직선, 자유곡선 그리기, 텍스트 삽입
  • 캡쳐 결과에서 ID 등 민감한 정보를 가리는데 사용할 수 있는 블러(blur) 기능
  • 온라인 임시 저장(1달) 기능과 Diigo.com과 연동을 통한 저장(영구) 기능
2013/07/26 16:26 2013/07/26 16:26
Posted
Filed under 프로그램과 명령어/기타 프로그램
참조 원문 : Meld : Graphical diff To Compare Files & Directories On Linux

  Meld는 파일이나 디렉토리를 비교할 수 있는 유틸리티입니다.
  • 2~3개의 파일/디렉토리 비교
  • 자동 병합(개발 버전)
  • 입력에 따른 비교 업데이트
  • 차이점이 있는 부분에 대한 쉬운 병합
  • Arch, Bazaar, Codeville, CVS, Darcs, Git, Mercurial, Mono-tone, RCS 등 버전 컨트롤 지원
  패키지 이름은 프로그램 이름과 일치하는 meld로 통상적인 배포판에서 yum이나 apt-get을 통해 설치할 수 있습니다.
2013/07/21 16:33 2013/07/21 16:33
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : phpvirtualbox - Running Virtual Machines With VirtualBox 4.2 and phpvirtualbox On A Headless Ubuntu 12.04 Server

  phpvirtualbox는 PHP로 만들어진 웹 기반의 VirtualBox 프론트엔드로 원격에서 VirtualBox 인스턴스에 접근 및 제어를 할 수 있게 해줍니다. VirtualBox의 GUI와 비슷하게 구현하여 사용하기가 쉽습니다. 원격에서 웹을 통해 접속하여 GUI로 인스턴스를 제어할 수 있다는 점 때문에 서버에서 설치하여 사용하기 매우 좋습니다. 이 글에서는 VirtualBox와 phpvirtualbox를 설치하여 원격에서 VirtualBox를 제어할 수 있게 연동하는 방법을 소개합니다. 기본적으로 우분투 12.04 서버 버전을 기준으로 설명하고 있지만 13.04 서버 버전 등 다른 버전에서도 가능하며, 몇몇 경로명이나 패키지 설치 명령어 정도만 바꾸면 레드햇 계열의 배포판에서도 충분히 따라 해볼 수 있습니다.

1. 선결조건
  호스트는 우분투 12.04 서버로 가정합니다. 거의 모든 명령어는 root 권한을 필요로 하므로 명령어를 사용할 때마다 sudo를 사용하거나 sudo su 명령어를 통해 root로 로그인해야 합니다.

2. VirtualBox 설치
  /etc/apt/sources.list 파일에 아래 내용을 추가합니다.
deb http://download.virtualbox.org/virtualbox/debian precise contrib
  VirtualBox 공개 키를 받습니다.
# wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | apt-key add -
  패키지 DB를 업데이트하고 VirtualBox 4.2를 설치합니다. dkms 패키지는 리눅스 커널 버전이 바뀔 때 VirtualBox 호스트 커널 모듈도 그에 맞춰 업데이트시키는 역할을 합니다.
# apt-get update
# apt-get install linux-headers-$(uname -r) build-essential virtualbox-4.2 dkms
  VirtualBox는 4.0부터 Remote Desktop Connection Support(VRDP) 등 일부 기능을 "확장팩(extension packs)"이란 이름의 별도 패키지로 제공하고 있습니다. 원격 제어를 하려면 VRDP가 필요하기 때문에 확장팩을 설치해야 합니다. http://www.virtualbox.org/wiki/Downloads에서 두 번째 항목에 있는 'All supported platforms' 링크의 주소를 파악하여 서버에서 다운로드를 합니다. 아래와 버전이 다를 확률이 높기 때문에 반드시 직접 확인하고 다운로드하시기 바랍니다.
# cd /tmp
# wget http://download.virtualbox.org/virtualbox/4.2.16/Oracle_VM_VirtualBox_Extension_Pack-4.2.16-86992.vbox-extpack
# VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.2.16-86992.vbox-extpack
  이제 VirtualBox를 실행할 계정을 만들어 패스워드를 설정하고 vboxusers라는 그룹에 넣습니다. 계정명은 vbox로 만들겠습니다.
# useradd –d /home/vbox –m vbox
# passwd vbox
# adduser vbox vboxusers
  위에서 만든 계정을 VirtualBox가 사용하도록 /etc/default/virtualbox 파일을 생성하여 아래 내용을 넣습니다.
VBOXWEB_USER=vbox
  부팅 시 서비스를 실행하도록 만들고 서비스를 실행합니다.
# update-rc.d vboxweb-service defaults
# /etc/init.d/vboxweb-service start

3. Apache, PHP, phpvirtualbox 설치
  아파치와 PHP를 설치합니다.
# apt-get install apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common apache2 apache2-doc apache2-suexec libapache2-mod-php5 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libapr1 php5-common php5-mysql php-pear
  phpvirtualbox를 다운로드하여 압축을 풀고 documentroot에 복사합니다. phpvirtualbox는 홈페이지에서 최신 버전을 확인하고 다운로드해야 합니다.
# cd /tmp
# wget https://phpvirtualbox.googlecode.com/files/phpvirtualbox-4.2-5.zip
# unzip phpvirtualbox-4.2-5.zip
# mv phpvirtualbox-4.2-5 /var/www/phpvirtualbox/
  템플릿 설정 파일을 일반 설정 파일명으로 복사한 후 계정명과 패스워드를 아까 생성한 계정의 것으로 수정합니다.
# cd /var/www/phpvirtualbox/
# cp config.php-example config.php
# vi config.php
...생략...
var $username = 'vbox';
var $password = '아까 설정한 패스워드';
...생략...
  이것으로 모든 설정이 끝났으며 네트워크상 해당 서버에 접근할 수 있는 컴퓨터의 웹 브라우저에서 http://IP주소/phpvirtualbox를 입력하여 설치했던 phpvirtualbox에 접근할 수 있습니다. 접근하면 로그인 화면이 나오는데 기본 계정명과 패스워드는 admin입니다.
2013/07/17 22:59 2013/07/17 22:59
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Groping through big data with grep

1. 숫자 4개로 시작하는 줄 뽑아내기
grep ^[0-9][0-9][0-9][0-9] textfile
grep -E "^[0-9]{4}" textfile
  하지만 이 조건만으로는 4자리로 시작하기만 하면 무조건 걸려나옵니다. } 문자 뒤에 공백을 하나 넣어서 처리할 수 있지만 좀 더   좋은 방법은 "단어 단위" 기능(<와 >)을 사용하는 것입니다.
$ grep '\<[0-9]\{4\}\>' textfile
2010
2013 is turning out to be a better year
  다만 이 방법을 사용할 때 주의할 점이 있습니다. 아래를 보시죠.
$ grep '\<[0-9]\{3,5\}\>' textfile
2010
2013 is turning out to be a better year
12345 Taylor Avenue
127.0.0.1
  다른 건 괜찮았는데 마지막에 IP 주소가 걸려 나왔습니다. 숫자 뒤에 문자가 나오는 경우도 "단어의 끝"으로 취급하기 때문입니다. 단어 단위로 걸러낼 때는 이런 사항도 고려해야 합니다.

2. IP 주소 뽑아내기
  IP 주소를 검출하는 게 은근히 생각보다 까다롭습니다. 먼저 특정 IP를 찾는 것부터 시작하겠습니다. 생각없이 그냥 지르면 이런 모습이 나옵니다.
$ grep 12.45.78.0 text
1234567890
12.45.78.0
  정규 표현식에서 점(.)은 하나의 문자를 뜻하니까요. 이럴 땐 -F 옵션(fixed string)을 사용하거나, fgrep 명령어를 사용하거나, 이스케이프 문자를 사용해야 합니다. 처음 두 방법은 사실상 같은 거나 다름없습니다.
$ grep -F 12.45.78.0 text
12.45.78.0
$ fgrep 12.45.78.0 text
12.45.78.0
$ grep "10\.20\.30\.40" textfile
Don't use the 10.20.30.40 address unless you first talk to Pete.
  이제 IPv4 주소 형식을 띈 문자열을 잡아내는 패턴의 예를 보겠습니다.
$ grep -w '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' textfile
127.0.0.1
Don't use the 10.20.30.40 address unless you first talk to Pete.
Refer to Section 11.2.3.4.20 for the process guidelines.
  마지막에 엉뚱한 게 나왔듯이 위의 방법도 완벽하진 않습니다만 여기서 더 발전시켰다간 필요 이상으로 복잡해지기 때문에 이 정도로 끝내는 게 적절할 것 같습니다.

2013/07/17 16:33 2013/07/17 16:33
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : 20 interesting and extremely helpful Linux command line tricks

1. 두 디렉토리 사이를 효율적으로 반복해서 이동하는 방법
  A 디렉토리에서 B 디렉토리로 이동한 후 다시 A 디렉토리로 이동할 때 A 디렉토리의 경로를 쓰는 대신 'cd -'를 사용하여 같은 효과를 볼 수 있습니다.
/home$ cd /var/log
/var/log$ cd -
/home
/home$

2. 콤마(,) 연산자
  첫 번째 글자나 문자열 전체를 소문자로 변환 방법
$ string="Example of comma OPERATOR"

$ echo ${string,}
example of comma OPERATOR

$ echo ${string,,}
example of comma operator
  파일명 확장(extension)에 사용
$ touch new_file{1,2,3}
$ ls new_file*
new_file1  new_file2  new_file3

파일명을 my_filename.old에서 my_filename.new로 변경
$ mv my_filename.{old,new}

3. 파일명에 공백이 있을 때 제어하는 방법
  파일명 전체를 큰 따옴표로 감싸거나 공백 앞에 역슬래쉬(\)를 넣습니다.
$ rm "temp File"
$ rm temp\ File

4. 하이픈(-)으로 시작하는 파일명 삭제 또는 생성 방법
$ rm -1mpFile.out
rm: invalid option -- '1'
Try `rm ./-1mpFile.out' to remove the file `-1mpFile.out'.
Try `rm --help' for more information.

$ rm -- -1mpFile.out
$ touch -- -1mpFile.out

5. 디렉토리 안에 있는 파일 중 특정 확장자가 아닌 모든 파일 삭제 방법
$ rm !(*.c|*.py)

6. touch와 find를 이용해 특정 시간 사이에 생성되거나 수정된 파일 복사
  어떤 디렉토리 안에 있고 09~17시 사이에 생성되거나 수정된 파일만 골라 복사하고 싶다고 가정했을 때 먼저 원하는 두 시간에 맞춰 타임스탬프 값을 가진 두 파일을 생성합니다.
$ touch -d "9am" temp1
$ touch -d "5pm" temp2
  이제 대상 파일이 있는 디렉토리로 이동해서 아래 명령어를 사용합니다.(또는 find에서 대상 디렉토리를 지정)
$ find . -newer ../temp1 ! -newer ../temp2 -exec cp '{}' ./target/ ';'
  실행하면 대상 파일이 target이라는 하위 디렉토리 안에 복사됩니다. 물론 target 디렉토리를 먼저 만들어야 합니다.

7. 대상 파일이 너무 많아서 삭제가 안 될 때
  디렉토리 안에 파일이 너무 많을 때 삭제를 시도하면 아래의 에러 메시지와 함께 삭제가 안 될 수 있습니다.
-bash: /bin/rm: Argument list too long
  이럴 땐 아래의 방법을 사용합니다. 사용하기 전에 현재 디렉토리를 다시 한 번 확인하는 것이 좋습니다.
find * -xdev -exec rm -f '{}' ';'

8. 특정 문자열을 포함한 파일 찾는 방법
$ grep -l "printf" *.c
  하위 디렉토리에 있는 파일들까지 포함하여 문자열이 포함된 파일과 그 문자열이 있는 줄을 보고 싶다면 find, xargs, grep 명령어를 활용합니다.
$ find . -name "*.c" | xargs grep -H "buff"
./bfrovrflw.c:    char buff[15];
./bfrovrflw.c:    gets(buff);
./bfrovrflw.c:    if(strcmp(buff, "MyLinuxBook"))

9. 파일 안의 내용을 모두 지우는 방법
$ > ./logfile

10. man 페이지에서 특정 문자열 검색 방법
$ man -k login
access.conf (5)      - the login access control table file
add-shell (8)        - add shells to the list of valid login shells
chsh (1)             - change login shell
faillog (5)          - login failure logging file
faillog (8)          - display faillog records or set login failure limits
getlogin (3)         - get username
getlogin_r (3)       - get username
gnome-session-properties (1) - Configure applications to start on login
hotot (7)            - lightweight & opensource microbloging client
issue (5)            - prelogin message and identification file
lastlog (8)          - reports the most recent login of all users or of a given user
login (1)            - begin session on the system
login (3)            - write utmp and wtmp entries
login.defs (5)       - shadow password suite configuration
login_tty (3)        - tty utility functions
logname (1)          - print user's login name
...
...
...

11. 표준 에러 출력 메시지를 파일로 리다이렉트시키는 방법
  일반 리다이렉트로는 표준 에러로 출력되는 메시지를 담을 수 없습니다.
$ touch new > /home/himanshu/practice/logfile
touch: cannot touch `new': Permission denied
$ cat /home/himanshu/practice/logfile
$
$ touch new > /home/himanshu/practice/logfile 2>&1
$ cat /home/himanshu/practice/logfile
touch: cannot touch `new': Permission denied
  2>&1은 표준 에러도 표준 출력으로 보내라는 뜻입니다.

12. history에 남기지 않고 명령어 사용
  앞에 공백을 넣고 명령어를 사용합니다.
$ a
a: command not found
$  vi
$ b
b: command not found
$ history | tail -3
 1055  a
 1056  b
 1057  history | tail -3

13. 영화처럼 같은 속도로 텍스트 출력
$ echo "You can simulate on-screen typing just like in the movies" | pv -qL 10

14. alias와 같은 이름을 가진 명령어가 있을 때 alias가 아닌 그 명령어 실행
  앞에 역슬래쉬(\)를 넣고 명령어를 사용합니다.
mirashi@mirashi-virtual-machine:~/test$ alias ls='ls -al'

mirashi@mirashi-virtual-machine:~/test$ ls
합계 8
drwxrwxr-x  2 mirashi mirashi 4096  7월 17 14:33 .
drwxr-xr-x 34 mirashi mirashi 4096  7월 17 14:33 ..
-rw-rw-r--  1 mirashi mirashi    0  7월 17 14:33 test

mirashi@mirashi-virtual-machine:~/test$ \ls
test

15. 특정 파일을 사용하고 있는 프로세스 찾아내기
  파일을 지우려고 하는데 어떤 프로세스가 그 파일을 사용 중이라 지울 수 없을 때가 있습니다. 이럴 땐 fuser 명령어로 그 파일을 사용하고 있는 프로세스들의 PID를 알아낼 수 있습니다.
# fuser /var/log/httpd/access_log
/var/log/httpd/access_log: 24273 24277 24278 24279 24280 24281 24282 24283 24284 24305 24306 24307 34994 35370 35371 35372 35373 35374 35375 35376
  또한 -k 옵션을 사용하면 해당 프로세스들을 죽일 수 있습니다.

16. 복사와 붙여넣기 단축키
  먼저 복사하고 싶은 부분을 마우스로 드래그해서 선택한 후 Ctrl+Shift+C를 누르면 복사가 되고 Ctrl+Shift+V를 누르면 붙여넣기가 됩니다.





2013/07/17 14:47 2013/07/17 14:47
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Installing Nginx With PHP5 (And PHP-FPM) And MySQL Support (LEMP) On Ubuntu 13.04

1. 선결조건
  호스트명은 server1.example.com, IP 주소는 192.168.0.100인 것으로 가정합니다. 거의 모든 명령어는 root 권한을 필요로 하므로 명령어를 사용할 때마다 sudo를 사용하거나 sudo su 명령어를 통해 root로 로그인해야 합니다.

2. MySQL5 설치
apt-get install mysql-server mysql-client
  설치 중 MySQL root 계정의 패스워드를 설정하게 됩니다.

3. Nginx 설치
apt-get install nginx
/etc/init.d/nginx start
  웹 브라우저로 접속 가능 여부를 확인합니다. 우분투 13.04에서 Nginx의 디폴트 document root는 /usr/share/nginx/html 입니다.

4. PHP5 설치
  PHP-FPM(FastCGI Process Manager. PHP FastCGI 구현물로 특히 방문자가 많은 사이트에 유용한 기능을 가지고 있음)로 Nginx에서 PHP5를 사용할 수 있습니다.
apt-get install php5-fpm
  PHP-FPM은 /var/run/php5-fpm.sock 소켓에서 FastCGI 서버를 실행하는 데몬 프로세스입니다. init 스크립트의 위치는 /etc/init.d/php5-fpm 입니다.

5. Nginx 설정
  Nginx의 설정 파일은 /etc/nginx/nginx.conf 입니다. 설정 파일은 이해하기 쉬운 구조로 되어 있습니다.(이곳이곳에서 배울 수 있습니다.)

  (선택사항으로)먼저 워커 프로세스의 개수를 조정하고 keepalive_timeout 값을 적절히 설정합니다.
[...]
worker_processes  4;
[...]
    keepalive_timeout   2;
[...]
  가상 호스트는 server {} 컨테이너에서 정의합니다. 디폴트 vhost는 /etc/nginx/sites-available/default 파일에 정의되어 있습니다. 파일의 내용을 아래처럼 바꾸겠습니다.
[...]
server {
        listen 80;
        listen [::]:80 default_server ipv6only=on;

        root /usr/share/nginx/html;
        index index.php index.html index.htm;

        # Make site accessible from http://localhost/
        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        location /doc/ {
                alias /usr/share/doc/;
                autoindex on;
                allow 127.0.0.1;
                allow ::1;
                deny all;
        }

        # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
        #location /RequestDenied {
        #       proxy_pass http://127.0.0.1:8080;
        #}

        #error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/html;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                #fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny all;
        }
}
[...]
  IPv4와 IPv6의 80번 포트를 모두 열기 위해 두 listen 줄의 주석을 모두 제거합니다.

  server_name _; 는 모든 vhost의 server_name을 포괄한다는 의미입니다.(물론 www.example.com처럼 호스트명을 지정할 수도 있습니다.)

  index 줄에는 index.php를 추가했습니다. root /usr/share/nginx/html;은 document root 디렉토리를 지정하는 항목입니다.

  PHP에 있어서 중요한 부분은 location ~ \.php$ {} 로서 이 부분의 주석을 제거해야 합니다.

  Nginx를 리로드합니다.
/etc/init.d/nginx reload
  /etc/php5/fpm/php.ini 파일을 열어 cgi.fix_pathinfo=0; 으로 설정합니다.
[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]
  PHP-FPM을 리로드합니다.
/etc/init.d/php5-fpm reload
  Document root 디렉토리인 /usr/share/nginx/html 안에 연동확인용 PHP 파일을 만듭니다.
# vi /usr/share/nginx/html/info.php
<?php
phpinfo();
?>
  웹 브라우저에서 위 파일을 열어 PHP가 작동하는지와 Server API 항목이 FPM/FastCGI인지를 확인합니다. MySQL과 연동하지 않았으므로 MySQL과 관련된 항목은 아직 나오지 않습니다.

6. MySQL과 PHP5 연동
  MySQL과 PHP5를 연동하기 위해 php5-mysql 패키지를 설치합니다. 또한 자주 사용하는 PHP5 모듈도 함께 설치합니다. 설치할 수 있는 PHP5 모듈은 아래 명령어로 검색할 수 있습니다.
apt-cache search php5
  아래처럼 php5-mysql과 함께 원하는 모듈들을 설치합니다.
apt-get install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
  APC는 eAccelerator나 Xcache처럼 PHP의 중간 코드를 캐싱하고 최적화하는 opcode 캐셔로서 PHP 페이지의 속도를 높이는데 큰 도움이 됩니다.
apt-get install php-apc
  이제 PHP-FPM을 리로드합니다.
/etc/init.d/php5-fpm reload

7. PHP-FPM이 TCP 연결을 사용하도록 설정
  PHP-FPM은 기본적으로 /var/run/php5-fpm.sock 소켓을 열고 있지만 TCP 연결을 사용하도록 만드는 것도 가능합니다. /etc/php5/fpm/pool.d/www.conf 파일을 열어서 listen 줄을 아래처럼 수정합니다.
[...]
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000
[...]
  이것으로 PHP-FPM은 127.0.0.1(localhost)의 9000번 포트를 열게 됩니다. 해당 포트가 미사용 포트인지 확인 후 PHP-FPM을 리로드합니다.
/etc/init.d/php5-fpm reload
  Nginx의 설정 파일인 /etc/nginx/sites-available/default를 열어서 fastcgi_pass unix:/var/run/php5-fpm.sock; 줄을 fastcgi_pass 127.0.0.1:9000;로 바꿉니다.
[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                #fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
[...]
  마지막으로 Nginx를 리로드합니다.
/etc/init.d/nginx reload

8. CGI/Perl 스크립트
  Nginx로 CGI/Perl 스크립트를 사용해야 한다면 이 글을 참고하시기 바랍니다. fcgiwrap 사용을 추천합니다.(챕터4)

2013/07/17 11:37 2013/07/17 11:37
Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : 5 Tips To Speed Up Linux Software Raid Rebuilding And Re-syncing

  원문 작성자가 기본 상태로 2TB 디스크 5개를 사용해 RAID 6를 구성했을 때 처리 속도가 초당 약 4000K로 완성까지 걸리는 시간이 대략 22시간이었다는 실제 사례를 들면서 이 속도를 더 빠르게 만드는 팁을 공개했기에 소개합니다.

1. /proc/sys/dev/raid/{speed_limit_max,speed_limit_min} 커널 변수
  /proc/sys/dev/raid/speed_limit_min 은 리빌드가 아닌 활동이 어레이에 있을 때의 "목표" 리빌드 속도를 나타내는 설정 파일입니다. 속도는 초당 킬로바이트(kibibyte=1024)이며 어레이 당 속도가 아닌 디바이스 당 속도입니다. 디폴트 값은 1000입니다.

  /proc/sys/dev/raid/speed_limit_max 는 리빌드가 아닌 활동이 어레이에 없을 때의 "목표" 리빌드 속도를 나타내는 설정 파일입니다. 디폴트 값은 200000입니다.

  현재 한계 값은 아래 명령어로 볼 수 있습니다.
# sysctl dev.raid.speed_limit_min
# sysctl dev.raid.speed_limit_max
  주의: 아래 내용은 리눅스 소프트웨어 레이드의 리빌딩 속도를 높여주지만 전체적인 시스템 부하, CPU 및 메모리의 사용률을 증가시킵니다.

  속도를 높이기 위해 아래 명령어를 입력합니다.
echo 값 > /proc/sys/dev/raid/speed_limit_min
또는
sysctl -w dev.raid.speed_limit_min=값
예:
# sysctl -w dev.raid.speed_limit_min=50000
  디폴트 자체를 변경하려면 /etc/sysctl.conf 파일에 아래처럼 두 옵션을 추가합니다. 참고로 CPU와 메모리로 인해 제한을 받을 수도 있습니다.
dev.raid.speed_limit_min = 50000
dev.raid.speed_limit_max = 2000000 (어레이의 구성 디스크가 4~5개인 경우)
dev.raid.speed_limit_max = 5000000 (어레이의 구성 디스크가 6~12개인 경우)

2. read-ahead 옵션 설정
  레이드 디바이스 당 readahead(단위는 512바이트 섹터) 값을 설정합니다. 방법은 아래와 같습니다.
# blockdev --setra 65536 /dev/mdX (장치명을 알맞게 변경)
## 아래는 read-ahead를 32 MiB로 설정하는 예 ##
# blockdev --setra 65536 /dev/md0
# blockdev --setra 65536 /dev/md1

3. RAID 5와 RAID 6의 stripe-cache_size 설정
  RAID 5와 RAID 6일 때만 가능한 설정으로 싱크 성능을 3~6배 높여줍니다. 어레이의 모든 쓰기 작업에 대한 동기화와 어레이에 문제가 발생했을 때 실시하는 모든 읽기 작업에 사용하는 stripe cache의 크기(디바이스 당 페이지 수)를 변경합니다. 디폴트 값은 256입니다. 가능한 값은 17~32768입니다. 이 값을 높이면 특정 상황에서 시스템 메모리를 더 사용하여 속도를 높일 수 있습니다. 이 값을 너무 높이면 시스템을 메모리 부족 상태로 만들 수 있습니다. 아래 공식을 사용합니다.
메모리 사용량 = 시스템_페이지_크기 * 구성 디스크의 개수 * stripe_cache_size
  아래는 /dev/md0의 stripe_cache_size 값을 16MiB로 설정하는 예입니다.
# echo 16384 > /sys/block/md0/md/stripe_cache_size
  아래는 /dev/md3의 stripe_cache_size 값을 32MiB로 설정하는 예입니다.
# echo 32768 > /sys/block/md3/md/stripe_cache_size

4. 모든 디스크의 NCQ 비활성화
  아래는 bash로 반복문을 사용하여 /dev/sda부터 /dev/sde까지의 NCQ를 비활성화하는 예입니다.
for i in sd[abcde]
do
  echo 1 > /sys/block/$i/device/queue_depth
done

5. 비트맵 옵션
  비트맵은 crash가 발생하거나 디바이스 제거 후 다시 추가했을 때의 리빌드 시간을 최적화시켜줍니다. 아래의 명령어로 사용할 수 있습니다.
# mdadm --grow --bitmap=internal /dev/md0
  어레이 리빌드나 싱크가 끝나면 다시 비활성화합니다.
# mdadm --grow --bitmap=none /dev/md0

결과
  작성자의 경우 속도가 4000K에서 51000K로 높아졌다고 합니다.
# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md5 : active raid1 sde2[2](S) sdd2[3](S) sdc2[4](S) sdb2[1] sda2[0]
      530048 blocks [2/2] [UU]
md0 : active raid6 sde3[4] sdd3[3] sdc3[2] sdb3[1] sda3[0]
      5855836800 blocks level 6, 64k chunk, algorithm 2 [5/5] [UUUUU]
      [============>........]  resync = 61.7% (1205475036/1951945600) finish=242.9min speed=51204K/sec

RAID 리빌딩/복구 작업을 모니터링하는 방법
  현재 사용 중인 어레이에 대한 정보를 담고 있는 /proc/mdstat 파일을 보면 됩니다. 이때 watch 명령어를 활용하면 진행상황을 실시간으로 볼 수 있습니다.
# watch -n1 cat /proc/mdstat
  mdadm 명령어로 특정 어레이에 대한 자세한 정보를 볼 수 있습니다.
# mdadm --detail /dev/md2
  iostat 명령어로 디스크 사용현황을 볼 수 있습니다.
# watch -n1 iostat -k 1 2
2013/07/17 00:54 2013/07/17 00:54
Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : CentOS system administration using text-based user interfaces

  Curses 라이브러리를 사용하는 dialog를 통해 스크립트에서 나름 GUI 느낌이 나게 스크립트를 짜는 예제입니다. CentOS라면 보통은 dialog가 설치되어 있지 않으므로 yum을 사용해서 설치해야 합니다.

  아래 예제에서는 메뉴, 진행률 막대의 기본 사용법을 볼 수 있습니다.
#!/bin/bash

#The dialog part. By default, the chosen menu item goes to STDERR (2). From there it's redirected to a temp file (/tmp/temp_file) in the script.

/usr/bin/dialog --title "Delete /tmp content" --menu "Delete /tmp content older than:" 10 30 0 1 "1 day" 2 "2 days" 2> /tmp/temp_file

#Get the choice by reading the /tmp/temp_file
option=`cat /tmp/temp_file`

#Remove the temp file
rm -f /tmp/temp_file

#Clear the screen for better readibility
/usr/bin/clear

#Create a function to delete the temp content. It accepts as an argument a number of days. Any content older than this number will be deleted.
function delete_tmp {
    /bin/echo "Deleting files and directories older than $1 day(s) in /tmp"
    /bin/find /tmp/ -type f -mtime +$1 -exec rm {} -rf \;
    #Show a dialog gauge with the progress
    /bin/echo "50" | /usr/bin/dialog --gauge "Deleting files" 10 30 0
    #For better visual effect wait 1 second before continuing
    /bin/sleep 1
    /bin/find /tmp/ -type d -mtime +$1 -exec rm {} -rf \;
    #Show a dialog gauge with the progress again
    /bin/echo "100" | /usr/bin/dialog --gauge "Deleting directories" 10 30 50
    /bin/sleep 1
    #Clear the screen
    /usr/bin/clear
}

#Go through a conditional statement
#First check if $option is not null. Option is null usually when the cancel button from the menu is pressed.
if [ -z $option ]; then
    /bin/echo 'Cancel pressed. Exiting.'
#Check if the first option is chosen
elif [ $option -eq 1 ]; then
    delete_tmp 1
#Check the second option
elif [ $option -eq 2 ]; then
    delete_tmp 2
fi
  실행하면 두 가지 선택사항이 나오는데 첫 번째는 /tmp 디렉토리 내에 있는 파일들 중 최종 수정 시간이 하루 이상 지난 파일들을 삭제하는 것이고, 두 번째는 이틀 이상 지난 파일을 삭제하는 것입니다. 선택하면 진행률 막대도 나오는 것을 볼 수 있습니다. 메뉴와 게이지의 인자로 있는 10과 30은 각각 텍스트 박스의 높이와 너비를 텍스트 문자로 쟨 값입니다. 메뉴에 있는 세 번째 인자는 내부 선택 공간의 높이고 네 번째 인자는 처음에 선택되어 있는 항목의 번호입니다. 게이지의 세 번째 인자는 진행률 막대의 시작지점을 비율 값으로 나타낸 것입니다.

  배포판에 따라 명령어의 경로명이 다를 수 있습니다. 가령 데비안 계열의 경우 find의 기본 위치가 /usr/bin/find 입니다. 이런 문제 때문에 스크립트 윗 부분에서 OS 및 배포판을 감지하여 그에 맞는 경로명을 변수에 보관하거나 which 같은 명령어로 즉석에서 알아내서 변수로 보관한 뒤 명령어를 사용할 때 그 변수를 활용하는 것이 더 좋습니다.

2013/07/16 13:18 2013/07/16 13:18
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Setup Master-Slave Replication in MySQL Server
참조 원문 : MySQL replication - Master/Slave

  MySQL 리플리케이션이란 마스터와 슬레이브 DB 서버를 설정하여 마스터의 DB 데이터를 슬레이브의 DB에 자동으로 복사하게 하는 일종의 DB 고가용성(High Availablility) 솔루션입니다. 마스터 서버가 죽는 일이 발생해도 슬레이브 서버를 통해 데이터를 이용할 수 있습니다.

  리플리케이션을 활용하는 방법은 여러가지가 있는데 이 글에서는 가장 간단한 방식인 1마스터/1슬레이브 설정을 소개합니다. 이를 위해 아래의 두 서버로 작업한다고 가정하겠습니다. 또한 이 글에서 사용하는 방법은 MySQL 5.5 이상에서 사용하는 방법으로 그보다 더 낮은 버전은 슬레이브 설정 방법이 약간 다르므로 참고하시기 바랍니다.
MySQL Master system : CentOS 6.4
Master IP Address : 192.168.1.250/24
MySQL Slave system : CentOS 6.4
Slave IP Address: 192.168.1.150/24

MySQL 설치
  iptables이 3306 포트를 허용하도록 /etc/sysconfig/iptables 파일의 적절한 위치에 아래 내용을 추가합니다. 이 작업은 마스터 서버에서만 하면 됩니다.
-A INPUT -p udp -m state --state NEW --dport 3306 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 3306 -j ACCEPT
  iptables를 재시작합니다.
# service iptables restart
  마스터와 슬레이브 서버에 MySQL을 설치하고 서비스를 시작합니다. 아래의 설치 작업은 두 서버에서 모두 실시합니다.
# yum install mysql-server mysql -y
# service mysqld start
# chkconfig mysqld on
  MySQL의 기본 보안 및 Root 패스워드를 설정합니다.
# /usr/bin/mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we'll need the current password for the root user.  If you've just installed MySQL, and you haven't set the root password yet, the password will be blank, so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!

By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them.  This is intended only for testing, and to make the installation go a bit smoother.  You should remove them before moving into a production environment.

Remove anonymous users? [Y/n]
... Success!
Normally, root should only be allowed to connect from 'localhost'.  This ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]
... Success!

By default, MySQL comes with a database named 'test' that anyone can access.  This is also intended only for testing, and should be removed before moving into a production environment.

Remove test database and access to it? [Y/n]
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!

Reloading the privilege tables will ensure that all changes made so far will take effect immediately.

Reload privilege tables now? [Y/n]
... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MySQL installation should now be secure.

Thanks for using MySQL!

MySQL 마스터 설정
  /etc/my.cnf 파일을 열어 [mysqld] 섹션에 아래 내용을 추가합니다.
log-bin = mysql-bin
server-id = 1
  추가가 끝나면 MySQL을 재시작합니다.
# service mysqld restart
  MySQL에 로그인해서 슬레이브 서버가 사용할 계정과 패스워드를 생성합니다. 여기선 슬레이브 계정명으로 mirashi, 패스워드로 passpass를 사용하겠습니다.
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.69-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> GRANT REPLICATION SLAVE ON *.* TO 'mirashi'@'%' IDENTIFIED BY 'passpass';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      106 | myservlab    |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)

mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
  파일명(위에선 mysql-bin.000001)과 위치 번호(위에선 106)는 나중에 필요하기 때문에 별도로 적어놓습니다.

MySQL 슬레이브 설정
  /etc/my.cnf 파일을 열어 [mysqld] 섹션에 아래 내용을 추가합니다. 아래 내용을 추가합니다.
server-id = 2
  추가가 끝나면 MySQL을 재시작합니다.
# service mysqld restart
  MySQL에 root 계정으로 로그인해서 아까 마스터 서버에서 SHOW MASTER STATUS; 명령어로 확인했던 마스터 로그 파일에 대한 정보를 슬레이브 서버에 입력합니다.
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.1.69-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.250', MASTER_USER='mirashi', MASTER_PASSWORD='passpass', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
Query OK, 0 rows affected (0.03 sec)

mysql> START SLAVE;
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.1.250
                Master_User: mirashi
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000001
        Read_Master_Log_Pos: 314
             Relay_Log_File: mysqld-relay-bin.000001
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 314
            Relay_Log_Space: 235
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0
  Slave_IO_State가 'Waiting for master to send event'이며 Seconds_Behind_Master 가 'NULL'이 아니면 리플리케이션이 작동하고 있는 것입니다.

리플리케이션 테스트
마스터 서버
# mysql -u root -p
Enter password: Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.69-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database myservlab;
Query OK, 1 row affected (0.04 sec)

mysql> use myservlab;
Database changed

mysql> create table sample (c int);
Query OK, 0 rows affected (0.08 sec)

mysql> insert into sample (c) values (1);
Query OK, 1 row affected (0.01 sec)

mysql> select * from sample;
+------+
| c    |
+------+
|    1 |
+------+
1 row in set (0.01 sec)

mysql>
슬레이브 서버
# mysql -u root -p
Enter password: Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.1.69-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use myservlab;
Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from sample;
+------+
| c    |
+------+
|    1 |
+------+
1 row in set (0.01 sec)

mysql>
2013/07/16 13:05 2013/07/16 13:05