您现在的位置是:主页 > news > 东莞网站制作实力乐云seo/比较靠谱的推广公司
东莞网站制作实力乐云seo/比较靠谱的推广公司
admin2025/5/3 19:00:14【news】
简介东莞网站制作实力乐云seo,比较靠谱的推广公司,做网站维护要学些什么·,宝安三网合一网站建设Nginx 连接 Redis 实现数据库操作 实现的功能:当有新的连接到达Nginx时,在redis记录连接数量。 1. redis 创建数据库 安装完成redis之后,通过set connums 0 创建数据。(redis基本使用参照官方文档即可)。 2. 更改 …
Nginx 连接 Redis 实现数据库操作
实现的功能:当有新的连接到达Nginx时,在redis记录连接数量。
1. redis 创建数据库
安装完成redis之后,通过set connums 0
创建数据。(redis基本使用参照官方文档即可)。
2. 更改 Nginx 源码
由于是要在新建连接时进行连接计数加一,因此需要在nginx accept新的连接时进行计数操作,首先找到 Nginx 处理新连接的函数所在文件nginx/src/event/ngx_event_accept.c
,在该文件中能够找到建立连接的函数为:ngx_event_accept
。在代码中添加连接redis数据库的方法以及连接计数增加的代码,新增的代码如下(省略号表示中间穿插有nginx的源码):
#include <hiredis/hiredis.h>
.........redisContext *conn = redisConnect("127.0.0.1",6379); //建立连接,都位于一台机器if(conn != NULL && conn->err){printf("connection error: %s\n",conn->errstr);return ;}......redisReply *reply = redisCommand(conn,"incr connums");//自增reply = redisCommand(conn,"get connums"); // 获取数值printf("%s\n",reply->str);freeReplyObject(reply); //释放...........redisFree(conn); //释放连接
编译nginx
由于更改了nginx源码所以需要重新编译nginx,并且由于以上的信息是通过printf
函数输出的,因此需要通过nginx配置文件的daemon off;
选项,使得printf
能够进行输出。
- 修改 daemon 选项
- 修改 Makefile 文件,进入nginx源码中,找到Makefile文件内容如下:
default: build
clean:
rm -rf Makefile objs
build:
$(MAKE) -f objs/Makefile # 可以看到makefile使用的是这个文件,因此需要去该目录下的Makefile文件中进行修改
install:
$(MAKE) -f objs/Makefile install
modules:
$(MAKE) -f objs/Makefile modules
upgrade:
/usr/local/nginx/sbin/nginx -t
kill -USR2cat /usr/local/nginx/logs/nginx.pid
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
kill -QUITcat /usr/local/nginx/logs/nginx.pid.oldbin
- 修改
nginx/obj/Makefile
,在该文件中添加-lhiredis
来实现编译。nginx/obj/Makefile
文件的前几行如下:
CC = cc
CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g
CPP = cc -E
LINK = $(CC)
因此第一反应便是将-lhiredis
加到 CFLAGS 后面,但是实践过后会发现,会报错如下:
而上图中圈起来的部分正是真真的错误原因,需要将-lhiredis
添加到 -lz
的后面,才能真正通过编译。至于原因,应该是跟Nginx的编译方式有关,有待研究。
结果
通过浏览器访问nginx页面能实现计数的自增。
问题说明
- Nginx有极好的模块化编程,这种直接更改的方式无疑会破坏Nginx的模块化,因此并不推荐,此处只是作为实验。
- 与redis的连接创建是每次有新连接到来时创建,连接处理结束时销毁,这种方式也会对Nginx的处理性能造成破坏。
- 由于是初次使用,对hiredis的连接方式以及协议等方面不够了解,使用也停留在最基本的层面,后续可以研究通过异步非阻塞的方式实现redis的连接。
- redis的自增没有在nginx重启后置0,这可以实现也可以不实现,取决于需求。
- 一次连接请求会产生两次计数,应该是nginx连接建立机制的问题,后续继续研究。