Skip to main content

Command Palette

Search for a command to run...

Nginx+lua+redis实现站群,不用reload和配置

Published
1 min read

公司最近想做一个pages静态网站服务,我负责这服务器端和网站前后端的开发。

那么按照常规思路来做,就会有几个问题:

  1. 要给每一个网站建立一个config,也就是告诉nginx,这个网站的所在的root路径,域名什么的
  2. 每次配置了config,都要nginx -s reload。如何网站非常多,每次修改都要reload一下,不见得是好事

所以为了解决这个问题,于是我打算使用lua模块来动态设置 root 路径:也就是根据不同的域名(host),来设置root的路径。

要解决下面几个问题

  1. 每次修改nginx的域名等配置怎样才能不用reload?
  2. 如何根据不同的host来匹配到不同的root路径呢?

于是就要使用redis了。redis是一个非常快的key/value内存数据库,非常的快。

我们可以将 host -> /home/website 这种键对值的方式来存储不同的域名对应不同的网站路径。

于是我们重新下载和编译Nginx

./configure –prefix=/etc/nginx
–with-ld-opt=”-Wl,-rpath,/usr/local/lib”
–add-module=/root/nginx-1.9.13/ngx_devel_kit-0.2.19
–add-module=/root/nginx-1.9.13/lua-nginx-module-0.10.2
–add-module=/root/nginx-1.9.13/lua-resty-redis-0.22

Nginx加入了nginx 开发包,lua, redis lua驱动程序等模块。

完成后,在nginx加入配置:

lua_package_path “/root/nginx-1.9.13/lua-resty-redis-0.22/lib/resty/redis.lua”;

init_by_lua ‘ table = {} ‘;

server { listen 80; server_name “”; # 适配所有的域名

location / { index index.html;

可以默认的root目录

set $root ''; #'/root/test'; access_by_lua ' local host = ngx.var.host local key = "host:" .. host if table[key] == nil then -- hash表没有的话则到redis中查找 local redis = require "resty.redis" local red = redis:new() red:set_timeout(1000) local ok, err = red:connect("unix:/tmp/redis.sock")

if not ok then -- 连接失败 return else local res, err = red:get(key) if res == ngx.null or not res then return end ngx.var.root = res end else ngx.var.root = table[key] end '; root $root; } }

配置完上面的代码后,就实现了动态根据不同的域名设置不同的root路径,这一切都是动态的,不需要reload,也不需要配置重新写配置文件,也不需要频繁的连接redis(因为有table变量存储hash表来缓存redis中的内容)。

唯一需要做的,就是当用户修改了网站域名等信息时,设置一下redis的值就行了。

根据这个思路,还能实现动态路由分发(不同用户,不同域名,不同的服务器)。

最近准备换个工作,想跳到技术能力强的公司,也能学到更多东西~~深圳的邮件我呀 molisoft@qq.com

睡觉~~~

1 views

More from this blog

会有越来的多的side projects出现

什么是side project 可以理解为工作之余开发的产品,通常是收费的服务,可作为工作之外额外收入的产品。 在目前经济下行、公司开源节流(裁员)、失业率上升的大环境下,每一个程序员都应该拥有自己的side projects来对冲未来的不可靠风险。 所以side project 不仅仅是多一种「被动收入」,他也是你未来的「筹码」——工作累了,不想干了、有小孩了、买房了、家人生病了等等这些事情发生的时候,你可以「任性」一下。 而不是一些不可靠的风险出现的时候,再来提高自己的「抗风险」能力。 上面...

Jul 28, 20231 min read61

Xbox Cloud Gaming 游戏加速尝试

Xbox Cloud Gaming 游戏加速 之前有个很老的xbox游戏机,因为性能有点差劲了,所以卖了。 偶尔还是想玩玩游戏,但是老婆不让给买xbox的物理机(怀恋单身),所以含泪玩xbox cloud gaming(以下简称 xcg),xpg会员游戏还是很丰富的。 于是买了uu加速器,坦白说uu加速器不算便宜的,但是xcg在晚上高峰期,一样卡得怀疑人生,那种被马赛克糊满脸的感受,上一次这种体验还是看小姐姐的电影。 其实用uu加速器玩是ok的,就是国内的网络情况大家都知道,dddd(懂得都懂)...

Sep 5, 20221 min read258

github codespaces 在ipad上的最佳浏览器

Github Codespaces github codespaces 是github在被微软收购后,提供的一款在线web IDE,基本与vscode一致,只是运行在浏览器上而已。 而且非常土豪的提供了4核8G内存,微软就是壕。 so,通过ipad来使用codespaces就是一件比较顺其自然的事。 可是其实也没那么简单。。 IPad使用codespaces的快捷键问题 其实最大的问题就是快捷键的问题,不管你是用saferi,还是chrome,他们提供的快捷键或多或少会与你的vscode的快捷键...

Oct 8, 20211 min read59

基于binlog检查数据错误

起因 某个表的 status 「莫名其妙」变成 0 了 其实可以判断出是 status 没有被赋值,通常是结构体的 status 默认是 0 才会被插入数据库。 于是问题看起来就很简单了:只要检查相关的更新操作中的 status 字段有没有被赋值即可。 但是 这个表是用户表。 因为历史原因,源码中的更新函数很多 调用更新函数的地方也很多 无法复现该问题,测试人员也不知道做了什么操作状态变成 0 的 所以同事关注这个问题挺久了,也没看到问题原因(当然我也没看到……) 但是恰好我在做导出 bin...

Aug 5, 20212 min read61
M

Moli'blog

64 posts

曾经的少年还在吗?

Nginx+lua+redis实现站群,不用reload和配置