J'ai essayé d'ajouter de la manière -l 11211 -l 11212 dans le fichier conf memcached. Mais il écoute juste le premier, c'est-à-dire 1121
Voici ce que memcached dit que le -l
commande est pour:
-l <addr> interface to listen on (default: INADDR_ANY, all addresses)
<addr> may be specified as Host:port. If you don't specify
a port number, the value you specified with -p or -U is
used. You may specify multiple addresses separated by comma
or by using -l multiple times
Tout d'abord, vous devez spécifier l'interface sur laquelle vous souhaitez que memcached écoute si vous utilisez le -l
drapeau. Utilisation 0.0.0.0
pour toutes les interfaces et utilisez 127.0.0.1
est que vous voulez juste pouvoir accéder à memcached à partir de localhost
. Deuxièmement, n'utilisez pas deux -l
drapeaux. N'utilisez qu'une seule et séparez chaque adresse par une virgule. La commande ci-dessous devrait faire ce que vous voulez.
memcached -l 0.0.0.0:11211,0.0.0.0:11212
Gardez à l'esprit que cela aura une écoute memcached sur deux ports. Pour avoir deux instances memcached sur une machine, exécutez ces deux commandes.
memcached -p 11211 -d
memcached -p 11212 -d
J'ai d'abord utilisé la solution de mikewied, mais j'ai ensuite rencontré le problème du démarrage automatique du démon. Une autre chose déroutante dans cette solution est qu'elle n'utilise pas la configuration de etc. J'étais sur le point de créer mes propres scripts de démarrage dans /etc/init.d mais j'ai ensuite regardé dans le fichier /etc/init.d/memcached et vu cette belle solution
# Usage:
# cp /etc/memcached.conf /etc/memcached_server1.conf
# cp /etc/memcached.conf /etc/memcached_server2.conf
# start all instances:
# /etc/init.d/memcached start
# start one instance:
# /etc/init.d/memcached start server1
# stop all instances:
# /etc/init.d/memcached stop
# stop one instance:
# /etc/init.d/memcached stop server1
# There is no "status" command.
Fondamentalement, les lecteurs de cette question ont juste besoin de lire le /etc/init.d/memcached
fichier.
À votre santé
La réponse de David Dzhagayev est la meilleure. Si vous n'avez pas la bonne version du script d'initialisation memcache, voici celle dont il parle:
Cela devrait fonctionner avec n'importe quelle distribution Linux utilisant init.
#! /bin/bash
### BEGIN INIT INFO
# Provides: memcached
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Should-Start: $local_fs
# Should-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start memcached daemon
# Description: Start up memcached, a high-performance memory caching daemon
### END INIT INFO
# Usage:
# cp /etc/memcached.conf /etc/memcached_server1.conf
# cp /etc/memcached.conf /etc/memcached_server2.conf
# start all instances:
# /etc/init.d/memcached start
# start one instance:
# /etc/init.d/memcached start server1
# stop all instances:
# /etc/init.d/memcached stop
# stop one instance:
# /etc/init.d/memcached stop server1
# There is no "status" command.
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/memcached
DAEMONNAME=memcached
DAEMONBOOTSTRAP=/usr/share/memcached/scripts/start-memcached
DESC=memcached
test -x $DAEMON || exit 0
test -x $DAEMONBOOTSTRAP || exit 0
set -e
. /lib/lsb/init-functions
# Edit /etc/default/memcached to change this.
ENABLE_MEMCACHED=no
test -r /etc/default/memcached && . /etc/default/memcached
FILES=(/etc/memcached_*.conf)
# check for alternative config schema
if [ -r "${FILES[0]}" ]; then
CONFIGS=()
for FILE in "${FILES[@]}";
do
# remove prefix
NAME=${FILE#/etc/}
# remove suffix
NAME=${NAME%.conf}
# check optional second param
if [ $# -ne 2 ];
then
# add to config array
CONFIGS+=($NAME)
Elif [ "memcached_$2" == "$NAME" ];
then
# use only one memcached
CONFIGS=($NAME)
break;
fi;
done;
if [ ${#CONFIGS[@]} == 0 ];
then
echo "Config not exist for: $2" >&2
exit 1
fi;
else
CONFIGS=(memcached)
fi;
CONFIG_NUM=${#CONFIGS[@]}
for ((i=0; i < $CONFIG_NUM; i++)); do
NAME=${CONFIGS[${i}]}
PIDFILE="/var/run/${NAME}.pid"
case "$1" in
start)
echo -n "Starting $DESC: "
if [ $ENABLE_MEMCACHED = yes ]; then
start-stop-daemon --start --quiet --exec "$DAEMONBOOTSTRAP" -- /etc/${NAME}.conf $PIDFILE
echo "$NAME."
else
echo "$NAME disabled in /etc/default/memcached."
fi
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --oknodo --retry 5 --pidfile $PIDFILE --exec $DAEMON
echo "$NAME."
rm -f $PIDFILE
;;
restart|force-reload)
#
# If the "reload" option is implemented, move the "force-reload"
# option to the "reload" entry above. If not, "force-reload" is
# just the same as "restart".
#
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --oknodo --retry 5 --pidfile $PIDFILE
rm -f $PIDFILE
if [ $ENABLE_MEMCACHED = yes ]; then
start-stop-daemon --start --quiet --exec "$DAEMONBOOTSTRAP" -- /etc/${NAME}.conf $PIDFILE
echo "$NAME."
else
echo "$NAME disabled in /etc/default/memcached."
fi
;;
status)
status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $?
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload|status}" >&2
exit 1
;;
esac
done;
exit 0
Solution simple pour Centos 6
Première copie /etc/sysconfig/memcached
à /etc/sysconfig/memcached2
et écrivez de nouveaux paramètres dans le nouveau fichier.
Copiez ensuite /etc/init.d/memcached
à /etc/init.d/memcached2
et modifiez le nouveau fichier:
/etc/sysconfig/memcached2
, donc on le fait juste au cas où)/etc/sysconfig/memcached
à /etc/sysconfig/memcached2
/var/run/memcached/memcached.pid
à /var/run/memcached/memcached2.pid
/var/lock/subsys/memcached
à /var/lock/subsys/memcached2
Vous pouvez maintenant utiliser service memcached2 start
, service memcached2 stop
etc. N'oubliez pas chkconfig memcached2 on
pour l'exécuter lorsque la machine démarre.
D'accord, très bonne réponse, Tristan CHARBONNIER. Veuillez remplacer le code dans le fichier/usr/share/memcached/scripts/start-memcached:
#!/usr/bin/Perl -w
# start-memcached
# 2003/2004 - Jay Bonci
# 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 $params; my $etchandle; my $etcfile = "/etc/memcached.conf";
# 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/bin/memcached";
my $pidfile = "/var/run/memcached.pid";
if (scalar(@ARGV) == 2) {
$etcfile = shift(@ARGV);
$pidfile = shift(@ARGV);
}
# 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 ||= "";
$line =~ s/\#.*//g;
$line =~ s/\s+$//g;
$line =~ s/^\s+//g;
next unless $line;
next if $line =~ /^\-[dh]/;
if($line =~ /^[^\-]/)
{
my ($directive, $arg) = $line =~ /^(.*?)\s+(.*)/;
$conf_directives->{$directive}->($arg);
next;
}
Push @$params, $line;
}
}else{
$params = [];
}
Push @$params, "-u root" unless(grep "-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);
}else{
if(open PIDHANDLE,">$pidfile")
{
print PIDHANDLE $pid;
close PIDHANDLE;
}else{
print STDERR "Can't write pidfile to $pidfile.\n";
}
}
Au cas où quelqu'un d'autre tomberait sur cette question, il y a un bug sur la distribution debian de memcached (ce qui signifie que les saveurs comme Ubuntu seraient également affectées).
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=784357
En raison de ce bogue, même lorsque vous disposez de fichiers de configuration distincts, lorsque vous exécutez Sudo service memcached restart
, seul le fichier de configuration par défaut dans /etc/memcached.conf
sera chargé.
Comme mentionné dans le commentaire ici , la solution temporaire est de
Retirer /lib/systemd/system/memcached.service
Courir Sudo systemctl daemon-reload
(ne vous inquiétez pas, vous pouvez le faire en toute sécurité)
Enfin, exécutez Sudo service memcached restart
si vous êtes d'accord pour perdre toutes les informations de cache. Sinon, exécutez Sudo service memcached force-reload
dans /etc/memcached.conf, vous pouvez simplement modifier comme ci-dessous
-l 192.168.112.22,127.0.0.1
doit utiliser virgule entre deux adresses IP