关于部署:软件高效自动化部署华为云部署服务CodeArts-Deploy

随着互联网、数字化的倒退,公司机构与各类企业往往须要进行大量频繁的软件部署,部署设施类型多样,如:本地机器、云上裸金属服务器、云上虚拟机与容器等。 面对多种部署模式、分布式简单运行环境,该如何用最短时间、高质量、安全可靠的进行软件部署呢? 有这样一款部署服务——继续部署,通过频繁的、标准化、自动化的形式,将软件疾速交付到生产环境。从开发人员提交代码到编译、测试、部署,全流程无人干涉,齐全自动化执行。这种模式与部署能力,能够大幅放慢软件版本上线速度,保障新性能第一工夫被用户应用。 它就是华为云继续部署服务CodeArts Deploy 通过模块化自在编排部署流程,实现软件的自动化部署,帮忙企业软件产品的疾速、高效、高质量交付。

July 12, 2023 · 1 min · jiezi

关于部署:5分钟部署百台云上计算机22支参赛队伍快速接入南网电力调度AI应用大赛

计算工夫从分钟级晋升到秒级、清洁能耗进步到99%、前三名AI调度员在计算工夫、危险断面管制、清洁能源消纳、零碎运行老本等多维度超过了人工.......这是第四届电力调度AI利用大赛播种的成绩。 近日,由南方电网总和谐电机工程学会电力系统自动化专委会主办的AI利用大赛在广州落幕,赛事期间聚合了22支参赛队伍,并通过阿里云无影云电脑部署了可用于近程调用的虚构开发环境,让选手们在9天内开发、训练和部署了数组AI在线调度员。 南方电网从2019年初开始就启动电力调度AI利用大赛,并在2022年实现行业内首次将AI真正使用于电网生产调度,往年更是引入了强化学习等技术,来解决新型电力系统调度面临的大规模实时决策问题。 残缺内容请点击下方链接查看: https://developer.aliyun.com/article/1174631?utm_content=g_10... 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

May 10, 2023 · 1 min · jiezi

关于部署:使用K8S进行蓝绿部署的简明实操指南

在之前的利用部署系列文章里,咱们曾经介绍过什么是蓝绿部署。如需回顾,点击下方文章链接即可重温。本文咱们将会介绍如何应用 Kubernetes 实现蓝绿部署。  利用部署初探:3个次要阶段、4种常见模式利用部署初探:微服务的3大部署模式利用部署初探:6个保障平安的最佳实际 后期筹备: Kubernetes 集群kubectl要部署的应用程序的 Docker 镜像 如果你曾经准备就绪,那么咱们就开始部署啦!  Step 1:创立命名空间首先,咱们须要创立命名空间来部署咱们的应用程序。输出以下命令即可:kubectl create namespace blue-green  Step 2:创立部署接下来,咱们须要创立2个部署,一个是蓝环境,另一个是绿环境。除了标签之外,两个部署应该是雷同的(标签次要是为了分别哪个是蓝环境,哪个是绿环境)。以下是部署 manifest 示例: apiVersion: apps/v1kind: Deploymentmetadata: name: myapp-blue labels: app: myapp env: bluespec: replicas: 3 selector: matchLabels: app: myapp env: blue template: metadata: labels: app: myapp env: blue spec: containers: - name: myapp image: myapp:v1.0 ports: - containerPort: 80将 manifest 保留为 blue-deployment.yaml,并应用以下命令在蓝环境中创立部署: kubectl apply -f blue-deployment.yaml -n blue-green  同理,通过在 manifest 文件中更改名称和标签来在绿环境中创立另一个部署,并将其保留为 green-deployment.yaml。接下来,应用以下命令将其部署在绿环境: kubectl apply -f green-deployment.yaml -n blue-green  ...

March 20, 2023 · 2 min · jiezi

关于部署:应用部署初探6个保障安全的最佳实践

在之前的文章中,咱们理解了利用部署的阶段以及常见的部署模式,包含微服务架构的利用应该如何部署等根本内容。本篇文章将介绍如何平安地部署应用程序。  平安是软件开发生命周期(SDLC)中的要害局部,同时也须要成为 SDLC 中每个环节的一部分,尤其是部署。因而,保障利用部署平安并不是开始于部署阶段,而是从写下第一行代码开始就须要将平安纳入思考的因素,即平安左移。  本文将会介绍6个保障利用部署平安的最佳实际,帮忙您防止平安问题。这些最佳实际还能够保障部署过程的速度不受影响。  1、管制部署的触发形式开发团队应该谨慎治理触发主动部署到生产环境的代码,生产部署不应该从不受信赖的代码库、fork或者分支中进行。  2、理解开发环境的平安问题在启动一个新的软件我的项目之前,让开发团队相熟相干零碎环境的平安最佳实际是至关重要的。例如,Kubernetes 的平安上下文设置能够帮忙开发团队了解 Kubernetes 平安的根本内容。当开发团队理解这些基础知识之后就能够极大水平缩小人为谬误。  这之所以重要是因为 Kubernetes 是历史上倒退最迅速的开源我的项目之一,它被广泛应用于云原生开发和部署,对 Kubernetes 的平安最佳实际有深刻理解能够帮忙团队防止平安失误,其余的容器编排零碎也同理。  3、施行密钥策略当应用动静服务来解决配置变动时,它们(或相似服务)也应该会解决相干的密钥。它们在运行时将密钥传递给容器,同时应用对立的策略来解决密钥,确保不同类型的密钥(即运行时与构建密钥)不被混同,并放弃测试和开发顺利。  应用程序仅须要在打包时构建密钥(比方,我的项目repo或文件存储凭证)。运行时密钥只有在部署之后才是必要的(比方,私钥、数据库明码以及 SSL 证书),因而开发者仅需传递必要的密钥到应用程序即可。  具体的策略并不重要,重要的时候保持采纳对立的策略。每个团队都必须在所有环境中应用雷同的密钥解决策略,使其更容易跟踪密钥。这个策略应该是灵便的,以便于测试和部署。重点应该是密钥的应用,而不是其起源。   4、采纳 GitOps 实际GitOps 正逐步成为平安的云原生和以Kubernetes为核心的CI/CD的首选办法。它同时提供了平安和疾速部署,这是以后任何软件开发我的项目中最重要的两个方面。  依据许多优良的开发人员和工程师的说法,GitOps 是一系列针对 Kubernetes 环境的实际,尤其是当单个集群资源被多个用户或团队共享时。  GitOps能够与 Kubernetes 的性能(如命名空间)协同工作,确保多个租户以平安的形式应用资源。这些做法通过放弃租户之间的隔离、缩小平安和可读性的危险来实现。当所有用户都在进行批改时,这一点尤其有帮忙。  应用像 GitOps 这样的模式,能够确保任何用户所做的任何扭转在进入最终构建之前都会被跟踪和批准。这不仅能够管理应用程序的更新,而且如果某个更新并没有像预期那样工作时,你能够轻松回滚到以前的版本。  5、永远别用默认配置如果你正在应用开源我的项目,那么千万别用它们的默认配置,这点尤为重要。默认配置不肯定与你的安全策略统一,因为它们关注的是商业、经营和性能上的胜利,而不是平安。此外,它们是常识,任何人都能够利用它们。在这种状况下,你能够寻求商业平台和供应商的帮忙。  这方面的一个典型例子是,在应用 Kubernetes 时,部署及其 pod 没有网络分段策略。这让所有的资产在它们之间进行通信。如果开发者想疾速建设一个应用程序,这种默认设置是很不便的,但保留默认设置意味着,如果一个容器被攻打,威逼就会迅速蔓延。  6、作为部署的一部分运行自动测试通过三思而行的测试能够帮忙你对代码的安全性取得信念,反之蹩脚的测试会障碍你。如果条件容许的话,将测试自动化,使其反对部署流水线。简略的“测试”能够在每次代码批改时运行,资源密集型的测试能够保留到重要的版本。不要漠视失败的测试,你须要从新评估和重构不起作用的测试。

February 17, 2023 · 1 min · jiezi

关于部署:应用部署初探3个主要阶段4种常见模式

利用部署是一个将软件提供给用户的过程,通常蕴含配置环境、装置及测试等步骤。现如今,大部分企业在部署新的应用程序时,会至多自动化其中一些步骤。应用程序部署的策略会影响该利用的性能、稳定性以及运行速度,因而有时会在向所有人提供更新之前,先对一小部分用户进行测试。  软件开发和用户体验的古代规范要求开发人员继续地更新他们的我的项目。部署和集成曾经成为日常操作——一个古代的应用程序每天都须要部署。这就是为什么当初领有一个无效的部署技术比以往任何时候都更重要。  当下,企业谋求更为灵便和可扩大的零碎,因而微服务架构、云基础设施变得随处可见。灵便的架构意味着诸多开发团队会关涉其中,这会给部署带来挑战。  本文将介绍利用部署过程的几个次要阶段以及不同的利用部署模式。  利用部署的次要阶段后期筹备/打算阶段在打算筹备阶段,以下步骤非常重要: 确认合作方: 软件开发的过程中会波及到不同的团队。部署前应该告知所有合作方,以尽量减少开发、运维和平安团队之间的摩擦。列出第三方工具: 确定部署流程中所须要的所有工具以及要求,这能够帮忙你确保所有合作方都晓得如何无效地应用它们并且最大限度地缩小问题的产生。设置测试环境: 在正式公布新产品前,肯定要测试软件设计清晰的部署步骤: 与团队亲密沟通以确保部署流程清晰明了创立回滚打算: 如果新版本呈现重大的问题能够启用这一打算。渐进式交付策略让无缝主动回滚部署成为可能。设置性能监控指标: 罕用的指标有内存、CPU使用率以及查问响应工夫。你能够应用这些根本指标和自定义KPI来掂量部署的有效性。在渐进式交付中,你甚至能够应用这些指标来主动确定部署是否胜利。 测试阶段测试阶段能够在部署之前验证软件是否牢靠。在这一阶段中,须要思考以下方面: 编写单元测试: 其目标是测试软件的其中某个局部,以验证其独立于其余局部的行为是否能够失常运行。当后果与需要统一时,单元测试通过,否则失败。在CI流程中集成测试: 将单元测试集成到共享代码仓库中以自动化构建和验证每个局部。在部署之前实现这个步骤能够更轻松地修复和移除bug。在staging环境中部署测试: 模仿生产环境,并应用它来测试更新、代码及其他方面,以确保软件按预期运行。运行端到端的测试: 从头到尾测试应用程序的工作流程,过一遍它能够执行的操作,查看它是否能够与其余组件(如网络连接、硬件等)一起失常运行。验收测试: 这是测试流程的最初一步,须要与相干方或实在用户一起验证软件。他们的反馈能够帮忙决定软件是否生产就绪。冒烟测试: 创立一个专门的测试套件,在部署之后在生产中运行,以验证刚刚公布的软件没有缺点。 部署及公布阶段利用部署的最终阶段,包含以下方面: 部署到生产环境: 将更新推送到生产环境中,用户能够应用它们。监控产品性能: 依据KPI来监测产品的性能,查看HTTP errors和数据库性能等。监控环境衰弱: 借助监控工具来辨认软件环境相干的潜在问题,比方操作系统、数据库系统以及编译器等。执行自动化回滚: 借助冒烟测试和指标来掂量公布是否胜利并且当存在问题时主动回滚到上一个版本。跟踪日志: 借助日志取得软件运行的可见性,比方理解软件如何运行在基础设施上,如何考察谬误并辨认潜在的平安危险。记录公布的版本和正文: 保留对产品进行批改时创立的新版本的正本,这有助于放弃一致性。 利用部署模式金丝雀公布金丝雀公布能够逐个公布新个性,而非残缺的更新版本。开发人员让旧版本处于沉闷状态,并比拟更新前后的实例性能。此外,金丝雀发布会先将新性能提供给一小部分用户应用,依据小范畴的用户反馈对产品进行必要的调整。  以下是金丝雀公布的根本步骤: 开发人员上传新版本(假如其为Version B)到服务器。次要用户群体仍旧定向到 Version A,与此同时,小局部用户开始应用 Version B,进而开发人员能够监控新版本的性能并进行改良。对 Version B 进行必要的调整之后,开发人员就会将大部分流量定向到更新结束的实例中。此时团队开始测量性能并将其与旧版本进行比照。当 Version B 曾经足够稳固,开发人员就会切断 Version A 并将流量齐全重定向到更新后的代码库中。 要保障金丝雀公布的胜利,开发人员必须设置清晰的性能指标,原始版本和金丝雀版本(更新版本)应该同时在雷同的条件下部署,以更主观地进行剖析。  金丝雀公布的劣势之一是能够最大限度地缩小宕机工夫并且防止新版本中存在潜在的问题。 此外,通过在小局部用户中测试个性,开发人员能够在对更多用户产生影响之前发现并修复问题,这有助于确保新性能或更新不会对用户体验产生负面影响。  这种部署模式也存在缺点——非常耗时。金丝雀的测试和部署是分几个阶段进行的,须要工夫进行彻底的监控和评估。正因为如此,不是所有用户都能马上从新的性能和降级中受害。  正如许多同时运行两个版本的部署策略一样,开发人员须要牢记并确保技术栈和数据库的兼容性。  蓝/绿部署蓝/绿部署是指同时部署两个利用版本,以后版本(蓝)和新版本(绿)在不同的环境中运行,并且只有一个版本是实时运行的。当绿版本进行测试时,蓝版本持续运行,反之亦然。两个版本都能够处于沉闷状态,但只有一个是公开的(通常是蓝版本)。  当测试实现、新部署就绪,就能够平安地切换流量到绿版本。尔后,蓝环境能够保留下来以执行回滚操作或在将来的更新中应用此前的性能。  蓝/绿部署简直打消了宕机工夫并容许即时回滚。 蓝/绿环境的隔离能够爱护实时部署在测试阶段免受 bug 的影响。尽管这种部署策略的危险较低,但施行老本较高,因为必须笼罩两个环境进行操作,会减少存储空间、计算能力及硬件等老本。为了在蓝绿环境之间无缝切换,开发团队还须要保障数据格式和存储的兼容性。  滚动部署应用滚动部署,开发人员能够同时上传几个版本——沉闷的版本数量被称为窗口大小(window size)。开发者能够1次只上传1个实例(即窗口大小设置为1)或在集群中同步更新部署应用程序。为了更快且更平安地部署,开发人员经常应用容器技术。容器利用部署包含 Docker 和 Kubernetes,它们是隔离更新版本、启用和禁用服务以及跟踪变动的常用工具。  滚动部署提供了灵活性,并缩小了停机工夫,因为它只在新版本筹备好之后再将流量重定向到新版本。 同时,它也升高了部署危险,因为更新存在的缺点只影响到无限的用户。然而这一部署办法回滚速度较慢,因为它须要一个渐进的办法。  另外,新的部署必须向下兼容,因为它们须要与旧版本共存。如果应用程序须要会话继续存在,那么确保负载平衡反对粘性会话也非常重要。  影子(Shadow)部署影子部署蕴含两个沉闷的平行版本,将传入申请 fork 到以后版本,而后将它们发送到新版本。这种办法有助于测试新性能如何在不影响流量的状况下解决生产负载。当新版本满足性能和稳定性要求后,即可平安上线利用。  尽管这种模式非常业余,设置起来也简单,但它打消了对生产的影响,利用流量复制来测试应用影子数据的bug。测试后果是高度精确的,因为它们应用生产负载来创立模仿事实条件。影子部署被认为是一种低危险的办法,并常常与其余办法相结合,比方金丝雀部署。  执行影子部署的步骤: 利用层级的实现: 开发人员编写的函数既能够向应用程序的以后版本也能够向新版本发送输出。输出和输入能够同时解决,也能够在一个队列中异步解决,以取得更高的精度。团队能够抉择在客户端划分输出,在浏览器或挪动设施中设置不同的API指标。基础设施层级的实现: 开发人员配置负载平衡以 fork 格局以及反对两个版本的端点。开发人员须要确保没有反复,应用程序绝不能两次申请雷同的数据。新版本应该从第一版本中接管用户的信息,否则,用户将不得不反复输出领取或注册数据。影子模式后果评估: 团队须要留神数据的谬误,比拟两个版本的性能,查看新版本是否正确接管旧版本的输出。

