Memcached 是一个高性能的分布式内存缓存系统,主要用于加速动态Web应用(如数据库查询结果、API调用结果等)的响应速度,与Redis类似,默认情况下都不启用鉴权措施,只要网络可达即可访问,但Redis可以通过修改配置文件requirepass参数快速配置密码认证,而Memcached默认无鉴权配置,需要通过SASL来实现鉴权。
1、Memcached安装
我这里基于RockyLinux8.x系统,通过默认的yum源来安装memcached(当前版本为1.5.22),除此之外你也可以自行选择编译安装。
|
1 |
dnf install memcached -y |
2、配置文件讲解
安装成功后,默认的memcached配置文件在/etc/sysconfig/memcached
PORT="11211",指定memcached监听的端口,默认是11211。
USER="memcached",指定memcached服务运行的用户,默认为memcached。
MAXCONN="1024",最大同时连接数,默认值为1024。
CACHESIZE="64",设置memcached使用的内存大小,默认是64MB。
OPTIONS="-l 127.0.0.1,::1",其他选项,默认是指定监听的IP地址,默认监听IPv4和IPv6的回环地址,除此之外也可以设置-S(SASL认证)、-v(详细输出)、-vv(更详细的输出)等。如不需要UDP,可以设置成OPTIONS="-U 0"。
3、启动服务
|
1 |
systemctl start memcached |
4、SASL鉴权认证配置
默认情况下,建议仅监听本机,特殊情况下,一定要暴露出去的,可通过设置防火墙白名单策略以及SASL鉴权认证,我这里重点来说下SASL鉴权认证配置方法。
首先查看当前memcached是否支持SASL,检查动态库依赖,如果输出中包含libsasl2库,则支持SASL。
|
1 |
ldd $(which memcached) | grep sasl |
注:如果你的memcached是编译的,则在编译时候需要增加--enable-sasl参数。
5、安装SASL管理工具
|
1 |
dnf install cyrus-sasl -y |
6、创建SASL配置文件
|
1 |
vi /etc/sasl2/memcached.conf |
|
1 2 3 |
mech_list: plain log_level: 5 sasldb_path: /etc/sasldb2 |
配置项含义是,SASL使用的认证机制为plain(明文认证),SASL日志级别为5,指定SASL用户数据文件。
7、为memcached服务创建SASL用户密码
|
1 |
saslpasswd2 -a memcached -c mem |
注1:执行后会提示你输入密码(两次确认),密码会被加密存储在SASL的密码数据库中(/etc/sasldb2),创建的用户可用于Memcached的SASL认证。
注2:saslpasswd2是SASL密码设置工具,通过-a指定memcached服务名称,-c创建用户,我这里使用的用户名是mem。
8、查看用户是否创建成功
|
1 |
sasldblistusers2 |
9、配置文件权限
|
1 |
chown :memcached /etc/sasldb2 |
10、配置Memcached启用SASL认证
|
1 |
vi /etc/sysconfig/memcached |
|
1 2 3 4 5 |
PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-S" |
注:OPTIONS设置为-S就表示开启SASL鉴权认证。
11、重启memcached
|
1 |
systemctl restart memcached |
12、测试验证
我这里通过一段python代码进行验证,当前python版本为3.6.8,pip 9.0.3 from /usr/lib/python3.6/site-packages (python 3.6),如果python版本不同,有可能导致以下python代码报错,请自行调整修改,此处不做过多说明。
安装pip3及bmemcached包
|
1 2 |
dnf install python3-pip pip3 install python-binary-memcached --user |
创建py文件并运行以下python3代码
|
1 |
vi test.py |
|
1 2 3 |
import bmemcached c = bmemcached.Client(['127.0.0.1:11211'], 'mem', 'whsir') print(c.stats()) |
注:我这里的用户是mem,密码为whsir。
执行python3 test.py,正常将返回以下内容
|
1 |
{'127.0.0.1:11211': {'pid': b'1117477', 'uptime': b'2105', 'time': b'1763272984', 'version': b'1.5.22', 'libevent': b'2.1.8-stable', 'pointer_size': b'64', 'rusage_user': b'0.237511', 'rusage_system': b'0.154903', 'max_connections': b'1024', 'curr_connections': b'2', 'total_connections': b'20', 'rejected_connections': b'0', 'connection_structures': b'3', 'reserved_fds': b'20', 'cmd_get': b'7', 'cmd_set': b'7', 'cmd_flush': b'0', 'cmd_touch': b'0', 'cmd_meta': b'0', 'get_hits': b'6', 'get_misses': b'1', 'get_expired': b'0', 'get_flushed': b'0', 'delete_misses': b'0', 'delete_hits': b'0', 'incr_misses': b'0', 'incr_hits': b'0', 'decr_misses': b'0', 'decr_hits': b'0', 'cas_misses': b'0', 'cas_hits': b'0', 'cas_badval': b'0', 'touch_hits': b'0', 'touch_misses': b'0', 'auth_cmds': b'18', 'auth_errors': b'1', 'bytes_read': b'2273', 'bytes_written': b'62613', 'limit_maxbytes': b'67108864', 'accepting_conns': b'1', 'listen_disabled_num': b'0', 'time_in_listen_disabled_us': b'0', 'threads': b'4', 'conn_yields': b'0', 'hash_power_level': b'16', 'hash_bytes': b'524288', 'hash_is_expanding': b'0', 'slab_reassign_rescues': b'0', 'slab_reassign_chunk_rescues': b'0', 'slab_reassign_evictions_nomem': b'0', 'slab_reassign_inline_reclaim': b'0', 'slab_reassign_busy_items': b'0', 'slab_reassign_busy_deletes': b'0', 'slab_reassign_running': b'0', 'slabs_moved': b'0', 'lru_crawler_running': b'0', 'lru_crawler_starts': b'2040', 'lru_maintainer_juggles': b'3284', 'malloc_fails': b'0', 'log_worker_dropped': b'0', 'log_worker_written': b'0', 'log_watcher_skipped': b'0', 'log_watcher_sent': b'0', 'bytes': b'72', 'curr_items': b'1', 'total_items': b'7', 'slab_global_page_pool': b'0', 'expired_unfetched': b'0', 'evicted_unfetched': b'0', 'evicted_active': b'0', 'evictions': b'0', 'reclaimed': b'0', 'crawler_reclaimed': b'0', 'crawler_items_checked': b'2', 'lrutail_reflocked': b'0', 'moves_to_cold': b'6', 'moves_to_warm': b'0', 'moves_within_lru': b'0', 'direct_reclaims': b'0', 'lru_bumps_dropped': b'0'}} |
如果密码错误将会返回以下内容
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Traceback (most recent call last): File "mem.py", line 3, in <module> print(c.stats()) File "/root/.local/lib/python3.6/site-packages/bmemcached/client/mixin.py", line 112, in stats returns[server.server] = server.stats(key) File "/root/.local/lib/python3.6/site-packages/bmemcached/protocol.py", line 955, in stats self._send(packed) File "/root/.local/lib/python3.6/site-packages/bmemcached/protocol.py", line 267, in _send self._open_connection() File "/root/.local/lib/python3.6/site-packages/bmemcached/protocol.py", line 159, in _open_connection self._send_authentication() File "/root/.local/lib/python3.6/site-packages/bmemcached/protocol.py", line 342, in _send_authentication raise MemcachedException('Code: %d Message: %s' % (status, extra_content), status) bmemcached.exceptions.MemcachedException: ("Code: 32 Message: b'Auth failure.'", 32) |
原文链接:Memcached安装配置与SASL鉴权,转载请注明来源!






