热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

十三、部署到生产环境

十三、部署到生产环境本章将介绍以下配方:部署到数字海洋上的生产

十三、部署到生产环境

本章将介绍以下配方:


  • 部署到数字海洋上的生产

  • 在我们的液滴中配置 Nginx、PM2 和一个域

  • 实施 Jenkins(持续集成)


介绍

如果您正在阅读本章,可能是因为您已经完成了 React 应用(恭喜!)。现在是将其部署到生产环境并向世界展示的时候了。在本章中,我们将学习如何使用最好的云服务之一:Digital Ocean 部署 React 应用。

At this point, you will need to invest some money in renting the servers you will need. I will show you the cheapest way to do this, and then, if you want to increase the power of your servers, you will be able to do it without re-doing the configurations.

部署到数字海洋上的生产

Digital Ocean 是我最喜欢的使用虚拟服务器(droplets)的云计算平台,因为创建、配置和删除 droplets 非常容易,而且价格很低(你可以以每月 5 美元的价格获得 droplets,也就是每小时 0.007 美元)。我认为 Digital Ocean 很棒的另一个原因是,他们拥有最新的所有文档,客户服务可以快速解决您可能遇到的任何问题。

对于这个配方,我们将使用 Ubuntu18.04,因此您需要了解一些基本的 Linux 命令,以便能够配置您的水滴。如果您完全不熟悉 Linux,不要担心,我将尝试以一种简单的方式解释每个步骤。

准备

首先,您需要创建您的数字海洋帐户,请转至https://www.digitalocean.com 。你可以注册你的谷歌账户;这是推荐的方法。单击 Google 的注册链接后,您将看到“账单信息”视图:

您可以注册您的信用卡/借记卡,也可以使用贝宝支付。配置好付款信息后,您就可以创建第一个液滴:

怎么做。。。

让我们创建第一个液滴:


  1. 选择你的 Linux 发行版;正如我之前提到的,我们将使用 Ubuntu 18.04:


  1. 一键式应用是预配置的液滴,但我更喜欢从头设置我的液滴,以获得控制,并能够优化我的配置。在本食谱之后,如果您想查看这些选项,如果您需要快速配置某些内容,则可以:


  1. 选择液滴的大小。我更喜欢使用 2GB 的 RAM 内存,每个月的成本为10 美元。你可能想知道为什么我不选择最便宜的 1GBRAM版本;这是因为我尝试过使用这个版本,但我注意到1GB RAM不足以在安装软件包时处理 NPM。大多数情况下,这会挂断您的水滴-我知道听起来很可笑,但 NPM 会消耗大量内存。


  2. 如果你选择 10 美元一滴,你不必马上付钱。Digital Ocean 最棒的一点是,他们只对你使用水滴的时间收费。这意味着,如果在您完成此配方后(假设您花 2 小时完成),您关闭(关闭)您的液滴,您将只收取 2 小时的费用,即$0.030。如果您在一个月内(30 天)坚持使用水滴,您将被收取 10 美元的费用,因此不要担心:



  1. 选择数据中心区域;这将取决于您的位置。如果你在美国,你需要选择纽约或旧金山。您需要选择离您所在位置最近的数据中心:


  1. 说出你滴的名字。如果需要多个液滴,可在此处选择数量:


  1. 单击“创建”按钮后,创建液滴需要 30-45 秒。完成后,您将看到您的液滴:


  1. 此时,您应该会收到一封包含服务器凭据的电子邮件:


  1. 在终端中,您可以通过ssh root@YOUR_DROPLET_IP命令访问您的液滴。当您第一次访问它时,您将收到一条消息,在您必须输入 Droplet 密码后,将此 IP 添加到您的已知主机:


  1. 如果一切正常,系统将要求您更改 UNIX 密码。您需要粘贴当前密码,然后必须写入所需的新密码,并在连接到液滴后重新键入密码:


  1. 让我们开始配置我们的液滴。安装 Node.js。为此,我们将使用 PPA 安装最新版本的 Node。现在,Node 的当前版本是 10.x。如果在阅读此配方时,Node 有一个新版本,请在命令(setup_10.x中更改版本):

