安装nginx同时安装redis2-nginx-module模块

本文详细介绍了如何在CentOS系统上安装Redis数据库及Nginx的Redis模块。首先通过wget下载Redis并进行编译安装,接着下载并配置Nginx及其所需的Redis模块,最后解决安装过程中可能遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装redis

wget http://download.redis.io/releases/redis-3.2.9.tar.gz

tar xzf redis-3.2.9.tar.gz

cd redis-3.2.9

make

下载nginx及其redis模块

wget -c https://nginx.org/download/nginx-1.10.1.tar.gz

 

 

接下来下载redis2-nginx-module模块

在这里下载(找了好长时间才找到)

https://github.com/openresty/redis2-nginx-module/tags

比如下载箭头所指向的那个,

 wget https://github.com/openresty/redis2-nginx-module/archive/v0.14.tar.gz

然后解压

tar -zxvf v0.14.tar.gz 

安装模块

tar -zxvf nginx-1.10.1.tar.gz

 

目前目录结构如下
 

 

 

cd nginx-1.10.1

 

接下来是重点-----编译nginx

./configure --prefix=/usr/local/nginx --with-http_ssl_module --add-module=/usr/local/redis2-nginx-module

有可能遇到这个报错,在centos上:

./configure: error: the HTTP rewrite module requires the PCRE library.

那就:

yum install pcre-devel

 

然后

make
make install

这样就安装好了

 

参考文献:

http://www.runoob.com/redis/redis-install.html

https://github.com/openresty/redis2-nginx-module/tags

http://www.linuxidc.com/Linux/2016-09/134907.htm

 

