阿里云ECS从0到1搭建Web网站 2018-11-21 13:34:37

本文不适合纯小白阅读,这里简单记录下方便自己日后查找。由于目前数据库采用的是LeanStorage,所以不包含数据库相关的操作。

1. 购买ECS

截止目前阿里云的政策还是学生24周岁以下实名认证用户可同享学生优惠,一年一百块出头的费用已经很良心了。

建议系统选CentOS,至于为什么不选Ubuntu,我也不知道哈哈哈哈。选Windows的你还是别买了。

2. 下载XShell

远程操作服务器,XShell是必备的。不过它是收费,好在对个人和学校提供了免费版本,在官网填下你的邮箱就可以收到一份针对个人和学校使用的下载链接。

下载完后,填上你的服务器公网ip,敲下确定。输入用户名root,输入密码即可连接成功。(如果密码忘记的话在阿里云控制台重置一下,重启下实例即可生效。)

3. 配置初始环境

在配置初始环境之前,建议先从头到尾梳理一下哪些是需要的环境,哪些是不需要的。不要盲目安装。

3.1 安装git

yum -y install git,(-y 参数表示yes,因为之后会让你手动选择是否安装,加了y就默认同意了)

3.2 检查是否安装ssh[1][2]

一般阿里云默认就有,不然XShell这些工具怎么跟他连接啊

如果没有安装(没安装可能第二步就卡死啦),执行命令yum install -y openssl openssh-server

如果安装过,默认是用密码连接的。需要更改一下配置文件使用密钥连接并重启服务(主要是为了方便后续git连接)。

# 本地:查看key(假设你本地电脑已生成过)
cat ~/.ssh/id_rsa.pub
# 服务器:追加key
vim ~/.ssh/authorized_keys
# 服务器:更新配置。主要将两个选项设置为yes:RSAAuthentication和PubkeyAuthentication
vim /etc/ssh/sshd_config
# 服务器:重启ssh服务
systemctl restart sshd

以上配置完成,后续用git推送代码时,依然需要输入密码,会存在以下几种原因:

  1. 文件读写权限不正确
# 更改根目录下.ssh目录的权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*
  1. git请求的路径写法有问题[3]

要添加或者克隆一个远程仓库应该怎么写呢?这其实是个很简单的问题。如果你了解过协议的组成,就知道不论哪种协议,每个部分都有它代表的意思,按序组成就可以了。但是如果不清楚每个部分的意思,就会像我一样吃亏的。

于是我一开始尝试参考github的ssh连接,像这样git@github.com:felbry/project.git,我猜想最开头的git是固定名称(即代表了ssh连接),而后是服务器地址或域名,然后是项目的路径。这样尝试了一下并没有成功。直到我再去回顾了下git的文档,才算恍然大悟。文档中有说明,一个ssh链接应该像这样:ssh://user@server_address/path/to/project,也可以使用它的简写形式:user@server_address:/path/to/project。这两者前后的差别也就是省略了ssh协议声明,并在服务器地址与项目路径之间多了个冒号而已。到此我们也就清楚了,github地址中开头的git实则表示的是用户名。

文档也说明了:你也可以不指定用户,Git 会使用当前登录的用户名。。我一开始就是这样搞的,采用server_address:/path/to/project的形式来添加仓库。结果就是怎么推都要输入密码,输完密码还都是错误的。我猜想可能是以我当前windows的用户名身份去访问的?那自然和服务器是对不上的。

ssh连接的小插曲[4]

由于一开始思路没理清,脑子一热直接重装了系统(毕竟刚开始还没配置啥)。然后git再次访问的时候报了个错误:

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

文章原话:会出现这些信息是因为,第一次SSH连接时,会生成一个认证,储存在客户端(也就是用SSH连线其他电脑的那个,自己操作的那个)中的known_hosts,但是如果服务器验证过了,认证资讯当然也会更改,服务器端与客户端不同时,就会跳出错误啦~因此,只要把电脑中的认证资讯删除,连线时重新生成,就一切完美啦

解决方案:命令ssh-keygen -R server_ip_address删除本地凭证,再重新连接即可。

3.3 检查是否安装gcc编译器

我的阿里云默认没有,导致在后续下载nodejs编译的时候报错:make[1]: g++: Command not found

yum -y update gcc
yum -y install gcc+ gcc-c++

3.4 安装nodejs

yum中目前是6.x的,所以自己下载编译,当然也可以装完6.x后安装n进行node的版本管理,和下边的重装思路是一样的

wget https://nodejs.org/dist/v8.9.4/node-v8.9.4.tar.gz
tar zxvf node-v8.9.4.tar.gz
cd node-v8.9.4
./configure
make
sudo make install
# 检查
# node --version
v8.9.4
# npm --version
5.6.0

安装完build项目的时候遇到eslint对node版本有要求(仅仅是差了几个小版本)

于是又把上述流程走了一遍,费时费力。谨记:安装node前一定要和自己的本地开发环境保持完全一致啊

