unison 사용

떨어져 있는 여러개의 서버를 동기화 할때는 보통 rsync 등을 사용한다
근데 그런 방식의 문제점은 단방향 싱크라는 점이다.

rsync는 A -> B의 방향성 일 때 A에서 파일이 추가/삭제되면 B에 추가/삭제되지만, B에 추가/삭제된 파일들은 A에 반영되지 않는다. 이런 때에는 unison을 사용하는 게 맞는 것 같다
사용자 삽입 이미지
centos 에서는 unison 배포본이 없다. 게다가 compile를 위해선 ocaml 이라는 언어를 사용해야 하는데, 물론 centos 배포본에도 없다.(슬슬 귀찮아지기 시작한다.) 그래서 그냥 unison rpm 설치를 하기로 했다.
http://www.rpmfind.net/linux/rpm2html/s ··· 3Dunison
양쪽서버에 다 unison을 깔아주고
wget ftp://195.220.108.108/linux/dag/redhat/el5/en/i386/dag/RPMS/unison-2.32.52-1.el5.rf.i386.rpm
rpm -Uvh unison-2.32.52-1.el5.rf.i386.rpm

명령어는 다음과 같다. 양방향이므로 from, to가 없다.
unison /var/www/test ssh://xxx.xxx.xxx.xxx//var/www/test -times -batch

unison을 잘 이용하면 골치 아픈 두 컴퓨터 간의 itune 싱크도 가능할듯하다.
좀 더 자세한 설치 활용 예들은 다음 사이트에서 확인
http://kblog.breadncup.com/archives/2009_10_17/1042/
http://tykim.wordpress.com/2008/01/11/원격지의-mac과-mac의-양방향-sync-unison/

cron에서 돌리기 위해선 그냥 '생'명령어로 하면 안 되고 스크립트를 만들어서 HOME 변수를 지정해줘야 한다. 이유는 cron으로 돌아갈때는 home을 / 로 생각하기 때문에 permission denied 오류가 나온다.
vi unison_sync.sh
#!/bin/sh
HOME=/var/www/backup/log
unison /var/www/test ssh://xxx.xxx.xxx.xxx//var/www/test -times -batch
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 엽기민원

2010/02/05 13:11 2010/02/05 13:11
,
Response
No Trackback , No Comment
RSS :
http://yupmin.com/rss/response/177

nginx 설치 및 셋팅

0. nginx


사용자 삽입 이미지
nginx('엔진엑스'라고 읽는다. 러시아어가 기본이니 정확한 발음은 모르겠다)는 작고 파워풀한 웹엔진의 능력과 간결한 셋팅은 유명하다.
테스트 해본결과 static 파일의 경우 apache나 lighttpd에 비해 월등한 성능을 보인다. 그러나 fastcgi+php쪽으로는 속도가 apache 보다 못하다.
proxy. cache or memcached 기능으로 다양한 조합을 하면 각각 상황에 알맞는 재미있는 구성이 가능할것 같다.

그래서 내가 주로 쓰는 centos, ubunt에 정리겸 설치 및 설정 방법을 정리해봤다.

1. centos 5.4 - install nginx

centos에는 배포본이 아직 없는듯 (0점대 버젼이라 그런가...)...암튼 그래서 구글링을 했다.

기본 깔아야 하는 패키지들은 다음과 같다
yum install gcc pcre-devel bzip2-devel openssl-devel

그리고 직접 소스를 받아서 컴파일 한다. 컴파일 옵션 참조: http://www.mman.pe.kr/?p=53
wget http://nginx.org/download/nginx-0.7.64.tar.gz
tar xvfz nginx-0.7.64.tar.gz
cd nginx-0.7.64
./configure \
--sbin-path=/usr/sbin \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/subsys/nginx \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--with-http_realip_module \
--with-http_ssl_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-mail \
--with-mail_ssl_module \
--with-cc-opt="-I /usr/include/pcre"
make
make install

그리고 깔린 결과는 다음과 같다
  + using system PCRE library
+ using system OpenSSL library
+ md5: using OpenSSL library
+ sha1 library is not used
+ using system zlib library

nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/sbin"
nginx configuration prefix: "/etc/nginx"
nginx configuration file: "/etc/nginx/nginx.conf"
nginx pid file: "/var/run/nginx.pid"
nginx error log file: "/var/log/nginx/error.log"
nginx http access log file: "/var/log/nginx/access.log"
nginx http client request body temporary files: "/var/tmp/nginx/client/"
nginx http proxy temporary files: "/var/tmp/nginx/proxy/"
nginx http fastcgi temporary files: "/var/tmp/nginx/fcgi/"

init script는 http://wiki.nginx.org 에 있다
http://wiki.nginx.org/RedHatNginxInitScript 에서 redhat쪽 init script 를 다운받아서
cp nginx /etc/init.d/
chmod 755 /etc/init.d/nginx
/usr/sbin/groupadd nginx
/usr/sbin/useradd -g nginx -s /sbin/nologin -c "Nginx" -M nginx
mkdir /var/tmp/nginx/
# chkconfig --add nginx
# chkconfig nginx on

