前两块猜测内容已被老师否定,若大家遇到该问题建议直接看"三、"!
目录
## 问题展示
核心流程:生产者推消息到队列,消费者消费消息然后执行任务
问题:nginx作代理时,业务启动后生产者无法发送消息,问题出于?如何配置?
## 一、错误猜想--猜想失败
### 猜想1:端口错误
Linux中,Nginx多用于监听HTTP和HTTPS请求,它默认监听的端口是80(HTTP)和443(HTTPS)。端口6379是Redis数据库的默认端口,用于处理Redis客户端的连接请求。
虽然技术上可以在Nginx中配置监听任何端口,但配置为监听6379端口并不是Nginx的标准用途。如果将Nginx配置为监听6379端口,它将尝试处理传入的连接,但由于它不是为处理Redis协议设计的,这将不会正常工作。
若需要让Nginx与Redis进行交互,通常的做法是在Nginx配置中使用ngx_http_redis_module模块(这是一个第三方模块,需要单独安装),这样Nginx可以作为反向代理将某些请求转发给Redis服务器。但Nginx仍监听其标准的HTTP/HTTPS端口,并将特定请求转发到Redis服务器的6379端口
### 猜想2:缺少location块
Nginx的配置文件中的location块不是必须的,但它是非常常见的,因为它用于定义如何响应特定的请求URI。省略了location块,Nginx将不知道如何处理传入的请求,除非在server块中使用了try_files指令或类似的指令来指定一个默认的文件或URL
## 二、尝试解决--尝试已被判定错误
### nginx配置文件修改
server{
listen 80;
server_name localhost;
location /redis {
proxy_pass http://<redis IP>:6379;
}
}
## 三、问题剖析--老师提供
Redis 本身并不直接支持通过 HTTP 协议发送和接收消息,它通常通过 TCP 连接进行通信。因此,如果生产者试图通过 HTTP 推送消息到 Redis,这本身就不是一个标准的做法。
若要强制Nginx使用http代理,要在Sentinel 或 Stunnel 情况下。若 Redis 使用了 Sentinel 并暴露了 HTTP 接口,或者通过Stunnel 提供 SSL 加密的 HTTP 接口,此时 Nginx 可以作为 HTTP 代理
## 四、nginx代理redis访问服务
### 1.目的及针对OSI模型解释
目的:
为了避免直接暴露redis端口到外部网络,将nginx配置为redis的反向代理
举例:
假设A、B俩台服务器,在同一局域网内,A服务器只能内网访问,安装了redis服务,B服务器可以外网访问,那就可以在B服务器安装nginx服务,通过nginx代理转发内网redis服务,这样可以实现临时的内网服务访问。通过nginx代理redis服务,主要使用的是nginx的stream模块
针对OSI模型的解释:
Nginx处于网络协议层(应用层),而Redis是在传输层工作的。Nginx作为代理服务器,它接收来自客户端的连接请求,然后与Redis服务器进行通信。这样,Nginx就在不直接暴露Redis端口的情况下,提供了一个安全的访问通道
### 2.nginx配置使用TCP配置作代理
IP | 负责 |
192.168.182.140 | nginx |
192.168.182.143 | redis |
- 安装stream模块--192.168.182.140
# 为nginx主机安装stream模块--源码安装使用
# ①进入nginx编译目录
cd /root/ngxin-1.24.0
# ②配置stream模块到指定目录
./configure --prefix=/opt/nginx --with-stream
# ③编译安装
make && make install
- 开启redis服务--192.168.182.143
# ①进入redis主机安装redis位置
cd /root/redis-6.2.3
# ②开启redis服务
[root@bogon redis-6.2.3]# ./src/redis-server redis.conf [root@bogon redis-6.2.3]# ./src/redis-cli 127.0.0.1:6379> auth 123456 OK
# ③开放redis6379端口或直接关闭防火箱
#开放端口访问 firewall-cmd --permanent --add-port=6379/tcp #重新加载防火墙策略 firewall-cmd --reload #关闭防火墙 systemctl stop firewalld #关闭防火墙开机自启动 systemctl disable firewalld
- 在nginx.conf配置文件中配置redis代理访问
# ①进入nginx配置文件目录
cd /opt/nginx/conf vim nginx.conf
# ② 为nginx主机配置添加redis代理,要保证我们的nginx所在的服务器能够访问redis服务器的地址和端口192.168.182.143:6379
在添加配置时请将http模块注释掉:可在vim编辑模式使用类似:"开始行数,终止行数s/^/#/g"为其批量添加注释
stream { upstream redis { # redis真实访问地址 server 192.168.182.143:6379 max_fails=3 fail_timeout=30s; } server { #外网监听地址 listen 2000; #代理连接超时时间 proxy_connect_timeout 5s; #代理超时时间 proxy_timeout 300s; #代理名称 proxy_pass redis; } }
# ③检查nginx配置文件
nginx -t
# ④重启nginx--源码安装的nginx
nginx -s reload
- 测试nginx代理访问redis
使用RedisDesktop连接工具连接nginx
点击"测试连接"查看nginx是否代理成功,能否查看redis数据库
### 3.设置redis连接密码
# 登录redis
[root@bogon redis-6.2.3]# ./src/redis-server redis.conf
[root@bogon redis-6.2.3]# ./src/redis-cl
# 设置密码
127.0.0.1:6379> config set requirepass 123456
# 重新登录
127.0.0.1:6379> auth 123456
OK