February 1, 2023 · 1 min · jiezi

关于部署:私有化部署的低代码平台-更安全的信息化解决方案

随同着社会经济的疾速倒退和数字技术时代的降临,企业正面临着必要的数字化转型。因为生态平台化的强化,以云端部署为主的低代码产品给咱们带来了便利性,但也有一系列问题逐步裸露,如服务器不稳固、数据安全隐患等问题。不少IT开发企业对数据安全要求高,心愿领有高稳固、高保真的数据安全爱护,越来越多的企业更偏向于将开发成绩和业务数据保留在本地,无需上传云端。在面临着平安,扩大,兼容,稳固等问题时,企业须要部署一套属于本人的私有化,平安化,扩大化数字化平台。 私有化部署是指将零碎间接部署到企业本人的服务器上,数据间接保留在企业自有的服务器。在大型国有企业、政企机构,军工,金融平台等把握着技术专利、相干行业隐衷信息、国家机密文件等重要畛域,如果服务器部署在第三方或者蒙受到守法分子监控及歹意攻打,导致信息泄露,会造成经济损失甚至威逼到中央平安,那么要如何应答该类平安威逼,私有化部署就成为了信息安全的首要保障。私有化部署后,企业的敏感数据,业务数据部署在内网的本地服务器上,不仅如此,通信信息自主可控,多种算法加密、全链的数据加密、数据第三方加密,挪动端转发、分享等安全控制,设施准入、禁用、擦除等办法让外部通信更平安、让企业专属数据信息更隐密,帮忙企业爱护数据的相对平安。 对于各行业而言,产品和畛域的不同,应用的用户不同,那么对于软件的需要就会有很大的差别,一款第三方软件因为通用化并不可能满足不同类型的治理需要。对于企业而言,在不同的阶段因为治理上的调整,以及产品的调整不同,那么就须要极强的扩展性需要。 私有化部署可利用凋谢的接口将所需性能集成到已有零碎中,以最小的调整实现原有零碎革新降级,进步企业协同办公等效率。而且因为部署在自在服务器,在遇到须要数据存储扩大,数据调用,局域网管制等问题时,私有化部署便可很快解决该类型问题。因为自在服务器以及自主管控数据,除了安全性增强以外,更能够疾速自在解决,极大地提高了灵活性。 LeaRun低代码平台是一款全技术链赋能的通用型低代码开发平台,采纳对立的设计器撑持Web页面、大屏可视化、3D数字孪生、APP、表单、工作流、数据管理等性能的可视化开发,通过利落拽和配置,即可疾速实现数字化软件应用的麻利开发。抉择全源码交付实现私有化部署的LeaRun低代码平台可间接对接内网,依据客户需要,按需灵便拓展,使得IT企业客户无需拜访外网,也能实现麻利的利用开发。 私有化部署的老本不在短期,而在长期。IT开发企业客户可对LeaRun低代码平台一次性买断,一次洽购即可重复应用。企业所有的数据均保留在本地,无需上传云端,私密数据的安全性有很好的保障,能合乎窃密型我的项目的开发诉求,还不便进行二次开发、整顿。通过长周期的平台应用和多我的项目开发,来摊薄力软平台的购买老本,大幅压低我的项目研发的刚性收入,取得更多的我的项目利润。 更多软件开发性能可返回www.learun.cn/Home/VerificationForm进行体验。

August 18, 2022 · 1 min · jiezi

关于部署:SpringBoot-Angular前后端分离项目部署更新实录

零、前言第一次给零碎上线,尽管团队内曾经有其他同学写过部署文档https://segmentfault.com/a/11...,但本文中咱们须要补充一些细节,使操作更简便 本文次要是补充内容,所以假如服务器上曾经部署了运行环境、数据库和nginx。 一、连贯服务器咱们通常应用SSH连贯Linux服务器,应用scp命令在本地和服务器之间传输文件。那么有没有更不便的办法呢?答案是有的。能够借助SFTP工具,来实现图形化传输文件,就像在本人电脑操作上一样。 Windows -> WinSCP官网地址: https://winscp.net/eng/index.php这个工具能够与服务器建设SSH连贯,并且图形化浏览服务器上的文件,并反对拖拽。 MacOS -> Termius官网地址: https://www.termius.com/与WinSCP性能雷同,既能管理文件,也能执行Bash命令。并且Termius反对MacOS、Linux、Windows、Android,网上能找到谐和版本。 有了这种可视化SFTP工具后,拷贝文件就不须要再用命令行了。 二、编译我的项目Angular: // 编译Angular我的项目ng build而后就能够生成dist文件夹,angular代码全副编译成了原生JavaScript代码。稍后须要用到dist中的所有文件 SpringBoot: // 编译SpringBoot我的项目mvn clean package咱们只须要用到target中的appName.jar这个文件。 须要留神的是,编译过程会把包含配置文件在内的所有文件封装,这意味着编译后就不能随便更改端口号、数据库等各种配置信息,因而在编译前,须要把各个参数调整至与生产环境统一。 三、复制文件关上SFTP工具,找到原来的代码地位。为了稳当起见,不要间接删除上个版本的代码,而是将它们重命名(万一出错了还能复原)。而后间接把文件夹拽过来即可。 四、敞开历史我的项目的过程,启动新过程Angular因为前端应用的HTML三件套、服务器是Apache或Nginx负责,当服务器上的代码文件变更时,一刷新就能加载新的代码,所以不须要重启服务。 SpringBoot但Java我的项目一旦运行,是不能自动检测变更的,所以必须重启这个Java过程。 // 查看端口占用状况sockstat -4l | grep 后端的端口号// 举例sockstat -4l | grep 8093// 返回值(本例中,2279为过程号)// log java 2279 26 tcp46 *:8080 *:*// 敞开过程sudo kill 过程号// 举例sudo kill 2279再次查看端口占用,曾经没有过程占用此端口了。 此时才能够在我的项目根目录输出 // 在服务器后盾运行jar包,不会随着终端退出而进行运行nohup java -jar test.jar运行胜利后,控制台不会输入任何信息。但在jar包的同级目录会有一个nohup.out文件,之前在终端上看到的那些日志信息改为写入到这个文件中,只须要查看此文件就能晓得我的项目是否启动胜利了。

February 21, 2022 · 1 min · jiezi

关于部署:如何高效完成ECS多环境部署

一、背景在软件开发和部署过程中,咱们的软件往往须要在不同的运行环境中运行,例如:开发人员本地开发环境、测试团队的测试环境、还有类生产环境和生产环境。在整个研发流程的过程中,针对开发和运维,前者面向需要和代码,后者面向资源和环境,而部署,是两者都会关注的局部。通过本文,你能够理解到,如何通过云效流水线无效拉通开发与运维,突破二者之间的壁垒墙,让开发与运维高效联动。 二、用户诉求一般来说,用户应用主机部署诉求如下: 1、开发人员不须要关注资源变更,只须要按需抉择环境进行部署即可。 2、开发人员可能依据制订好的公布策略,自主公布,不须要手工配置和干涉。 3、运维人员不需关注研发平台,只需做好资源的布局治理即可。 三、云效解决方案联合云效交付流水线公布策略及ECS的标签性能,为ECS的多环境公布提供了很好的根底保障,如图: 该场景下次要会波及开发人员跟运维人员两个角色,上面文章中咱们次要会这两个角色角度进行解说。 四、云效操作实际前置条件接下来以一个 Java Spring Boot 的代码库为例,解说如何通过云效流水线进行阿里云 ECS 的多环境公布。 1、运维人员已购买相应阿里云ECS资源,并配置好相应环境,如本文案例中须要的JDK环境。 2、运维人员,依据须要,对相应ECS资源进行标签配置。标签是云资源的标识,能够帮忙您从不同维度对具备雷同特色的云资源进行分类、搜寻和聚合,让资源管理变得更加轻松。本文中ECS资源及标签设置如图所示: 标签键:environment 标签值:dev、sit、product 创立流水线1、进入云效流水线,点击右上角【新建流水线】,进入流水线创立向导页面。 2、抉择图中标识模板,并点击创立 配置代码库创立流水线之后会自动弹出增加代码源的窗口,这里抉择Flow提供的示例代码源,并进行增加 配置构建上传工作批改一下”Java构建上传“的工作,减少一个打包门路,填入deploy.sh。这个文件存在于代码库中,其中蕴含了在ECS上进行利用启动的脚本,为了进行后续的主机部署,须要将这个文件也打入到压缩包中,在后续的主机部署工作中能够看到如何应用该deploy.sh。在该配置中指定了target/和deploy.sh两个门路,所以Flow会将这两个文件(夹)打包成为一个压缩包,并进行归档,在Flow中咱们称之为制品,该制品也会在后续的主机部署工作中用到。 配置部署工作 1、接下来配置主机部署工作,在制品下拉框中抉择”制品名称.default”,也就是后面的”Java构建上传“步骤归档的那个制品。为了配置主机组,须要先创立一个,点击”新建主机组”。 2、抉择”阿里云ECS“,点击”新建服务受权”,跳转到阿里云,实现RAM受权,而后会主动跳回到Flow。 3、此时再抉择标签形式增加,顺次抉择地区、ECS标签键、ECS标签值,点击下一步。 4、在新弹出的页面中输出主机组名称及主机组环境,点击保留即可。 5、接下来进行部署脚本的配置: 下载门路:示意心愿把”构建上传”工作中的压缩包下载到机器上的什么地位,在本例的值为:/home/admin/app/package.tgz执行用户:心愿以是哪个用户的身份进行脚本执行,本例的值为:root部署脚本:在机器上执行脚本的具体内容,本例的值为:mkdir -p/home/admin/application/tar zxvf /home/admin/app/package.tgz -C/home/admin/application/sh /home/admin/application/deploy.sh restart 6、部署策略配置 暂停形式:心愿一个主机组中的机器以什么样的暂停形式进行,比方第一批暂停,每批暂停,或者不暂停。举荐应用第一批暂停,在公布完第一批之后,对线上服务进行察看,如果没有异样,则能够持续其余批的公布分批数量:心愿主机组中的机器分为几批进行公布。比方一共4台机器,分两批,则每批同时公布2台机器。本文中配置如下所示: 7、部署后果查看 点击右上角保留并执行按钮 待执行结束后,点击部署详情按钮查看部署明细。 通过IP:8080拜访验证,如下图所示: 资源变更场景因业务须要,需在开发环境中减少一台机器,运维同学只需在ECS侧筹备相应资源,打上相应环境标签即可,如下图所示。 运维同学配置结束后,开发同学不需做任何变更,间接运行相应环境流水线即可。流水线运行过程中,因为咱们之前设置的分批,第一批暂停的公布策略,因而流水线会暂停,呈现如下状态 此时点击部署详4. 情按钮,进入部署详情页面,确认没有问题后,点击持续按钮,如下图所示 五、结语通过以上的操作流程,咱们能够通过云效流水线,利用标签性能,拉通开发与运维,同时,让开发和运维关注点拆散,专一于外围的工作内容,实现高效的ECS多环境部署。 点击下方立刻体验云效流水线Flow! https://www.aliyun.com/produc... 对于咱们 理解更多对于云效DevOps的最新动静,可微信搜寻关注【云效】公众号; 福利:公众号后盾回复【指南】,可取得《阿里巴巴DevOps实际指南》&《10倍研发效力晋升案例集》; 看完感觉对您有所帮忙别忘记点赞、珍藏和关注呦;

January 24, 2022 · 1 min · jiezi

关于部署:万字长文-解读功能开关-IDCF

