本篇记录 AWS EC2 的环境搭建内容

EBS磁盘挂载和卸载

参考链接

AWS Doc

添加用户

参考链接

  1. AWS Doc: 如何将具有 SSH 访问权限的新用户添加到 Amazon EC2 Linux
  2. Amazon EC2 密钥对和 Windows 实例
  3. 简书: 免密码使用 sudo 和 su
  4. CenterOS 7 创建新用户和ssh安全登录配置

chmod u+w /etc/sudoers 先要给予权限才可修改

CenterOS 添加新用户后,若需要 SSH 登录就需要去修改 /etc/ssh/sshd_configAllowUsers 后添加用户名, 然后

service sshd restart 重启生效

检索 pem 文件

1
ssh-keygen -y -f XX.pem

同步时区

1
2
3
4
5
6
# 查看时区
timedatectl
# 设置当前系统为Asia/Shanghai上海时区
timedatectl set-timezone Asia/Shanghai
# 设置完时区后,强制同步下系统时钟
chronyc -a makestep

参考链接

  1. AWS Doc: 为 Linux 实例设置时间
  2. K8S学习笔记之CentOS7集群使用Chrony实现时间同步

JDK

1
yum list java*
1
yum install java-1.8.0-openjdk.x86_64

SSL

AWS Doc: 在 Amazon Linux 2 上配置SSL

Nginx

1. 添加下载源

/etc/yum.repos.d/ 目录下新建一个 nginx.repo 文件

1
2
3
4
5
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/x86_64/
gpgcheck=0
enabled=1

保存

2. 下载

1
yum install nginx

3. 启动

1
2
3
4
5
6
7
8
# 设置开机启动
sudo systemctl enable nginx
# 启动服务
sudo systemctl start nginx
# 重启服务
sudo systemctl restart nginx
# 重新加载,因为一般重新配置之后,不希望重启服务,这时可以使用重新加载
sudo systemctl reload nginx

参考链接

  1. Amazon Linux 2 AMI 下 yum 安装 Nginx
  2. CentOS 7 下 yum 安装和配置 Nginx

Redis

1. 安装

默认 AWS EC2 上 是没有 redis 源的 , 需要下载 Fedora 的 epel 仓库

1
yum install epel-release 

若找不到则需要手动安装 rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

此时会提示需要通过另外的命令安装,输入安装即可

1
sudo amazon-linux-extras install epel

然后再安装redis

1
yum install redis

2. 启动

1
2
3
4
5
6
7
8
# 启动redis
service redis start
# 停止redis
service redis stop
# 查看redis运行状态
service redis status
# 查看redis进程
ps -ef | grep redis

开启自启动

1
chkconfig redis on

3. 配置

Redis 默认配置文件为 /etc/redis.conf , 通常对其进行配置修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 指定 Redis 端口
port 6379
# 绑定主机 IP , 通常修改为 0.0.0.0 或内网地址方便远程访问
bind 127.0.0.1
# 设置数据库数量
databases 16
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
# save <seconds> <changes>
# Redis 默认配置文件中提供了三个条件
save 900 1
save 300 10
save 60 10000
# 指定本地数据库文件名,默认如下
dbfilename dump.rdb
# 指定本地数据库存放目录 , 若自定义目录,需要赋予权限 chown -R redis:redis {自定义目录}
dir /var/lib/redis
# 指定是否激活重置哈希,默认为开启
activerehashing yes
# 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
requirepass foobared

更多的配置,可直接查看配置文件的注释或者查看 详细文档

4. 常用操作

1. 连接 Redis
1
2
3
redis-cli -h [ip] -p [端口]
#例
redis-cli -h 127.0.0.1 -p 6379

若设置了密码 , 则需要输入密码

1
auth 445813  #445813为密码,输入密码前要密码前面加 auth和空格
2. 键值操作
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
#添加
set key value
#例
set webname django.cn
set usrname "My namne is XXX" #中间有空格的要用引号
#通过KEY查询
127.0.0.1:6379> get webname
"django.cn"
#删除key
del webname

#设置过期时间(单位为秒)
expire key timeout
#也可以在设置值的时候,一同指定过期时间
set key value EX timeout
#例子
set name django.cn EX 20 #设置20秒过期

#查看过期时间
ttl key
#如
ttl name

#查看当前redis中所有Key
keys *

Redis支持五种数据类型: string(字符串),hash(哈希), list(列表),set(集合)及zset(sorted set: 有序集合).更多关于不同数据类型操作方法, 可查看官方文档: https://redis.io/commands(英文), 这里还有一个中文的, 可以去看看 http://redisdoc.com/index.html

docker-compose 安装 Redis

直接通过 Rancher 或者 docker-compose 安装 ,方便追踪