cd ~
curl -sL https://deb.nodesource.com/setup_10.x -o nodesource_setup.sh


  1. 获取nodesource_setup.sh文件后,运行以下命令:

sudo bash nodesource_setup.sh


  1. 要安装节点,请运行以下操作:

sudo apt install nodejs -y


  1. 如果要验证刚安装的 Node 和 NPM 的版本,请运行:

node -v
v10.8.0
npm -v
6.2.0

它是如何工作的。。。

使用我们在第 11 章实现服务器端渲染中执行的一些方法,我用这些代码创建了一个新的 GitHub 存储库,以将其推向生产。您可以在处查看此存储库 https://github.com/csantany/production 。

在我们的 Droplet 中,我们将克隆这个 git repo(如果您已经准备好了应用,请使用您的存储库)。生产存储库是公共的,但如果使用私有存储库,则需要在 GitHub 帐户中添加 Droplet 的 SSH 密钥。为此,您需要在您的液滴中运行ssh-keygen命令,然后按Enter三次而不写入任何密码短语:

If your terminal was inactive for more than five minutes, it's possible your connection will be closed, and you will have to connect again.

创建 SSH 密钥后,可以通过执行以下操作来查看:vi /root/.ssh/id_rsa.pub。您需要复制 SSH 密钥并转到您的 GitHub 帐户|设置| SSH 和 GPG 密钥(https://github.com/settings/ssh/new 。然后将您的密钥粘贴到文本区域,并为密钥添加一些标题。当您单击添加 SSH 密钥按钮时,GitHub 将询问您的密码以确认:

现在我们可以使用git clone git@github.com:csantany/production.git或您的存储库克隆我们的存储库:

然后转到生产文件夹并安装 NPM 软件包:

cd production
npm install

为了测试我们的应用,让我们运行 npm 运行开始生产脚本:

npm run start-production

如果您想验证它是否有效,请转到浏览器并打开液滴的 IP,然后在我的案例中添加端口 3000 将是http://178.128.177.84:3000如果一切正常,您应该查看您的应用(在我们的案例中,我们将打开我们的/todo 部分):

还有更多。。。

如果要关闭液滴,可以转到电源部分,或者使用开/关开关:

当您单击它时,您将获得以下模式:

在我们的液滴中配置 Nginx、PM2 和一个域

此时,我们的第一个液滴已准备就绪,但我们可以看到使用端口 3000 的 React 应用。在本教程中,我们将学习如何在服务器中配置 Nginx,以及如何实现代理以将通信量从端口 80 重定向到 3000。这意味着我们不再需要直接指定端口。PM2(节点生产流程管理器)将帮助我们在生产中安全地运行节点服务器。一般情况下,如果我们直接使用nodebabel-node命令运行 Node,并且我们的应用中出现错误,则会崩溃并停止工作;如果发生错误,PM2 将重新启动节点服务器

准备

对于此配方,我们需要在全球范围内安装 PM2:

npm install -g pm2

此外,我们还需要安装 Nginx:

sudo apt-get update
sudo apt-get install nginx

怎么做。。。

让我们从配置开始:


  1. 调整防火墙以允许通信量仅在端口 80 中。要列出可用的应用配置,请运行以下命令:

sudo ufw app list
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH


  1. Nginx Full表示我们将允许来自端口 80(HTTP)和 443(HTTPS)的流量。目前,我们还没有为任何域配置 SSL,因此应该限制通信量仅通过端口 80(HTTP):

sudo ufw allow 'Nginx HTTP'


  1. 如果我们尝试访问我们的 IP,我们应该看到我们的 Nginx 正在工作:


  1. 如果要管理 Nginx 的进程,可以使用以下命令:


    • 启动服务器sudo systemctl start nginx

    • 停止服务器sudo systemctl stop nginx

    • 重启服务器sudo systemctl restart nginx

    • 重新加载服务器sudo systemctl reload nginx

    • 禁用服务器sudo systemctl disable nginx



  2. 将 Nginx 设置为反向代理服务器,为此,我们需要打开 Nginx 配置文件:


sudo vi /etc/nginx/sites-available/default


  1. location /块中,我们需要将其替换为:

location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}

