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压缩库,支持多种插件,包括有损和无损压缩。其用法简单直接,但安装过程中可能出现一些问题,特别是dw导入源码在 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 以内。优化不仅仅体现在体积数据上,更在于架构设计层面上的转变,将服务面向容器化云服务。
2024-12-24 11:05
2024-12-24 11:05
2024-12-24 09:55
2024-12-24 09:53
2024-12-24 09:42
2024-12-24 09:20
2024-12-24 09:14
2024-12-24 08:45