/etc/nginx/nginx.conf를 수정한다
user  nginx nginx;
error_log /var/log/nginx/error.log;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
server {
listen 80;
server_name localhost;
location / {
root /var/www/html
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

하면 완료.

일단 문제가 있는데, initscript로 restart가 잘 안된다. worker 프로세스가 죽는 시간이 좀 걸리는데, 그상태에서 start하는게 문제가 되는 듯하다. 근데 nginx는 꼭 restart로 서버를 리스타팅 할 필요가 없다

ps aux|egrep (PID|nginx) # 여기서 master [pid]를 알아낸후 
kill -HUP [pid]

이렇게 하면 무정지로 서버 리스타팅이 가능하다.

2. centos 5.4 - install nginx + php(with spawn-fcgi)

먼저 php패키지를 인스톨한다.(이외 필요한 php패키지 및 php-cache 프로그램은 알맞게 install)
yum install php php-dev

nginx의 경우 spawn-cgi를 같이 사용한다.
소스는 여기(http://redmine.lighttpd.net/projects/sp ··· %2Fbuild)에 있다.
wget http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz
tar xvfz spawn-fcgi-1.6.3.tar.gz
cd spawn-fcgi-1.6.3
./configure --prefix=/usr
make
make install

init 스크립트는 다음 참조 : http://bash.cyberciti.biz/web-server/rh ··· cript%2F
vi /etc/init.d/php-cgi
#!/bin/sh
#
# php-cgi - php-fastcgi swaping via spawn-fcgi
#
# chkconfig: - 85 15
# description: Run php-cgi as app server
# processname: php-cgi
# config: /etc/sysconfig/phpfastcgi (defaults RH style)
# pidfile: /var/run/php_cgi.pid
# Note: See how to use this script :
# http://www.cyberciti.biz/faq/rhel-fedora-install-configure-nginx-php5/
# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

spawnfcgi="/usr/bin/spawn-fcgi"
php_cgi="/usr/bin/php-cgi"
prog=$(basename $php_cgi)
server_ip=127.0.0.1
server_port=9000
server_user=nginx
server_group=nginx
server_childs=5
pidfile="/var/run/php_cgi.pid"

# do not edit, put changes in /etc/sysconfig/phpfastcgi
[ -f /etc/sysconfig/phpfastcgi ] && . /etc/sysconfig/phpfastcgi

start() {
[ -x $php_cgi ] || exit 1
[ -x $spawnfcgi ] || exit 2
echo -n $"Starting $prog: "
daemon $spawnfcgi -a ${server_ip} -p ${server_port} -u ${server_user} -g ${server_group} -P ${pidfile} -C ${server_childs} -f ${php_cgi}
retval=$?
echo
return $retval
}

stop() {
echo -n $"Stopping $prog: "
killproc -p ${pidfile} $prog -QUIT
retval=$?
echo
[ -f ${pidfile} ] && /bin/rm -f ${pidfile}
return $retval
}

restart(){
stop
sleep 2
start
}

rh_status(){
status -p ${pidfile} $prog
}

case "$1" in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
rh_status;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
exit 3
esac

chmod +x /etc/init.d/php-cgi
vi /etc/nginx/nginx.conf
# server 섹션안에 다음 구문을 추가한다
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
include fastcgi_params;
}


3. ubuntu 9.10 - nginx

유분투는 당연히 nginx 패키지를 가지고 있다.
apt-get install nginx


4. ubuntu 9.10 - nginx + php

apt-get install php5 php5-cgi spawn-fcgi

다음 셋팅으로 init script 만든다 참조: http://chrisjohnston.org/2009/setting-u ··· untu-904
vi /etc/init.d/php-fastcgi
#! /bin/sh
### BEGIN INIT INFO
# Provides: php-fastcgi
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start and stop php-cgi in external FASTCGI mode
# Description: Start and stop php-cgi in external FASTCGI mode
### END INIT INFO

# Author: Kurt Zankl <[EMAIL PROTECTED]>

# Do NOT "set -e"

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="php-cgi in external FASTCGI mode"
NAME=php-fastcgi
DAEMON=/usr/bin/php-cgi
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
PHP_CONFIG_FILE=/etc/php5/cgi/php.ini

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# If the daemon is not enabled, give the user a warning and then exit,
# unless we are stopping the daemon
if [ "$START" != "yes" -a "$1" != "stop" ]; then
log_warning_msg "To enable $NAME, edit /etc/default/$NAME and set START=yes"
exit 0
fi

# Process configuration
export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS
DAEMON_ARGS="-q -b $FCGI_HOST:$FCGI_PORT -c $PHP_CONFIG_FILE"

do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON \
--background --make-pidfile --chuid $EXEC_AS_USER --startas $DAEMON -- \
$DAEMON_ARGS \
|| return 2
}

do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE > /dev/null # --name $DAEMON
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac

init script 설정 파일 추가한다
chmod +x /etc/init.d/php-fastcgi
vi /etc/default/php-fastcgi
START=yes

# Which user runs PHP? (default: www-data)

EXEC_AS_USER=www-data

# Host and TCP port for FASTCGI-Listener (default: localhost:9000)

FCGI_HOST=localhost
FCGI_PORT=9000

# Environment variables, which are processed by PHP

PHP_FCGI_CHILDREN=4
PHP_FCGI_MAX_REQUESTS=1000

기본 default vhost 설정에 추가
vi /etc/nginx/sites-available/default
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;
include fastcgi_params;
}

이러면 설정 완료
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 엽기민원

2010/01/20 01:23 2010/01/20 01:23
Response
No Trackback , No Comment
RSS :
http://yupmin.com/rss/response/175

Postfix 셋팅하기

imap/pop3 서비스를 쓰지 않는다면, sendmail보다는 postfix를 쓰는게 좋다.

게다가 요즘 대부분 gmail을 베이스로 쓰니..  간단한 셋팅에 다양한 매쉬업들이 가능하다.