最优方案应该是npm install -g n,用n来管理(同windows上的nvm)

3.5 安装yarn

前提最好是装了nodejs,详见官网

curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
sudo yum -y install yarn

4. 部署git服务器

在阿里云上部署我们私有的git服务器。它的作用是什么呢?当然是收发我们的代码啊。不然你每次更新完代码之后怎么推到阿里云服务器上呢?当然你也可以选择像侯弯弯同学一样在服务器端安装一个百度网盘客户端

部署完git服务器最终达到的效果就是:你能像平日里往github/gitlab/coding这些平台推代码的流程一样,commit完push一下即可更新代码。你甚至可以在服务端添加各种各样的git hook,以实现如代码提交合并前检查语法,不符合规范的拒绝提交,代码提交后重启服务等等操作,真正完成了自动化

  1. 在服务端准备一个裸仓库(即git服务器)
# 路径为:/usr
git init --bare school
# 上述写法类似于以下命令
mkdir school
cd school
git init --bare .git
  1. 向git服务器推送代码

推送代码的场景往往有两种,一种是你刚着手开发,直接done下来这个初始仓库,基于此开始。另一种是你已经完成了项目,需要推送到这个git服务器上。(其实跟你平日操作github是一个样子的)

刚着手开发

# 此种方式未经实际操作,理论上应该没什么问题
# 克隆仓库
git clone root@server_ip_address:/usr/school
# 礼貌性的拉一下代码(一般没必要,clone完就是最新的了)
cd school && git pull origin master
# 然后就可以开发了,开发完add、commit步骤省略
# 然后往远程推
git push origin master

基于已完成的项目

# 在你当前本地项目的目录
git remote add second_origin root@server_ip_address:/usr/school
# 往远程推
git push second_origin master

现在我们已经推送了新的代码到远程git仓库,即服务器的/usr/school文件夹下。然而当你去查看此文件夹的时候会发现,什么文件都没有[5]

其实这个仓库可以看作是一个中转站,它存放了各文件的组织信息,但是却不是一个实际的文件系统。此时只需要clone一下这个仓库,就能拿到我们的项目文件了。

# 在服务端路径为:/usr 下
git clone school school-prod

再之后,无论是本地,还是school-prod,都可以依靠这个中转站(git服务器)来同步更新代码了。

5. 启动Web服务

各个环境都提前准备好了,项目文件也通过git推送上来了。接下来做的就是启动我们的服务。

我目前使用的是pm2[6]来管理服务,更多pm2的应用如果后期涉及的业务较复杂时也会整理到这里。目前使用的命令很简单。

# 启动服务
pm2 start server.js
# 如果有多个CPU,可以启动多个服务,以实现负载均衡
pm2 start server.js -i max
# 查看服务
pm2 ls
# 删除服务
pm2 del
# 重启机器之后,一键启动之前的所有服务
pm2 startup

默认我们的应用监听80端口,实际并不在购买的ECS对外开放的端口列表[7]内,需要我们手动开启:

控制台 -> 云服务器ECS -> 安全组(网络和安全) -> 配置规则 -> 快速创建规则 -> 选择端口(或手动填入,因为只预置了常见的端口可以直接选择) -> 填写授权对象(一般填0.0.0.0/0,表示任何ip段都可访问)

通过以上方式,我开启了80,443,3000三个端口。为什么要开3000呢,因为往往我们的web应用不止一个。比如常见的一个CMS项目分为前台和后台两个。那么我们就需要启动两个服务,自然不能监听同一个端口了。假设我的前台监听的是80,后台监听的是3000。到这里我们就可以通过以下方式访问了。

# 前台
curl http://server_ip_address
# 后台
curl http://server_ip_address:3000

6. 域名解析

使用ip地址访问服务可不是个好主意,一般都有准备好的域名,接下来需要把域名映射成我们的服务器ip地址。

控制台 -> 域名 -> 点击对应域名后边的解析选项(假设你已经购买了域名且已完成了备案) -> 添加记录(也可以选新手引导,只需要输入你的服务器ip,阿里云就为你添加好了@和www的主机记录)

添加好@和www的记录之后,你就可以通过www.domainname.comdomainname.com直接访问前台了,你也可以通过www.domainname.com:3000访问后台,但是显然追加端口号对于用户来说并不友好。

6.1 隐性URL和二级域名

这时候我们可以创建一个记录类型为隐性url和主机记录为admin(这个admin可以自己随便起)的解析规则,记录值就填写:http://www.domainname.com:3000。如图所示:

设置完成之后,我们就可以在浏览器中以admin.domainname.com访问后台了。


  1. CentOS 7安装和配置ssh ↩︎

  2. 阿里云 CentOS7.2 配置SSH登录 新手教程 ↩︎

  3. Git - 协议 ↩︎

  4. mac终端连接阿里云服务器报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! ↩︎

  5. 自己搭建git服务器,本地文件为什么push不到服务器上? ↩︎

  6. PM2 文档 ↩︎

  7. 阿里云安全组应用案例 ↩︎