性能开关Feature Toggle(通常也称为性能标记Feature Flag)是一种弱小的技术,容许团队在不更改代码的状况下批改零碎行为。包含各种应用类别,在施行和治理开关时思考该形式十分重要。开关引入了复杂性。咱们能够通过应用智能开关实现实际和适当的工具来治理咱们的开关配置来管制这种复杂性,但咱们还应该致力于限度零碎中开关的数量。 作者 Pete Hodgson是旧金山湾区的一名独立软件交付参谋。他善于帮忙初创工程团队改良他们的工程实际和技术架构。Pete 之前曾在 Thoughtworks 负责过六年的参谋,领导其西海岸业务的技术实际。他还曾在旧金山多家初创公司负责技术主管。 内容 一个开关的故事开关的类别治理不同类别的开关施行技术开关配置应用带有特色开关的零碎“性能开关”是一组模式,能够帮忙团队疾速但平安地向用户提供新性能。在这篇对于性能开关的文章中,咱们将从一个简短的故事开始,展现性能开关有用的一些典型场景。而后咱们将深入研究细节,涵盖有助于团队通过性能开关取得成功的特定模式和实际。 性能开关也称为性能标记、性能位或性能翻转器。这些都是同一组技术的同义词。在本文中,我将交替应用性能开关和性能标记。 一、一个开关的故事场景描述:你隶属于从事简单城市规划模拟游戏的多个团队之一,你的团队负责外围模仿引擎,你的工作是进步网络渲染算法的效率。你晓得这将须要对施行进行相当大的检修,这将须要数周工夫。同时,你团队的其余成员将须要在代码库的相干畛域持续一些正在进行的工作。 依据过来合并长期存在的分支的苦楚经验,如果可能的话,你心愿防止为这项工作打分支。相同,你决定整个团队将持续在骨干上工作,但致力于网络渲染算法改良的开发人员将应用性能开关来避免他们的工作影响团队的其余成员或毁坏代码库的稳定性。 1.1 性能标记的诞生以下是钻研算法的两人引入的第一个变动: 退出开关之前 function reticulateSplines () { // 以后的实现在这里 }这些示例都应用 JavaScript ES2015退出开关之后 function reticulateSplines(){ var useNewAlgorithm = false; // useNewAlgorithm = true; // UNCOMMENT IF YOU ARE WORKING ON THE NEW SR ALGORITHM if( useNewAlgorithm ){ return enhancedSplineReticulation(); }else{ return oldFashionedSplineReticulation(); } } function oldFashionedSplineReticulation(){ // current implementation lives here } function enhancedSplineReticulation(){ // TODO: implement better SR algorithm } function oldFashionedSplineReticulation () { // 以后的实现在这里 } function enhancedSplineReticulation () { // TODO:实现更好的 SR 算法 }这对曾经将以后的算法实现挪动到一个 oldFashionedSplineReticulation 函数中,并将 reticulateSplines设置为一个开关点。当初,如果有人正在钻研新算法,他们能够通过勾销正文来启用“应用新算法” 性能useNewAlgorithm = true 。 ...

January 24, 2022 · 4 min · jiezi

关于部署:揭秘远程证明架构EAA机密容器安全部署的最后一环-龙蜥技术

文 / 周亮, 云原生秘密计算 SIG 核心成员。在云原生场景下,基于HW-TEE(如Intel SGX, Intel TDX 和 AMD SEV)的秘密容器技术(如 Inclavare Containers 秘密容器和 Kata CC 秘密容器)能够为用户在应用(计算)过程中的敏感数据提供了机密性和完整性的爱护。然而在云环境中,仍旧存在如下的问题: 怎么证实用户的秘密容器的确运行在云上实在 HW-TEE 环境中?怎么证实运行在云上 HW-TEE 环境中的程序或者容器内容是合乎预期的或者没有被篡改?更进一步,如果须要在云上 HW-TEE 环境里启动一个加密容器,如何在启动过程中获取容器的解密密钥?Inclavare Containers 现已是龙蜥社区云原生秘密计算 SIG 的我的项目之一。而 Inclavare Containers 的组件 Enclave Attestation Architecture (EAA) 正是为解决这些简单的问题而生的。其设计指标是在解决上述问题的根底上,提供一个反对不同类型秘密容器和 HW-TEE 环境的通用近程证实架构。EAA设计RATS 参考架构秘密计算联盟定义了 RATS 参考架构,并倡议所有近程证实服务都应该遵循 RATS 的参考架构,RATS 架构如下:EAA 架构因而 EAA 的架构设计遵循了 RATS 参考架构,EAA 架构如下: 其次要组件和性能: Attestation Agent(Attester):运行在 HW-TEE 中的组件。作用是获取 HW-TEE 中运行程序的度量值信息,该度量值信息由 HW-TEE 进行签名。Chip Manufacturer Specific Attestation Service(Endorser):运行在私有网络中,由芯片厂商提供的服务。作用是验证度量值信息的签名,以确定度量值信息的确是由实在 HW-TEE 生成的。Verdict & Reproducible Build Infrastructure(Reference Value Provider):运行在用户可信环境中的服务。作用是生成 HW-TEE 中运行程序的度量值的参考值,以断定在 HW-TEE 环境中的运行程序是合乎预期的或者程序是没有被篡改过的。Verdictd(Relying Party + Relying Party Owner + Verifier Owner):运行在用户可信侧环境中的服务。职责是调用 Chip Manufacturer Specific Attestation Service 和 Verdict & Reproducible Build Infrastructure 查看度量值信息的签名和其内容,以实现整个近程证实流程。KMS:运行在用户可信侧环境或者私有网络中的密钥治理服务。作用是进行密钥的治理。 ...

December 22, 2021 · 2 min · jiezi

关于部署:如何通过云效Flow完成自动化部署主机部署

如何通过云效Flow实现自动化部署—主机部署,云效流水线Flow是继续交付的载体,通过构建自动化、集成自动化、验证自动化、部署自动化,实现从开发到上线过程的继续交付。通过继续向团队提供及时反馈,让交付过程高效顺畅,Flow 提供了通用的部署能力该篇内容留神解说如何通过云效Flow实现自动化部署—主机部署 新建部署工作为了创立部署组,须要先在流水线中增加「主机部署」工作。用户能够通过以下形式增加部署工作。 应用模板新建流水线,抉择蕴含 “部署” 工作的模板在已有的流水线中,增加新的阶段,并抉择「部署」工作流水线模版创立新建流水线时,抉择对应的开发语言,能够查看以后语言下的默认流水线模版,抉择带有“部署”节点的流水线模版,即可疾速应用构建能力 。 编排流水线,增加部署工作 一、主机部署云效Flow 提供了通用的部署能力,反对业务被部署到不同国家,不同云厂商环境还有你的公有环境的主机中。 云效Flow 目前反对部署以下的主机类型: 阿里云ECS二、主机组主机组是什么?每个 Web 利用,在集成测试的环境(通常称作日常环境)、预发的环境(称作预发环境)、对外提供服务的环境(称作正式环境)等不同的环境里运行。 对应在 Flow 中,咱们把这些环境称之为「主机组」,也就是该利用运行在若干台机器(虚拟机/容器)。 前置工作 能够通过两种形式创立主机组: 办法一:通过「主机组治理」增加主机组 办法二:先在流水线中增加「主机部署」工作。用户能够通过以下形式增加部署工作。 应用模板新建流水线,抉择蕴含 “部署” 工作的模板在已有的流水线中,增加新的阶段,并抉择「主机部署」工作 如何应用增加部署工作,可查阅“部署”一节 创立主机组 在部署工作中,点击「新建主机组」,进入新建主机组的流程。 你能够创立三种类型的主机组: 阿里云ECS部署到阿里云 ECS能够出公网的非阿里云主机部署到公网主机不可拜访公网的非阿里云主机(行将上线)2、部署到阿里云 ECS 云效流水线 Flow 反对部署到阿里云 ECS 。你能够依照以下形式,将你的阿里云 ECS 退出主机组,从而让流水线能对其进行部署。 创立阿里云 ECS 类型主机组 增加形式——间接增加 1)新建主机组,抉择 【主机类型】为 "阿里云ECS" 。 2)抉择【服务受权】和【地区】,展现【可增加的主机列表】,可【新建服务受权】。 3) 抉择你想要增加至主机组的ECS主机。 4) 编辑主机信息,包含主机组名称、环境、标签;主机组成员权限的配置,创建人默认为企业拥有者;点击保留,即可实现主机组的创立。 5)至此,你可在流水线中抉择应用该主机组了。 对部署权限的阐明,可查看“主机组成员权限”一节 增加形式——通过 ECS 标签增加 同时,主机组反对通过ECS标签增加,如果您应用 ECS 标签对 ECS 资源进行分类管理,能够间接在 Flow 中建设主机组和 ECS 标签的关联。 ...

September 27, 2021 · 1 min · jiezi

关于部署:git-webhook自动部署服务端代码django-python-docker等

背景自己开了一个django的集体博客,而且应用docker部署的,每次有代码更改都须要git本地提交,而后登陆服务器拉取代码,比拟耗时耗力,有没有一种形式能够本地提交代码之后,服务器主动拉取?这就是本文要介绍的主动部署 计划调研看了网上对于主动部署的文章不是特地多,而且部署的都有点简单,尤其是针对docker容器的这种根本没有还有大部分都是介绍如何主动部署一个网站,然而网站外的代码没法拉取,因为网站内执行git命令,无奈cd到网站根目录外去操作,通过大量尝试,本人钻研出一种十分间接简略的主动部署计划 计划次要内容用python写一个webhook.py的服务文件,运行 python3 webhook.py如果曾经运行了,端口9002会被占用,查找pid: lsof -i:9002 ,而后kill就行外网无法访问http://ip:9002/,是端口须要在控制台增加放开规定详解因为我的是docker利用治理形式,网站内目录拉取不了外层级的目录,所以须要独立开webhook服务,这种独立webhook服务比拟通用,根本所有webhook需要都能够满足首先我用python开的服务,当然php、go等都能够,语言不限,我这里以python为例服务代码: from http.server import HTTPServer, BaseHTTPRequestHandlerimport jsonimport subprocessimport osclass Resquest(BaseHTTPRequestHandler): def handler(self): print("data:", self.rfile.readline().decode()) self.wfile.write(self.rfile.readline()) def do_POST(self): print("hello webhook..") os.system('cd /root/docker-django && git add . && git status && git stash ;git stash clear;git pull') print("git pull finished")if __name__ == '__main__': host = ('', 9002) server = HTTPServer(host, Resquest) print("Starting server, listen at: %s:%s" % host) server.serve_forever()这段服务代码是网上找的,外面有get和post,这段是我精简之后的,没必要get,也没必要解析参数,间接开启服务执行shell命令就完事了 在服务器上执行 python3 webhook.py 服务就起来了,前面加上& 而后回车,就能够在后盾运行了 python3 webhook.py & ...

June 5, 2021 · 1 min · jiezi

关于部署:万字长文一文看懂持续部署按需发布DevOps部署和发布方法大全-IDCF

一、前言麻利DevOps的一个次要目标是要达成继续的最短的周期进行价值交付,这就离不开疾速的部署和公布。 那么问题来了,部署和公布到底是一个概念还是不同的概念?有哪些常见的部署和公布策略? 本文将会分析不同的概念,介绍不同的部署和公布的策略,在文章的最初,会对所有的策略和技术进行总结。 二、什么是部署与公布在谈继续部署之前,让咱们廓清一下什么是部署,什么是公布。 在互联网和SaaS之前的时代,通常是,先有公布(Release),再有部署(Deployment)。 1)公布研发团队公布一个版本,代表着开发实现并且测试实现是一个能够销售的软件,也代表着这个软件的上市。将软件售卖之前,须要把版本复制到软盘、U盘或者刻录到光盘上,通常叫做公布到工厂(RTM,Release to manufacturing)。软件正式上市售卖代表着软件曾经Gone Live,上线。2)部署如果是面向集体的桌面系统软件,那么由集体担当部署的人员,将软件(来源于软盘、光盘、U盘)进行装置,装置后自行进行配置。如果是面向企业的软件,那么由甲方的IT工程师负责装置和配置,或者是由乙方的服务人员负责装置和配置。还有另外一种状况,在甲方真正装置和配置软件之前,有一个用户验收测试(UAT,User Acceptance Test),在甲方的机房,先装置和配置一套,而后由甲方进行测试,如果测试通过,代表验收胜利,就能够正式的去装置和配置。在互联网、挪动互联网和SaaS时代,通常是,部署就代表着公布。 1)公布用户能看见软件或者间接应用软件,概念上和互联网之前的年代是一样的,目标都是上市 通常是将一个版本公布到网上(RTW,Release to the web)或者叫做网上公布(Web release)。在中国互联网行业,通常称之为上线(Release to production)。2)部署部署变成了将软件包公布到生产环境的一个动作,或者是一个步骤。即通过部署的动作,达成了公布的后果。麻利DevOps时代,部署和公布解耦,变成了继续部署,按业务须要公布。 1)继续部署继续的,自动化的,将软件包公布到生产环境。SaaS和网站类型的,就是间接部署到网站上。挪动利用App类型的会通过各种APP散发渠道,发到利用市场,例如苹果的AppStore,安卓的各种利用市场。2)按需公布依据业务须要,公布性能。公布,代表用户看见软件或者能够间接应用软件的性能,即release the functionality to end users。3)补充阐明对于一些ToB的企业级软件,例如电信行业,通常是软件+硬件整体销售给运营商(例如中国移动),依然会波及到发送硬件(例如替换件、路由器)到运营商,而后设施商(例如华为)的服务人员在客户现场进行机房、硬件等的装置和配置,之后才会割接上线。而2011年建设的凋谢网络基金会开始在业界大力提倡软件定义网络(SDN,Software-defined networking)和OpenFlow协定,在肯定水平上解耦了软件和硬件,那么DevOps的理念就有可能被达成,例如在华为生产的软件通过网络间接在中国移动的网络上降级软件。如下图所示,是规模化麻利框架SAFe(Scaled Agile Framework)的继续交付流水线,部署和公布是解耦开的,部署不意味着用户可见,公布才是性能对用户可见,部署仅仅是将软件部署在生产环境,新的代码变更对于用户来说还是“黑/暗”(dark)的。 让咱们正式的定义一下部署和公布,《DevOps实际指南》的定义如下: 1)部署是指在特定的环境中装置指定版本的软件(例如,将代码部署到集成测试环境中,或者部署到生产环境中)。具体的说,部署可能与某个个性的公布无关。如果部署与某个个性公布无关,部署后即时失效,即代表着公布,部署=公布。2)公布是指把一个个性(或者一组个性)提供给所有客户或者一部分客户(例如,向5%的客户群凋谢个性)。代码和环境架构要可能满足这种要求:个性公布不须要变更利用的代码。部署和公布是解耦开的,也就是:让部署能够独立于公布独自进行;而个性部署后,业务能够灵便决定什么时候公布,向哪些指标客群公布。如果部署周期过程,就会限度向市场频繁地公布新个性的能力。如果能做到按需部署,或者继续部署,那么什么时候公布新个性,就成了业务和市场决策,而不再是技术决策,所以部署是技术领域,而公布时业务领域。 三、什么是继续部署继续部署(CD,Continuous Deployment)是将在预发、类生产环境中通过验证确认的个性部署到生产环境的过程,部署后这些个性就曾经就绪,须要公布的时候随时公布。 按需公布(Release on Demand)是团队和企业的要害能力。按需公布使得业务具备继续的在最短的前置工夫(Lead Time)内,以高频率的形式,让客户应用新性能,从而通过高价值计划响应市场机会。 为了反对业务具备按需公布的能力,个性在业务须要它们之前,必须在生产环境失去验证和期待公布。所以须要将部署过程优化并从公布过程中分离出来,这样将代码变更部署到生产环境,并不会影响整个零碎的行为。继续部署的能力使团队能够进行更小的增量的代码变更,并继续地部署到生产环境,然而并不公布,直到业务须要的工夫才正式公布给客户。 而对于继续部署的“继续”,每个公司的水平是不一样的,例如,亚马逊2011年5月的部署数据,在工作日均匀每11.6秒部署一次,一个小时部署最多的一次是部署了1079次部署,一次部署均匀部署到一万台云主机,最多的时候一次部署是部署到三万台云主机。 如下图所示,《凤凰我的项目》提到国外的一些大厂2012年的部署频率和每次部署破费的工夫(Deploy Lead Time)。 笔者于2020年在苹果的App Store查看了国内各大支流IOS APP的版本公布状况,大多数的APP是在2周以内公布一次。 拿京东来说,在APP市场,大多数状况下,京东商城APP是两周一个版本,京东金融APP也是两周一个版本。对于京东的服务端的公布,基本上是每周有两次上线窗口进行小批量的上线,当然对于紧急的线上问题的修复依据状况随时上线。 如下图所示,《公布!设计与部署稳固的分布式系统 第2版》提到:部署间隔时间有更长的提早,将会导致每次的部署蕴含更多的代码变更,后果就是呈现更多缺点和宕机的危险,因而会减少更多的评审环节,那么又大大增加了部署之间的间隔时间。这是一个越来越差的加强回路。 正如《公布》这本书所说的“如果每次部署都很苦楚,那么就频繁屡次做”,所以高频的继续部署能够颠覆这个恶性循环,并且从以上国外大厂和国内大厂公布的频率来看,充分说明继续的部署是业务按需公布的必要条件。 四、继续部署实际4.1 蓝绿部署(Blue-Green Deployments)蓝绿部署是指有两个完全相同的、相互独立的生产环境,一个叫做“蓝环境”,一个叫做”绿环境“。 绿环境是用户正在应用的生产环境。当要部署一个新版本的时候,先把这个新版本部署到蓝环境中,而后在蓝环境中运行冒烟测试,来查看是否失常工作,当所有准备就绪当前,向新版本迁徙就非常简单了,只有批改一下路由配置,将用户流量从绿环境导向蓝环境就能够,这个时候蓝环境就变成了生产环境,这种切换通常在一秒钟之内就能搞定。如果出了问题,把路由器切回到绿环境上即可,而后在蓝环境中调试,找到问题的起因。 所以蓝绿部署,是在部署之后,仅仅一次切换,立即就向所有用户推出新版本,新性能对所有用户立即失效可见。 如果因为老本和投资回报的思考,不能建设两套齐全一样的生产环境,那么能够将蓝环境作为预发或预生产环境,将软件的新版本部署在预发环境,并进行验收测试,之后将拜访流量引流到这个预发环境,那么蓝环境就是正式的生产环境,同时放弃旧版本所在的绿环境不变,直至新版本没有问题后,再将旧版本所运行的环境作为下一个新版本的预发环境。 蓝绿部署中,如果是放弃两份一样的数据库,须要解决的问题是数据库的问题,一个是如何疾速复制数据库,一个是波及数据库的事务时如何解决数据的一致性问题。 在电信行业中,通常须要保障99.999%的工夫是服务可用的,所以通常会投入冗余的设计和实现,例如一个设施的双CPU、双存储、多个板卡等,双机主备等,网络建设的时候进行冗余设施的设计,通信链路有爱护协定时刻进行心跳式的检测,如果某个链路数据不通,就主动切换到另外的链路等等。 例如交换机或路由器有两个CPU,一个是主,一个是备,主备之间内存应用内存数据库进行同步,备机如果内存数据库被更新了,就立即同步到备机的长久化存储中。这样能够保障设施如果有问题的时候主备之间进行切换,同时能够被用来零停机部署、不中断业务降级(ISSU,In-Service Software Upgrade)在standby备机CPU中降级到新版本,再将其切换成主服务CPU,而原来的主活CPU变成了备机待机状态,再将其降级,这样既不影响实时业务,又降级了新版本。 ...