(물론 centos기준)

yum remove sendmail
yum install postfix

/etc/postfix/main.cf 수정
myhostname = test.com
mydomain = test.com
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, $mydomain
mynetworks = 127.0.0.0/8


도메인 별 alias 설정은 http://www.postfix.org/VIRTUAL_README.html 참조
스팸체크 및 한글설명서는 http://wiki.kldp.org/wiki.php/Postfix-SASL-HOWTO 참조

외부로 smtp 서버를 열었을 경우 스팸들의 습격을 받을수도 있으니..
malware urls를 참고 해서 /etc에 다음과 같은 스크립트를 만든다
vi /etc/fetch.postfixmalware.sh

#!/bin/bash
# Script to update malware urls
/usr/bin/wget -O - http://www.malware.com.br/cgi/submit?action=list_postfix > /etc/postfix/mbl-body-deny
/usr/sbin/postmap /etc/postfix/mbl-body-deny
/etc/init.d/postfix reload

crontab에 다음과 같은 구문을 추가하면 보통의 스팸들은 막을수 있다
40 4 * * * /etc/fetch.postfixmalware.sh >/dev/null 2>&1

더해서 스팸을 막는 다양한 방법들은 다음 링크 참조 : http://www.howtoforge.com/virtual_postfix_antispam

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 엽기민원

2009/11/25 12:25 2009/11/25 12:25
Response
No Trackback , No Comment
RSS :
http://yupmin.com/rss/response/171

monit 부활

죽어있었던 monit사이트가 부활했다. (약 6~7개월전 죽었던걸로 기억함.)
centos에 rpm으로 설치했을때는 잘작동하지 않았는데, 이번에는 작동할지?
yum install flex bison openssl-devel
wget http://mmonit.com/monit/dist/monit-5.0.3.tar.gz
tar xvfz monit-5.0.3.tar.gz
cd monit-5.0.3
./configure
make; make install

설정 파일은 다음과 같이(/etc/monitrc)
set daemon 60
set logfile syslog facility LOG_daemon
set mailserver localhost
set alert admin@abc.com
set httpd port 8080 address localhost
allow localhost


check process apache with pidfile "/var/run/httpd.pid"
start = "/etc/init.d/httpd start"
stop = "/etc/init.d/httpd stop"
if failed host 127.0.0.1 port 80 and protocol http
and request "/abc.txt" then restart
if cpu usage is greater than 60 percent for 2 cycles then alert
if cpu usage > 98% for 5 cycles then restart
if 2 restarts within 3 cycles then timeout
alert admin@abc.com

check process mysql with pidfile "/var/run/mysqld/mysqld.pid"
group database
start program = "/etc/init.d/mysqld start"
stop program = "/etc/init.d/mysqld stop"
if failed host 127.0.0.1 port 3306 then restart
if cpu usage > 98% for 5 cycles then restart
if 5 restarts within 5 cycles then timeout


initscript는 다음을 다운받아서


가끔씩 httpd pid를 먹어버리거나...(httpd 자체 문제인지 모르겠음)  문제가 약간 있는듯 하다

http://mmonit.com/ m/monit를 써보고 싶지만 싶지만, 너무 비싸다. (스텐다드 타입이 €99...15만원선..프로페셔널 타입은 €499...76만원선 ㅎㄷㄷ )
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 엽기민원

2009/11/06 18:57 2009/11/06 18:57
, ,
Response
No Trackback , No Comment
RSS :
http://yupmin.com/rss/response/160

centos php5.2 업그레이드

centos 에서 php의 버젼은 고질적인 문제다. php5.1인데 yum을 이용해 업그레이드 할 수 있는 안전한 방법은 custom repository를 이용하는 것인데, 이 방법에는 문제가 있다. 문제는 바로 php배포본뿐만 아니라 여타 다른 배포본까지 업데이트 해야 하는 문제가 있다. 만일 다시 원래 repo로 돌아가려면 영향받는 mysql 등까지도 다시 깔아야 하는데 이건 도통 귀찮은 방법이다.

그래서 방법을 찾던 중 제일 간편하고, 다시 원래 배포본으로 돌아갈 수 있는 방법이 있었으니 다음과 같다. ^^

참조 : http://www.somegate.com/topic_new.php?topic_uid=3973
wget http://dev.centos.org/centos/5/CentOS-Testing.repo
mv CentOS-Testing.repo /etc/yum.repos.d/
yum --enablerepo=c5-testing update php

그리고 eaccelerator, memcache(php-pecl-memcache 이 작동안함)를 다시 깔아야함.
yum --enablerepo=c5-testing install php-mcrypt php-tidy php-mbstring
그외 필요한 php모듈은 버젼에 맞게 다시 깔면 된다.

새로 깔리는 패키지
php
php-cli
php-common
php-devel
php-gd
php-mysql
php-pdo
php-xml
php-tidy
php-mcrypt
libtidy mysql-libs

이것만 지우고 다시 깔면 원복이 될듯..
xdebug, json 등은 pear로 깔면 되니
yum install --enablerepo=c5-testing php-pear
pear install pecl/json
pear install Xdebug
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 엽기민원

2009/11/06 18:45 2009/11/06 18:45
, ,
Response
No Trackback , No Comment
RSS :
http://yupmin.com/rss/response/168

eAccelerator php 설치

정작 php를 깔아놓고 옵티마이저등을 안까는건 바보 같은일...

참조 : http://www.codeway.co.kr/board/bbs/boar ··· id%3D132