首先在对应目录下创建 redis.conf , 关于端口 , 目录等基本不要改 , 就改动访问密码等平台相关的信息即可

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3'
services:
redis:
image: redis
container_name: redis
restart: always
ports:
- 16379:6379
volumes:
- $PWD:/data
- /etc/localtime:/etc/localtime:ro
- $PWD/conf/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf

参考链接


MySQL

1. 卸载自带的 mariadb-lib 及 mysql

首先查看已安装的 mariadb 和 mysql

然后一一卸载

1
2
3
4
# 查看
rpm -qa|grep mariadb
# 卸载
rpm -e --nodeps mariadb-libs-xxx

mysql 同理

2. 下载 MySQL 的 Yum Repository

查看系统发行版本

1
cat /etc/os-release
1
2
3
4
5
6
7
8
9
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora" # 留意这里, 对应可选下载版本
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

然后进入 MySQL 官网 Yum Repository 下载区 选择对应版本复制链接, 下载

1
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

安装 repo

1
yum localinstall ./mysql80-community-release-el7-3.noarch.rpm

检查是否安装成功

1
yum repolist enabled | grep "mysql.*-community.*"

3. 安装 MySQL

1
yum install mysql-community-server

4. 配置

修改 MySQL 的配置文件 /etc/my.cnf , 这里笔者将 mysql 配置目录集中配置在了 /mnt/efs/mysql

1
2
3
4
5
6
7
8
9
10
basedir=/mnt/efs/mysql # 新增
datadir=/mnt/efs/mysql/data # 修改
socket=/mnt/efs/mysql/mysql.sock # 修改
character_set_server = utf8 # 新增

pid-file=/mnt/efs/mysql/mysqld/mysqld.pid # 修改
log-error=/mnt/efs/mysql/log/mysqld.log # 修改

[client] # 新增
socket=/mnt/efs/mysql/mysql.sock# 新增

然后需要给予自定义目录权限

这里需要注意, 在给权限之前需要创建一些子目录, 否则后面启动 mysql 时会报"SERVER_BOOTING" Permission denied 类似的错误 , 需要查看错误日志了解详情 . 这里罗列下要创建的子目录

1
2
3
4
5
/mnt/efs/mysql/data
/mnt/efs/mysql/log
/mnt/efs/mysql/share
/mnt/efs/mysql/mysqld
/mnt/efs/mysql/share/mysql-8.0

再给予权限

1
chown -R mysql:mysql /mnt/efs/mysql

初始化

1
mysqld --initialize --user=mysql

管理 SELinux

1
setenforce 0

设置开机启动

1
systemctl enable mysqld

启动

1
systemctl start mysqld

查询是否启动成功

1
systemctl  status mysqld

5. 登录验证

1
grep "temporary password" /mnt/efs/mysql/log/mysqld.log

得到临时密码 , 然后登录数据库

1
mysql -uroot -p # 输入得到的临时密码

再修改密码

1
ALTER USER 'root'@'%' IDENTIFIED BY 'xxxxxx';

如果是 mysql8.0 需要使用以下命令 , 否则用 Navicat 等客户端登录时会报 Authentication plugin 'caching_sha2_password' cannot be loaded

1
2
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';
FLUSH PRIVILEGES;

若这里的 % 填写的是localhost 后面登录时会报 Host 'x.x.x.x' is not allowed to connect to this MySQL server . 其中 x.x.x.x 是登录的本地 IP .

最好不要改root的登录host , 创建新用户并修改host .

6. 创建用户及权限控制

创建

1
2
3
4
5
6
7
8
9
# root登录,然后创建用户 
use mysql;
# 创建用户
create user 'dev'@'%';
# 查询用户
select user,host from user;
# mysql_native_password 是使用旧版本密码插件,使本地 navicat 方便登录
ALTER USER 'dev'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';
FLUSH PRIVILEGES;

授权

1
2
3
4
5
6
7
# 给予 dev my_db 数据库下的所有表的所有权限
grant all privileges on my_db.* to 'dev'@'%';
# 给予 dev testDB 数据库下的所有查询和更新语句权限
grant select,update on testDB.* to 'dev'@'%';
# 给予 dev 所有数据库的某些权限
grant select,delete,update,create,drop on *.* to 'dev'@'%';
FLUSH PRIVILEGES;

7. docker-compose 安装 MySQL

直接通过 Rancher 或者 Docker 安装 MySQL

首先创建 conf/my.cnf 文件

1
2
3
4
5
6
7
8
9
10
[mysqld]

default-authentication-plugin=mysql_native_password
bind-address = 0.0.0.0
character_set_server = utf8
skip-name-resolve
max_connections = 1000


[client]

docker-compose.yml 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'
services:
mysql:
image: mysql:8.0
restart: always
ports:
- 13306:3306
volumes:
- /etc/localtime:/etc/localtime:ro
- $PWD/conf:/etc/mysql/conf.d
- $PWD/logs:/logs
- $PWD/data:/var/lib/mysql
privileged: true
environment:
- MYSQL_ROOT_PASSWORD=yourpassword

8. 数据库日备

这里我们对 docker 安装的 MySQL 进行数据库结构+数据的每日全量备份

首先 docker ps 查看 MySQL 容器的 container ID 或者 Name

然后编写脚本 , 首先在当前目录下创建好 db 目录 , 用于存放备份好的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

DAT=`date +%m%d`
HOR=`date +%H`
begin=`date +%F" "%T`
DIR=$PWD/db

if [[ ! -d $DIR/$DAT ]];then
mkdir $DIR/$DAT
fi

for i in `cat $PWD/mysql-back.list`
do
docker exec -it CONTAINER_NAME mysqldump -uroot -pPASSWORD $i > $DIR/$DAT/$i-$DAT$HOR.sql
done
find $DIR/* -mtime +20 -exec rm -rf {} \;
end=`date +%F" "%T`

echo "$begin dump mysql -------> $end has done" >> $PWD/mysqldump.log

然后在当前目录创建 mysql-back.list 文件 , 填入要备份的数据库名

替换以上脚本中的 CONTAINER_NAMEPASSWORD

然后设置脚本运行时间

vim /etc/crontab

在最下方加入行 , sh 文件路径替换为自己存放的

1
0 2 * * * root sh /mnt/data/mysql/backups/mysql-backup.sh

这样每天凌晨2点就会执行全量数据备份

参考链接

  1. Centos7,redhat安装Mysql
  2. CentOS7安装MySQL8.0图文教程
  3. MySQL 8.0报错:ERROR 2059 (HY000): Authentication plugin ‘caching_sha2_password’ cannot be loaded
  4. 查看Linux发行版名称及版本号
  5. CenterOS7-Docker-安装MySQL8

Docker

1. 安装依赖包

首先移除旧的 docker 及其 依赖

1
2
3
4
5
6
7
8
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

然后安装 docker 依赖包

1
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

2. 添加 Docker-ce 镜像

  • 国外源
1
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 国内阿里云源
1
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

远程的包信息缓存到本机

1
yum makecache fast

3. 安装 Docker

最新版安装

1
yum -y install docker-ce 

在生产环境中, 通常需要使用统一的稳定版 ,而不是最新版 . 此时我们需要查看并安装指定版本

指定版本安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yum list docker-ce --showduplicates | sort -r

Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
...

然后安装对应版本

1
sudo yum install docker-ce-18.09.5 docker-ce-cli-18.09.5 containerd.io-1.2.5
Issue

此时可能出现 Requires: container-selinux >= 2.9 的报错

1
2
3
4
Error: Package: 3:docker-ce-18.09.6-3.el7.x86_64 (docker-ce-stable)             
Requires: container-selinux >= 2.9
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest

此时需要去 http://rpm.pbone.net/index.php3/stat/4/idpl/40704222/dir/centos_7/com/container-selinux-2.9-4.el7.noarch.rpm.htmlhttps://pkgs.org/download/container-selinux 下载 container-selinux2.9.4

1
wget ftp://bo.mirror.garr.it/1/slc/centos/7.1.1503/extras/x86_64/Packages/container-selinux-2.9-4.el7.noarch.rpm

接着执行

1
rpm -ivh container-selinux-2.9-4.el7.noarch.rpm

过程中可能又报错 , 若无报错则可跳过

1
2
error: Failed dependencies:
policycoreutils-python is needed by container-selinux-2:2.9-4.el7.noarch

直接 yum install 缺失的包即可

1
yum -y install policycoreutils-python

至此,缺失的依赖包已补全 , 再按照上述安装 Docker

4. 配置 Docker

重载 systemctl 并启动和开机自启动 docker

1
2
3
4
systemctl daemon-reload
systemctl start docker
systemctl enable docker
docker --version

5. 安装 Docker-compose

1
2
3
4
5
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

docker-compose --version

6. 改变 Docker 默认存储路径

安装完后不要启动,或者先停掉服务

移动现有文件

1
mv /var/lib/docker/* /mnt/efs/docker

删除原来的目录

1
rm -rf /var/lib/docker

建立软连接

1
ln -s /mnt/efs/docker/ /var/lib/docker

进入 /var/lib 下用命令查看软连接结果

1
2
3
 ls -la docker
# 显示结果如下表示成功
docker -> /mnt/efs/docker/

启动服务 , 用 docker info 查看是否成功

7. 卸载 Docker

__1. __ 搜索已安装的 docker 包 并删除

1
2
3
yum list installed|grep docker

yum –y remove {以上所列的包}

__2. __ 删除 docker 镜像

1
rm -rf /var/lib/docker    ##  若有自定义目录,需删除自定义目录

也可在卸载前删除容器及镜像

1
2
3
# 停止所有容器并删除
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

Docker制作 Java 服务镜像并推送到私有镜像库

首先将 Java 工程改造成docker工程 . 在 pom.xml 中加入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<properties>
<docker.image.prefix>hc</docker.image.prefix>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>

然后本地安装 Docker , 此处不清楚的可自行 Google .

然后命令打包

1
mvn clean package dockerfile:build -Dmaven.test.skip=true
1
2
3
4
5
6
# 登录私有镜像库,然后输入密码
sudo docker login --username=用户名 registry.cn-shenzhen.aliyuncs.com
# 通过 docker images 查看imageId 填入下方指令中
sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/命名空间/仓库:[镜像版本号]
# 推送
sudo docker push registry.cn-shenzhen.aliyuncs.com/命名空间/仓库:[镜像版本号]

此时注意下,如果是在 Mac 端输入 sudo xxx 命令,第一个输入的密码其实是本地电脑密码, 通过后才是输入镜像库密码, 别搞错了😂

CenterOS 补充

后面使用了几台 CenterOS , 安装过程中依赖环境相对于 AWS Linux 还是全一些 .

卸载 device-mapper-* 安装高版本即可安装成功

1
2
3
4
5
6
7
8
9
10
# 查看安装的 device* 包
rpm -qa | grep device
# rpm -e xxx(以上查找出来的包) --nodeps
# 下载依赖
wget ftp://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/7.4/x86_64/os/Packages/device-mapper-1.02.140-8.el7.x86_64.rpm

wget ftp://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/7.4/x86_64/os/Packages/device-mapper-libs-1.02.140-8.el7.x86_64.rpm

# 安装
rpm -ivh xxx(以上两个包) --nodeps

NPM Repo

1
2
# 删除所有无用镜像
docker image prune -a
Issue

docker info 查看有 WARNING: bridge-nf-call-iptables is disabled 的警告显示 .

解决办法 :

1
vim /etc/sysctl.conf

添加以下内容

1
2
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

再执行

1
sysctl -p

再执行 docker info 就不会报错了.

参考链接

  1. Requires: container-selinux >= 2.9报错
  2. 官网: Get Docker CE for CenterOS
  3. 官网: Install Docker Compose
  4. 修改 docker 默认的存储位置
  5. WARNING:bridge-nf-call-iptables is disabled解决

SS

参考链接

Amazon EC2 Linux实例上安装Shadowsocks服务器

GitLab

1. Docker及docker-compose

参考本文 Docker部分

2. GitLab

Issue
  • 阿里云企业邮箱 smtp OpenTimeout: execution expired

通常是因为阿里云服务器 25 端口未开放, 换成 465 即可.

已经通过 docker-compose 部署的 GitLab 需要修改GitLab自身的配置文件gitlab.rb

首先修改自定义目录下的 {docker-compose文件中的自定义路径}/config/gitlab.rb 并保存

1
2
3
4
5
6
7
8
9
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.mxhichina.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "{account}@{domain}"
gitlab_rails['smtp_password'] = "有授权码填授权码,没有填密码"
gitlab_rails['smtp_domain'] = "{domain}"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true

然后进入容器 bash

1
docker exec -it gitlab bash  

重新读取配置

1
2
gitlab-ctl reconfigure
gitlab-ctl restart

然后进入 gitlab 控制台

1
gitlab-rails console

检查邮件配置

  • 检查邮件发送协议
1
ActionMailer::Base.delivery_method

显示=> :smtp

  • 查看当前的发送邮件配置
1
ActionMailer::Base.smtp_settings

查看配置是否与修改后的一致

然后发送测试邮件

1
Notify.test_email('xxx@yyy.com','测试标题','测试内容').deliver_now

建议不要使用163邮箱, 可能因为内容导致邮件发送失败报554

参考链接

Docker-compose一键部署gitlab中文版

Yapi

参考链接

顶尖API文档管理工具Yapi

爱发布 APP 托管

fabu.love

常用的APP托管平台 蒲公英 , fir 审核越来越严格,时不时还会突然下架. 最好自己部署平台

物理机环境补充

物理机初始化缺少很多云主机装好的环境

1
2
3
4
5
6
7
8
9
10
## vim
yum -y install vim*
## wget
yum -y install wget
## yum-utils
yum -y install yum-utils
## telnet
yum list telnet* 列出telnet相关的安装包
yum install telnet-server 安装telnet服务
yum install telnet.* 安装telnet客户端