javashop-6.5版本中将访问量比较高的页面(商城首页、商品详情页面、帮助中心)生成静态页时生成到redis缓存中,当访问这些页面的时候将会直接在redis中读取这些页面,这样做大大减轻了服务器的负担。所以,为了配合此功能的实现,需要在nginx中引入redis、lua等模块。Javashop采用 Redis + NGINX + LUA 的分页式静态页存储方案,选用OpenResty为NGINX +LUA的部署套件。

1、目录规划

路径 说明
/opt/ 存放软件包
/usr/local/openresty Openresty安装目录

2、OpenResty及Redis+lua连接池的安装

yum install -y git  //安装git支持

cd /opt             //进入软件存放包路径

git clone https://code.aliyun.com/javashop/resty-redis-cluster.git    //下载Openresty套件

chmod a+x resty-redis-cluster/install-openresty.sh     //赋予权限

resty-redis-cluster/install-openresty.sh     //进行Openresty套件的安装

cp -r resty-redis-cluster/lib/* /usr/local/openresty/nginx/lua    //替换脚本

注:OpenResty的默认安装目录为/usr/local/openresty/,安装完之后,nginx、lua等均已经安装成功

一、其中:
1、/usr/local/openresty/nginx/lua/single_connector_pc.lua 为PC端lua脚本。

2、/usr/local/openresty/nginx/lua/single_connector_wap.lua 为WAP端lua脚本。

3、/usr/local/openresty/nginx/lua/clusterconnector_pc.lua 为集群版本PC端lua脚本。

4、/usr/local/openresty/nginx/lua/clusterconnector_wap.lua 为集群版本WAP端lua脚本。

3、标准版配置静态页输出节点

一、分别修改single_connector_pc.lua、single_connector_wap.lua脚本中的相关信息为实际redis所在服务器的IP信息及密码,

vi /usr/local/openresty/nginx/lua/single_connector_pc.lua

local ok, err = red:connect("127.0.0.1", 6379)

local res, err = red:auth("password")

vi /usr/local/openresty/nginx/lua/single_connector_wap.lua

local ok, err = red:connect("127.0.0.1", 6379)

local res, err = red:auth("password")

如果redis没有密码,删掉以下配置:

local res, err = red:auth("password")
if not res then
    ngx.say("failed to authenticate: ", err)
    return
end

4、集群版版配置静态页输出节点

修改clusterconnector_pc.lua、clusterconnector_wap.lua中的serv_list片段,将各个服务器的redis所在的IP以及端口编写正确。

    serv_list = {                          
        { ip = "ip", port = port },
        { ip = "ip", port = port }
    },

5、配置nginx.config

vi /usr/local/openresty/nginx/conf/nginx.conf     //nginx配置文件位置

修改lua支持,在http节点中加入下面的配置

如果是集群版,请使用clusterconnector_pc.lua clusterconnector_wap.lua 脚本。
lua_shared_dict redis_cluster_slot_locks 100k;


    #修改nginx的转发,此处配置pc域名,v64test.javamall.com.cn为PC端域名
    server {
        listen       80;
        server_name  v64test.javamall.com.cn;   
        location /{ 
            set $isapi "";

            #如果匹配到静态资源,则交由本机82端口处理。    
            if ( $uri ~* "\.(gif|jpg|jpeg|png|css|js|ico)$" ){
                proxy_pass http://127.0.0.1:82;
                set $isapi "no";
                break;
            }

        #如果uri匹配到商家中心首页,则交由Tomcat进行处理,因为此页面虽然以index.html,但却是商家中心页面,所以需要单独配置
         if ( $uri ~* "/store_themes/(\d+)/index.html" ){
            #如果转发到其他服务器请填写内网ip,否则填写你tomcat的ip内网访问地址+端口
            proxy_pass http://10.44.184.80:8086 ;
                break;
            }

        #这里代表使用lua响应内容。如果uri匹配到首页、商品详情页、帮助中心页面,则交由83端口处理

            if ( $uri ~* "/index.html|/goods-(\d+).html|/help-(\d+)-(\d+).html" ){
                proxy_pass http://127.0.0.1:83;
                set $isapi "no";
                break;
            }

        #如果不是以上页面,则交由Tomcat进行处理,转发到其他服务器请填写内网ip,否则则填写web项目的内网IP访问地址+端口
            proxy_pass http://10.44.184.80:8086;              
            proxy_redirect    off;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_set_header Cookie $http_cookie;        
        }

    }

    #静态资源端口
     server {
        listen       82;
        server_name  localhost;
        location / {

       #注意:需要将静态资源放至下面目录,为防止某些特殊的静态资源访问不到。
       #将war包中的(adminthemes、cms、core、index、install、selector、statics、themes、ueditor)直接解压至此
           root /opt/statics;
        }
     }

   #新建静态页输出节点,content_by_lua_file为lua脚本实际路径。
   server {
        listen       83;
        server_name  localhost; 
        location / {
           default_type text/html;
           content_by_lua_file "/usr/local/openresty/nginx/lua/single_connector_pc.lua";  
        }
    }

 }

     #此处配置wap的域名 
      server {
        listen       80;
        server_name   m.v64test.javamall.com.cn;
        #这里代表使用lua响应wap内容。如果uri匹配到首页、商品详情页、帮助中心页面,则交由84端口处理 
        location / {
            if ( $uri ~* "/index.html|/goods-(\d+).html|/help-(\d+)-(\d+).html" ){
                proxy_pass http://127.0.0.1:85;
                set $isapi "no";
                break;
            }              
        #如果转发到其他服务器请填写内网ip,否则则填写你tomcat访问地址:端口
            proxy_pass http://10.44.184.80:8086;
            proxy_redirect    off;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_set_header Cookie $http_cookie;     
        }
     }
    #wap静态页输出节点 ,content_by_lua_file为lua脚本实际路径
    server {
        listen 85;
        server_name localhost;
        location / {
            default_type text/html;
            content_by_lua_file "/usr/local/openresty/nginx/lua/single_connector_wap.lua";  
        }
    }

6、nginx优化(此步骤仅供参考,可根据实际情况进行优化)

worker_processes  2;
events {
    worker_connections  65535; 
    use epoll;
}

备注:worker_processes 调整为机器CPU核数

7、测试

启动nginx:   /usr/local/openresty/nginx/sbin/nginx
重起nginx:  /usr/local/openresty/nginx/sbin/nginx -s reload

其他

如果配置阿里云的redis,在nginx的配置文章建中的http{}部分条件一行 resolver 8.8.8.8 即可。

results matching ""

    No results matching ""