February 18, 2021 · 2 min · jiezi

关于部署:从0到1实现简单部署

对于目前的集体开发者而言,应用云服务器是非常方便快捷的,在灰溜溜地写好了我的项目代码后,会有一种想要疾速部署到服务器上的激动,明天咱们就来实际一下 0 到 1 的简略服务器部署。 首先你须要有一台云服务器,这里以我的阿里云服务器为例,零碎是CentOS 7.3 1.近程连贯想要在服务器上进行部署,首先得连贯上服务器,能够通过阿里云官网管制的 浏览器近程连贯 登录服务器,然而比拟麻烦,每隔一段时间都须要从新登录。除此之外,还能够利用 ssh 通过账号密码或者密钥进行连贯,如下: # 通过账号密码进行连贯,个别为 root,连贯胜利后须要输出明码ssh root@yourIp# 通过密钥进行连贯,yourKey 为密钥的本地门路ssh root@yourIp -i yourKey2.nginx 配置当初的服务器部署,基本上离不开 nginx,配置简略易用,对于集体开发者非常敌对。 2.1 nginx 装置yum install -y nginx装置胜利后能够应用 -v 查看版本,我这里是 1.16.1 nginx -v2.2 nginx 命令启动 nginx能够应用 Linux 的零碎工具 Systemd 来启动 nginx,也能够应用 nginx 自带的命令: systemctl start nginx# 或nginx# 设置开机主动启动systemctl enable nginx进行 nginx当你想进行 nginx 时,能够应用 stop 命令: systemctl stop nginx# 或nginx -s stop重启 nginx当你更改了 nginx 的配置时,这个时候往往须要重启 nginx 服务配置能力失效: systemctl restart nginx# 或nginx -s reload2.3 配置 nginxnginx 装置好了之后,默认门路个别是 /etc/nginx/,如果在该门路下没有找到,能够应用 nginx -t 命令查看装置门路: ...

February 17, 2021 · 3 min · jiezi

译如何连接-React-和-NodeExpress

原文:How to create a React frontend and a Node/Express backend and connect them作者:João Henrique译者:博轩 在本文中,我将引导你创建一个简单的 React 应用,以及一个简单的 Node/Express API,并将两者相互连接。 我不会详细介绍本文中提到的任何技术,但是我会留下链接,以便你想了解更多信息。 您可以在我为本教程制作的代码库中找到源码。 译注:嘤嘤嘤,我也写了Demo的... client-react-001 , api-node-001这里的目标是为您提供有关如何设置和连接前端客户端和后端API的实用指南。 在我们开始之前,确保您的机器上已经安装了 Node.js 创建项目主目录在终端,导航到你要保存项目的目录。现在为您的项目创建一个新目录并导航到它: mkdir my_awesome_projectcd my_awesome_project创建一个 React 应用这个过程非常简单。 我们将使用 Facebook 的 create-react-app 来... 你猜对了,简单的创建一个名为 client 的应用程序: npx create-react-app clientcd clientnpm start让我们看看这里做了什么: 1.使用 npm 的 npx 创建一个 React 应用,并将其命名为 client。2.cd (更改目录)到客户端目录中。3.启动了应用程序。 在浏览器中,访问:http://localhost:3000/ 如果一切正常,您将看到 React 欢迎页面。恭喜!这意味着您现在在本地计算机上运行了一个基本的 React 应用程序。是不是很简单? 要停止您的 React 应用程序,只需在终端按下 Ctrl + c 即可。 ...

July 15, 2019 · 2 min · jiezi

Kafka集群部署指南

一、前言1、Kafka简介Kafka是一个开源的分布式消息引擎/消息中间件,同时Kafka也是一个流处理平台。Kakfa支持以发布/订阅的方式在应用间传递消息,同时并基于消息功能添加了Kafka Connect、Kafka Streams以支持连接其他系统的数据(Elasticsearch、Hadoop等) Kafka最核心的最成熟的还是他的消息引擎,所以Kafka大部分应用场景还是用来作为消息队列削峰平谷。另外,Kafka也是目前性能最好的消息中间件。 2、Kafka架构 在Kafka集群(Cluster)中,一个Kafka节点就是一个Broker,消息由Topic来承载,可以存储在1个或多个Partition中。发布消息的应用为Producer、消费消息的应用为Consumer,多个Consumer可以促成Consumer Group共同消费一个Topic中的消息。 概念/对象简单说明BrokerKafka节点Topic主题,用来承载消息Partition分区,用于主题分片存储Producer生产者,向主题发布消息的应用Consumer消费者,从主题订阅消息的应用Consumer Group消费者组,由多个消费者组成3、准备工作1、Kafka服务器准备3台CentOS服务器,并配置好静态IP、主机名 服务器名IP说明kafka01192.168.88.51Kafka节点1kafka02192.168.88.52Kafka节点2kafka03192.168.88.53Kafka节点3软件版本说明 项说明Linux ServerCentOS 7Kafka2.3.02、ZooKeeper集群Kakfa集群需要依赖ZooKeeper存储Broker、Topic等信息,这里我们部署三台ZK 服务器名IP说明zk01192.168.88.21ZooKeeper节点zk02192.168.88.22ZooKeeper节点zk03192.168.88.23ZooKeeper节点部署过程参考:https://ken.io/note/zookeeper... 二、部署过程1、应用&数据目录#创建应用目录mkdir /usr/kafka#创建Kafka数据目录mkdir /kafkamkdir /kafka/logschmod 777 -R /kafka2、下载&解压Kafka官方下载地址:https://kafka.apache.org/down...这次我下载的是2.3.0版本 #创建并进入下载目录mkdir /home/downloadscd /home/downloads#下载安装包wget http://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.3.0/kafka_2.12-2.3.0.tgz #解压到应用目录tar -zvxf kafka_2.12-2.3.0.tgz -C /usr/kafkakafka_2.12-2.3.0.tgz 其中2.12是Scala编译器的版本,2.3.0才是Kafka的版本3、Kafka节点配置#进入应用目录cd /usr/kafka/kafka_2.12-2.3.0/#修改配置文件vi config/server.properties通用配置配置日志目录、指定ZooKeeper服务器 # A comma separated list of directories under which to store log fileslog.dirs=/kafka/logs# root directory for all kafka znodes.zookeeper.connect=192.168.88.21:2181,192.168.88.22:2181,192.168.88.23:2181分节点配置Kafka01broker.id=0#listeners=PLAINTEXT://:9092listeners=PLAINTEXT://192.168.88.51:9092Kafka02broker.id=1#listeners=PLAINTEXT://:9092listeners=PLAINTEXT://192.168.88.52:9092Kafka03broker.id=2#listeners=PLAINTEXT://:9092listeners=PLAINTEXT://192.168.88.53:90924、防火墙配置#开放端口firewall-cmd --add-port=9092/tcp --permanent#重新加载防火墙配置firewall-cmd --reload5、启动Kafka#进入kafka根目录cd /usr/kafka/kafka_2.12-2.3.0/#启动/bin/kafka-server-start.sh config/server.properties &#启动成功输出示例(最后几行)[2019-06-26 21:48:57,183] INFO Kafka commitId: fc1aaa116b661c8a (org.apache.kafka.common.utils.AppInfoParser)[2019-06-26 21:48:57,183] INFO Kafka startTimeMs: 1561531737175 (org.apache.kafka.common.utils.AppInfoParser)[2019-06-26 21:48:57,185] INFO [KafkaServer id=0] started (kafka.server.KafkaServer)三、Kafka测试1、创建Topic在kafka01(Broker)上创建测试Tpoic:test-ken-io,这里我们指定了3个副本、1个分区 ...

July 3, 2019 · 1 min · jiezi

让开发部署提速-8-倍我参与贡献这款-IDE-插件的全过程

如何像参与开源那样,去参与一款 IDE 插件的设计? 作为一款 IDE 插件的使用者,我是否能决定下一个版本的功能? 自从产品经理银时小伙和他的开发小哥们在去年12月发布 Cloud Toolkit(一款 IDE 插件)以来,已帮助数以万计的开发者们提高了业务的部署效率。期间,开发者们不仅是 Cloud Toolkit 的使用者,同时也作为设计者参与了插件的更新迭代。 本文来自开发者徐靖峰,分享了他和 Cloud Toolkit 的故事 遇见 Cloud Toolkit在与中间件小姐姐的一次聊天中,偶然间了解到这款插件,小姐姐跟我提到自己正在运营一款 IDE 开发者工具,能够使开发部署效率提高 8 倍,出于好奇心,我就上手体验了一下,看看究竟是一个什么样的产品。使用了一段时间之后,便迫不及待地向小姐姐分享了我作为开发者对插件的一些看法。 我对这款产品最直观的感受:这是一款发布工具,帮助用户在 IDE 中直接打包应用并部署到各种终端。一开始看到这款产品位于阿里云的页面中,原本以为是一款和阿里云服务强绑定的产品,但试用过后才发现,即使对于普通的云主机,也非常适用,还可以解决很多开发运维的痛点,非阿里云用户可以放心使用。 在 Cloud Toolkit 出现之前作为一个 Java 程序员,我们大多数会在 Intellij IDEA 中基于 SpringBoot 来开发 WEB 应用,所以本文中的测评将会基于以下几个架构来构建: 开发环境:IDEA项目组织方式:Maven开发框架:SpringBoot在接触 Cloud Toolkit 之前,用什么方法来部署一个 SpringBoot 应用呢?作为一个偏正经的测评人员,我不会为了凸显出 Cloud Toolkit 的强大而去翻出一些上古的部署工具来做对比,而是直接使用 Intellij IDEA 的内置功能与之对比。 第一步:配置服务器信息 在 Tools -> Deployment 中找到 IDEA 对项目部署支持的内置插件,我们可以在其中进行服务器信息的配置,包括服务器地址和权限认证,并且在 Mapping 选项卡中完成本地工程与服务器路径的映射。 第二步:配置 Maven 打包插件<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins></build>由于是 SpringBoot 应用,配置专用的打包插件后,可以将整个工程打成一个 fatjar,示例工程非常简单: ...

June 28, 2019 · 3 min · jiezi

Istio-在阿里云容器服务的部署及流量治理实践