yum install php-devel
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
tar xvfj eaccelerator-0.9.5.3.tar.bz2
cd eaccelerator-0.9.5.3
phpize
./configure
make;make install
mkdir -p /var/cache/eaccelerator
chmod 0777 /var/cache/eaccelerator
vi /etc/php.d/eaccelerator.ini

extension="eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/var/cache/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"



크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 엽기민원

2009/06/30 23:52 2009/06/30 23:52
,
Response
No Trackback , No Comment
RSS :
http://yupmin.com/rss/response/164

서버마다 메일서버를 구축할 필요가 없다.
하나의 메일서버를 사용하고, ssmtp로 연결할수 있다.

소스 패키지 : http://packages.debian.org/source/sid/ssmtp

wget http://ftp.de.debian.org/debian/pool/main/s/ssmtp/ssmtp_2.64.orig.tar.bz2
tar xvfj ssmtp_2.64.orig.tar.bz2
cd ssmtp-2.64
./configure --sysconfdir=/etc
make; make install

wget http://ftp.de.debian.org/debian/pool/main/s/ssmtp/ssmtp_2.62.orig.tar.gz
wget http://ftp.de.debian.org/debian/pool/main/s/ssmtp/ssmtp_2.62-3.diff.gz
tar xvfz ssmtp_2.62.orig.tar.gz
gunzip ssmtp_2.62-3.diff.gz
mv ssmtp-2.62 ssmtp
patch -p0 < ssmtp_2.62-3.diff
mv ssmtp ssmtp-2.62
cd ssmtp-2.62/ssmtp
./configure --sysconfdir=/etc
make; make install

그리고 sendmail을 대치한다. 만일 sendmail을 지우지 않았다면 다음과 같이 대치 한다.
아니면 /etc/alternatives 가서 mta관련 링크를 수정해야 한다. (근데 sendmail 지워주고 깔면 알아서 셋팅된다.)
참고 : http://linux.com/archive/feature/132006

sudo mv /usr/sbin/sendmail /usr/sbin/sendmail.orig
sudo ln -s /usr/local/sbin/ssmtp /usr/sbin/sendmail

/etc/ssmtp/ssmtp.conf 수정
#
# /etc/ssmtp.conf -- a config file for sSMTP sendmail.
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=postmaster
# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and you mailhub is so named.
mailhub=mail ← 바꾸려는 메일서버 주소
# Where will the mail seem to come from?
#rewriteDomain=
# The full hostname
hostname=localhost ← 서버 hostname
fromlineoverride=yes ← php등에서 메일 보낼때 from을 오버라이딩 가능하게


수정 끝.

gmail서버로도 연결이 가능하니 꼭 메일 서버를 가지지 않아도 될듯 하다.
Using SSMTP to Replace Sendmail (Gmail Config)

위 방법과 적절히 사용하면, 간단히 replace가 될듯 하다. 보안에 관해 물론 메일서버에는 셋팅을 해놔야겠지만, ^^
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 엽기민원

2009/06/10 14:35 2009/06/10 14:35
Response
No Trackback , No Comment
RSS :
http://yupmin.com/rss/response/161

memcached 설치 / 사용

CentOS 의 경우

source : http://www.danga.com/memcached/dist/

yum install libevent libevent-devel
wget http://www.danga.com/memcached/dist/memcached-1.4.0.tar.gz
tar -xvzf memcached-1.4.0.tar.gz
cd memcached-1.4.0
./configure --with-libevent=/usr/lib/
make; make install

php 라이브러리 추가
yum install php-pecl-memcache

혹은 버젼이 안되면, 직접 컴파일
wget http://pecl.php.net/get/memcache-2.2.5.tgz
tar xvfz memcache-2.2.5.tgz
cd memcache-2.2.5
phpize
./configure --enable-memcache
make
cp modules/memcache.so /usr/lib/php/modules

PHP 관련 설정도 해주고..
vi /etc/php.d/memache.ini 

extension=memcache.so

기본 설정 파일도 만들어주고..
vi /etc/memcached.conf

#Memory a usar
-m 16
# default port
-p 11211
# user to run daemon nobody/apache/www-data
-u nobody
# only listen locally
-l 127.0.0.1

다음의 실행 스크립트 및 데몬 스크립트를 생성한다.
daemon script : http://www.vbseo.com/blogs/danny-bembib ··· ed-44%2F, http://www.dev411.com/wiki/Memcached_startup_files_for_Red_Hat_(RHEL)
wget http://yupmin.com/attachment/1246298963.xxx
mv 1246298963.xxx /usr/local/bin/start-memcached
chmod 755 /usr/local/bin/start-memcached
wget http://yupmin.com/attachment/1314503238.xxx
mv 1314503238.xxx /etc/init.d/memcached
chmod 755 /etc/init.d/memcached

php-test : http://dorkage.net/2009/02/memcached-test/

그외 Sun에서 했던 MySQL 컨퍼런스에 봤던 강사의 키노트
http://download.tangent.org/talks/Memcached%20Study.pdf

memcached wow!!
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 엽기민원

2009/05/25 11:33 2009/05/25 11:33
,
Response
No Trackback , 2 Comments
RSS :
http://yupmin.com/rss/response/159

유용한 mysql 관리툴 : mytop

mytop
http://jeremy.zawodny.com/mysql/mytop/
필요 라이브러리
http://search.cpan.org/~jstowe/

centos의 경우
wget http://search.cpan.org/CPAN/authors/id/J/JS/JSTOWE/TermReadKey-2.30.tar.gz
tar xvfz TermReadKey-2.30.tar.gz
cd TermReadKey-2.30
perl Makefile.PL
make;make install

