-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Docker + Node + Pm2 + Redis + Puppeteer #20
Comments
Docker部署方式【issue】 上面全局安装这种会造成全局环境污染,这里我们使用docker部署相关服务。
安装docker-nginx并配置
|
Dockerfile
FROM <基础镜像名称>基于某一个基础镜像进行拉取 COPY <源路径1>... <目标路径>复制指令,从上下文目录中复制文件或者目录到容器里指定路径 RUN <命令行命令>用于执行后面跟着的命令行命令,用于构建镜像阶段 CMD ["<可执行文件或命令>","","",...]类似于 RUN 指令,用于运行程序,但二者运行的时间点不同: 1. CMD 在docker run 时运行。2. RUN 是在 docker build。 用Dockerfile构建镜像进入Dockerfile所在文件夹,运行 docker-compose.yml
其实主要就是避免了过于复杂的docker run命令参数,且可以依次运行出多个容器。
用compose创建容器
|
Docker 空间使用分析与清理【issue】 docker的空间由于一段时间运行发现占满了磁盘,故作出清理
docker system prunedocker system prune 自动清理说明: 该指令默认会清除所有如下资源:
该指令默认只会清除悬空镜像,未被使用的镜像不会被删除。
总体瘦身后的docker体积详情
参考文档: |
Nodejs + Redis【issue】 项目出现被调用者频繁地调用,为了有效控制执行的速度,将接口修改为调用者调用后,将参数存储到队列中,node服务定时去获取队列,执行完成之后去消耗队列,这里可以是消耗kafka或者存放redis,kafka相对太重,故使用了后者 redis
mac中Redis环境搭建(本地调试使用)
使用redis-cli请开启终端,进入redis文件夹,输入
node中的使用redis
const Redis = require('ioredis')
const options = {
keyPrefix: 'demo-', //存诸前缀
db: 0
}
const newRedis = new Redis(6379, '127.0.0.1', options);
module.exports = newRedis const redis = require("../config/redis") // redis配置文件路径
let timeId = null;
async function intervalGetRedis() {
let targetUrl = await redis.lpop('app-urls-list');
if (targetUrl) {//如果不为null
clearInterval(timeId);
timeId = null;
//同步app-urls-set-collect
await redis.srem('app-urls-set-collect', targetUrl);
//获取app
getAppAttr(targetUrl);
} else {
if(!timeId){
timeId = setInterval(async () => {
console.log('interval');
intervalGetRedis();
}, 1000 * 60 * 20);//20分钟 1000 * 60 * 20
}
}
}
intervalGetRedis();
//判读length长度
let redisArrLen = await redis.llen('app-urls-list');
if (redisArrLen > 100000) { //大于10w则清除key
await redis.del('app-urls-list');
await redis.del('app-urls-set-collect');
}
//sadd如果Set集合已存在该元素则为0
let addRedis = await redis.sadd('app-urls-set-collect', url);
if (addRedis !== 0) {//url在队列中不存在
await redis.rpush('app-urls-list', url);
} |
pm2日志清理【issue】 在我们的node应用中,实际出现了pm2日志体积过大的情况,默认情况下pm2的日志是一个文件不会被拆分为多个,不方便清理,所以这里我们使用pm2-logrotate进行日志切割。
|
Puppeteer/chrome-remote-interface与Docker【issue】 在node后台是放置在docker中执行的,调用之后,过了一段时间使用top命令发现了很多的僵尸进程chrome没有被回收 Puppeteer Troubleshooting
这里要说明一下chrome-launcher的chromeFlags参数已经支持了--disable-dev-shm-usage去禁用,项目issue为puppeteer/puppeteer#1834
我们为什么需要init系统
参考文档: |
centOS7安装node+pm2+chrome步骤
Selenium在MAC中的环境搭建
Selenium由于不再迭代,现在主流爬虫都使用的--Puppeteer
由于mac中自带python,那么我们可以避开python的安装。
sudo easy_install pip
安装pip;sudo pip install selenium
安装selenium;brew install chromedriver
;注意:如果运行该命令报错:则改为如下命令去执行:
新建test.py,粘贴下面的内容;保存之后使用
python test.py
执行,即可得到运行结果与爬虫截图。The text was updated successfully, but these errors were encountered: