阿里云服务器(裸机)建站指南
前言
一年前在阿里云上买了一台1核2G的服务器,利用业余时间也做了一些东西:站点 https://www.readingblog.cn、微信小程序(积木小盒)等等。
目前小程序流量主已经有少量收益,能维持收支平衡了。同时也积累了一些服务器建站和运维经验,所以想着在这篇文章中集中做一些整理。
起步
先在阿里云官网[https://www.aliyun.com] 选择适合自己的云服务器ECS,然后按照购买流程走即可。
购买完毕,就可以使用你的服务器了。点击控制台,再选择左侧栏的云服务器ECS,就可以进到云服务器控制台。
点击左侧栏的实例,初始化一下密码。初始化后需要重启一下。
密码初始化后就可以远程连接服务器了。(建议密码设置得复杂一些,自己之前由于密码设置得过于简单而被其他人登录过)
安装git
在服务器上安装git可以让你很方便地更新代码,部署服务。
1 | sudo wget https://www.kernel.org/pub/software/scm/git/git-2.8.0.tar.gz |
下载相关依赖
1 | sudo yum -y install zlib-devel openssl-devel cpio expat-devel |
解压
1 | sudo tar -zxvf git-2.8.0.tar.gz |
编译
1 | cd git-2.8.0 |
在这些过程中可能会出现一些错误,
1 | autoconf: command not found (centos 6.7 install git-2.10.0 from source code) |
安装node.js
笔者主要研究前端,所以服务端语言以node.js为主。
如何安装node.js可以参见阿里云文档,可以修改版本为较新的node.js版本,当然也可以使用nvm来管理node.js的版本。
安装完node.js以后,我们稍微修改一下node.js官方文档的例子,来启动一个http服务器。
代码如下
1 | // server.js |
启动服务器
1 | [root@iZ8vbfhrv1vsbp44n9fdtoZ start]# node server.js |
你还需要添加安全组规则,打开服务器防火墙上的3001端口。具体操作如下
在实例列表页点击”更多”,找到安全组配置
点击配置规则
点击快速创建规则
具体配置如下
配置完毕后,就可以调用接口了。
mysql
要处理一些业务数据,mysql是必需的。
下载
使用yum下载
1 | wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm |
速度比较慢,需要耐心等待。
启停mysql服务
启动
1 | [root@iZ8vbfhrv1vsbp44n9fdtoZ ~]# systemctl start mysqld.service |
使用ps -ef | grep mysql查看,发现mysql服务已经启动了。
1 | [root@iZ8vbfhrv1vsbp44n9fdtoZ ~]# ps -ef | grep mysql |
停止
1 | [root@iZ8vbfhrv1vsbp44n9fdtoZ ~]# systemctl stop mysqld.service |
mysql服务停止了
1 | [root@iZ8vbfhrv1vsbp44n9fdtoZ ~]# ps -ef | grep mysql |
重设root密码,设置远程登录权限
先设置免密登录
1 | vim /etc/my.cnf |
在mysqld下面添加
skip-grant-tables
保存后重启mysql,这时就可以跳过密码来登录mysql了
1 | systemctl stop mysqld.service |
先刷新
1 | mysql>flush privileges; |
创建用户
1 | mysql>create user 'root'@'localhost' identified by '你的密码'; |
允许root用户远程登录
1 | mysql>grant all privileges on *.* to 'root'@'%' identified by '你的密码'; |
刷新
1 | mysql>flush privileges; |
去掉my.cnf里的免密设置,使用密码登录
1 | mysql -u root -p '你的密码' |
最后,你还需要按照之前的方法添加安全组规则,打开服务器防火墙上的3306端口。
配置完毕后你就可以在本地远程连接服务器上的mysql了。(建议mysql的密码设置得复杂些,平时关闭3306端口,这样通过外网就无法直接连接mysql了,同时还要使用oss将mysql的数据做好备份以确保安全。之前mysql的密码被黑客破解了,所有库表都被删了,惨痛的教训)。
测试
我用的是Sequelize包,它是基于promise的,支持es6语法。除了mysql,它还可以用于连接Postgres、MariaDB、SQLite和Microsoft SQL Server。(https://www.npmjs.com/package/sequelize)
结合开发文档,我们就可以进行实际开发了。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36const Sequelize = require('sequelize');
const config = require('../config');
const logger = require('log4js').getLogger('app');
class MysqlClient {
constructor() {
if (!MysqlClient.instance) {
this.client = new Sequelize(config.mysql.database, config.mysql.username, config.mysql.password, {
host: config.mysql.host,
port: config.mysql.port,
dialect: 'mysql',
pool: {
max: 5,
min: 0,
idle: 10000,
},
timezone: '+08:00',
});
const client = this.client;
MysqlClient.instance = client;
client
.authenticate()
.then(() => {
logger.info('Connection has been established successfully.');
})
.catch(err => {
logger.info('Unable to connect to the database:', err);
});
}
}
}
module.exports = new MysqlClient().client;
redis
下载和编译
1 | wget http://download.redis.io/releases/redis-4.0.2.tar.gz |
启动服务
后台启动redis
1 | cd redis-4.0.2/ |
查询redis进程
1 | ps -ef | grep redis |
可以看到redis已经启动了
1 | root 19141 19065 0 12:50 pts/1 00:00:03 ./src/redis-server 0.0.0.0:6379 |
结束进程
1 | kill -9 pid |
简单测试
启动redis客户端
1 | cd redis-4.0.2/ |
redis安装成功了。
配置服务器远程连接
默认配置只能是本地访问,我们修改redis-4.0.2/redis.conf配置文件
将
1 | bind 127.0.0.1 |
修改为
1 | bind 0.0.0.0 |
你需要添加安全组规则,打开服务器防火墙上的6379端口。
设置远程连接密码
默认配置开启了保护模式
1 | protected-mode yes |
这时你需要设置密码才可以远程连接上redis,密码设置非常简单,只需要在requirepass字段上填写你的密码即可
1 | requirepass 你的密码 |
配置完毕,后台启动你的redis可以了。
1 | ./opt/software/redis-4.0.2/src/redis-server /opt/software/redis-4.0.2/redis.conf & |
node客户端连接
我用的是redis包,根据前面你的配置就可以远程连接服务器上的redis了。结合开发文档,就可以进行实际开发了。
1 | const redis = require('redis'); |
短信服务
如果你购买了阿里云的短信服务,就可以通过短信API实现验证码、推广短信、通知短信的发送功能了。
这里以验证码为例,介绍一下短信的发送功能。
快速学习
进入快速学习页面(https://dysms.console.aliyun.com/dysms.htm#/quickStart)
直接点击查看API Demo
你在左侧输入参数,选择不同的后端语言,它会自动帮你生成Demo代码,并且还可以去CloudShell在线调试。
参数说明
PhoneNumbers 接收短信的手机号码
SignName 签名名称,在控制台国内消息签名管理一列添加、查看
TemplateCode 模板ID,在控制台国内消息模板管理一列添加、查看
TemplateParam 模板变量对应的实际值,注意一定要是JSON格式。
签名可以设置你的网站名、公司名
模板可以选择验证码、短信通知、推广短信(升级为企业后启用),设置你的短信内容,同时支持变量替换,如我的网站的验证码短信模板内容为:
1 | 您的验证码为:${code},该验证码5分钟内有效,请勿泄漏于他人。 |
TemplateParam可以设置code变量,发送你需要的内容
1 | "TemplateParam": JSON.stringify({ |
短信发送客户端
根据API Demo,我们写出自己的短信客户端代码
1 | const Core = require('@alicloud/pop-core'); |
编写单元测试
1 | const smsClient = require('../../common/sms-client.js'); |
执行后,手机上成功收到了短信。
域名、DNS、nginx
域名
虽然通过ip地址可以直接访问你的网站,但是我们很少看到网站是通过ip地址访问的,一般网站都会提供域名。域名直观易记,且在用户访问的域名不改变的情况下,解析的ip地址可以更改。
域名申请可以去万网购买,国家规定了网站需要备案才可以访问,我在阿里云走的备案流程,在阿里云APP填写、上传相应信息即可,以前的流程需要邮寄幕布什么的了,现在只需要在线上操作即可。阿里云的流程走得是比较快的,最终会提交到管局,管局流程就需要等待一阵子了(5~20个工作日)。我的域名从开始备案到备案成功,流程约走了2周。
DNS
域名需要解析到ip地址,DNS做的就是这个工作。它可以将易于管理识别的域名转换为计算机用于互连通信的数字IP地址,从而将用户的访问路由到相应的网站或应用服务器。
同样,我使用了阿里云的DNS解析服务。在云解析DNS域名控制台-域名解析,点击添加域名。
再添加解析
具体配置如下
配置完成后访问域名就会解析到记录值所填写的ip地址了。
nginx
虽然域名解析到了ip地址(服务器),但是默认的端口是80(所以请确保服务器的80端口设置了安全组规则,具体可以参考前面文章介绍过的方法)。我们一般服务监听的端口不是80怎么办?其实很简单,我们只需要简单的配置一下nginx转发就可以了。
接下介绍一下在阿里云服务器上安装和使用nginx。
安装
首先安装PCRE pcre-devel 和Zlib
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括perl兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装 pcre库,pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。命令:
1 | yum install -y pcre pcre-devel |
zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在Centos上安装zlib库。
1 | yum install -y zlib zlib-devel |
安装GCC和OpenSSL
1 | yum install gcc-c++ |
现在我们开始安装nginx,这里我安装的是1.14.0版本
1 | wget -c https://nginx.org/download/nginx-1.14.0.tar.gz |
解压并进入nginx目录
1 | tar -zxvf nginx-1.14.0.tar.gz |
使用nginx的默认配置
1 | ./configure |
编译安装
1 | make |
查找安装路径:
1 | [root@iZ8vbfhrv1vsbp44n9fdtoZ ~]# whereis nginx |
进入sbin目录,可以看到有一个可执行文件nginx,直接./执行就OK了。
1 | [root@iZ8vbfhrv1vsbp44n9fdtoZ ~]# cd /usr/local/nginx |
配置开机自启动
在rc.local增加启动代码就可以。增加一行 /usr/local/nginx/sbin/nginx
1 | vi /etc/rc.local |
设置执行权限:
1 | chmod 755 rc.local |
配置
nginx配置文件修改
1 | vim /usr/local/nginx/conf/nginx.conf |
修改原配置文件的部分内容
1 | server { |
这样访问80端口根路径就会请求index.html文件,匹配/blog路径的请求会被转发到本地服务器的3000端口上。
配置完毕后,可以执行命令检查一下配置是否有错误
1 | [root@iZ8vbfhrv1vsbp44n9fdtoZ conf]# /usr/local/nginx/sbin/nginx -t |
最后重启一下nignx就可以了
1 | /usr/local/nginx/sbin/nginx -s reload |
此时你访问域名,就会按照nginx配置请求前后端资源。试试访问我的网站 (http://www.readingblog.cn)
配置HTTPS
准备
- 备案过的域名
- ssl证书(免费的就行)
申请证书
- 登录阿里云控制台产->产品与服务->SSL 证书
- 点击购买证书,证书类型选择免费型DV SSL,完成购买
- 购买完以后,出现了Symantec 免费版 SSL,操作项下按钮点击。
- 完善资料、提交审核。我这里域名用的是阿里云DNS服务,按照提示勾选证书绑定的域名在阿里云的云解析,系统生成CSR,直至提交审核。
10分钟左右,申请的证书就能审核通过。
下载证书
确认已获得证书就可以去证书控制台下载证书了,解压后会得到两个文件
1 | 3064445_readingblog.cn.key 3064445_readingblog.cn.pem |
不同的服务器类型,证书配置方法也不一样,这里我们以nginx服务器为例做介绍
配置nginx的https
- 创建存储证书的目录(任意)
1 | sudo mkdir -p /usr/local/nginx/ssl/key |
- 上传证书
1 | scp -p 22 /usr/local/nginx/ssl/key/3064445_readingblog.cn.pem root@47.92.166.108:/usr/local/nginx/ssl/key |
上传完毕后,目录结构如下
1 | [root@iZ8vbfhrv1vsbp44n9fdtoZ key]# pwd |
- 修改nginx配置文件
1 | # HTTPS server |
- 重启nginx
1 | /usr/local/nginx/sbin/nginx -s reload |
安装ngx_http_ssl_module
如果提示the “ssl” parameter requires ngx_http_ssl_module,说明nginx还需要安装ngx_http_ssl_module模块。
我的nginx安装目录为:/usr/local/nginx,源码包在/usr/nginx-1.14.0
首先进入源码包目录,执行
1 | ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module |
配置完成后,运行命令make命令(注意此处不能进行make install,否则就是覆盖安装)
1 | make |
替换已安装好的nginx包,替换之前先备份:
1 | cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak |
先停止nginx服务:
1 | /usr/local/nginx/sbin/nginx -s stop |
将刚刚编译好的nginx覆盖掉原有的nginx
1 | cp ./objs/nginx /usr/local/nginx/sbin/ |
最后就可以启动nginx了
1 | /usr/local/nginx/sbin/nginx |
删除备份
1 | rm -rf /usr/local/nginx/sbin/nginx.bak |
我们可以通过命令查看ssl模块是否已经加入成功
1 | [root@iZ8vbfhrv1vsbp44n9fdtoZ nginx-1.14.0]# /usr/local/nginx/sbin/nginx -V |
配置完成后就可以通过https访问网站了 (https://www.readingblog.cn)