wget http://jeremy.zawodny.com/mysql/mytop/mytop-1.6.tar.gz
tar xvfz mytop-1.6.tar.gz
cd mytop-1.6
perl Makefile.PL
make;make install

혹시 설치시 'Warning: prerequisite DBD::mysql 1 not found.'에러가 난다면
yum install perl-DBD-mysql


만일 s/// 식으로 에러가 나올때는 fix.455901.diff 로 패치
아하 좋쿠나..

사용자 삽입 이미지
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 엽기민원

2009/05/15 16:11 2009/05/15 16:11
,
Response
No Trackback , No Comment
RSS :
http://yupmin.com/rss/response/158

어이 좆선 공부좀 해...

울 집안 신문시장에서 작년말 우위를 점하던 한겨레신문을 아버지께서 끊어 버리고, 조선일보를 보고 있는데, 매일 아침 신문을 보면서 쌍욕이 나오기 일쑤다.

뭐 대부분 정치분야지만 가끔씩 조선일보는 다른 분야에서도 삐걱거리는데...
오늘 IT섹션에서 봤던 윈도우 비스타 얘기는 조선일보 IT기자 자질을 의심케 했다.

기사 : http://www.chosun.com/economy/news/2006 ··· 017.html

MS가 지난 5월 24일 무료 시험판(베타2 버전)을 일제히 배포한 비스타(Vista)는 네이버·야후·구글 등 포털 사이트와 시만텍·안철수연구소·하우리 등 보안 소프트웨어 업체들의 수익모델을 한꺼번에 뒤흔들 가능성도 있다.

비스타가 위협적인 이유는 검색과 보안이 ‘기본 기능’이기 때문이다. 네이버·구글에 접속하지 않고도 운영체제에서 키워드 검색이 가능하다. 컴퓨터 바이러스 등을 차단하고 치료하는 소프트웨어 제품도 별도로 구입할 필요가 없다. 달력·시계·계산기·전자지도·날씨·환율·증권·사진·동영상 보기 등 각종 서비스 중에서 필요한 것을 선택해 운영체제 위에 설치함으로써 운영체제의 기능도 넓혔다.

여기에 비스타와 함께 출시될 차세대 인터넷 익스플로러(IE)인 ‘IE 7’은 동시에 여러 개의 인터넷사이트를 띄워 놓고 이곳 저곳을 맘대로 골라보는 ‘탭 브라우징(Tab Browsing)’ 기능을 제공한다. 탭 브라우징은 MS IE의 강력한 경쟁자인 파이어폭스의 뛰어난 기능. MS가 이 기능을 한층 업그레이드한 형태로 IE 7에 집어넣었다. 컴퓨터 화면에 여러 인터넷 사이트의 첫 화면들을 나란히 배열해 동시에 보여주도록 한 ‘퀵 탭스 뷰(quick tabs view)’가 그것이다. 이 기능은 각 포털 사이트의 시장 점유율을 무의미하게 만든다. 이를테면 네이버·다음·야후·엠파스 등이 컴퓨터 화면에 한꺼번에 뜨게 돼 인터넷 초기화면 설정의 의미가 없다. 페이지뷰, 검색이용빈도 등에서 압도적 1위인 네이버 입장에서 볼 때, 비스타와 IE 7은 위협적인 존재가 아닐 수 없다. IT칼럼니스트이자 ‘시맨틱웹’의 저자인 김중태씨는 “네이버 같은 포털 사이트들은 심각한 위기에 직면할 것이며, 영원히 사라질 포털도 있을 것”이라고 경고했다.

기사에서는 윈도 비스타가 뭔가 새로운 서비스로 무장했다 그래서 돌풍이 될것이다 말하는 것 같다.
허나 잘 읽어보면 MS가 아직도 정신못차리고, 그 동안 반독점법을 무시하고, OS 플랫폼으로써의 통합서비스를 하겠다는 얘기뿐이다.

"각 포털 사이트의 시장 점유율을 무의미하게 만든다."는 "퀵 탭스"의 기능이 사실 파이어 폭스 텝 브라우지 기능해서 그렇게 새로울게 없는 서비스다.

관련링크 : IE7 의 퀵탭 기능을 Firefox 에서도 - Tab Catalog

브라우저 시작페이지 설정이 포탈의 시장점유율에 얼마만큼은 영향을 미치겠지만, 그게 네이버가 1위한 이유는 아닐터다.

대충 여기서 기사를 끝내도 될터 마지막 코멘트를 해주시는데,
"IT칼럼니스트이자 ‘시맨틱웹’의 저자인 김중태씨는 “네이버 같은 포털 사이트들은 심각한 위기에 직면할 것이며, 영원히 사라질 포털도 있을 것”이라고 경고했다."
이 라인을 읽고 실소를 금하지 못했다.

대충 웹 검색 후에 인용만 해서 기사를 쓴 듯 한데, 김중태씨가 네이버 같은 포털의 암울한 미래에 대해 쓴글은 대략 이렇다.

기사링크 : http://www.dal.co.kr/col/interview/2006 ··· y21.html

네이버는 5년 뒤에도 살아남을까

오 라일리는 웹 2.0의 첫 번째 원칙을 ‘플랫폼으로서의 웹’이라고 규정한다. 사라진 넷스케이프와 살아남은 구글의 차이를 살펴보면 이 개념을 쉽게 이해할 수 있다. 넷스케이프는 웹 브라우저라는 응용 프로그램을 플랫폼으로 만들려고 했다. 그러나 웹 브라우저는 마이크로소프트의 윈도우즈라는 플랫폼에서 돌아가는 서비스 가운데 하나로 전락해버렸고, 넷스케이프는 설 자리를 잃게 됐다.

