用openresty部署高并发项目

一、需要在liunx上安装openresty

1.添加仓库执行命令

yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

2.执行安装

yum install openresty -y

3.安装成功后 会在默认的目录如下:

/usr/local/openresty

4.默认已经安装好了nginx,在目录:

/usr/local/openresty/nginx 

5. 启动openresty

cd /usr/local/openresty/nginx/sbin
./nginx

6.停止openresty

./nginx -s stop

7.重启openresty

./nginx -s reload

8.测试访问

访问地址: http://ip/
用openresty部署高并发项目_第1张图片

二、DOCKER里的MySQL、REDIS部署 

1.安装docker

# yum ( Yellow dog Updater, Modified)是一个在 Fedora RedHat 以及 SUSE 中的 Shell
前端软件包管理器。
基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安
装所有依赖的软件包,无须繁琐地一次次下载、安装。
# 1 yum 包更新到最新
yum update
# 2 、安装需要的软件包, yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动
依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3 、 设置 yum
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 4 、 安装 docker ,出现输入的界面都按 y
yum install -y docker-ce
# 5 、 查看 docker 版本,验证是否安装成功
docker -v
阿里云镜像获取地址: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors ,登陆后,左侧
菜单选中镜像加速器就可以看到你的专属地址了:
用openresty部署高并发项目_第2张图片
/etc/docker/daemon.json ,文件末尾增加如下内容
{
"registry-mirrors": ["https:// 你的 ID.mirror.aliyuncs.com"]
}

 启动docker服务: systemctl start docker

2.MySQL部署

1. 搜索 mysql 镜像
docker search mysql
2. 拉取 mysql 镜像
docker pull mysql:5.7
3. 创建容器,设置端口映射、目录映射
docker run -d --name = c_mysql -p 33306 :3306 -e MYSQL_ROOT_PASSWORD = 123456 -e
MYSQL_DATABASE = dn mysql:5.7
4.   进入容器
// 开启 mysql 容器
docker exec -it c_mysql /bin/bash
// 登录 mysql
mysql -u root -p
// 赋外网访问权限
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
// 刷新权限
flush privileges;

3.Redis部署

1. 搜索 redis 镜像
docker search redis
2. 拉取 redis 镜像
docker pull redis:5.0
3. 创建容器,设置端口映射
docker run -id --name = c_redis -p 6379 :6379 redis:5.0
docker exec -it c2 /bin/bash # 进入容器
4. 内部访问 redis
redis-cli
redis-cli --raw

三、lua脚本的配置

1.实现思路-查询数据放入redis

创建 /root/lua 目录,在该目录下创建 update_content.lua : 目的就是连接 mysql 查询数据 并存储到
redis 中。
update_content.lua 代码如下:

-- 响应类型
ngx.header.content_type="application/json;charset=utf8"
-- json转换模块
local cjson = require("cjson")
-- mysql连接模块
local mysql = require("resty.mysql")
-- 获取所有请求参数
local uri_args = ngx.req.get_uri_args()
-- 获取请求参数中的id
local categoryid = uri_args["id"]

-- 创建数据库对象
local db = mysql:new()
-- 超时时间 1000毫秒
db:set_timeout(1000)
-- 连接数据库属性
local props = {
    host = "192.168.174.130",
    port = 33306,
    database = "dn",
    user = "root",
    password = "123456"
}
-- 连接数据库
local res = db:connect(props)
-- 定义查询语句
local select_sql = "select url,pic from tb_content where status ='1' and category_id='"..categoryid.."'"
res = db:query(select_sql)
db:close()

ngx.say("{\"res\":cjson.encode(res)}")

local redis = require("resty.redis")
local red = redis:new()
red:set_timeout(2000)

local ip = "192.168.174.130"
local port = 6379
red:connect(ip,port)
red:set("content_"..categoryid,cjson.encode(res))
red:close()

ngx.say("{\"flag\":true}")

修改 /usr/local/openresty/nginx/conf/nginx.conf 文件:
server {
listen 80;
server_name localhost;
location / update_content {
content_by_lua_file / root /content_lua/update_content.lua;
}
}
重启 Nginx
测试地址: http://ip/update_content?id=1
此时会将分类 ID=1 的所有广告查询出来,并存入到 Redis 缓存。

