备注
部署就是三步走,一步准备工作,一步安装依赖,一步配置运行。 Windows下就不要考虑了,以下文档基于Linux的CentOS7、Ubuntu18
源码地址: https://github.com/staugur/tdi-node
正式版本: https://github.com/staugur/tdi-node/releases
作者博客: https://blog.saintic.com/
内容说明: 以下部署文档适用于有一点linux基础的同学,大概涉及到yum、git、node等相关命令,以及redis、nginx等服务。
部署redis很简单,CentOS用户可以yum install redis
,Ubuntu用户可以apt-get install redis-server
,都可以编译安装,给一个教程链接:http://www.runoob.com/redis/redis-install.html
也可以docker启动,用官方镜像启动一个docker redis,镜像:https://hub.docker.com/_/redis。
这是一个基于Node.js写的web应用,使用bee-queue作为任务队列,测试过10、12版本,简单测试过v8+
另外,此部署是直接部署到服务器上,比如物理机、云主机、VPS等,由于依赖的程序原因,理论上可以支持unix系列,但是,除了CentOS和Ubuntu外,其他机器咱也没试过,咱也不知道~~
! 建议,如果你有git,可以:
git clone https://github.com/staugur/tdi-node
! 也可以下载压缩包:
wget -O tdi-node.zip https://codeload.github.com/staugur/tdi-node/zip/master && unzip tdi-node.zip && mv tdi-node-master tdi-node
! 或者到release页面下载正式版本的包。
! 进入代码目录: cd tdi-node
很详细的安装Node.js的步骤不是这里的重点,您可以使用包管理器安装、直接下载二进制或源码编译,版本推荐v10+
项目中依赖的第三方模块已经写好了,如果不是二次开发,仅安装生产依赖即可(开发依赖就一个,安装也不嫌多~~)
开发环境:
yarn
ornpm install
正式环境:
yarn --production
ornpm install --production
关于config.json配置文件
请复制config.sample.json生成配置,这是JSON文件也不好注释, 其中必填项是
redis
和token
,具体内容参考下方2.3小节中的配置表格。备注
tdi-node v0.1.0,用了系统zip命令,不过现已经舍弃,如果还用旧版,可以如下安装
CentOS/Fedora/RHEL:
yum install zip
Ubuntu:
apt-get install zip
配置文件是 config.json
,给出了样例文件 config.sample.json
。
您需要使用 mv config.sample.json config.json
重命名文件,或者使用 cp config.sample.json config.json
复制一份。
可设置列表如下:
配置段 |
默认值 |
说明 |
---|---|---|
host |
127.0.0.1 |
Web应用监听地址 |
port |
3000 |
Web应用监听端口 |
status |
ready |
自主设定服务状态,ready可用、tardy不可用 |
redis |
无 |
redis连接串,格式是:redis://[:password]@host:port/db |
token |
无 |
签名令牌,切勿泄露、遗失,支持修改。 |
alarmemail |
无 |
报警邮箱,当检测到队列有failed时发送邮件,可选。 |
loglevel |
INFO |
日志级别,DEBUG、INFO、WARN、ERROR |
noclean |
无 |
如果值是true,那么使用pm2启动正式环境进程时不会清理过期文件 |
!!!以上参数 redis 和 token 必须设置;
配置文件中alarmemail参数是关于报警的配置,可以参考 下载异常报警
备注
Tdi-node读取配置有个顺序,假设配置名为key,首先从package.json中读取key值。
未果,从config.json中读取;
未果,从环境变量中读取,但是读取的是以 crawlhuabantdi_ 开头的key值,这里,Tdi for Python也是通过环境变量设置的,所以可以共用。(但是redis有点区别,python版读取的是crawlhuabantdi_redis_url,node版读取的是crawlhuaban_redis);
未果,返回自定义默认值,若无,则返回空字符串。
需要启动bee-queue进程处理队列任务和node处理web请求,两者必须开启才能正常接收请求并处理下载任务。
开发环境:
启动Web服务:
yarn start
ornpm start
启动队列处理进程:
yarn start:worker
ornpm start:worker
正式环境:
启动所有:
yarn run prod:start
ornpm run prod:start
已经在代码中添加了Dockerfile且上传到了阿里云Docker镜像仓库,使用的官方node镜像,v10!
$ docker pull registry.cn-beijing.aliyuncs.com/staugur/tdi-node
$ git clone https://github.com/staugur/tdi-node && cd tdi-node
$ docker build -t tdi-node .
3.3.1 启动命令:
$ docker run -tdi --name 容器名 --restart=always --net=host \
-e crawlhuabantdi_redis=REDIS连接串 \
-e crawlhuabantdi_token=令牌 \
-v 下载目录挂载点:/Tdi-node/src/downloads \
镜像:标签
3.3.2 镜像及标签:
镜像:自主构建的即tdi-node,官方镜像是:registry.cn-beijing.aliyuncs.com/staugur/tdi-node
标签(这里表示版本,每个稳定版打一个标签):
latest:默认,最新版本,可能是最新的稳定版,但最可能是正在开发的版本,所以建议用稳定版
v0.2.0:压缩方式由zip改为tar
v0.1.0:第一个稳定版
3.3.3 其他参数解释说明
> 容器名:就是启动容器的名字;–net=host,即容器使用物理网络
> REDIS连接串:其格式请参考上方修改配置那段
> 令牌:英文字母开头加数字、字母或下划线,2-32位字符串
> 挂载点:程序运行在容器内,下载的图片都在内部,路径是/Tdi-node/src/downloads
,需要挂载出来,供nginx访问,比如挂载点是/data/TdiDownloads/
> 示例:
docker run -tdi --name tdi-node --restart=always --net=host \
-e crawlhuabantdi_redis=redis://:passwd@127.0.0.1:6379/0 \
-e crawlhuabantdi_token=test \
-v /data/TdiDownloads/:/Tdi-node/src/downloads registry.cn-beijing.aliyuncs.com/staugur/tdi-node [或自行打包的镜像名]
Tdi-node启动一个web应用,使用的框架是express,默认监听127.0.0.1:3000,可以参考tdi, 简单的反向代理即可。
首选Nginx,不解释;Apache HTTP Server,很遗憾,我现在也忘了怎么配置,得写.htaccess规则。
这里假设程序目录是/tdi-node,那么程序下载目录就是/tdi-node/src/downloads;
Nginx配置示例如下,您也可以配置使其支持HTTPS:
server {
listen 80;
server_name 域名;
charset utf-8;
#防止在IE9、Chrome和Safari中的MIME类型混淆攻击
add_header X-Content-Type-Options nosniff;
client_max_body_size 10M;
client_body_buffer_size 128k;
#可以设置不允许搜索引擎抓取信息
#此路径是为了下载实际图片压缩包,直接走nginx,这段可以说是最重要的配置
location /downloads {
#程序下载目录(源码下的src/downloads或者容器的主机挂载点)
alias /tdi-node/src/downloads/;
default_type application/octet-stream;
if ($request_filename ~* ^.*?\.(zip|tgz|tar)$){
add_header Content-Disposition 'attachment;';
}
}
location / {
#3000是默认端口
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
程序部署好+Nginx配置完成,启动后,这个域名就能对外服务了(温馨提示:您可以使用HTTPS提供服务,并且也建议用HTTPS),即可进入下一篇查看如何注册、使用。
另外,若您没有[已备案]域名,可以与我留言申请一个 tdi.saintic.com 的子域。
PS:补充说明
您也可以使用已有域名配置,将Tdi-node设置为子目录,合并到配置文件中(server里),核心配置段:
server{
listen 80;
server_name 此处为已有域名;
......
#在已有配置文件中增加以下两段,具体下载目录和端口自行修改:
client_max_body_size 10M;
client_body_buffer_size 128k;
#此路径是为了下载实际图片压缩包,直接走nginx,这段可以说是最重要的配置
location ^~ /downloads/ {
#下载程序目录
alias /tdi-node/src/downloads;
default_type application/octet-stream;
if ($request_filename ~* ^.*?\.(zip|tgz|tar)$){
add_header Content-Disposition 'attachment;';
}
}
#此路径是tdi-node程序中的路由,需要代理过去
location ~ ^/(ping|download|rqdashboard) {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
......
}
目前git下载可以使用git pull拉取最新代码,重载进程( yarn prod:reload
)完成升级。
Docker升级请docker pull拉取latest或最新稳定版,重新启动一个新容器完成升级。
关于定时检测、资源报警、过期清理等功能的使用,请点击跳转查看Tdi使用说明文档