본문으로 건너뛰기

memcached 서버 구성 방법은 무엇인가요?

💡 요약 정리

  • memcached는 메모리 기반의 고속 캐시 서버입니다.
  • PHP 세션 공유 및 빈번한 데이터 호출 시 성능 향상에 활용됩니다.
  • 서버 설치, 설정, 실행 스크립트 작성 및 클라이언트 모듈 설정이 포함됩니다.

memcached는 이름 그대로 메모리 캐쉬서버입니다. 세션이나, 자주 쓰는 데이터를 메모리에 올려놓고, I/O 속도를 최대한 빠르게 하기 위한 시스템에서 사용되며, PHP의 세션 공유 용도로도 많이 사용합니다.

공식 웹사이트: http://memcached.org/


1. memcached 서버 구성

1) 필수 패키지 설치

[root@localhost ~]# yum install libevent-devel
[root@localhost ~]# tar -zxvf memcached-1.x.x.tar.gz
[root@localhost ~]# cd memcached-1.x.x
[root@localhost ~]# ./configure --with-libevent=/usr/lib64/
[root@localhost ~]# make && make test && make install

2) 설정 파일 작성

[root@localhost ~]# vi /etc/memcached.conf
--------------------------------------------
# run as a daemon
-d
# user to run daemon nobody/apache/www-data
-u nobody
#Memory a usar
-m 512
# default port
-p 11211
#max simultaneous connections
-c 9216
# only listen locally
#-l 127.0.0.1
--------------------------------------------

2. 실행 스크립트 및 데몬 스크립트

1) init.d 스크립트 생성

[root@localhost ~]# touch /etc/init.d/memcached
[root@localhost ~]# chmod +x /etc/init.d/memcached
------------------------------------------------------------------------
#!/bin/bash
#
# memcached     This shell script takes care of starting and stopping
#               standalone memcached.
#
# chkconfig: - 80 12
# description: memcached is a high-performance, distributed memory
#              object caching system, generic in nature, but
#              intended for use in speeding up dynamic web
#              applications by alleviating database load.
# processname: memcached
# config: /etc/memcached.conf

# Source function library.
. /etc/rc.d/init.d/functions
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/memcached
DAEMONBOOTSTRAP=/usr/local/bin/start-memcached
DAEMONCONF=/etc/memcached.conf
NAME=memcached
DESC=memcached
PIDFILE=/var/run/$NAME.pid

[ -x $DAEMON ] || exit 0
[ -x $DAEMONBOOTSTRAP ] || exit 0

RETVAL=0

start() {
     echo -n $"Starting $DESC: "
     daemon $DAEMONBOOTSTRAP $DAEMONCONF
     RETVAL=$?
     [ $RETVAL -eq 0 ] && touch $PIDFILE
     echo
     return $RETVAL
}

stop() {
     echo -n $"Shutting down $DESC: "
     killproc $NAME
     RETVAL=$?
     echo
     [ $RETVAL -eq 0 ] && rm -f $PIDFILE
     return $RETVAL
}

# See how we were called.
case "$1" in
     start)
         start
         ;;
     stop)
         stop
         ;;
     restart|reload)
         stop
         start
         RETVAL=$?
         ;;
     status)
         status $prog
         RETVAL=$?
         ;;
     *)
         echo $"Usage: $0 {start|stop|restart|status}"
         exit 1
esac

exit $RETVAL
------------------------------------------------------------------------

2) start-memcached Perl 스크립트 작성

[root@localhost ~]# touch /usr/local/bin/start-memcached
[root@localhost ~]# chmod +x /usr/local/bin/start-memcached
------------------------------------------------------------------------------
#!/usr/bin/perl -w
# start-memcached
# 2003/2004 - Jay Bonci <jaybonci@debian.org>
# This script handles the parsing of the /etc/memcached.conf file
# and was originally created for the Debian distribution.
# Anyone may use this little script under the same terms as
# memcached itself.
use strict;

if ($> != 0 and $< != 0) {
  print STDERR "Only root wants to run start-memcached.n";
  exit;
}

my $etcfile = shift || "/etc/memcached.conf";
my $params = [];
my $etchandle;

# This script assumes that memcached is located at /usr/bin/memcached, and
# that the pidfile is writable at /var/run/memcached.pid
my $memcached = "/usr/local/bin/memcached";
my $pidfile = "/var/run/memcached.pid";

# If we don't get a valid logfile parameter in the /etc/memcached.conf file,
# we'll just throw away all of our in-daemon output. We need to re-tie it so
# that non-bash shells will not hang on logout. Thanks to Michael Renner for
# the tip
my $fd_reopened = "/dev/null";

sub handle_logfile {
  my ($logfile) = @_;
  $fd_reopened = $logfile;
}

sub reopen_logfile {
  my ($logfile) = @_;
  open *STDERR, ">>$logfile";
  open *STDOUT, ">>$logfile";
  open *STDIN, ">>/dev/null";
  $fd_reopened = $logfile;
}

# This is set up in place here to support other non -[a-z] directives
my $conf_directives = {
  "logfile" => &handle_logfile
};

if (open $etchandle, $etcfile) {
  foreach my $line (<$etchandle>) {
    $line =~ s/#.*//go;
    $line = join ' ', split ' ', $line;
    next unless $line;
    next if $line =~ /^-[dh]/o;
    if ($line =~ /^[^-]/o) {
      my ($directive, $arg) = $line =~ /^(.*?)s+(.*)/;
      $conf_directives->{$directive}->($arg);
      next;
    }
    push @$params, $line;
  }
}

unshift @$params, "-u root" unless (grep $_ eq '-u', @$params);
$params = join " ", @$params;

if (-e $pidfile) {
  open PIDHANDLE, "$pidfile";
  my $localpid = <PIDHANDLE>;
  close PIDHANDLE;
  chomp $localpid;
  if (-d "/proc/$localpid") {
    print STDERR "memcached is already running.n";
    exit;
  } else {
    `rm -f $localpid`;
  }
}

my $pid = fork();
if ($pid == 0) {
  reopen_logfile($fd_reopened);
  exec "$memcached $params";
  exit(0);
} elsif (open PIDHANDLE,">$pidfile") {
  print PIDHANDLE $pid;
  close PIDHANDLE;
} else {
  print STDERR "Can't write pidfile to $pidfile.n";
}
------------------------------------------------------------------------------

3) 데몬 작동 확인 및 재시작

[root@localhost ~]# /etc/init.d/memcached restart
Shutting down memcached:                          [  OK  ]
Starting memcached:                               [  OK  ]

3. 설정 확인

[root@localhost ~]# ps ax | grep memcach
14688 pts/0    Sl     0:00 /usr/local/bin/memcached -u root -u nobody -m 512 -p 11211 -c 9216

4. 클라이언트 (Web 서버) 설정

1) memcache 모듈 설치

[root@localhost ~]# wget http://pecl.php.net/get/memcache-2.2.4.tgz
[root@localhost ~]# tar xzfv memcache-2.2.4.tgz
[root@localhost ~]# cd memcache-2.2.4
[root@localhost ~]# phpize
[root@localhost ~]# ./configure --enable-memcache
[root@localhost ~]# make
[root@localhost ~]# make install

2) php.ini 수정

[root@localhost ~]# vi /usr/local/apache/conf/php.ini
------------------------------------------------------------------------------
extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20060613/"
extension=memcache.so

[Session]
; Handler used to store/retrieve data.
;session.save_handler = files
session.save_handler = memcache
session.save_path = "tcp://192.168.0.100:11211"
------------------------------------------------------------------------------

참고한 IP 주소(192.168.0.100)는 연결할 memcached 서버의 주소에 맞게 수정해야 합니다.