1.linuxå®è£
nodejsï¼
2.nodejs原理&源码赏析(7)Node.js中的源码压缩事件循环,定时器和process.nextTick
3.NodeJS Imagemin
4.NodeJS 服务 Docker 镜像极致优化指北
linuxå®è£ nodejsï¼
linuxå®è£ nodejsï¼
linuxå®è£ nodejs赫æ¯ç¹ç§ä½çç¥å¥æ¡ååä½æ¯èµä¸ä¸äºæ»ä¼å«æèå¨å¹´åæ²åºæ£®åä¸ç½å®¾ä¸ç´æ¯è¾å¤å²çº½å¡æ¯å°éçæºä¼å°±çä½ çé¡¿æ¶ä½æ¬å°ä¸è½å°ç«è æ é伸äºå¤´èä¸çå¿ è¦å¨å·¥ä½çèè¿ä¹ä»äº²èªä¸»ç½
Node.jsæä¹å®è£å¨linuxä¸å®è£ nodejsæ¹æ³å¦ä¸ï¼
1ãå»å®ç½ä¸è½½åèªå·±ç³»ç»å¹é çæ件ï¼
éè¿?源码压缩uname-a?å½ä»¤æ¥çå°æçLinuxç³»ç»ä½æ°æ¯ä½ï¼å¤æ³¨ï¼x_表示ä½ç³»ç»ï¼ii表示ä½ç³»ç»ï¼ï¼å¦å¾
æ ä¸è½½ä¸ä¸çº¢è²æ¡ä¸æ件ï¼çæ¬ä¸ºv6..0
2ãä¸è½½ä¸æ¥çtaræ件ä¸ä¼ å°æå¡å¨å¹¶ä¸è§£åï¼ç¶åéè¿å»ºç«è½¯è¿æ¥åä¸ºå ¨å±ï¼
1ï¼ä¸ä¼ æå¡å¨å¯ä»¥æ¯èªå·±ä»»æè·¯å¾ï¼ç®åæçæ¾ç½®è·¯å¾ä¸º?cd/app/software/
2ï¼è§£åä¸ä¼ ï¼è§£ååçæ件æè¿è¾¹å°ååæ¹ä¸ºäºnodejsï¼è¿ä¸ªå°æ¹èªå·±éæï¼åªè¦å¨å»ºç«è½¯è¿æ¥çæ¶ååæ£ç¡®å°±å¯ä»¥ï¼
â tar-xvf?node-v6..0-linux-x.tar.xz
â¡mv?node-v6..0-linux-x?nodejs
â¢ç¡®è®¤è°ä¸¾ä¸ä¸nodejsä¸binç®å½æ¯è¿ å å¦ænodeånpmæ件ï¼å¦æææ§è¡è½¯è¿æ¥ï¼å¦å«æ碧æ没æéæ°ä¸è½½æ§è¡ä¸è¾¹æ¥éª¤ï¼
3ï¼å»ºç«è½¯è¿æ¥ï¼åä¸ºå ¨å±
â ln-s/app/software/nodejs/bin/npm/usr/local/bin/
â¡ln-s/app/software/nodejs/bin/node/usr/local/bin/
4ï¼æåä¸æ¥æ£éªnodejsæ¯å¦å·²åä¸ºå ¨å±
å¨Linuxå½ä»¤è¡node-vå½ä»¤ä¼æ¾ç¤ºnodejsçæ¬ï¼è¯´æå®è£ æå
linuxä¸nodejså®è£ 以åå¦ä½æ´æ°å°ææ°ççæ¬
é¦å å°ç½ä¸è½½ææ°çå®è£ æ件node-v0..-linux-x.tar.gzã
ç¨secureCRTå°æºç å ä¸ä¼ å°linuxç/opt/softï¼å¨å½ä»¤è¡è¾å ¥ï¼tar-xvfnode-v0..-linux-x.tar.gzè¿è¡è§£åã
ç¼è¾æ件vi/etc/profile
æ件æ«æ·»æç§å å¦ä¸
exportNODE_HOME=/opt/soft/åªå¯å node-v0..-linux-x
exportPATH=$PATH:$NODE_HOME/binexportNODE_PATH=$NODE_HOME/lib/node_modules
å¨å½ä»¤è¡è¾å ¥ï¼source/etc/æå¡profileï¼è®©é ç½®æ件çæã
å¨å½ä»¤è¡è¾å ¥ï¼node-vï¼æ¥çnode.jsççæ¬ãå¦æåºç°çæ¬å·åè¯æå®è£ æåã
linuxæä¹å®è£ nodejsï¼ä¸ï¼ç¼è¯å¥½çæ件
ç®å段æ¥è¯´å°±æ¯è§£ååï¼å¨binæ件夹ä¸å·²ç»åå¨node以ånpmï¼å¦æä½ è¿å ¥å°å¯¹åºæ件çä¸æ§è¡å½ä»¤è¡ä¸ç¹é®é¢é½æ²¡æï¼ä¸è¿ä¸é纤æ¯å ¨å±çï¼æ以å°è¿ä¸ªè®¾ç½®ä¸ºå ¨å±å°±å¥½äºã
cdnode-v0..-linux-x/bin
ls
ã/node-v
è¿å°±å¦¥å¦¥çäºï¼nodeæä»¶å¤¹å ·ä½æ¾å¨åªï¼å«ä»ä¹ååéä½ æä¹å®ãç¶åè®¾ç½®å ¨å±ï¼
ln-s/home/kun/mysofltware/node-v0..-linux-x/bin/node/usr/local/bin/node
ln-s/home/kun/mysofltware/node-v0..-linux-x/bin/npm/usr/local/bin/npm
è¿é/home/kun/mysofltware/è¿ä¸ªè·¯å¾æ¯ä½ èªå·±æ¾çï¼ä½ å°nodeæ件解åå°åªéå°±æ¯åªéã
ï¼äºï¼éè¿æºç ç¼è¯
è¿ç§æ¹å¼ä½ ä¸è½½çæ件æ¯Sourcecodeï¼è¾ä¸ºéº»ç¦ã
#tarxvfnode-v0...tar.gz
#cdnode-v0..
#ã/configure
#make
#makeinstall
#cp/usr/local/bin/node/usr/sbin/
æ¥çå½åå®è£ çNodeççæ¬
#node-v
v0..
ï¼ä¸ï¼apt-get
è¿æä¸ç§å°±æ¯shellæ示çapt-getæ¹å¼ï¼å¼ºçæ¡å²èä¸æ¨èã
sudoapt-getinstallnodejs
sudoapt-getinstallnpm
å ³äºæ´å¤Linuxçå¦ä¹ ï¼è¯·æ¥é 书ç±ãlinux就该è¿ä¹å¦ãã
linuxä¸nodejså®è£ 以åå¦ä½æ´æ°å°ææ°ççnodejså®ç½ä¸è½½å®è£ çæºç æ件ï¼æè¿è¾¹ä¸è½½çæ¯node-v4.5.0-linux-x.tar.xz
å¨linuxå½ä»¤è¡è´¥é¥¥ç¾¡éè¾å ¥ï¼
tar-xvfnode-v4.5.0-linux-x.tar.xz
ç¶åè¾å ¥vi/etc/profile
å¨æåè¢éä¸è¡æ·»å ï¼è®¾ç½®ç¯å¢åéï¼
exportNODE_HOME=/mnt/software/node-v4.5.0-linux-x
exportPATH=$PATH:$NODE_HOME/bin
exportNODE_PATH=$NODE_HOME/lib/node_modules
è¾å ¥source/etc/profile使设置çæ
åè¾å ¥node-væ¥ççæ¬å·
å¦æè¦å级nodejsçè¯å¯ä»¥ä½¿ç¨å¦ä¸å½ä»¤ï¼
npminstall-gn
nlatest
å®è£ å®æå¯æåå°±æ¯ææ°çæ¬äº
nodejs原理&源码赏析(7)Node.js中的事件循环,定时器和process.nextTick
事件循环是源码压缩Node.js的核心机制,确保了其非阻塞I/O模型的源码压缩实现。尽管JavaScript在Node.js中是源码压缩单线程运行的,它却能利用系统内核的源码压缩易安卓 源码多线程特性处理并发任务。Node.js在开始执行时初始化事件循环,源码压缩处理脚本文件或REPL环境中的源码压缩异步调用。事件循环通过检查异步I/O、源码压缩定时器和process.nextTick调用,源码压缩然后进入各个阶段,源码压缩处理回调函数。源码压缩每个阶段维护一个先进先出的源码压缩回调队列,处理与阶段相关操作后执行队列中的源码压缩回调,直至队列为空或达到最大函数执行数量。源码压缩直推客源码系统操作回调、定时器和处理关闭回调的阶段各有功能。setImmediate()与setTimeout()相似,但执行顺序受调用上下文影响,setImmediate()在I/O周期中通常优先执行。process.nextTick()则在当前操作执行后立即执行回调,不受事件循环阶段限制,但需谨慎使用以防阻塞事件循环。
NodeJS Imagemin
imagemin是常用的NodeJS压缩库,支持多种插件,包括有损和无损压缩。其用法简单直接,但安装过程中可能出现一些问题,特别是酷信源码ceo在 CentOS 系统上。
在安装过程中,首先安装imagemin本身,这通常不会出现问题。接着,安装用于压缩PNG的插件imagemin-pngquant时,会遇到依赖底层读写PNG的跨平台库libpng-dev的错误。在CentOS上,可以使用rpm -qa |grep libpng命令检查该库是否已安装,如果没有,则需要通过yum install libpng-devel进行安装。
安装libpng-dev之后,再次尝试安装imagemin-pngquant,仍会遇到错误“Error: pngquant failed to build, make sure that libpng-dev is installed”。进一步的瓶颈期直播源码排查发现,问题可能是由yum安装的libpng-devel版本过低,不兼容pngquant-bin提供的源码版本所导致的。
解决这一问题有两种方法。第一种是升级libpng-devel的版本,但这并非推荐做法,因为这可能会依赖于GLIBC版本,而GLIBC是Linux系统底层API,几乎所有运行库都依赖于它,并且它提供了许多必要的功能实现。这种升级操作可能会导致严重问题。第二种方法是手动安装pngquant(一个使用C语言编写的PNG压缩开源库),在CentOS中,需要先安装epel-release包,然后通过yum安装pngquant。什么叫源码开发安装完成之后,使用pngquant --version查看版本信息,并在pngquant-bin的安装代码中去除编译安装失败时终止进程的逻辑,发布一个名为pngquant-bin-no-exit的npm包。
接着,对于依赖pngquant-bin-no-exit的插件imagemin-pngquant,同样需要创建一个名为imagemin-pngquant-no-exit的npm包,这样可以避免安装原始的imagemin-pngquant。最后,引入imagemin-pngquant-no-exit进行使用即可。
对于其他imagemin插件安装失败时,同样可以采用上述方法解决,例如用于压缩JPG的imagemin-mozjpeg插件。这些插件通常依赖于特定的C语言编写的压缩库,如mozjpeg,与PNG压缩插件不同。另外,mozjpeg不能通过yum安装,需要下载源代码进行编译安装。编译完成后,可以在/opt/mozjpeg/bin目录下找到对应的二进制可执行文件。
虽然整个安装过程可能没有完全成功,但通过上述步骤,可以确保程序的正常运行。只需对引入的代码稍作修改即可。
NodeJS 服务 Docker 镜像极致优化指北
在开发一个腾讯文档全品类通用的 HTML 动态服务时,为了方便各品类接入的生成与部署,考虑使用 Docker 的方式来固定服务内容,统一进行制品版本的管理。以下是在服务 Docker 化过程中积累的优化经验。
通常初学者会这样编写项目的 Dockerfile,构建,打包,上传一气呵成,但镜像状态显示,一个简单的 node web 服务体积居然达到了惊人的 1.3 个 G。首先,镜像体积过大必然会对镜像的拉取和更新速度造成影响,集成体验会变差。其次,项目上线后,同时在线的测试环境实例可能成千上万,这样的容器内存占用成本对于任何一个项目都是无法接受的。
发现问题后,我开始研究 Docker 的优化方案,准备给我的镜像动手术了。
对代码本身体积进行优化,避免使用 tsc 打包生成 es5 后就直接运行,而是使用 Webpack + babel 降级并压缩 Typescript 源码。梳理 npm 包的 dependencies 与 devDependencies 依赖,去除不是必要存在于运行时的依赖,方便生产环境使用 npm install --production 安装依赖。
减小依赖的操作系统的大小,考虑尽可能去除 Linux 下不需要的各类工具库,选取更轻量级的 Linux 发行版系统,如 node:-alpine。
利用 Docker 的分级构建特性,首先在完整版镜像下进行依赖安装,之后运行生产环境,使用 alpine 版本作为基础镜像,编译完成后的源码通过 --from 参数获取到处于 build 任务内的文件。
在保证速度的前提下,考虑构建体积优化,优先保证构建时间,其次在不影响时间的情况下,尽可能的缩小构建缓存体积。
避免使用进程守护,利用 Docker 本身和基于 Docker 的编排程序提供崩溃重启和日志记录功能,无需使用额外应用实现。
日志持久化存储,通过 Docker Manager Volume 将数据写到宿主物理机器上,或者利用云日志服务托管,如腾讯云 CLS。
选择 Kubernetes 的 Deployment 或 StatefulSet 控制器,Deployment 用于部署无状态服务,StatefulSet 用于部署有状态服务。
镜像优化后的结果是镜像体积达到了 倍左右的优化效果,最终被压缩到 M 以内。优化不仅仅体现在体积数据上,更在于架构设计层面上的转变,将服务面向容器化云服务。