它是如何工作的。。。

保存并关闭文件后,我们需要验证是否存在语法错误。使用以下命令:

sudo nginx -t

如果一切正常,您应该看到:

最后,我们重新启动 Nginx 服务器:

sudo systemctl restart nginx

现在,我们可以在不使用端口的情况下访问 IP,React 应用将正常工作:

还有更多。。。

如果你想用你的液滴使用一个域,那真的很容易;您需要更改域的名称服务器以指向数字海洋服务器。例如,我有一个名为 educnow.com 的域,我将用它来制作我的水滴。我向 Godaddy 注册了这个域,所以我必须去域管理并选择它。您可以直接转到https://dcc.godaddy.com/manage/YOURDOMAIN.COM/dnsURL。然后转到名称服务器:

我们必须单击更改按钮,选择自定义,指定数字海洋命名服务器,然后单击保存:

修改名称服务器后,需要转到 Droplet 仪表板并选择添加域选项:

然后介绍要链接到您的 Droplet 的域,并单击添加域:

现在您需要为 CNAME 创建一个新记录。在主机名写入www中,在别名字段写入@中选择 CNAME 选项卡,默认情况下 TTL 为43200-这可以使用www.yourdomain.com前缀访问您的域:

如果你做的一切都正确,你应该能够访问你的域名,并看到你的反应应用的工作;此过程可能需要 30 分钟到 24 小时,具体取决于 DNS 传播速度。

实施 Jenkins(持续集成)

Jenkins 是最流行的持续集成软件之一,它基于 Java,并且是开源的。

准备

运行 Jenkins 有一些先决条件:


  • 你需要一个带有 Ubuntu18 的 droplet(服务器)。

  • 您需要安装 Java8。

If you don't have Java 8 installed, you can install it with this command:

sudo apt  install openjdk-8-jre-headless

如果要检查安装的 Java 版本,可以使用java -version命令:

怎么做。。。

现在,让我们安装并配置 Jenkins:


  1. 将存储库密钥添加到系统:

wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -


  1. 将 Debian 软件包地址附加到sources.list

sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'


  1. 更新 apt 软件包:

sudo apt update


  1. 安装 Jenkins:

sudo apt install jenkins

If you get an error when you install Jenkins, you can uninstall it with:

sudo apt-get remove --purge jenkins


  1. 启动 Jenkins 服务:

sudo systemctl start jenkins


  1. 如果要查看 Jenkins 状态,请使用以下命令:

sudo systemctl status jenkins


  1. 默认情况下,Jenkins 在端口 8080 上运行,我们需要打开防火墙以允许该端口的流量:

sudo ufw allow 8080


  1. 如果要验证防火墙状态,请执行以下操作:

sudo ufw status

If you see Status: inactive, you will need to run these commands to enable the firewall:

sudo ufw allow OpenSSH
sudo ufw enable


  1. 是时候第一次运行我们的 Jenkins 并对其进行配置了。为此,您需要访问http://:8080。就我而言,它是http://142.93.28.244:8080


  1. 要查看第一个密码,您需要运行:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword


  1. 您将看到欢迎来到詹金斯页面。您必须选择“安装建议插件”选项:


  1. 您将看到安装过程:


  1. 安装完成后,您需要创建第一个管理员用户:


  1. 如果不想更改,请确认 Jenkins URL。单击保存并完成:


  1. 詹金斯准备好了:


  1. 您将在 Jenkins 中看到的第一个视图是:


  1. 转到 Manage Jenkins>Manage Plugins 以安装 GitHub 插件:


  1. 选择可用选项卡,然后搜索 GitHub 集成。现在选择复选框选项并单击“立即下载并在重新启动后安装”按钮:


  1. 选择安装完成且无作业运行时重新启动 Jenkins 选项:


  1. 您将看到以下消息:


  1. 等待一分钟,然后刷新页面。您可能需要再次登录。

  2. 返回管理插件;现在您需要安装后期构建任务插件


  3. 我们可以通过单击主页上的“创建新工作”来创建第一份工作:



  1. 写下作业名称,选择“自由式项目”选项,然后单击“确定”按钮:


  1. 在常规配置中,转到源代码管理部分,选择 Git 选项,然后编写 GitHub 项目 HTTPS URL(如果选择 SSH URL,则需要在 GitHub 中为 Jenkins 添加新的 SSH 密钥):


  1. 如果您的存储库是私有的,则需要单击 Add 按钮来指定您的 GitHub 凭据(用户名和密码):


  1. 选择您的凭证并确保选择master分支作为您的主分支(建议使用主分支而不是其他分支):


  1. 在生成后操作上选择生成后任务选项:


  1. 在文本区域脚本中,添加npm install && npm run start-production。单击应用,然后单击保存按钮:

它是如何工作的。。。

我们已经配置了 Jenkins 作业,现在让我们测试它。我将修改一个简单的文件,以确保 Jenkins 正常工作。

At this point (if you followed the first recipe), you must stop the PM2 server with the command "npm run stop" and then remove the production directory that we cloned before, to avoid problems with the Jenkins job.

让我们修改我们的主组件;我将添加一个额外的文本(詹金斯)

import React from 'react';
import styles from './Home.scss';
const Home = props => (

Hello {props.name || 'World'} (Jenkins)


);
export default Home;

File: src/client/home/index.jsx

之后,您需要提交并推送到 master。现在转到詹金斯,选择你的工作,点击Build Now

在那之后,点击最新版本(在我的例子中是#5,因为我以前做过一些测试,但对你来说,它将是#1):

在构建中,您将看到谁(用户)启动了构建,以及哪个版本(主版本的最后一次提交)正在构建。如果要查看控制台输出,可以单击左侧菜单上的该选项:

如果查看控制台输出,您将看到大量命令:

每次运行新构建时,Jenkins 都会获取存储库的最新更改:

git config remote.origin.url https://github.com/csantany/production.git

然后将获得主机的最后一次提交:

git rev-parse refs/remotes/origin/master^{commit}

最后,它将执行我们在生成后任务中指定的命令:

npm install && npm run start-production

如果一切正常,您应该在输出的末尾看到 Finished:SUCCESS:

现在等待 30 秒或 1 分钟,然后访问您的生产现场(在我的例子中为http://142.93.28.244/)–您将看到新的更改:

如果您想知道文件存储在哪里,您可以在/var/lib/jenkins/workspace/看到它们。


推荐阅读
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • centos php部署到nginx 404_NodeJS项目部署到阿里云ECS服务器全程详解
    本文转载自:http:www.kovli.com20170919ecs-deploy作者:Kovli本文详细介绍如何部署NodeJS项目到阿里云ECS上, ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • Linux一键安装web环境全攻略
    摘自阿里云服务器官网,此处一键安装包下载:点此下载安装须知1、此安装包可在阿里云所有Linux系统上部署安装,此安装包包含的软件及版本为& ... [详细]
  • React 小白初入门
    推荐学习:React官方文档:https:react.docschina.orgReact菜鸟教程:https:www.runoob.c ... [详细]
  • 本文主要介绍关于linux文件描述符设置,centos7设置文件句柄数,centos7查看进程数的知识点,对【Linux之进程数和句柄数】和【linux句柄数含义】有兴趣的朋友可以看下由【东城绝神】投 ... [详细]
  • 构建LNMP架构平台
    LNMP架构的组成:Linux、Nginx、MySQL、PHP关于NginxNginx与apache的作用一样,都是为了搭建网站服务器,由俄罗斯人lgorsysoev开发,其特点是 ... [详细]
  • 前言:原本纠结于Web模板,选了Handlebars。后来发现页面都是弱逻辑的,不支持复杂逻辑表达式。几乎要放弃之际,想起了Javascript中ev ... [详细]
author-avatar
刺嫩芽豆豆
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有