거 꾸로 구글은 일찌감치 데이터베이스 관리에 역량을 집중했다. 구글은 넷스케이프처럼 어떤 종류의 응용 프로그램을 팔려고 하지도 않았고 대량의 서버를 갖추고 있으면서도 그 서버로 돈을 벌어들이려고 하지도 않았다. 방대한 정보를 제공하지만 그 정보는 구글의 소유가 아니고 소유하려고 하지도 않는다. 구글은 다만 데이터베이스를 수집해 관리하고 유용한 정보를 뽑아내 사용자들에게 전달해주는 시스템, 즉 플랫폼의 역할에 주력했던 것이다.

인 터넷 서점 아마존이나 경매 사이트 이베이 역시 플랫폼을 가진 기업이 성공한 경우다. 이들의 경쟁력은 응용 프로그램이 아니라 정보의 전달 프로세스, 즉 플랫폼에 있다. 냅스터의 계보를 잇는 P2P 서비스 비트토런트 역시 마찬가지다. 파일 하나 소유하고 있지 않지만 비트토런트는 세계적인 규모의 파일 공유 플랫폼을 만들어냈다. 웹 1.0 시대에는 이처럼 플랫폼을 가진 기업이 응용 프로그램을 가진 기업을 밀어내고 살아남았다.
그러나 웹 2.0 시대에는 플랫폼을 가진 기업들끼리의 싸움이 시작된다. 이것이 바로 핵심이다. 이제는 플랫폼의 경쟁력을 고민해야 할 때다. 오라일리는 “플랫폼 대 응용 프로그램이 아니라 플랫폼 대 플랫폼인 지금의 경쟁은 더 이상 불공평하지 않다”고 전제하고 “어떤 플랫폼이 될 것인가, 즉 어떤 기술과 어떤 비즈니스 모델이 앞에 놓여 있는 기회에 더 적합한가가 관건”이라고 말했다.
여기서 잠깐 처음의 질문으로 돌아가본다. 네이버의 플랫폼은 과연 경쟁력이 있을까. 지식검색을 비롯해 블로그와 뉴스 서비스, 그리고 트래픽에 의존한 광고 매출 등은 앞으로도 계속 유효한 비즈니스 모델일까. 업계 1위라는 선점효과는 계속 유효할까.

이글의 대략 논지는 웹2.0의 시대에는 웹 플랫폼의 시대가 될것이며, 그 안에서 현재 네이버의 여러 서비스들이 웹표준화, 웹2.0, 시만텍 웹 트랜드에 맞지 않고 있다라는 얘기다.
그래서 네이버같은 포탈이 현재의 서비스에 자만하고, 자성하지 않을 때 위험하다는 얘기다. 겨우 "퀵 탭스" 기능과 이래저래 비대해진 윈도우 비스타 때문이 아니고 말이다.

대충 기사쓴게 확 티나는 부분이다. 이런 것을 기사로 내고 있으니, 일등신문 좆선일보의 인프라가 얼마나 좆같음을 느낄수 있다. 어이 좆선!! 언제나 얘기하지만, 공부 좀 하고 기사를 쓰라고...

그리고, 웹개발자로 한마디 하건데, 퀵텝이고 나발이고, 텝브라우징 필요없고, 윈도우 비스타의 IE7 가 제발 엑티브엑스 버리고 기본 웹표준화에 근접하기만을 바랄 뿐이다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 엽기민원

2006/06/09 13:10 2006/06/09 13:10
, ,
Response
No Trackback , 2 Comments
RSS :
http://yupmin.com/rss/response/104

Gentoo Linux with Compaq Proliant DL380-G4

젠투 리눅스를 각종 컴퓨터와 좀 특이하게 vmware 등에 깔아봤지만, 이번 프로라인언트 DL380에 까는 것은 만만치 않았다. 그래서 각종 업무와 술자리가 일정을 더디게 하여 걸린 기간 딱 10일!!

암튼 그 비법을 소개할터이니 10일의 고통을 한큐에 공개하는게 아깝긴 하지만, 이 괴물 만드는 법을 여러분에게 알려드리겠다.

대충의 서버 스펙
서버명 : Compaq Proliant DL380-G4
프로세서 : Intel® Xeon™ 프로세서 3.06GHz * 2
메모리 : 2GB
칩셋 : ServerWorks GC-LE 칩셋
네트워크 컨트롤러 : Broadcom Tigon3 Gigabit NIC * 2
스토리지 컨트롤러 : 스마트 어레이 5i 플러스 컨트롤러
하드 디스크 : 72.8GB 15,000 rpm U320 범용 핫 플러그 * 2
그래픽 : 8MB SDRAM 비디오 메모리와 통합된 ATI RAGE XL

첨엔 팀장에게 좋은 서버 사야 된다고 졸랐지만, 리눅스를 깔아야 한다는 특명을 감지하고선 대충하면 되겠지 했다. 그러나 그 괴물이 내 눈앞에 있자, 대충 살껄이란 후회가 막심했다.

이유는? 바로 Compaq서버들에게 독특하게 존재하는 스마트 어레이란 넘때문에 그런다. 대충 눈치로 보니 이 컨트롤러는 분리되어있는 scsi하드 디스크를 하나로 만들어주고 잡다한 좋은 기능들이 들어가 있는 것 같다.

윈도야 대충 깔면 되지만, 리눅스란 넘은 하나 하나 잡아줘야 함에 바로 문제가 있다.

암튼 가보자!!

1.
먼저 Gentoo 최신 씨디를 구하자. http://www.gentoo.org/main/en/mirrors.xml 가서 minimal 버젼을 구하면 되겠다.(이 포스트에서 쓰이는 젠투 버젼은 "Gentoo x86 minimal 2004.3"이요)

대충 씨디를 굽고, 다시 한번 Gentoo Handbook을 한번은 읽어보자!!

2.
스마트 어레이 or Laid를 설정하고(72기가 하드를 둘을 통 하나로 만들었다.) BIOS 셋업 들어가서 기본적인 것들을 셋팅하면 들어다 보자. (이부분은 잘모른다. -_-a)
특히 날짜는 잘 잡아주자. 그리곤 서버에 씨디를 넣고 부팅을 하자.

다행이도 젠투로 부팅이 된다. ^^

3.
2004. 1버젼이전에는 스마트 어레이를 자동으로 잡아주지 못했던 것 같다. 해외의 각종 포스트를 검색해 본 결과 수동으로 잡아주는데, 2004. 3버젼은 운수좋게도 자동으로 잡힌다. 아싸~~
허나 에러를 동반하고 있다.

특히 이런 문구로 "/dev/cciss/part0/~~"로 에러가 나오는데...
걍 무시하자. cciss 드라이버가 자동 하드디스크를 잡는데 약간의 문제를 동반하고 있다. 후에 언급하겠다.

4.
서버실이 졸라 추우므로 네트워킹을 설정하고 sshd를 초기화 하자.
서버실을 나와 사무실로~~

젠투가 가장 맘에 이유중의 하나는 원격 설치가 가능하기 때문이다.

# net-setup eth0
# passwd <-- 비밀번호 생성
# /etc/init.d/sshd start

5.
먼저 파티션을 잡아줘야 하는데, 이거 스마트 어레이라서 어떤 디바이스를 대상으로 할지 도통 아리송하다.

이때 /dev 폴더를 보면 cciss폴더가 있다.
그안에 아마도 "c0d0"이란 파일 뿐이다. 그전까지 보통 하드디스크나, scsi 하드디스크로 깔았을텐데 /dev/hda, /dev/sda 등등을 사용했던 사람들에겐 무지 쌩뚱맞다.

허나 그 cciss폴더에 "c0d0"이 바로 스마트 어레이 의 디바이스 파일이다.
잠깐 설명 : /dev/cciss/cXdXpX 의 파일 형식
첫번째 X : controller number
두번째 X : logical disk number
세번째 X : partition number

걍 그대로 사용하면 된다.
# fdisk /dev/cciss/c0d0

경고문이 나오는데 이것도 걍무시하자. 대충 몇기가안에 부트로더를 둬야 하는가 그런 얘기인듯 싶다.

파티션은 그전에 하던데로 핸드북에 있는데로 설정하자.
swap파티션은 대충 램용량과 같은 2기가를 잡았다. 잘 기억이 나지 않는데, 보통 2배정도 잡으라는 건데, 램이 빵빵하니 2기가만 잡았다.(부족할까?)

# fdisk /dev/cciss/c0d0
# mke2fs /dev/ccisss/c0d0p1 <-- /boot
# mke2fs -j /dev/ccisss/c0d0p3 <-- /
# mke2fs -j /dev/ccisss/c0d0p4 <-- home 이다.
# mkswap /dev/ccisss/c0d0p2
# swapon /dev/ccisss/c0d0p2

각각 마운트도 하자

# mount /dev/ccisss/c0d0p3 /mnt/gentoo
# mkdir /mnt/gentoo/boot
# mkdir /mnt/gentoo/home
# mount /dev/ccisss/c0d0p1 /mnt/gentoo/boot
# mount -t proc none /mnt/gentoo/proc

6.
# date MMDDhhmmYYYY <--시간도 맞춰주고...
# cd /mnt/gentoo
# links2 http://www.gentoo.org/main/en/mirrors.xml
# tar -xvjpf /mnt/cdrom/stages/stage1-????-2004.3.tar.bz2

원래 하던데로 stage1을 받아오자...

# nano -w /etc/make.conf ->컴파일옵션들을 설정해주고 기본적인 플래그들도 설정하자
# mirrorselect -a -s4 -o |grep 'GENTOO_MIRRORS=' >> /mnt/gentoo/etc/make.conf
cp -L /etc/resolv.conf /mnt/gentoo/etc/resolv.conf

make.conf 기본적인 USE옵션도 설정하자.
따로 x-window를 안깔것이기때문에...
USE="-X -kde -gtk -gtk2 -qt -gnome"
이렇게 설정했다.

그리고 미러 가져오는게 꽤 걸린다. 알아서 빠른쪽으로 가져오는 작업을 하는 것 같은데...믿어보자. 좀 기둘리면서 차 한잔씩 하시라.

# chroot /mnt/gentoo /bin/bash
# env-update
# source /etc/profile

원래 하던데로 계속 하면 된다. 아주 잘 깔릴뿐더러, stage1으로 시작해서 커널 컴파일 전까지 약 1시간 이내 끝남을 알수 있다. 이넘 괴물일 수 밖에 없다. (숙련일 경우 이 서버에 젠투를 까는 시간은 대략 약 4시간 안팎이다.)

# cd /usr/portage
# scripts/bootstrap.sh
# emerge system

