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 即可。