这个综合实验实现的功能其实很简单,用户访问一个页面,显示一个默认页面。输入参数(post或者get都可以),如果参数在数据库查询得到并满足一定条件,根据数据库记录的类型调转到不同页面,并记录下访问者的IP并记录到数据库,参数不符合要求返回默认页面。

其实也就用到之前记录下的那些功能点,这个实验也就被用在本网的www入口

用图说话,具体流程:

webFlowsheet.png

简单的说,其实就是先看session有无记录,没有看传入参数后先查redis有无记录,没有则查mysql,查完mysql数据处理后都缓存回redis,那么下次再查该数据就可以在redis查到了。至于获取数据后处理完毕都是经过rabbitMQ发送消息再由python写入mysql。
lua程序只有第一次读取该数据的时候需要操作mysql,其他情况都是只操作redis和rabbitMQ。确保lua的高性能得以发挥。

程序目录是如下:

/home/lua/
└── homePage
    ├── access.lua
    ├── assets
    │   ├── css
    │   │   ├── error-style.css
    │   │   ├── index-style.css
    │   │   └── style.css
    │   └── favicon.ico
    ├── channelOne.lua
    ├── channelTwo.lua
    ├── common
    │   ├── getArgs.lua
    │   ├── getIp.lua
    │   ├── myRabbitmq.lua
    │   ├── myRedis.lua
    │   └── mysqlPool.lua
    ├── config
    │   └── config.lua
    ├── error.lua
    ├── index.lua
    ├── router.lua
    └── view
        ├── channelOne.html
        ├── channelTwo.html
        ├── error.html
        ├── footer.html
        ├── header.html
        └── index.html

assets 文件夹下放置静态资源文件
view 是页面的视图,使用了template这个库
common 是一些封装好的方法
access.lua 是入口鉴权
router 只是简单的根据鉴权结果分配到不同的页面
index.lua,error.lua,channelOne.luachannelTwo.lua 都是些简单的页面

用到的lua库有

/usr/local/openresty/lualib/resty/
├── template.lua
├── upload.lua
├── mysql.lua
├── rabbitmqstomp.lua
├── redis.lua
├── session

主要的 nginx 配置

http
    {
        lua_package_path "/usr/local/openresty/lualib/?.lua;/home/lua/?.lua;";
        lua_package_cpath "/usr/local/openresty/lualib/?.so;";
        lua_shared_dict limit 10m;
        lua_shared_dict jsjump 10m;

server
    {
        listen 80 default_server;
        server_name localhost;
        set $SERVER_DIR homePage;
        set $BASE_PATH /home/lua/$SERVER_DIR;
        set $template_root $BASE_PATH/view;

        location / {
            default_type text/html;  
            lua_code_cache on;
            access_by_lua_file $BASE_PATH/access.lua;
            content_by_lua_file $BASE_PATH/router.lua;
        }

        location @error {
            default_type text/html;  
            lua_code_cache on;
            content_by_lua_file $BASE_PATH/error.lua;
        }

        location ~ .*.(js|css|woff|ttf|svg|ico)$ {
            root $BASE_PATH/assets;
        }
}

另外还有python程序

/home/python/
├── IPGetPlaceDaemon
│   ├── config.cfg
│   ├── daemon.py
│   └── ipGetPlace.py
└── RedisSyncMysqlDaemon
    ├── config.cfg
    ├── daemon.py
    └── redisSyncMysql.py