目标在阿里云容器服务 Kubernetes 集群上部署 Istio 服务网格实践灰度发布、故障注入、熔断等 Istio 流量管理特性准备工作安装和设置 kubectl 客户端,请参考不同的操作系统,如果已经安装请忽略:macOScurl -LO https://kubectl.oss-cn-hangzhou.aliyuncs.com/macos/kubectlchmod +x ./kubectlsudo mv ./kubectl /usr/local/bin/kubectlkubectl --helpLinuxcurl -LO https://kubectl.oss-cn-hangzhou.aliyuncs.com/linux/kubectlchmod +x ./kubectlsudo mv ./kubectl /usr/local/bin/kubectlkubectl --helpWindows把 https://kubectl.oss-cn-hangzhou.aliyuncs.com/windows/kubectl.exe 放到系统PATH路径下 kubectl --help配置 kubectl 连接 Kubernetes 集群的配置,可参考文档 通过kubectl连接Kubernetes集群 实验步骤部署Istio登录容器服务控制台,在集群列表中选择一个集群,打开更多 - 部署 Istio 保持默认配置,点击"部署 Istio" 等待完成后,Istio 已经成功部署在 Kubernetes 集群中使用 kiali 查看服务网格可视化kubectl port-forward -n istio-system "$(kubectl get -n istio-system pod --selector=app=kiali -o jsonpath='{.items..metadata.name}')" 20001在本地浏览器中访问 http://localhost:20001 ,使用默认账户 admin/admin 登录 灰度发布创建命名空间并开启 Sidecar 自动注入:单击左侧导航栏中的集群 > 命名空间,进入命令空间页面,创建一个名称为 demo 的命名空间,并为其添加一个 istio-injection:enabled 的标签 单击左侧导航栏中服务网格 > 虚拟服务,进入虚拟服务(Virtual Service)页面,点击创建,创建一个简单的示例应用,指定应用名称为istio-app,指定应用版本为v1,选择刚刚创建的命名空间 demo 配置应用容器,使用如下镜像:registry.cn-beijing.aliyuncs.com/test-node/node-server:v1 ...

June 19, 2019 · 2 min · jiezi

从HelloWorld看Knative-Serving代码实现

摘要: Knative Serving以Kubernetes和Istio为基础,支持无服务器应用程序和函数的部署并提供服务。我们从部署一个HelloWorld示例入手来分析Knative Serving的代码细节。概念先知官方给出的这几个资源的关系图还是比较清晰的: 1.Service: 自动管理工作负载整个生命周期。负责创建route,configuration以及每个service更新的revision。通过Service可以指定路由流量使用最新的revision,还是固定的revision。2.Route:负责映射网络端点到一个或多个revision。可以通过多种方式管理流量。包括灰度流量和重命名路由。3.Configuration:负责保持deployment的期望状态,提供了代码和配置之间清晰的分离,并遵循应用开发的12要素。修改一次Configuration产生一个revision。4.Revision:Revision资源是对工作负载进行的每个修改的代码和配置的时间点快照。Revision是不可变对象,可以长期保留。 看一个简单的示例我们开始运行官方hello-world示例,看看会发生什么事情: apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: helloworld-go namespace: defaultspec: runLatest: // RunLatest defines a simple Service. It will automatically configure a route that keeps the latest ready revision from the supplied configuration running. configuration: revisionTemplate: spec: container: image: registry.cn-shanghai.aliyuncs.com/larus/helloworld-go env: - name: TARGET value: "Go Sample v1"查看 knative-ingressgateway: kubectl get svc knative-ingressgateway -n istio-system 查看服务访问:DOMAIN kubectl get ksvc helloworld-go --output=custom-columns=NAME:.metadata.name,DOMAIN:.status.domain 这里直接使用cluster ip即可访问 ...

May 22, 2019 · 4 min · jiezi

全流程上线平台

整体:https://segmentfault.com/a/11...。服务化建设,服务多,上线和部署成本高,本文介绍全流程上线部署平台的设计方案。 架构 线上接入层:nginx攻防(白名单,黑名单,封禁,限流),机房切换。运行层:包(一个完整 可运行的业务代码+基础环境+基础包)+容器+资源隔离+部署。容器见:运行层和接入层联动平台代码版本,配置存储;回滚;分级发布,跑case,监控文件发送:产品线生产数据①之后,调用文件飞线的客户端(图中为orp_scp.sh),指定好数据源,发到服务端(图中为中控机),服务端从ORP的基础设施NamingService读取产品线所在的机器及相关路径,然后进行部署(③④⑤)。产品线用户可以通过查看ORP平台,获得部署的进度和部署的结果(成功或失败) 定时任务:添加任务:发到任务平台,注册到计时器,存到任务集独立计时器触发,任务平台去任务集中取任务部署到任务平台,工作。日志重建线上日志采集agent。发到传输集群。消费到日志机器集群管理机器 backpool->online->故障池->backpool容器 创建资源(更新nameserver,新增ip)->迁移/释放=》更新nameserver(监控)=》更改接入层router这里做机房切换。节点监控改router内部可以服务发现+rpc,每次获取nameserver转发,或Pushnameserver 发给mq 发给接入层/监控等部署提交到任务队列(有序)-》mq=》部署拉取=》线上脚本执行重启等deploy会先将任务存进任务队列,然后推给消息中间件。消息中间件后端会重新发回deploy(如果失败,消息中间件负责重试)。Deploy会对文件进行下载、打包封装,然后调用archer将文件分发到机器上的临时目录上。最终调用deploy的后置脚本进行最终的部署。详细公司内部部署方案过程0.外部请求输1.打包,打包机将部署包存放在指定的Artifact上2.发起上线Api实现上线的控制逻辑,相当于传统的中控Api向部署Agent发送上线指令3.执行上线部署Agent下载部署包部署Agent指定上线业务部署Agent向Api上报 上线的执行结果agentbuild:完成 源文件的build,产出可执行文件完成 配置管理的替换,产出可用配置文件完成 进程托管配置supervisord.conf的生成完成 服务描述文件me.json的生成监控架构 日志agentcollector是用户上传数据等另一种输入nsq:负责接收,排队,消息投递;消息缓存存储transfer:按照一致性哈希规则进行数据分片,并将分片后的数据推送到graph中存储,基于RRD规则,对数据进行简单处理,包括时间戳按照step对齐、添加必须的字段(MAX/MIN等)graph,接收transfer上报的数据,raph推送数据到index,中间通过nsqd 做消息队列(没有proxy转发),减轻index的实时压力Round Robin是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置RRDtool 要求定时获取数据,如果在一个时间间隔内(heartbeat)没有收到值,则会用 UNKN (unknow)代替报警1).monitor-judge通过config获取报警配置策略通过index获取索引,通过query查询数据judge数据直接推送到nsqd的4151端口(nsqd广播数据到lookupd的4160端口)judge产生报警事件2).odin-monitor-alarm通过monitor-web接口获取报警策略、屏蔽策略通过nsq的lookupd(4161端口)查询对应nsqd地址并消费报警事件通过本机部署的redis(监听端口6379),作缓存报警事件写入到后端数据库中(dba维护)报警通知 经过nginx做中转,转发到notify集群

May 14, 2019 · 1 min · jiezi

从零开始上线网站的日常二-第一次上线

上一章:从零开始上线网站的日常(一)— 前后端分离网站本地调通本章目标:在云服务器上线上一章完成的网站 时间:2019.05.13 零. 步骤项目打包云服务器环境部署(JDK & Nginx)项目部署部署脚本编写一. 项目打包1. 前端项目打包前端项目打包比较简单,进入前端项目目录,运行yarn build即可完成打包 打包结果即当前目录下的 dist 文件夹,其内容如图所示: 将 dist 文件夹压缩为dist.zip包即可 2. 后端项目打包1) 使用 IDEA 打包后端项目A. 配置 IDEA a. 点击IDEA 顶部栏 File - Project Structure b. 在 Project Structure 窗口中点击 Artifacts - JAR - From modules with dependencies c. 在 Create JAR from Modules 中点击 Main Class 右边的文件夹图标,在弹出的 Select Main Class 框中选中 SpringBoot 项目的启动文件(一般会自动显示) d. 在 JAR files from libraries 部分选中第二项,下方目录默认即可,点击确认. ...

May 13, 2019 · 3 min · jiezi

Cloud Toolkit 部署应用到阿里云轻量应用服务器

在之前的文章《在 Intellij IDEA 中部署 Java 应用到 阿里云 ECS》中讲解了如何将一个本地应用部署到阿里云 ECS 上去,有些读者反馈目前正在使用阿里云轻量应用服务器,咨询是否可以通过 Cloud Toolkit 插件将应用部署到这些服务器上去?最新版本的 Cloud Toolkit 已经发布,完全支持啦。由于阿里云 ECS 云助手只能支持 VPC 网络机器,因此,轻量应用服务器只能通过 Host 模式手动添加机器,采用标准 SSH 协议来进行部署添加服务器如上图所示,在菜单Tools - Alibaba Cloud - Alibaba Cloud View - Host中打开机器视图界面,如下图:点击右上角Add Host按钮,出现添加机器界面设置服务器的 SSH 账号部署在 IntelliJ IDEA 中,鼠标右键项目工程名,在出现的菜单中点击 Alibaba Cloud - Deploy to Host…,会出现如下部署窗口:在 Deploy to Host 对话框设置部署参数,然后单击 Deploy,即可执行初次部署。部署参数说明:Deploy File:部署文件包含两种方式。Maven Build:如果当前工程采用 Maven 构建,可以使用 Cloud Toolkit 直接构建并部署。Upload File:如果当前工程并非采用 Maven 构建,或者本地已经存在打包好的部署文件,可以选择并直接上传本地的部署文件。Target Deploy host:在下拉列表中选择Tag,然后选择要部署的服务器。Deploy Location :输入在 ECS 上部署路径,如 /root/tomcat/webapps。Commond:输入应用启动命令,如 sh /root/restart.sh。表示在完成应用包的部署后,需要执行的命令 —— 对于 Java 程序而言,通常是一句 Tomcat 的启动命令。本文作者:银时阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

April 3, 2019 · 1 min · jiezi

在 IntelliJ IDEA 中部署应用到服务器

在之前的文章《在 Intellij IDEA 中部署 Java 应用到 阿里云 ECS》中讲解了如何将一个本地应用部署到阿里云 ECS 上去,有些读者反馈目前还有一些测试机器是在经典网络,甚至是在本地机房中,咨询是否可以通过 Cloud Toolkit 插件将应用部署到这些服务器上去?最新版本的 Cloud Toolkit 已经发布,完全支持啦。本地开发无论是编写云端运行的,还是编写本地运行的 Java 应用程序,代码编写本身并没有特别大的变化,因此本文采用一个及其基础的样例《在 Web 页面打印 HelloWorld 的 Java Servlet 》为例,做参考。public class IndexServlet extends HttpServlet { private static final long serialVersionUID = -112210702214857712L; @Override public void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); //Demo:通过 Cloud Toolkit ,高效的将本地应用程序代码修改,部署到云上。 writer.write(“Deploy from alibaba cloud toolkit. 2018-10-24”); return; } @Override protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { return; }}源代码下载上述代码就是一个标准的 Java 工程,用于在 Web 页面上打印一串“Hello World”的文案。安装插件阿里云提供了基于 Intellij IDEA 的插件,以方便开发人员能够高效的将本地 IDE 中编写的应用程序,极速部署到服务器中去。插件主页:https://www.aliyun.com/product/cloudtoolkit阿里云的这个 IntelliJ IDEA 插件的安装过程,和普通的插件大同小异,这里不再赘述,读者请自行安装。添加服务器如上图所示,在菜单 Tools - Alibaba Cloud - Alibaba Cloud View - Host中打开机器视图界面,如下图:点击右上角Add Host按钮,出现添加机器界面部署在 IntelliJ IDEA 中,鼠标右键项目工程名,在出现的菜单中点击 Alibaba Cloud - Deploy to Host…,会出现如下部署窗口:在 Deploy to Host 对话框设置部署参数,然后单击 Deploy,即可执行初次部署。部署参数说明:Deploy File:部署文件包含两种方式。Maven Build:如果当前工程采用 Maven 构建,可以使用 Cloud Toolkit 直接构建并部署。Upload File:如果当前工程并非采用 Maven 构建,或者本地已经存在打包好的部署文件,可以选择并直接上传本地的部署文件。Target Deploy host:在下拉列表中选择Tag,然后选择要部署的服务器。Deploy Location :输入在 ECS 上部署路径,如 /root/tomcat/webapps。Commond:输入应用启动命令,如 sh /root/restart.sh。表示在完成应用包的部署后,需要执行的命令 —— 对于 Java 程序而言,通常是一句 Tomcat 的启动命令。本文作者:银时阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

April 2, 2019 · 1 min · jiezi

odoo部署遇到的问题 yaml.parser.ParserError

ERROR: yaml.parser.ParserError: while parsing a block mapping in “./docker-compose.yml”, line 15在写docker-compose.yml文件version: ‘2’services: # PostgreSQL mydb: image: postgres:10 ports: - “5432:5432” environment: - POSTGRES_DB=postgres - POSTGRES_USER=odoo - POSTGRES_PASSWORD=odoo volumes: - odoo-db-data:/var/lib/postgresql/data # Odoo web web: build: context: ../odoo_demo dockerfile: Dockerfile hostname: web command: ./docker_run_web.sh volumes: - ../odoo_demo:/app # mount current directory inside container - odoo-web-data:/app/odoo-web-db # 把此路径/app/odoo-ee-web-db配置到odoo conf data_dir参数中 ports: - “8069:8069” # set up links so that web knows about db, rabbit and redis depends_on: - mydbvolumes: odoo-web-data: odoo-db-data:文件写完运行docker-compose up -d报错:ERROR: yaml.parser.ParserError: while parsing a block mapping in “./docker-compose.yml”, line 15, column 5expected <block end>, but found ‘<block mapping start>’ in “./docker-compose.yml”, line 25, column 4查看发现问题(vim)原因文件内块对齐有问题,使用notepad++打开查看如下:volumes: - ../odoo_demo:/app # mount current directory inside container - odoo-web-data:/app/odoo-web-db # 把此路径/app/odoo-ee-web-db配置到odoo conf data_dir参数中解决办法:在下面这句话前面添加两个空格,使他能和上面保持对其 - odoo-web-data:/app/odoo-web-db # 把此路径/app/odoo-ee-web-db配置到odoo conf data_dir参数中 ...