7.
# ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
# emerge gentoo-sources
# genkernel --menuconfig all

보통 genkernel할때 all옵션만 줘서하는 사람들이있는데, 이 기회에 커널에 친숙할수 있도록 menuconfig옵션을 사용하자. 대충 handbook에 있는 것들은 다 설정해주고...
특히 HT를 지원하는 제온 cpu를 위해 아래를 설정하고

Processor type and features --->
[*] Symmetric multi-processing support
Block devices --->
[*] Compaq SMART2 support

block device에 compaq smart array 부분에도 *을 찍어주자
(그리고 걍 이상태로 커널 컴파일을 하면 SCB2 BIOS 어쩌고 에러가 나오는데, BIOS flash chip on Intel SCB2 boards을 [ ]으로 하자)

Mapping drivers for chip access -->
[ ]BIOS flash chip on Intel SCB2 boards

Network device support --->
Ethernet (1000 Mbit) --->
<*> Broadcom Tigon3 support

블루투스 같이 대충 필요없다 싶은것은 지워고...대부분은 모듈로 남겨두자. 세이브 하고 나가는 척을 하면 알아서 컴파일된다.
물론 컴파일 시간은 상상에 맡기겠다.

# emerge coldplug
# rc-update add coldplug default

쓰던 버릇으로 hotplug를 걍 쓰는 사람들이 있는데, 버젼업한 coldplug를 써주자!!

8.
# nano -w /etc/fstab

자!! 여기서 중요한것은 2.4대 커널과 2.6대 커널 특히 devfs와 udev를 사용하는 것으로 dev node이름이 달라진다.

Gentoo x86 minimal 2004.3 에서는 커널 2.6과 udev를 써서 /dev/cciss/cXdXpX 형식으로 쓰여지나, 커널 2.4에 devfs는 /dev/cciss/discX/partX 형식으로 쓰여진다...-_-
그러니 대충 유추해서 사용하자!! 아래와 같이

/dev/cciss/disc0/part1 /boot ext2 noauto,noatime 1 2
/dev/cciss/disc0/part3 / ext3 noatime 0 1
/dev/cciss/disc0/part2 none swap sw 0 0
/dev/cciss/disc0/part4 /home ext3 noatime 0 1
/dev/cdroms/cdrom0 /mnt/cdrom iso9660 noauto,ro 0 0

이런식으로 설정하면 되겠다.

9.
또 기본적인 것들도 설정하자.

# echo xxx > /etc/hostname
# echo xxx.xxx.com> /etc/dnsdomainname
# rc-update add domainname default
# nano -w /etc/conf.d/net <-- 네트웍 설정
# rc-update add net.eth0 default
# nano -w /etc/hosts <-- 현재 쓰고 있는 host를 추가하자
# passwd

# emerge metalog
# rc-update add metalog default
# emerge vixie-cron
# rc-update add vixie-cron default

10.
앗 문제는 드디어 생긴다. grub을 emerge하고 설정을하자.

default 0
timeout 30
splashimage=(hd0,0)/grub/splash.xpm.gz

title=Gentoo Linux 2.4.26-r13
root (hd0,0)
kernel /kernel-2.4.26-gentoo-r13 root=/dev/ram0 init=/linuxrc ramdisk=8192 real_root=/dev/cciss/disc0/part3 vga=788
initrd /initrd-2.4.26-gentoo-r13

# emerge grub
# grub

real_root를 devfs방식으로 적자!
보통 하던데로 grub 하고 root (hd0,0)하면 "Error 21: Selected disk does not exist" 에러만 나온다...
헥? 선택한 디스크가 없다고? 이기 무슨...

몇몇 사이트를 돌아댕겨 보니 grub에서 자동적으로 하드웨어를 인식 못하는 모양이다. 그럴땐...

# grub --device-map=device.map

하고 들어갔다 나오면 /boot/grub 폴더에 device.map파일이 생긴다 그 안을보면...

(fd0) /dev/fd0

되어있는데, "(hd0) /dev/cciss/c0d0"를 추가해주자!!
그리고 해봐도...안된다. 또 열라 웹등을 뒤져서 나온 정보를 토대로 해보자. 아마도 device.map을 가지고 mtab파일을 참조하는 것 같다.

# grep ext /proc/mounts > /etc/mtab
# grub-install --root-directory=/boot /dev/cciss/c0d0
Installation finished. No error reported.
This is the contents of the device map /boot/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(fd0) /dev/fd0
(hd0) /dev/cciss/c0d0

아 기쁨과 동시에 몇 일간의 삽질을 이렇게 공개하는 것이 배가 아플뿐이다.

10.
나가자!!
# exit
# cd
# umount /mnt/gentoo/boot /mnt/gentoo/proc /mnt/gentoo
# reboot


대략 이정도인데, 가끔씩 부팅하다가 커널패닉이 생기는 이유는 커널 옵션 설정내지는 grub설정이 실패했기 때문이다. 잘살펴보고 하시라.

참고 쟁점 포스트들
http://forums.gentoo.org/viewtopic.php?t=10380&highlight=hp
http://www.mail-archive.com/sisuite-users@lists.sourceforge.net/msg00881.html
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 엽기민원

2004/12/22 12:04 2004/12/22 12:04
Response
No Trackback , No Comment
RSS :
http://yupmin.com/rss/response/37


블로그 이미지

엽기민원의 옴팡진 공간

- 엽기민원

Notices

Archives

Calendar

«   2010/03   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Site Stats

Total hits:
13186
Today:
44
Yesterday:
46