<think>我们正在处理用户关于OpenResty升级时遇到的编译错误,错误信息是redis2-nginx-module模块中函数`ngx_http_redis2_handler`的多重定义。 根据错误提示,这通常是因为同一个符号在多个地方被定义,导致链接器发现多个定义。 可能的原因: 1. 模块被重复添加:可能在配置时多次添加了同一个模块redis2-nginx-module)的不同版本或相同路径。 2. 全局变量/函数定义在头文件中:如果`ngx_http_redis2_handler`在头文件中被定义(而不是声明),并且该头文件被多个源文件包含,则会导致多重定义。 3. 编译选项变化:新版本的编译器(如GCC 10+)默认使用`-fno-common`,将全局变量视为强符号,不允许重复定义。 解决方案: 1. **检查模块依赖**:确保在配置OpenResty时没有重复添加同一个模块。例如,检查configure命令中是否多次出现`--add-module=/path/to/redis2-nginx-module`。 2. **修改模块源码**:如果问题出在模块内部,我们需要修改模块的源码,确保函数只被定义一次。通常,在头文件中使用`extern`声明函数,在源文件中定义函数。 具体到`ngx_http_redis2_handler`,我们可以在模块的源文件中查找这个函数,并检查它是否在头文件中被定义(即是否有函数体在头文件中)。如果是,则需要将头文件中的定义改为声明,并将定义移到源文件中。 3. **使用编译选项**:临时解决方案是在编译时添加`-fcommon`选项,允许重复定义(但不推荐,因为这是绕过问题,而不是解决问题)。 4. **更新模块**:检查redis2-nginx-module是否有新版本修复了该问题,如果有,则更新该模块。 根据经验,redis2-nginx-module在较新的版本中已经修复了类似问题。因此,建议更新该模块到最新版本。 具体步骤: 步骤1:更新redis2-nginx-module 如果你使用的是git clone的模块,进入模块目录,拉取最新代码: ```bash cd /path/to/redis2-nginx-module git pull origin master ``` 或者,如果你使用的是OpenResty的bundle,可以尝试更新整个OpenResty源码。 步骤2:检查配置 确保配置命令中没有重复添加模块。 步骤3:如果问题仍然存在,手动修改源码 在redis2-nginx-module的源码中,找到定义`ngx_http_redis2_handler`的地方。通常,它应该在源文件(如`ngx_http_redis2_module.c`)中定义一次,并且在头文件中只有声明(使用`extern`)。 检查头文件(如`ngx_http_redis2_module.h`)中是否有如下定义: ```c ngx_int_t ngx_http_redis2_handler(ngx_http_request_t *r); ``` 如果有函数体(即实现)在头文件中,则将其移到源文件中。 如果头文件中只有声明,那么可能是链接时发现多个目标文件中有该函数的定义。这时,检查是否同一个模块被编译了两次(比如,配置时添加了两次)。 步骤4:重新编译 清理之前的编译结果,重新编译: ```bash make clean ./configure ... # 你的配置参数 make ``` 步骤5:如果以上都不行,尝试使用`-fcommon`选项(临时) 在配置时添加: ```bash ./configure --with-cc-opt="-fcommon" ... # 其他配置 ``` 但是,请注意,这只是临时解决方案,长期来看应该修复代码。 由于用户提到是升级OpenResty,所以建议先更新所有模块到最新版本,因为新版本可能已经修复了这个问题。 参考用户提供的引用[1],建议使用OpenResty官方发布的版本,其中包含了兼容的模块组合。 因此,我们给出以下建议: 1. 更新OpenResty到最新版本(如果可能),因为最新版本可能已经修复了该问题。 2. 如果无法更新整个OpenResty,则更新redis2-nginx-module模块到最新版本。 如果用户是自己编译的,并且添加了第三方模块,那么需要确保这些模块与当前OpenResty版本兼容。 下面是一个具体的修复示例(假设需要修改源码): 在redis2-nginx-module的源码中,我们通常会在`ngx_http_redis2_module.c`文件中找到函数`ngx_http_redis2_handler`的定义。同时,在`ngx_http_redis2_module.h`中,我们应该只看到它的声明,即: ```c extern ngx_int_t ngx_http_redis2_handler(ngx_http_request_t *r); ``` 如果头文件中不小心包含了定义(即函数体),那么需要将其删除,并将函数体保留在.c文件中。 但是,根据历史经验,redis2-nginx-module的代码结构是符合规范的。因此,更可能的原因是在配置时重复添加了该模块,或者模块的版本太旧。 因此,我们优先建议更新模块。 如果用户无法更新模块,我们可以尝试以下步骤: 1. 定位到编译错误中提到的文件,比如`ngx_http_redis2_module.c`,查看该函数定义的位置(行号)。 2. 检查该函数是否被定义为static(静态函数)?如果不是,那么它会被暴露给链接器。如果同一个函数在另一个模块中也有定义(即使同一个模块被编译两次),就会导致冲突。 但是,在redis2-nginx-module中,这个函数是作为模块的处理函数,必须是非静态的,因为Nginx框架需要调用它。 所以,我们回到重复模块的问题:检查configure命令,确保没有重复添加。 示例配置命令: ```bash ./configure --prefix=/usr/local/openresty \ --with-http_ssl_module \ --add-module=/path/to/redis2-nginx-module \ # 只出现一次 ... ``` 如果用户确实只添加了一次,那么可能是该模块的多个版本被包含(比如,通过不同的路径添加了两次)。请确保路径唯一。 最后,如果确认配置没有问题,并且模块已经是最新,那么可以尝试在配置时加上`-fcommon`选项,但这只是权宜之计。 综上所述,我们推荐以下步骤: 1. 更新redis2-nginx-module到最新版本(从官方仓库拉取最新代码)。 2. 检查配置命令,确保没有重复添加模块。 3. 如果仍然报错,尝试在配置时加入`--with-cc-opt="-fcommon"`。 4. 如果还是不行,考虑升级整个OpenResty到最新版本。 注意:在升级OpenResty时,确保所有第三方模块都兼容新版本的OpenResty。 由于用户是在升级过程中遇到问题,可能是新版本的OpenResty使用了新版本的编译器(如GCC 10+),而旧模块没有及时更新。因此,更新模块是最直接的解决方案。 下面给出一个完整的操作示例: ```bash # 假设OpenResty源码目录在/usr/local/src/openresty-1.21.4.1 # 假设redis2-nginx-module在/usr/local/src/redis2-nginx-module # 步骤1:更新redis2-nginx-module cd /usr/local/src/redis2-nginx-module git pull # 步骤2:重新配置OpenResty cd /usr/local/src/openresty-1.21.4.1 ./configure --prefix=/usr/local/openresty \ --with-http_ssl_module \ --add-module=/usr/local/src/redis2-nginx-module \ ... # 其他模块 # 如果仍然报错,尝试添加-fcommon ./configure --prefix=/usr/local/openresty \ --with-cc-opt="-fcommon" \ --with-http_ssl_module \ --add-module=/usr/local/src/redis2-nginx-module \ ... # 步骤3:编译 make -j4 # 如果没有错误,则安装 make install ``` 如果更新模块后问题解决,则不需要添加`-fcommon`。 希望这些步骤能帮助用户解决问题。 最后,我们生成相关问题:</think>### OpenResty编译错误:`multiple definition of 'ngx_http_redis2_handler'`解决方案 #### 问题分析 该错误发生在编译redis2-nginx-module模块时,表明`ngx_http_redis2_handler`函数被重复定义。主要原因是: 1. **符号冲突**:函数在多个位置被定义,导致链接器无法确定使用哪个定义[^1] 2. **模块版本不兼容**:redis2-nginx-module模块与当前OpenResty版本存在兼容性问题 3. **编译选项变化**:新版本GCC(≥10)默认使用`-fno-common`,对符号重复定义更严格 #### 解决方案 ##### ✅ 方案1:更新redis2-nginx-module(推荐) ```bash # 进入模块目录 cd bundle/redis2-nginx-module # 拉取最新代码 git pull origin master # 或完全重置模块 rm -rf bundle/redis2-nginx-module git clone https://github.com/openresty/redis2-nginx-module.git bundle/redis2-nginx-module ``` ##### ✅ 方案2:修改源码(兼容旧版本) 在源文件中修复符号定义: 1. 打开文件 `ngx_http_redis2_handler.c` 2. 修改函数定义(添加`static`限定符): ```c // 修改前 ngx_int_t ngx_http_redis2_handler(ngx_http_request_t *r) { // 函数体 } // 修改后 static ngx_int_t ngx_http_redis2_handler(ngx_http_request_t *r) { // 函数体 } ``` ##### ✅ 方案3:添加编译兼容选项 ```bash # 重新配置时添加 -fcommon ./configure \ --prefix=/usr/local/openresty \ --add-module=../redis2-nginx-module \ --with-cc-opt="-O2 -fcommon" # 关键参数 # 重新编译 make clean && make -j$(nproc) sudo make install ``` ##### ✅ 方案4:检查模块冲突 确认是否重复添加模块: ```bash ./configure --help | grep redis2 # 检查模块列表 ``` 移除可能冲突的第三方模块(如多个Redis客户端模块)。 #### 完整修复流程 ```bash # 1. 更新OpenResty基础版本 wget https://openresty.org/download/openresty-1.21.4.1.tar.gz tar zxvf openresty-*.tar.gz # 2. 更新redis2模块 cd openresty-1.21.4.1/bundle git clone --depth=1 https://github.com/openresty/redis2-nginx-module.git # 3. 配置编译选项 ./configure \ --prefix=/usr/local/openresty \ --with-http_ssl_module \ --add-module=./redis2-nginx-module \ --with-cc-opt="-fcommon" # 4. 编译安装 make -j$(nproc) sudo make install ``` #### 验证安装 ```bash # 检查符号定义唯一性 nm /usr/local/openresty/nginx/sbin/nginx | grep ngx_http_redis2_handler # 预期输出(T表示唯一文本段定义): 000000000054a910 T ngx_http_redis2_handler ``` > **重要提示**:OpenResty官方强烈建议使用其捆绑的模块组合以保证兼容性[^1]。若需使用自定义模块,请确保模块与OpenResty版本匹配。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值