March 18, 2019 · 1 min · jiezi

Travis CI 部署遇到的问题

最近研究nuxt服务端渲染的时候,看到nuxt的几种部署方式,因为nuxt打包的静态文件可以直接放在GitHub上面,然后 TravisCI跟GitHub又很亲切,就选择了TravisCI部署。然后就走上了研究TravisCI的不归路。Travis CI 部署到GitHub项目gh-pages分支上,打开页面发现引用资源404?在研究nuxt的这一篇文章 《如何部署至GitHub Pages?》的时候,所有操作都按照文章提示来,发现怎么部署都失败,然后仔细看自己页面资源引用的路径,并没有实现文章中的router base 的路径配置。router: { base: ‘/<repository-name>/’}然后自己反复上传验证,终于发现问题。在官网给出的TravisCI配置中:language: node_jsnode_js: - “8"cache: directories: - “node_modules"branches: only: - masterinstall: - npm install - npm run generate # 这个需要改为npm run generate:gh-pagesscript: - echo “Skipping tests"deploy: provider: pages skip-cleanup: true github-token: $GITHUB_ACCESS_TOKEN # Set in travis-ci.org dashboard, marked secure https://docs.travis-ci.com/user/deployment/pages/#Setting-the-GitHub-token target-branch: gh-pages local-dir: dist on: branch: master需要把install中的 npm run generate 改为npm run generate:gh-pages,这样就可以走gh-page分支的打包了。不知道是不是还有别的解决方法,刚接触也不是特别了解。Travis CI 如何部署服务器?可以参考这篇文章Travis CI 自动化部署博客Travis CI 部署服务器如何实现免密登录?搞完GitHub Pages静态部署,然后就想部署服务端,毕竟接触nuxt的目的就是实现服务端渲染。然后找了一个比较坑的文章… 每次Travis部署后,都要求输入一个密码。卡在了免密登录的地方卡了很久很久… 在此多谢 @X1nFLY 的帮忙,很耐心的帮我解决了问题。其实免密登录跟trvais并没有什么关系,原理就是私钥公钥的加密解密(有兴趣可以自行去搜索),只要你本地 ssh连接实现免密登录,那Travis部署也可以的。需要在终端输入:ssh-copy-id username@your-server-ipssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的home, ~./ssh , 和 /.ssh/authorized_keys的权利,这时候只要你终端输入:ssh username@your-server-ip再次连接就不用再输入密码啦Travis CI 部署怎么启动 nuxt服务,node服务?下面到了最关键的时刻,部署成功后after_success:怎么处理?对于一个前端(没怎么接触过后台)来说,确实一脸懵逼,要操作 一些常用Linux命令。下面我就总结几个我碰到的:部署nuxt静态资源到服务器。因为nuxt静态资源是打包到 /dist 文件夹下的,所以我们只需要把/dist文件夹 拷贝到服务端对应的文件夹即可。after_success:- rsync -az –delete ./dist/* root@123.123.123.123:/data/html/nuxt # copy dist文件夹下的所有文件部署nuxt服务端渲染应用到服务器。打包对应文件夹是.nuxt 文件,但是需要服务端启动服务,所以需要安装各种依赖以及启动配置。所以需要将 .nuxt nuxt.config.js package.json static 文件或文件夹都拷贝到服务器上,并对其安装依赖,启动服务。after_success:- rsync -az –delete .nuxt nuxt.config.js package.json root@47.99.102.212:/data/ssr- ssh root@123.123.123.123 ‘cd /data/ssr/ && npm install && npm run start’部署node应用服务器。after_success:- ssh root@123.123.123.123 ‘cd /data/node/ && git pull && npm install && npm run prd’ ...

February 22, 2019 · 1 min · jiezi

Golang项目部署

文章来源:https://goframe.org/deploymen…一、独立部署使用GF开发的应用程序可以独立地部署到服务器上,设置为后台守护进程运行即可。这种模式常用在简单的API服务项目中。服务器我们推荐使用*nix服务器系列(包括:Linux, MacOS, BSD),以下使用Ubuntu系统为例,介绍如何部署使用GF框架开发的项目。1. nohup我们可以使用简单的nohup命令来运行应用程序,使其作为后台守护进程运行,即使远程连接的SSH断开也不会影响程序的执行。在流行的Linux发行版中往往都默认安装好了nohup命令工具。命令如下:nohup ./gf-app &2. tmuxtmux是一款Linux下的终端复用工具,可以开启不同的终端窗口来将应用程序作为后台守护进程执行,即使远程连接的SSH断开也不会影响程序的执行。在ubuntu系统下直接使用sudo apt-get install tmux安装即可。使用以下步骤将应用程序后台运行。tmux new -s gf-app;在新终端窗口中执行./gf-app即可;使用crt + B & D快捷键可以退出当前终端窗口;使用tmux attach -t gf-app可进入到之前的终端窗口;3. supervisorsupervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。官方网站:http://supervisord.org/常见配置如下:[program:gf-app]user=rootcommand=/var/www/mainstdout_logfile=/var/log/gf-app-stdout.logstderr_logfile=/var/log/gf-app-stderr.logautostart=trueautorestart=true使用步骤如下:使用sudo service supervisor start启动supervisor服务;创建应用配置文件/etc/supervisor/conf.d/gf-app.conf, 内容如上;使用sudo supervisorctl进入supervisor管理终端;使用reload重新读取配置文件并重启当前supoervisor管理的所有进程;也可以使用update重新加载配置(默认不重启),随后使用start gf-app启动指定的应用程序;随后可以使用status指令查看当前supervisor管理的进程状态;二、代理部署代理部署即前置一层第三方的WebServer服务器处理所有的请求,将部分请求(往往是动态处理请求)有选择性地转交给后端的Golang应用程序执行,后端部署的Golang应用程序可以配置有多个。这种模式常用在复杂的WebServer配置中,常见的场景例如:需要静态文件分离、需要配置多个域名及证书、需要自建负载均衡层,等等。虽然Golang实现的WebServer也能够处理静态文件,但是相比较于专业性的WebServer如nginx/apache来说比较简单,性能也较弱。因此不推荐使用Golang WebServer作为前端服务直接处理静态文件请求。Nginx我们推荐使用Nginx作为反向代理的前端接入层,有两种配置方式实现动静态请求的拆分。静态文件后缀这种方式通过文件名后缀区分,将指定的静态文件转交给nginx处理,其他的请求转交给golang应用。配置示例如下:server { listen 80; server_name goframe.org; access_log /var/log/gf-app-access.log; error_log /var/log/gf-app-error.log; location ~ ..(gif|jpg|jpeg|png|js|css|eot|ttf|woff|svg|otf)$ { access_log off; expires 1d; root /var/www/gf-app/public; try_files $uri @backend; } location / { try_files $uri @backend; } location @backend { proxy_pass http://127.0.0.1:8199; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}其中,8199为本地的golang应用WebServer监听端口。例如,在该配置下,我们可以通过http://goframe.org/my.png访问到指定的静态文件。静态文件目录这种方式通过文件目录区分,将指定目录的访问请求转交给nginx处理,其他的请求转交给golang应用。配置示例如下:server { listen 80; server_name goframe.org; access_log /var/log/gf-app-access.log; error_log /var/log/gf-app-error.log; location ^~ /public { access_log off; expires 1d; root /var/www/gf-app; try_files $uri @backend; } location / { try_files $uri @backend; } location @backend { proxy_pass http://127.0.0.1:8199; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}其中,8199为本地的golang应用WebServer监听端口。例如,在该配置下,我们可以通过http://goframe.org/piblic/my.png访问静态文件。三、容器部署容器部署即使用docker化部署golang应用程序,这是在云服务时代最流行的部署方式,也是最推荐的部署方式。1. 编译程序跨平台交叉编译是golang的特点之一,可以非常方便地编译出我们需要的目标服务器平台的版本,而且是静态编译,非常方便地解决了运行依赖问题。使用以下方式静态编译Linux平台amd64架构的可执行文件:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o gf-app main.go这样便编译出来一个gf-app的可执行文件。2. 编译镜像我们需要将该可执行文件gf-app编译生成docker镜像,以便于分发及部署。Golang的运行环境推荐使用alpine基础系统镜像,编译出的容器镜像约为20MB左右。一个参考的Dockerfile文件如下( 可以参考gf-home项目的Dcokerfile: https://github.com/gogf/gf-home ):FROM loads/alpine:3.8LABEL maintainer=“john@johng.cn”################################################################################ INSTALLATION###############################################################################ADD ./gf-app /bin/mainRUN chmod +x /bin/main################################################################################ START###############################################################################CMD main其中,我们的基础镜像使用了loads/alpine:3.8这个镜像,基础镜像的Dockerfile地址:https://github.com/johngcn/do… ,仓库地址:https://hub.docker.com/u/loads随后使用 docker build gf-app . 命令编译生成名为gf-app的docker镜像。3. 运行镜像使用以下命令运行镜像:docker run gf-app4. 镜像分发容器的分发可以使用docker官方的平台:https://hub.docker.com/ ,国内也可以考虑使用阿里云:https://www.aliyun.com/produc… 。5. 容器编排在企业级生产环境中,docker容器往往需要结合kubernetes或者docker swarm容器编排工具一起使用。容器编排涉及到的内容比较多,感兴趣的同学可以参考以下资料:https://kubernetes.io/https://docs.docker.com/swarm/ ...

February 19, 2019 · 1 min · jiezi

Nginx + Node + Vue 部署初试

