如何为生产环境的Nginx反向代理添加Memcached模块(无需重新安装Nginx)
Hey Heathz,好消息是你完全可以不用重新安装Nginx就能添加memcached模块!从你给出的nginx -V输出来看,你的Nginx已经支持动态加载模块(能看到http_xslt_module=dynamic这类带=dynamic的标识),这意味着我们可以单独编译memcached模块并动态加载它,具体步骤如下:
1. 确认当前Nginx版本
首先得获取你正在运行的Nginx版本,确保后续下载的源码版本完全一致:
nginx -v
比如输出会是 nginx version: nginx/1.24.0,记好这个版本号。
2. 准备编译环境与源码
根据你的系统安装编译依赖:
- CentOS/RHEL:
sudo yum install gcc make pcre-devel zlib-devel openssl-devel - Ubuntu/Debian:
sudo apt-get install build-essential libpcre3-dev zlib1g-dev libssl-dev
然后下载对应版本的Nginx源码包(以1.24.0为例):
wget http://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0
3. 复制现有Nginx的编译参数
执行以下命令获取当前Nginx的完整编译参数:
nginx -V 2>&1 | grep -oP 'configure arguments: \K.*'
把输出的参数复制下来,后面编译模块会用到。
4. 编译memcached动态模块
在源码目录下执行./configure,粘贴刚才复制的编译参数,再加上--with-http_memcached_module=dynamic(指定编译成动态模块):
./configure [这里粘贴你复制的原有参数] --with-http_memcached_module=dynamic
比如如果原有参数是--prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx ...,那完整命令就是:
./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx ... --with-http_memcached_module=dynamic
然后执行模块编译(不要执行make install,避免覆盖现有Nginx):
make modules
编译完成后,会在objs目录下生成ngx_http_memcached_module.so文件。
5. 部署并加载模块
先把编译好的模块文件复制到Nginx的模块目录(不同系统路径可能不同,你可以通过nginx -V看--modules-path参数的值,默认比如/usr/lib/nginx/modules/):
sudo cp objs/ngx_http_memcached_module.so /usr/lib/nginx/modules/
然后编辑Nginx的主配置文件nginx.conf,在文件最顶部添加加载模块的指令:
load_module modules/ngx_http_memcached_module.so;
6. 验证并重启Nginx
先检查配置文件是否合法:
sudo nginx -t
如果输出nginx: configuration file /etc/nginx/nginx.conf test is successful,就可以安全重启Nginx:
sudo systemctl restart nginx
最后验证模块是否成功加载,执行你之前用的命令:
nginx -V 2>&1 | tr -- - '\n' | grep memcached
如果看到http_memcached_module=dynamic,就说明模块已经成功添加啦!
生产环境注意事项
- 建议先在测试环境完整走一遍流程,确认没问题再操作生产环境;
- 操作前备份好Nginx的配置文件,避免出现意外;
- 编译时一定要保证原有参数完全一致,否则模块可能无法正常加载。
备注:内容来源于stack exchange,提问作者Heathz

