docker-compose.yml
version: '3'
services:
redis:
image: redis
# restart: always
ports:
- "6379:6379"
volumes:
- /root/docker/redis/data:/data
container_name: "redis"
networks:
- dev
mongo:
image: mongo
# restart: always
ports:
- "27017:27017"
volumes:
- /root/docker/mongo/db:/data/db
container_name: "mongo"
networks:
- dev
tracker:
image: morunchang/fastdfs #基于file出来的镜像
container_name: "tracker" #新建容器名字
command: sh tracker.sh
# restart: always
network_mode: host
storage:
image: morunchang/fastdfs
container_name: "storage" #新建容器名字
environment:
- TRACKER_IP=你的ip:22122 #自己Linux地址
- GROUP_NAME=xiaohong #自己定义名字,但是nginx中也要改
command: sh storage.sh
# restart: always
network_mode: host
elasticsearch-head:
image: mobz/elasticsearch-head:5
# restart: always
ports:
- "9100:9100"
container_name: "elasticsearch-head"
networks:
- dev
# kibana:
# image: kibana
# restart: always
# ports:
# - "5601:5601"
# environment:
# - elasticsearch_url=http://你的ip:9200
# depends_on:
# - elasticsearch
# container_name: "kibana"
# networks:
# - dev
canal:
image: docker.io/canal/canal-server
# restart: always
ports:
- "11111:11111"
container_name: "canal"
networks:
- dev
rabbitmq:
image: rabbitmq
# restart: always
ports:
- "15672:15672"
- "4369:4369"
- "5671:5671"
- "5672:5672"
- "15671:15671"
- "25672:25672"
environment:
- RABBITMQ_DEFAULT_VHOST=my_vhost #主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名)
- RABBITMQ_DEFAULT_USER=admin #登录用户名
- RABBITMQ_DEFAULT_PASS=admin #登录密码
container_name: "rabbitmq"
networks:
- dev
elasticsearch:
image: yaoguoh/elasticsearch-ik-pinyin
# restart: always
ports:
- "9200:9200"
- "9300:9300"
environment:
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
# volumes:
# - /root/docker/elasticsearch/data:/usr/share/elasticsearch/data
# - /root/docker/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
container_name: "elasticsearch"
networks:
- dev
# nginx:
# image: nginx
# # restart: always
# container_name: nginx
# environment:
# - TZ=Asia/Shanghai
# ports:
# - "80:80"
# - "443:443"
# volumes:
# - /usr/local/nginx/conf.d:/etc/nginx/conf.d
# - /usr/local/nginx/log:/var/log/nginx
# - /usr/local/nginx/www:/etc/nginx/html
# - /etc/letsencrypt:/etc/letsencrypt
# networks:
# - dev
mysql:
image: mysql
# restart: always
container_name: "mysql"
environment:
MYSQL_ROOT_PASSWORD: root
command:
--max_connections=1000
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--default-authentication-plugin=mysql_native_password
ports:
- 3306:3306
volumes:
- /root/docker/mysql:/var/lib/mysql
networks:
- dev
web:
image: tomcat
# restart: always
volumes:
- /root/docker/tomcat/webapps:/usr/local/tomcat/webapps
- /root/docker/tomcat/conf:/usr/local/tomcat/conf
#8080端口被storage占用了
ports:
- "8081:8080"
container_name: "tomcat"
networks:
- dev
- pro
networks:
dev:
driver: bridge
pro:
driver: bridge
还需配置的步骤
进入storage的容器内部,修改nginx.conf
docker exec -it storage /bin/bash
进入后
vi /etc/nginx/conf/nginx.conf
找到以下内容
location ~ /M00 {
root /data/fast_data/data;
ngx_fastdfs_module;
}
在里面在加一段,禁止缓存
add_header Cache-control no-store;
退出容器
exit
重启storage容器
docker restart storage
安装lua
//版本去官网看
curl -R -O http://www.lua.org/ftp/lua-5.x.x.tar.gz
tar zxf lua-5.x.x.tar.gz
cd lua-5.x.x
make linux test
make install
yum install libtermcap-devel ncurses-devel libevent-devel readline-devel
安装Openresty
yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install openresty
如果openresty安装好了,在/usr/local下会看到一个文件夹名叫openresty
打开文件夹会看到一个nginx文件夹,因为openresty内部集成了nginx
先修改nginx.conf再启动nginx试试看能不能用
vi /usr/local/openresty/nginx/conf/nginx.conf
启动nginx
/usr/local/openresty/nginx/sbin/nginx
浏览器输入自己的网站测试
如果是这页面就成功了
创建lua缓存脚本
在/root/lua目录下创建content_update.lua ,实现连接mysql 查询数据 并存储到redis中。
ngx.header.content_type="application/json;charset=utf8"
local cjson = require("cjson")
local mysql = require("resty.mysql")
local uri_args = ngx.req.get_uri_args()
local id = uri_args["id"]
local db = mysql:new()
db:set_timeout(1000)
local props = {
host = "xx.xxx.xx.xx",
port = 3306,
database = "changgou_content",
user = "root",
password = "root"
}
local res = db:connect(props)
local select_sql = "select url,pic from tb_content where status ='1' and category_id="..id.." order by sort_order"
res = db:query(select_sql)
db:close()
local redis = require("resty.redis")
local red = redis:new()
red:set_timeout(2000)
local ip ="xx.xxx.xx.xx"
local port = 6379
red:connect(ip,port)
red:set("content_"..id,cjson.encode(res))
red:close()
ngx.say("{flag:true}")
其他的数据库也一样自己修改
再修改/usr/local/openresty/nginx/conf/nginx.conf文件,在里面添加一段
location /ad_update {
content_by_lua_file /root/lua/ad_update.lua;
}
重启nginx测试
/usr/local/openresty/nginx/sbin/nginx -s reload
打开redis查看是否有数据
如果有则清空
现在发起请求测试数据
如果看到这个
还有这个
那就稳了
创建lua读取缓存脚本
在/root/lua目录下创建content_read.lua
ngx.header.content_type="application/json;charset=utf8"
local uri_args = ngx.req.get_uri_args(); -- 获取uri中的所有参数
local id = uri_args["id"]; -- 获取名为id的参数
--获取本地缓存
local cache_ngx = ngx.shared.dis_cache; -- 加载Nginx缓存模块,需要先定义
--根据ID 获取本地缓存数据
local contentCache = cache_ngx:get('content_cache_'..id);
--[[
Nginx中有缓存就输出缓存,没有的话就从Redis中加载
--]]
if contentCache == "" or contentCache == nil then
local redis = require("resty.redis"); -- 依赖Redis模块
local red = redis:new() -- 创建Redis对象
red:set_timeout(2000) -- 超时
red:connect("xx.xxx.xx.xx", 6379) -- 连接Redis
local rescontent=red:get("content_"..id); -- 从Redis中读数据
-- Redis中没有就从MySQL中加载
if ngx.null == rescontent then
local cjson = require("cjson"); -- 依赖json模块
local mysql = require("resty.mysql"); -- 依赖mysql模块
local db = mysql:new(); -- 创建mysql对象
db:set_timeout(2000) -- 设置过期时间
-- mysql的参数信息
local props = {
host = "xx.xxx.xx.xx",
port = 3306,
database = "changgou_content",
user = "root",
password = "root"
}
local res = db:connect(props); -- 连接mysql
local select_sql = "select url,pic from tb_content where status ='1' and category_id="..id.." order by sort_order";
res = db:query(select_sql); --执行sql
local responsejson = cjson.encode(res); -- 将mysql返回的数据转换成json
red:set("content_"..id,responsejson); -- 存到Redis中
ngx.say(responsejson); -- 输出
db:close() -- 关闭mysql连接
else
cache_ngx:set('content_cache_'..id, rescontent, 10*60); -- 把Redis中的数据写到Nginx缓存中,设置过期时间
ngx.say(rescontent) -- 输出
end
red:close() -- 关闭Redis连接
else
ngx.say(contentCache) -- 输出
end
在/usr/local/openresty/nginx/conf/nginx.conf中server下添加配置
location /content_read {
content_by_lua_file /root/lua/content_read.lua;
}
修改nginx配置文件vi/usr/local/openresty/nginx/conf/nginx.conf ,http节点下添加配置:
配置限流
在http里面添加以下内容进行限流配置
#限流设置
#binary_remote_addr 是一种key,表示基于 remote_addr(客户端IP) 来做限流,binary_ 的目的是压缩内存占用量。
#zone:定义共享内存区来存储访问信息, contentRateLimit:10m 表示一个大小为10M,名字为contentRateLimit的内存区域。1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。
#rate 用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,
limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=2r/s;
在server的l读取缓存配置里添加以下内容使用限流配置
#burst相当于队列,若rate=2r/s同时有4个请求到达,Nginx 会处理第一个请求,剩余3个请求将放入队列,然后每隔500ms从队列中获取一个请求进行处理。若请求数大于4,将拒绝处理多余的请求,直接返回503
#nodelay,配合burst使用,并发处理不延迟,不按(1s/rate)秒/个的速率处理,等到完成之后,按照正常的速率处理
limit_req zone=contentRateLimit burst=4 nodelay; #使用限流配置
控制并发量
控制并发量就是限制一个ip对服务器的连接数。首先我们需要配置一下,编辑nginx.conf文件,在http下添加如下配置。
#根据IP地址来限制,存储内存大小10M,配置名为perip,大小为1m
limit_conn_zone $binary_remote_addr zone=perip:10m;
#根据IP地址来限制,存储内存大小10M,配置名为perserver,大小为1m
limit_conn_zone $server_name zone=perserver:10m;
配置完成之后,我们需要让某一个location使用这个配置,这里,我们让/brand使用这个配置,在nginx.conf中的http.server.location /brand中添加以下内容。
limit_conn perip 10; #设置单个客户端ip与服务器的连接数为10.
limit_conn perserver 100; #限制与服务器的总连接数为100
#表示这个请求给180主机处理,因为程序运行在主机上,不在虚拟机上
proxy_pass http://192.168.31.180:18081;
最后重启一下nginx,用浏览器测试一下
看到这个openresty就部署完成了
配置canal
进入MySQL开启binlog模式
docker exec -it mysql /bin/bash
cd /etc/mysql
apt-get update
apt-get install vim
vim my.cnf
输入以下代码
log-bin=/var/lib/mysql/mysql-bin #二进制日志的存储路径
server-id=123456 #数据库的唯一编号,不能与canal的id一样
配置数据库闲置连接断开时间
vim /etc/mysql/my.cn
interactive_timeout=388000
wait_timeout=388000
退出mysql,并重启mysql
exit
docker restart mysql
再进入到MySQL里测试binlog是否开启成功
show variables like '%log_bin%';
创建一个canal专用数据库用户
-- 用户名是canal,%表示能在任意机器上登录,密码是canal
-- SELECT查询权限,REPLICATION SLAVE, REPLICATION CLIENT主从复制权限,
-- SUPER ON *.* TO 'canal'@'%':用户canal拥有任意数据库,任意表的这些权限
-- FLUSH PRIVILEGES:刷新权限
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
进入canal配置canal
docker exec -it canal /bin/bash
cd canal-server/conf
vi canal.properties
这里id与前面的数据库编号不冲突就可以
(不过这里好像没找到canal.id的)
为了保险起见避免重复还是添加一个id
cd example
vi instance.properties
下面几个地方修改成自己的数据
这里的匹配可以自己修改
比如只监听changgou_content中的tb_content表和changgou_goods中所有表就可以写成
配置Elasticsearch
进入elasticcsearch
docker exec -it elasticsearch /bin/bash
配置elasticsearch.yml 文件
cd /usr/share/elasticsearch/config
apt-get update
apt-get install vim
vim elasticsearch.yml
把transport.host前面的注释去掉
再加上当前集群节点的名称
cluster.name: 名称
再开启跨域和填写主机ip
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 120.55.57.108
图片enable少了一个d
这时重启elasticsearch会失败,还需修改主机系统参数
vi /etc/security/limits.conf
添加下面数据到末尾(nofile是单个进程允许打开的最大文件个数 soft nofile 是软限制 hard nofile是硬限制 )
* soft nofile 65536
* hard nofile 65536
vi /etc/sysctl.conf
添加一下数据到末尾(限制一个进程可以拥有的VMA(虚拟内存区域)的数量 )
vm.max_map_count=655360
执行命令使修改内核参数马上生效
sysctl -p
重启服务器即可
添加ik分词器
先去查看elasticsearch的版本
根据版本安装对于的ik分词器,方法参考之前的文章
跳转
如果下载慢可以试试用gitee镜像仓库
镜像仓库
然后用cmd直接clone下来
免得出现以下场景。。。
注意:下载的版本不能高于要安装的版本,比如要安装5.x版本,下载7.x版本就不行
把配置好的ik分词器解压,改名为ik
上传到服务器
然后再拷贝到elasticsearch容器里
docker cp ./ik elasticsearch:/usr/share/elasticsearch/plugins
浏览器访问测试
http://ip地址:9200/_analyze?analyzer=ik_smart&pretty=true&text=超级棒棒糖
http://ip地址:9200/_analyze?analyzer=ik_max_word&pretty=true&text=超级棒棒糖
如果添加的是6版本以上的ik分词器
请求方式: post 数据格式:json
http://ip:9200/_analyze/?pretty
{ "analyzer": "ik_max_word", "text": "测试用例" }
如果要添加自定义分词文件,进入到elasticsearch容器,找到ik/config文件下的IKAnalyzer.cfg.xm文件
添加分词文件
如果要添加停用词文件也是一样
例如:
分词前
创建一个文件,添加入自定义分词
vim 写中文需要设置 :set encoding=utf-8
加入配置文件
重启容器后刷新浏览器
添加禁用词汇一样的操作
启动RabbitMq
docker容器启动MQ后用浏览器登录
这时还访问不到,
还需要到MQ的容器中执行下面一段代码启动RabbitMQ包含有管理台插件
docker exec -it rabbitmq /bin/bash
rabbitmq-plugins enable rabbitmq_management
完成后再登录,这时就可以了
最后给用户设置权限
//后面跟的时权限列表
rabbitmqctl set_permissions -p "主机名" 用户名 ".*" ".*" ".*"
但登录发现有些功能还不能用,比如图像报表功能
还需进入到rabbitMq配置一下
vi /etc/rabbitmq/conf.d/management_agent.disable_metrics_collector.conf
把true改为false
重启rabbitMq后 再次登录
功能显示正常
警告:仅供自己使用
他人使用报错不负责哦