趁着爸妈做年夜饭之前,把之前做的笔记贴出来,新的一年到了,祝大家Nginx + Node + Vue 部署初试知乎个人博客Github日常学习笔记Nginx定义异步框架的 Web服务器,也可以用作反向代理,负载平衡器 , HTTP缓存, 媒体流等的开源软件。它最初是一个旨在实现最高性能和稳定性的Web服务器。除了HTTP服务器功能外,NGINX还可以用作电子邮件(IMAP,POP3和SMTP)的代理服务器以及HTTP,TCP和UDP服务器的反向代理和负载平衡器。特点更快高扩展性, Nginx的模块都是嵌入到二进制文件中执行高可靠性低内存消耗单机支持10万次的并发连接热部署, master管理进行与work工作进程分离设计,因此具备热部署功能最自由的BSD许可协议功能静态服务(css , js , html, images, videos)SSL 和 TLS SNI 支持HTTP/HTTPS, SMTP, IMAP/POP3 反向代理FastCGI反向代理负载均衡页面缓存(CDN)支持gzip、expirse支持 keep-alive 和管道连接基于 PCRE 的 rewrite 重写模块带宽限制基于IP 和名称的虚拟主机服务支持访问速率、并发限制反向代理(适用2000WPV、并发连接1W/秒),简单的负载均衡和容错基于客户端 IP 地址和 HTTP 基本认证的访问控制Mac 安装Nginx// 推荐使用brew, 安装homebrew/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"// Homebrew 安装 Nginx brew install nginx// Mac 下 Nginx的目录cd /usr/local/etc/nginxll -alvim nginx.confhomebrew详见Nginx 参数列表配置参数属性解释说明参数列表user设置nginx服务的系统使用用户nobody(注意:此处用户如果比启动Nginx的用户权限低,你需要使用当前用户重启Nginx)nginx -s stop 关闭nginx-> nginx 启动-> ps auxgrep nginx查看启动用户worker_processes开启的线程数一般与服务器核数保持一致error_log定位全局错误日志文件错误日志定义等级,[ debug \info notice \warn \error \crit ],debug输出最多,crir输出最少pid指定进程id的存储文件位置 worker_rlimit_nofile指定一个nginx进程打开的最多文件描述符数目,受系统进程的最大打开文件数量限制 events包含Nginx中所有处理连接的设置 httpNginx http处理的所有核心特性 Event配置参数属性解释说明参数列表worker_connections定义每个进程的最大连接数,受系统进程的最大打开文件数量限制单个后台worker process进程的最大并发链接数 (最大连接数= worker_processes worker_connections)在反向代理环境下:<br/>最大连接数 = worker_processes worker_connections / 4use工作进程数[ epoll /dev/poll \poll \eventport \kqueue \select \rtsig ]multi_accept一个新连接通知后接受尽可能多的连接on / offaccept_mutex开启或者禁用使用互斥锁来打开socketson / offEvent Use支持的事件模型Events详见HTTP配置参数属性解释说明参数列表include主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度,DNS主配置文件中的zonerfc1912,acl基本上都是用include语句 default_type核心模块指令默认设置为二进制流,也就是当文件类型未定义时使用这种方式log_format日志格式的设定日志格式的名称,可自行设置,后面引用access_log引用日志引用log_format设置的名称keepalive_timeout设置客户端连接保存活动的超时时间0是无限制sendfile开启高效文件传输模式on / offtcp_nopush开启防止网络阻塞on / offtcp_nodelay开启防止网络阻塞on / offupstream负载均衡 serverNginx的server虚拟主机配置 Upstream配置参数属性解释说明轮询(默认)每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况ip_hash每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。url_hash(第三方)按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。weight 默认为1.weight越大,负载的权重就越大。Nginx Upstream 状态例如:upstream news { server 127.0.0.1:9527 backup; server 127.0.0.1:9527 weight=1 max_fails=2 fail_timeout=3; …}配置参数属性解释说明backup预留的备份服务器down当前的server暂时不参与负载均衡fail_timeout经过max_fails 失败后,服务暂停的时间max_conns限制最大的接收的连接数max_fails允许请求失败的次数use location:在server中添加proxy_pass http://127.0.0.1:9527;// 因为我的API接口是这个,such as /api/profile// location 具体匹配规则详见后面location ~ /api/ { proxy_pass http://127.0.0.1:9527;}Server配置参数属性解释说明参数列表listen监听端口http -> 80 / https -> 443server_name设置主机域名localhostcharset设置访问的语言编码 access_log设置虚拟主机访问日志的存放路径及日志的格式 location设置虚拟主机的基本信息 Location配置参数属性解释说明参数列表root设置虚拟主机的网站根目录Vue项目的根目录/Users/rainy/Desktop/MyWork/Work/cloudwiz-website/distindex设置虚拟主机默认访问的网页index.html index.htmproxy通过不同协议将请求从NGINX传递到代理服务器 =: 开头表示精确匹配,如 api 中只匹配根目录结尾的请求,后面不能带任何字符串.^~ :开头表示uri以某个常规字符串开头,不是正则匹配.: 开头表示区分大小写的正则匹配.: 开头表示不区分大小写的正则匹配./ : 通用匹配, 如果没有其它匹配,任何请求都会匹配到.匹配优先级(高到低)location =location 完整路径location ^~ 路径location , 正则顺序location 部分起始路径/详见Location配置Reverse Proxy当NGINX代理请求时,它会将请求发送到指定的代理服务器,获取响应并将其发送回客户端。可以使用指定的协议将请求代理到HTTP服务器(另一个NGINX服务器或任何其他服务器)或非HTTP服务器(可以运行使用特定框架(如PHP或Python)开发的应用程序)。location / some / path / { proxy_pass http://www.example.com:8080; proxy_set_header Host $ host ; proxy_set_header X-Real-IP $ remote_addr ; // 禁用特定位置的缓冲 proxy_buffering off ; proxy_buffers 16 4k ; proxy_buffer_size 2k ; proxy_bind 127.0.0.2 ; // IP地址也可以用变量指定}将请求传递给非HTTP代理服务器,**_pass应使用相应的指令:fastcgi_pass 将请求传递给FastCGI服务器uwsgi_pass 将请求传递给uwsgi服务器scgi_pass 将请求传递给SCGI服务器memcached_pass 将请求传递给memcached服务器配置参数属性解释说明参数列proxy_pass将请求传递给HTTP代理服务器 proxy_set_header传递请求标头默认情况下,NGINX在代理请求中重新定义两个头字段“Host”和“Connection”,并删除其值为空字符串的头字段。“Host”设置为$proxy_host变量,“Connection”设置为close。proxy_buffering负责启用和禁用缓冲on / offproxy_buffers请求分配的缓冲区的大小和数量 proxy_buffer_size代理服务器的响应的第一部分存储在单独的缓冲区大小通常包含一个相对较小的响应头,并且可以比其余响应的缓冲区小。proxy_bind接受来自特定IP网络或IP地址范围的连接指定proxy_bind必要网络接口的指令和IP地址详见Proxy全局变量Global Variable变量名变量含义$args请求中的参数$content_lengthHTTP请求信息里的Content-Length$content_type请求信息里的Content-Type$host请求信息中的Host,如果请求中没有Host行,则等于设置的服务器名$http_cookiecookie 信息$http_referer引用地址$http_user_agent客户端代理信息$remote_addr客户端地址$remote_port客户端端口号$remote_user客户端用户名,认证用$request_method请求的方法,比如GET、POST等$request_uri完整的原始请求URI(带参数)$scheme请求方案,http或https$server_addr接受请求的服务器的地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);$server_protocol请求的协议版本,HTTP/1.0或HTTP/1.1$uri请求中的当前URI, $uri在请求处理期间 ,值可能会发生变化,例如在执行内部重定向或使用索引文件时全局变量详见Alphabetical index of variables修改 http server中的配置启动Nginxnginxps -ef | grep nginx重启Nginxnginx -s reload关闭Nginxnginx -s stop因为我已经启动了,所以就重启一下Nginx即可Linux安装NginxLinux安装常见的Linux命令使用pstree查看当前服务器启动的进程pstree查找Nginx的位置ps -aux | grep nginx进入nginx的目录然后配置nginx.conf文件即可Docker安装Nginx查找 Docker Hub 上的 nginx镜像docker search nginx拉取官方镜像docker pull nginx查看当前镜像docker images nginxServer Treetree -C -L 3 -I ‘node_modules’├── server│ ├── app.js│ ├── db│ │ ├── db.js│ │ └── newsSql.js│ ├── package-lock.json│ ├── package.json│ └── routers│ ├── news.js│ └── router.jsNode Servernpm initnpm install express mysql body-parser -Sapp.jsconst express = require(’express’)const bodyParser = require(‘body-parser’)const app = express()const router = require(’./routers/router’)const PORT = 9527app.use(bodyParser.json())app.use(bodyParser.urlencoded({ extended: true }))app.use(router)app.listen(PORT, () => { console.log(Listen port at ${PORT})})db.js -> Mysql配置module.exports = { mysql: { host: ’localhost’, user: ‘root’, password: ‘xxxx’, database: ’test’, port: ‘3306’ }}router.jsconst express = require(’express’)const router = express.Router()const news = require(’./news’)router.get(’/api/news/queryAll’, (req, res, next) => { news.queryAll(req, res, next)})router.get(’/api/news/query’, (req, res, next) => { news.queryById(req, res, next)})router.post(’/api/news/add’, (req, res, next) => { news.add(req, res, next)})router.post(’/api/news/update’, (req, res, next) => { news.update(req, res, next)})router.delete(’/api/news/deleteNews’, (req, res, next) => { news.deleteNews(req, res, next)})module.exports = routernewSql.jsmodule.exports = { createNews: CREATE TABLE news ( id int(255) NOT NULL AUTO_INCREMENT, type varchar(255) CHARACTER SET utf8 NOT NULL, title varchar(255) CHARACTER SET utf8 NOT NULL, description varchar(255) CHARACTER SET utf8 NOT NULL, occur_time varchar(255) CHARACTER SET utf8 NOT NULL, url varchar(255) NOT NULL, newsImg varchar(255) NOT NULL, PRIMARY KEY (id) ), queryAll: ‘SELECT * FROM news’, queryById: ‘SELECT * FROM news WHERE id = ?’, add: ‘INSERT INTO news (type, title, description, occur_time, url, newsImg) VALUES (?, ?, ?, ?, ?, ?)’, update: ‘UPDATE news SET type = ?, title = ?, description = ?, occur_time = ?, url = ?, newsImg = ? WHERE id = ?’, delete: ‘DELETE FROM news WHERE id = ?’}news.jsconst mysql = require(‘mysql’)const db = require(’../db/db’)const $newsSql = require(’../db/newsSql’)let pool = mysql.createPool(db.mysql)let queryAll = (req, res, next) => { pool.getConnection((error, connect) => { if (error) { throw error } else { connect.query($newsSql.queryAll, (error, data) => { if (error) { throw error } res.json({ code: ‘200’, msg: ‘success’, data }) connect.release() }) } })}let queryById = (req, res, next) => { let id = +req.query.id pool.getConnection((error, connect) => { if (error) { throw error } else { connect.query($newsSql.queryById, id, (error, data) => { if (error) { throw error } res.json({ code: ‘200’, msg: ‘success’, data }) connect.release() }) } })}let add = (req, res, next) => { let rb = req.body let params = [rb.type, rb.title, rb.description, rb.occur_time, rb.url, rb.newsImg] pool.getConnection((error, connect) => { if (error) { throw error } else { connect.query($newsSql.add, params, (error, data) => { if (error) { throw error } res.json({ code: ‘200’, msg: ‘success’ }) connect.release() }) } })}let update = (req, res, next) => { let rb = req.body let params = [rb.type, rb.title, rb.description, rb.occur_time, rb.url, rb.newsImg, rb.id] pool.getConnection((error, connect) => { if (error) { throw error } else { connect.query($newsSql.update, […params], (error, data) => { if (error) { throw error } res.json({ code: ‘200’, msg: ‘success’ }) connect.release() }) } })}let deleteNews = (req, res, next) => { let id = +req.query.id pool.getConnection((error, connect) => { if (error) { throw error } else { connect.query($newsSql.delete, id, (error, data) => { if (error) { throw error } res.json({ code: ‘200’, msg: ‘success’ }) connect.release() }) } })}module.exports = { queryAll, queryById, add, update, deleteNews}Vue配置代理以及使用apiconfig/index.js 修改proxyTablemodule.exports = { dev: { proxyTable: { ‘/api’: { target: ‘http://127.0.0.1:9527’, changeOrigin: true, pathRewrite: { ‘^/api’: ‘/api’ } } } }}使用axios调用接口import axios from ‘axios’export default { created () { this._getAllNews() }, methods: { _getAllNews () { axios.get(’/api/news/queryAll’).then(res => { if (+res.data.code === SCC_CODE) { this.news = res.data.data } }) } }}Vue build打包npm run build因为我的Server端是Express写的,启动Server需要使用Node,所以我们需要在服务器上安装Node.Linux安装Node 8.x# Using Ubuntucurl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -sudo apt-get install -y nodejs# Using Debian, as rootcurl -sL https://deb.nodesource.com/setup_8.x | bash -apt-get install -y nodejs# Using Centoscurl -sL https://rpm.nodesource.com/setup_8.x | bash -yum install -y nodejs具体安装各版本的Node详见启动Node此处我之前的命令执行错误,所以我需要kill这个进程nohup node website/server/app.js &nohup:可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out文件中。如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。到这里,我们的Web,Node Server ,Nginx都已经配置并启动好了,我们只需要到浏览器输入你的服务器IP:8080即可.Nginx众多概念详见官方词汇表什么是应用交付?什么是应用交付控制器(ADC)?什么是应用程序服务器与Web服务器?什么是缓存?什么是云负载平衡?什么是聚类?什么是DevOps?什么是分布式拒绝服务(DDoS)?什么是DNS负载平衡?什么是全局服务器负载平衡?什么是高可用性?什么是HTTP?什么是HTTP / 2?什么是混合负载均衡?什么是第4层负载均衡?什么是第7层负载平衡?什么是负载平衡?什么是媒体服务器?什么是微服务?什么是网络负载均衡器?什么是NGINX?什么是渐进式下载?什么是反向代理服务器?什么是反向代理与负载均衡器?什么是循环负载平衡?什么是面向服务的体系结构(SOA)?什么是会话持久性?什么是SSL负载均衡器?什么是Web加速?什么是Web服务器? ...

February 4, 2019 · 4 min · jiezi

自动化部署工具Syncd v1.1.0发布,提供二进制安装包

Syncd是一款开源的代码部署工具,它具有简单、高效、易用等特点,可以提高团队的工作效率。项目地址(Github) 项目地址(Gitee) 下载地址 v1.1.0 使用文档特性:Go语言开发,编译简单、运行高效Web界面访问,交互友好灵活的角色权限配置支持Git仓库分支、tag上线部署hook支持完善的上线工作流邮件通知机制更新内容安装脚本通过go env获取GOPATH #8utf8 to utf8mb4 #13支持go modules #4压缩登录背景图 #5添加服务器支持填入域名 #3解决没有添加集群的时候添加项目出错 #7提供二进制安装包

January 16, 2019 · 1 min · jiezi

Syncd - 自动化部署工具