2.实现思路-redis中获取数据  

/root/lua 目录下创建 read_content.lua:
--设置响应头类型
ngx.header.content_type="application/json;charset=utf8"
--获取请求中的参数ID
local uri_args = ngx.req.get_uri_args();
local id = uri_args["id"];
--引入redis库
local redis = require("resty.redis");
--创建redis对象
local red = redis:new()
--设置超时时间
red:set_timeout(2000)
--连接
local ok, err = red:connect("192.168.174.130", 6379)
--获取key的值
local rescontent=red:get("content_"..id)
--输出到返回响应中
ngx.say(rescontent)
--关闭连接
red:close()
/usr/local/openresty/nginx/conf/nginx.conf 中配置如下:
location / read_content {
content_by_lua_file / root /content_lua/read_content.lua;
}
重启 Nginx
测试地址: http://ip/read_content?id=1
此时会将分类 ID=1 的所有广告查询出来。

3.加入openresty本地缓存

/root/lua 目录下创建 read_new_content.lua, 代码如下:

ngx.header.content_type="application/json;charset=utf8"
local uri_args = ngx.req.get_uri_args();
local categoryid = uri_args["id"];
--获取本地缓存
local cache_ngx = ngx.shared.dis_cache;
--根据ID 获取本地缓存数据
local contentCache = cache_ngx:get('content_cache_'..categoryid);

if contentCache == "" or contentCache == nil
   then
    local redis = require("resty.redis");
    local red = redis:new()
    red:set_timeout(2000)
    red:connect("192.168.174.130", 6379)
    local rescontent=red:get("content_"..categoryid);
    if ngx.null == rescontent or rescontent == ""
      then
        local cjson = require("cjson");
        local mysql = require("resty.mysql");
        local db = mysql:new();
        db:set_timeout(2000)
        local props = {
            host = "192.168.174.130",
            port = 33306,
            database = "dn",
            user = "root",
            password = "123456"
        }
        local res = db:connect(props);
        local select_sql = "select url,pic from tb_content where status ='1' and category_id='"..categoryid.."'";
        res = db:query(select_sql);
        local responsejson = cjson.encode(res);
        red:set("content_"..categoryid,responsejson);
        -- ngx.say(" === ");
        ngx.say(responsejson);
        -- ngx.say(" === ");
        -- ngx.say("{\"响应来自\":\"mysql\"}")
        db:close();
    else
        cache_ngx:set('content_cache_'..categoryid, rescontent, 10*60);
        -- ngx.say("{\"响应来自\":\"redis缓存\"}")
        ngx.say(rescontent);
    end
    red:close();
else
    ngx.say(contentCache)
    -- ngx.say("{\"响应来自\":\"nginx本地缓存\"}");
end

定义 lua 缓存命名空间,修改 nginx.conf ,添加如下代码即可:
lua_shared_dict dis_cache 128m; #是在http里
location / read_new_content {
content_by_lua_file / root /content_lua/read_new_content.lua;
}#是在server里
测试地址: http://192.168.174.130/read_new_content?id=1
此时会获取分类 ID=1 的所有广告信息。
此时手动清空 redis 中的数据,发现依然可以访问到信息。

 4.清除缓存

/root/lua目录下创建remove_content.lua,代码如下:

ngx.header.content_type="application/json;charset=utf8"
local uri_args = ngx.req.get_uri_args();
local categoryid = uri_args["id"];
--获取本地缓存
local cache_ngx = ngx.shared.dis_cache;
--清除本地缓存数据
cache_ngx:set('content_cache_'..categoryid,nil);

local redis = require("resty.redis");
local red = redis:new();
red:connect("192.168.174.130",6379);
red:set("content_"..categoryid,"");

ngx.say("{\"msg\":\"缓存被清除\"}")

nginx.conf配置

location /clear_cache {
content_by_lua_file /root/content_lua/clear_cache.lua;
}

 

四、网站首页前台工程广告轮播图展示

1.网站首页工程搭建 ,创建静态web工程 , 网站首页开发 ,部署页面

上传首页相关文件到nginx目录:/usr/local/openresty/nginx/html

用openresty部署高并发项目_第3张图片

2.访问测试

访问地址: http://ip/index.html  

你可能感兴趣的:(openresty)