syncd是一款开源的代码部署工具,它具有简单、高效、易用等特点,可以提高团队的工作效率.目录特性原理安装使用帮助授权特性Go语言开发,编译简单、运行高效Web界面访问,交互友好灵活的角色权限配置支持Git仓库分支、tag上线部署hook支持完善的上线工作流邮件通知机制原理GitSyncd服务通过git-ssh(或password)方式从仓库中拉取指定tag(分支)代码构建运行配置好的构建脚本, 编译成可上线的软件包在这一环节中,可运行单元测试 (例如 go test php phpunit, 下载依赖 (如 go: glide install php: composer install), 编译软件包 (如 js: npm build go: go build xx.go java: javac xx.java c: cc xx.c) 等.分发通过 scp 命令分发软件包到各机房生产服务器的临时目录, 远程执行 pre-deploy 配置的命令, 执行完毕后解压缩软件包到目标目录,然后执行 post-deploy 命令分发上线过程是串行执行,并且任意步骤执行失败整个上线单会终止上线并将状态置为上线失败,需要点击 再次上线 重试.将来会支持同一集群服务器并行执行, 集群之间串行发布的特性SSH信任生产服务器与部署服务器之间通过ssh-key建立信任配置方法请参考 秘钥配置 章节安装准备工作Go推荐Go1.10以上版本, 用来编译源代码NginxWeb服务依赖NginxMySQL系统依赖Mysql存储持久化数据, 推荐版本 Mysql 5.7Linux + Bash系统会使用到 git, ssh, scp 等命令,所以目前只推荐在Linux上使用, 并且需要提前安装或更新这些命令道最新版本秘钥配置由于部署服务器(Syncd服务所在的服务器)与生产服务器(代码部署目标机)之间通过ssh协议通信,所以需要将部署机的公钥 (一般在这里: /.ssh/id_rsa.pub)加入到生产机的信任列表中(一般在这里 /.ssh/authorized_keys)可使用 ssh-copy-id 命令添加,或手动拷贝. 拷贝后不要忘记进行测试连通性 ssh {生产机用户名}@{生产机地址} 最后建议将以下配置加入到部署服务器ssh配置/etc/ssh/ssh_config中,关闭公钥摘要的显示提示,防止后台脚本运行失败Host * StrictHostKeyChecking no请注意: ssh目录权限需按此设置,否则会出现无法免密登录的情况/.ssh 0700/.ssh/authorized_keys 0600安装运行以下命令curl https://raw.githubusercontent.com/dreamans/syncd/master/install.sh |bash当前路径中若生成 syncd-deploy 或者 syncd-deploy-xxx 目录则表明安装成功生成的 syncd-deploy 目录可拷贝或移动到你想要的地方,但不要试图将此目录拷贝到其他服务器上运行,会造成不可预料的结果.数据库依赖你需要将 github.com/dreamans/syncd/syncd.sql 数据表结构和数据导入到MySQL数据库中修改配置文件修改 syncd-deploy/etc/syncd.ini 中相关配置信息, 具体配置描述可参考注释启动服务cd syncd-deploy➜ syncd-deploy ./bin/syncd -c ./etc/syncd.ini __ _____ __ __ ____ _____ / / / / / / / / / __ \ / / / __ / ( ) / // / / / / / / / / // /// _, / // // ___/ _,/ /___/Service: syncdVersion: 1.0.0Config Loaded: ./etc/syncd.iniLog: stdoutDatabase: 127.0.0.1Mail Enable: 0HTTP Service: :8868Start Running…添加Nginx配置upstream syncdServer { server 127.0.0.1:8868 weight=1;}server { listen 80; server_name deploy.syncd.cc; # 此处替换成你的真实域名 access_log logs/deploy.syncd.cc.log; location / { try_files $uri $uri/ /index.html; root /path/syncd-deploy/public; # 此处/path请替换成真实路径 index index.html index.htm; } location ^~ /api/ { proxy_pass http://syncdServer; proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Origin $host:$server_port; proxy_set_header Referer $host:$server_port; }}重启nginx服务修改hosts若域名未解析,可修改hosts进行临时解析sudo vim /etc/hosts127.0.0.1 deploy.syncd.cc;安装完成打开浏览器,访问 http://deploy.syncd.cc初始账号:用户名: syncd邮箱: syncd@syncd.cc密码: syncd.cc!!!登录后请尽快修改密码使用系统使用流程图使用截图 帮助遇到问题请提 issue或者加微信进讨论群授权本项目采用 MIT 开源授权许可证,完整的授权说明已放置在 LICENSE 文件中 ...

January 12, 2019 · 1 min · jiezi

服务器小白的我,是如何成功将 node+mongodb 项目部署在服务器上并进行性能优化的

前言本文讲解的是:做为前端开发人员,对服务器的了解还是小白的我,是如何一步步将 node+mongodb 项目部署在阿里云 centos 7.3 的服务器上,并进行性能优化,达到页面 1 秒内看到 loading ,3 秒内看到首屏内容的。搭建的项目是采用了主流的前后端分离思想的,这里只讲 服务器环境搭建与性能优化。效果请看 http://乐趣区.cn/main.html1. 流程开发好前端与后端程序。购买服务器与域名服务器上安装所需环境(本项目是 node 和 mongodb )服务器上开放端口与设置规则用 nginx、apache 或者tomcat 来提供HTTP服务或者设置代理上传项目代码 或者 用码云或者 gihub 来拉取你的代码到服务器上启动 express 服务器优化页面加载2. 内容细节2.1 开发好前端与后端程序开发好前端与后端程序,这个没什么好说的,就是开发!开发!开发!再开发!2.2 购买服务器与域名本人一直觉得程序员应该有一个自己的个人网站,拥有自己的域名与服务器。学知识或者测试项目的时候可以用来测试。阿里云有个专供学生的云翼计划 阿里云学生套餐,入门级的云服务器原价1400多,学生认证后只要114一年,非常划算。还是学生的,直接购买;不是学生了,有弟弟、妹妹的,可以用他们的大学生身份,购买,非常便宜实用(我购买的就是学生优惠套餐)。当然阿里云服务器在每年双 11 时都有很大优惠,也很便宜,选什么配置与价格得看自己的用处。服务器预装环境可以选择 CentOS 或者 windows server,,为了体验和学习 linux 系统,我选择了CentOS。再次是购买域名 阿里域名购买,本人也是在阿里云购买的。域名是分 国际域名与国内域名的,国际域名是不用备案的,但是国内的域名是必须 ICP备案的 阿里云ICP代备案管理系统,不然不能用,如果是国内域名,如何备案域名,请自己上网查找教程。当然如果你的网站只用来自己用的话,可以不用买域名,因为可以通过服务器的公网 ip 来访问网站内容的。如果购买了域名了,还要设置域名映射到相应的公网 ip ,不然也不能用。3. 服务器上安装所需环境(本项目是 node 和 mongodb )3.1 登录服务器因本人用的是 MacBook Pro ,所以直接打开 mac 终端,通过下面的命令行连接到服务器。root 是阿里云服务器默认的账号名,连接时候会叫你输入密码,输入你购买时设置的或者后来设置的密码。ssh root@47.106.20.666 //你的服务器公网 ip,比如 47.106.20.666如图:window 系统的,请用 Putty 或 Xshell 来登录,可以参考一下这篇文章 把 Node.js 项目部署到阿里云服务器(CentOs)一般在新服务器创建后,建议先升级一下 CentOS:yum -y update常用的 Linux 命令cd 进入目录cd .. 返回上一个目录ls -a 查看当前目录mkdir abc 创建abc文件夹mv 移动或重命名rm 删除一个文件或者目录3.2 安装 node升级常用库文件, 安装 node.js 需要通过 g++ 进行编译。yum -y install gcc gcc-c++ autoconf跳转到目录:/usr/local/src,这个文件夹通常用来存放软件源代码:cd /usr/local/src下载 node.js 源码,也可以使用 scp 命令直接上传,因为下载实在太慢了:下载地址:Downloads,请下载最新的相应版本的源码进行下载,本人下载了 v10.13.0 版本的。https://nodejs.org/dist/v10.13.0/node-v10.13.0.tar.gz下载完成后解压:tar -xzvf node-v10.13.0.tar.gz进入解压后的文件夹:cd node-v10.13.0执行配置脚本来进行预编译处理:./configure编译源代码,这个步骤花的时间会很长,大概需要 5 到 10 分钟:make编译完成后,执行安装命令,使之在系统范围内可用:make install安装 express 推荐 global 安装npm -g install express建立超级链接, 不然 sudo node 时会报 “command not found"sudo ln -s /usr/local/bin/node /usr/bin/nodesudo ln -s /usr/local/lib/node /usr/lib/nodesudo ln -s /usr/local/bin/npm /usr/bin/npmsudo ln -s /usr/local/bin/node-waf /usr/bin/node-waf通过指令查看 node 及 npm 版本:node -vnpm -vnode.js 到这里就基本安装完成了。3.2 安装 mongodb下载地址:mongodb下载时,请选对相应的环境与版本,因为本人的服务器是 CentOS ,其实本质就是 linux 系统,所以选择了如下图环境与目前最新的版本。mongodb :软件安装位置:/usr/local/mongodb数据存放位置:/home/mongodb/data数据备份位置:/home/mongodb/bak日志存放位置:/home/mongodb/logs下载安装包> cd /usr/local> wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.4.tgz解压安装包,重命名文件夹为 mongodbtar zxvf mongodb-linux-x86_64-4.0.4.tgzmv mongodb-linux-x86_64-4.0.4 mongodb在 var 文件夹里建立 mongodb 文件夹,并分别建立文件夹 data 用于存放数据,logs 用于存放日志mkdir /var/mongodbmkdir /var/mongodb/datamkdir /var/mongodb/logs打开 rc.local 文件,添加 CentOS 开机启动项:vim /etc/rc.d/rc.local// 不懂 vim 操作的请自行查看相应的文档教程,比如: vim 模式下,要 按了 i 才能插入内容,输入完之后,要按 shift 加 :wq 才能保存退出。将 mongodb 启动命令追加到本文件中,让 mongodb 开机自启动:/usr/local/mongodb/bin/mongod –dbpath=/var/mongodb/data –logpath /var/mongodb/logs/log.log -fork启动 mongodb/usr/local/mongodb/bin/mongod –dbpath=/var/mongodb/data –logpath /var/mongodb/logs/log.log -fork看到如下信息说明已经安装完成并成功启动:forked process: 18394all output going to: /var/mongodb/logs/log.logmongodb 默认的端口号是 27017。如果你数据库的连接要账号和密码的,要创建数据库管理员,不然直接连接即可。在 mongo shell 中创建管理员及数据库。切换到 admin 数据库,创建超级管理员帐号use admindb.createUser({ user: “用户名”, pwd:“登陆密码”, roles:[{ role: “userAdminAnyDatabase”, db: “admin” }] })切换到要使用的数据库,如 taodb 数据库,创建这个数据库的管理员帐号use taodbdb.createUser({ user: “用户名”, pwd:“登陆密码”, roles:[ { role: “readWrite”, db: “taodb” }] //读写权限 })重复按两下 control+c ,退出 mongo shell。到这里 mongodb 基本已经安装设置完成了。备份与恢复 请看这篇文章:MongoDB 备份(mongodump)与恢复(mongorestore)安装 node 与 mongodb 也可以参考这篇文章:CentOs搭建NodeJs服务器—Mongodb安装3.3 服务器上开放端口与设置安全组规则如果你只放静态的网页,可以参考这个篇文章 通过云虚拟主机控制台设置默认首页但是我们是要部署后台程序的,所以要看以下的内容:安全组规则是什么鬼授权安全组规则可以允许或者禁止与安全组相关联的 ECS 实例的公网和内网的入方向和出方向的访问。 阿里云安全组应用案例文档80 端口是为 HTTP(HyperText Transport Protocol) 即超文本传输协议开放的,浏览器 HTTP 访问 IP 或域名的 80 端口时,可以省略 80 端口号如果我们没有开放相应的端口,比如我们的服务要用到 3000 ,就要开放 3000 的端口,不然是访问不了的;其他端口同理。端口都配置对了,以为能用公网 IP 进行访问了么 ? 小兄弟你太天真了 …还有 防火墙 这一关呢,如果防火墙没有关闭或者相关的端口没有开放,也是不能用公网 IP 进行访问网站内容的。和安全组端口同理,比如我们的服务要用到的是 3000 端口,就要开放 3000 的端口,不然是访问不了的;其他端口同理。出于安全考虑还是把防火墙开上,只开放相应的端口最好。怎么开放相应的端口 ? 看下面两篇文章足矣,这里就不展开了。1. 将nodejs项目部署到阿里云ESC服务器,linux系统配置80端口,实现公网IP访问2. centos出现“FirewallD is not running”怎么办3.4 用 nginx、apache 或者 tomcat 来提供 HTTP 服务或者设置代理我是用了 nginx 的,所以这里只介绍 nginx 。安装 nginx 请看这两篇文章:1. Centos7安装Nginx实战2. 阿里云Centos7安装Nginx服务器实现反向代理开启 ngnx 代理进入到目录位置cd /usr/local/nginx在 nginx 目录下有一个 sbin 目录,sbin 目录下有一个 nginx 可执行程序。./nginx关闭 nginx./nginx -s stop重启./nginx -s reload基本的使用就是这样子了。如下给出我的 nginx 代理的设置:我的两个项目是放在 /home/blog/blog-react/build/; 和 /home/blog/blog-react-admin/dist/; 下的,如果你们的路径不是这个,请修改成你们的路径。#user nobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events { worker_connections 1024;}http { include mime.types; default_type application/octet-stream; #log_format main ‘$remote_addr - $remote_user [$time_local] “$request” ’ # ‘$status $body_bytes_sent “$http_referer” ’ # ‘"$http_user_agent” “$http_x_forwarded_for”’; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # 如果port_in_redirect为off时,那么始终按照默认的80端口;如果该指令打开,那么将会返回当前正在监听的端口。 port_in_redirect off; # 前台展示打开的服务代理 server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; #root /home/blog; location / { root /home/blog/blog-react/build/; index index.html; try_files $uri $uri/ @router; autoindex on; } location @router{ rewrite ^.$ /index.html last; } location /api/ { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://47.106.136.114:3000/ ; } gzip on; gzip_buffers 32 4k; gzip_comp_level 6; gzip_min_length 200; gzip_types text/css text/xml application/javascript; gzip_vary on; #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } # HTTPS server # 管理后台打开的服务代理 server { listen 4444; server_name localhost; # charset koi8-r; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; location / { root /home/blog/blog-react-admin/dist/; index index.html index.htm; try_files $uri $uri/ @router; autoindex on; } location @router{ rewrite ^.$ /index.html last; } location /api/ { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://47.106.136.114:3000/ ; } gzip on; gzip_buffers 32 4k; gzip_comp_level 6; gzip_min_length 200; gzip_types text/css text/xml application/javascript; gzip_vary on; error_page 500 502 503 504 /50x.html; }}我是开了两个代理的:前台展示打开的服务代理和管理后台打开的服务代理,这个项目是分开端口访问的。比如:我的公网 ip 是 47.106.20.666,那么可以通过 http://47.106.20.666 即可访问前台展示,http://47.106.20.666:4444 即可访问管理后台的登录界面。至于为什么要写这样的配置:try_files $uri $uri/ @router;location @router{ rewrite ^.*$ /index.html last; }因为进入到文章详情时或者前端路由变化了,再刷新浏览器,发现浏览器出现 404 。刷新页面时访问的资源在服务端找不到,因为 react-router 设置的路径不是真实存在的路径。所以那样设置是为了可以刷新还可以打到对应的路径的。刷新出现 404 问题,可以看下这篇文章 react,vue等部署单页面项目时,访问刷新出现404问题3.5 上传项目代码,或者用码云、 gihub 来拉取你的代码到服务器上我是创建了码云的账号来管理项目代码的,因为码云上可以创建免费的私有仓库,我在本地把码上传到 Gitee.com 上,再进入服务器用 git 把代码拉取下来就可以了,非常方便。具体请看:码云(Gitee.com)帮助文档 V1.2git 的安装请看: CentOS 7.4 系统安装 git如果不想用 git 进行代码管理,请用其他可以连接服务器上传文件的软件,比如 FileZilla。3.6 启动 express 服务启动 express 服务,我用了 pm2, 可以永久运行在服务器上,且不会一报错 express 服务就挂了,而且运行中还可以进行其他操作。安装:npm install -g pm2切换当前工作目录到 express 应用文件夹下,执行 pm2 命令启动 express 服务:pm2 start ./bin/www比如我操作项目时的基本操作:cd /home/blog/blog-nodepm2 start ./bin/www // 开启pm2 stop ./bin/www // 关闭pm2 list //查看所用已启动项目:3.7 页面加载优化再看刚刚的 nginx 的一些配置:server { gzip on; gzip_buffers 32 4k; gzip_comp_level 6; gzip_min_length 200; gzip_types text/css text/xml application/javascript; gzip_vary on; }这个就是利用 ngonx 开启 gzip,亲测开启之后,压缩了接近 2/3 的文件大小,本来要 1M 多的文件,开启压缩之后,变成了 300k 左右。还有其他的优化请看这篇文章 React 16 加载性能优化指南,写的很不错,我的一些优化都是参考了这个篇文章的。做完一系列的优化处理之后,在网络正常的情况下,页面首屏渲染由本来是接近 5 秒,变成了 3 秒内,首屏渲染之前的 loading 在 1 秒内可见了。4. 项目地址本人的个人博客项目地址:前台展示: https://github.com/乐趣区/blog-react管理后台:https://github.com/乐趣区/blog-react-admin后端:https://github.com/乐趣区/blog-nodeblog:https://github.com/乐趣区/blog本博客系统的系列文章:react + node + express + ant + mongodb 的简洁兼时尚的博客网站react + Ant Design + 支持 markdown 的 blog-react 项目文档说明基于 node + express + mongodb 的 blog-node 项目文档说明服务器小白的我,是如何将node+mongodb项目部署在服务器上并进行性能优化的5. 最后对 全栈开发 有兴趣的朋友,可以扫下方二维码,关注我的公众号,我会不定期更新有价值的内容。微信公众号:乐趣区分享 前端、后端开发 等相关的技术文章,热点资源,全栈程序员的成长之路。关注公众号并回复 福利 便免费送你视频资源,绝对干货。福利详情请点击: 免费资源分享–Python、Java、Linux、Go、node、vue、react、javaScript ...

November 26, 2018 · 4 min · jiezi