上一篇我们介绍了如何配置服务器,如何安装系统及安全加固:Dell服务器配置与安装Ubuntu Server20.04操作系统,超详细!。今天这篇文章就来介绍一下如何在一台空白的服务器上,稳定有序的搭建生产环境,让你免去复杂的开发环境带来的一系列烦恼。这里主要涉及软件工程方向的,包含:Java、Node、Docker、MySQL、Redis、Gitlab、RabbitMQ......
AI方向的GPU服务器的配置(CUDA、cuDNN、LXD虚拟化等),可以看这篇文章:基于LXD搭建多人共用GPU服务器,简单易用,全网最详细!。
本文实验操作系统是 Ubuntu,Centos 可 看这篇文章:Linux 服务器搭建配置,开发效率一飞冲天 - Centos 篇
前期规划
我们软件开发讲究自顶向下的设计方案,在配置服务器的过程中也不例外,我们需要先把底层的软件配置好。这样一些依赖于底层SDK的软件包也可以自由运行,比如你在运行Nacos之前必然需要先有Java环境。所以我这边列出了一个基本的安装配置顺序,可以从下到上依次安装配置。
由于我这台装的是Ubuntu Server 20.04系统,所以很多已经有的基础的环境就不多说了。接下来我就按照这台服务器为主,来操作一边安装配置流程。
1.底层基础
1.1 Java
上篇文章我说过为什么喜欢采用apt安装的形式,所以如果apt有的我基本都会采用这种方式进行安装。
一条命令即可,不用wget,不用配置环境变量,就是这么省心。
bash
sudo apt install openjdk-11-jdk
java -version
java version "11.0.12" 2021-07-20 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.12+8-LTS-237)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.12+8-LTS-237, mixed mode)
1.2 Maven
bash
sudo apt install maven
mvn -version
Maven home: /usr/share/maven
Java version: 11.0.12, vendor: Oracle Corporation, runtime: /data/src/jdk-11.0.12
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-81-generic", arch: "amd64", family: "unix"
Maven这里我们配一下阿里云的Maven源,打开/etc/maven/settings.xml
文件,添加如下内容:
bash
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<name>aliyun-nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
1.3 Node
bash
sudo apt install nodejs npm
nodejs --version
npm --version
1.4 Docker
这里建议直接跟着官网一步步走即可,在Ubuntu中安装Docker。我这里也二次说明一下每一个步骤。
首先用官方脚本卸载一下旧版本,没有装的运行也没事:
bash
sudo apt-get remove docker docker-engine docker.io containerd runc
安装 apt 依赖包,用于通过HTTPS来获取仓库:
bash
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
添加 Docker 的官方 GPG 密钥:
bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
设置稳定版仓库:
bash
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装最新版本的 Docker Engine-Community 和 Containerd :
bash
sudo apt-get install docker-ce docker-ce-cli containerd.io
安装完成后,我们可以运行这条命令测试一下:
bash
sudo docker run hello-world
能看到如下的信息,就代表安装成功了!
最后,我们配置一下Docker的远程访问,开启Remote API 访问 2375端口,这样就可以用API来控制Docker了。
bash
# vim /usr/lib/systemd/system/docker.service
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
主要在[Service]这个部分,加上下这句话: -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
,然后重启即可:
bash
systemctl daemon-reload
systemctl restart docker
1.5 Docker-Compose
没有Compose的Docker怎么飞起呢,接下来安它!同样可以参考官方的文档。
首先使用 curl 将Compose文件下载到/usr/local/bin目录中:
bash
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
下载完成后,将可执行文件权限应用于文件:
bash
sudo chmod +x /usr/local/bin/docker-compose
然后就配置成功了,验证一下:
bash
docker-compose --version
2. 系统支撑
2.1 Nginx
bash
sudo apt install nginx
sudo systemctl status nginx
安装好后先别着急访问,别忘了上一篇文章我们开启了UFW防火墙,这里开启一下,可以直接用别名开启:
bash
sudo ufw allow 'Nginx Full'
Nginx常用命令:
bash
# 停止服务
systemctl stop nginx
# 启动服务
systemctl start nginx
# 重启服务
systemctl restart nginx
# 重新加载配置文件
nginx -s reload -c /etc/nginx/nginx.conf
修改完Nginx配置文件后执行重新加载就可以了,不用重启服务。
2.2 MySQL
bash
sudo apt install mysql-server
一旦安装完成,MySQL 服务将会自动启动。想要验证 MySQL 服务器正在运行,输入:
bash
sudo systemctl status mysql
输出应该显示服务已经被启用,并且正在运行:
bash
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-08-27 11:15:38 UTC; 2 days ago
Main PID: 1796 (mysqld)
Status: "Server is operational"
Tasks: 58 (limit: 76922)
Memory: 513.4M
CGroup: /system.slice/mysql.service
└─1796 /usr/sbin/mysqld
安装完后可以使用MySQL自带的安全脚本来进行安全配置:
bash
sudo mysql_secure_installation
然后就根据要求填写你的密码强度、root密码、上线相关配置了。
bash
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: y
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Please set the password for root here.
New password:
Re-enter new password:
配置完后,你直接执行sudo mysql
就可以进入mysql了,没有要求输入你刚刚输入的密码,这是因为MySQL 8默认验证方式是auth_socket
方式,而不是用户名密码,你可以在User表里修改root的验证方式:
bash
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'very_strong_password';
FLUSH PRIVILEGES;
当然,这里更推荐你新建一个管理员账户,这样更安全一些:
bash
# 创建账户:
create user '用户名'@'访问主机' identified by '密码';
# 赋予权限:
grant 权限列表 on 数据库 to '用户名'@'访问主机' WITH GRANT OPTION; ;
最后,如果想远程访问别忘了配置一下mysql的配置文件:
bash
vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 将下面这句话注释
# bind-adress = 127.0.0.1
service mysql restart
重启后就可以远程访问了。
2.3 Redis
bash
sudo apt install redis-server
检查是否运行成功:
bash
sudo systemctl status redis-server
为了保障安全性,我们这里配置个密码:
bash
vim /etc/redis.conf
# 取消注释下面这行配置
requirepass YOUR_PASSWORD
重启Redis服务:
bash
systemctl restart redis-server
这里推荐一个免费开源的Redis客户端:AnotherRedisDesktopManager,一点也不比收费的RDM差。
2.4 Harbor
Harbor 是 VMware 公司开源了企业级 Registry 项目, 其的目标是帮助用户迅速搭建一个企业级的 Docker registry 服务。可以通过 docker-compose 安装部署。
在官方Github仓库下载运行包:goharbor/harbor,可以直接wget下载,也可以电脑下载好传到服务器中。
bash
# 解压缩包
tar xvf harbor-offline-installer-v2.3.2.tgz
# 修改配置文件
vim harbor/harbor.cfg
# hostname 设置访问地址,支持IP,域名,主机名,禁止设置127.0.0.1
hostname = reg.mydomain.com
# 访问协议,可设置 http,https
ui_url_protocol = http
# 邮件通知, 配置邮件通知。
email_identity =
email_server = smtp.mydomain.com
email_server_port = 25
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin <sample_admin@mydomain.com>
email_ssl = false
email_insecure = false
# harbor WEB UI登陆使用的密码
harbor_admin_password = Harbor12345
# 认证方式,这里支持多种认证方式,默认是 db_auth ,既mysql数据库存储认证。
# 这里还支持 ldap 以及 本地文件存储方式。
auth_mode = db_auth
# ldap 服务器访问地址。
ldap_url = ldaps://ldap.mydomain.com
ldap_basedn = uid=%s,ou=people,dc=mydomain,dc=com
配置设置完成运行安装脚本:
bash
sudo ./install.sh
这个脚本会帮你生成一个Docker-Compose.yaml文件后自动启动,以后直接操作这个compose即可。要更改 Harbour 的配置,请先停止现有的 Harbor 实例并更新 harbour.cfg。 然后运行 prepare
脚本来填充配置,最后重新创建并启动Harbor的实例:
bash
docker-compose down -v
# 注:其实上面是停止 docker-compose.yml 中定义的所有容器
vim harbor.cfg
prepare
docker-compose up -d
Docker服务要想使用Harbor需要先登录:
bash
# 镜像推送
docker login https://***.com:8001
# 查看 cat ~/.docker/config.json
# 镜像打包时候需要按一定规则 tag
docker pull nginx
docker tag nginx ***.com:8001/library/nginx:latest
docker push ***.com:8001/library/nginx
docker rmi -f ***.com:8001/library/nginx:latest
注意:如果没有配https,默认Docker会登录不成功,这里需要按这篇博文配置一下。
在Harbor下拉镜像可以直接在页面中点击拉取命令:
2.5 Nexus
这里我们可以直接创建一个docker-compose.yml文件,配置如下:
yml
version: '3.1'
services:
nexus:
restart: always
image: sonatype/nexus3
container_name: nexus
ports:
- 6005:8081
volumes:
- /data/Docker/nexus/data:/nexus-data
注意把最后一行挂载卷换成你想要的路径,然后直接执行:docker-compose up -d
即可。
3. 基础应用
3.1 GitLab
这里分两个情况,如果你已有GitLab仓库想换到新的服务器上,则需要保持GitLab版本一致,这样才可以恢复备份文件。如果是新装使用,则可以直接按官网文档用最新的版本。
bash
$ GITLAB_HOME = /home/docker/gitlab # 建立gitlab本地目录
$ docker run -d \
--hostname gitlab.example.com\ # 指定容器域名,创建镜像仓库用
-p 8443:443 \ # 容器443端口映射到主机8443端口(https)
-p 8080:80 \ # 容器80端口映射到主机8080端口(http)
-p 2222:22 \ # 容器22端口映射到主机2222端口(ssh)
--name gitlab \ # 容器名称
--restart always \ # 容器退出后自动重启
-v $GITLAB_HOME/config:/etc/gitlab \ # 挂载本地目录到容器配置目录
-v $GITLAB_HOME/logs:/var/log/gitlab \ # 挂载本地目录到容器日志目录
-v $GITLAB_HOME/data:/var/opt/gitlab \ # 挂载本地目录到容器数据目录
gitlab/gitlab-ce:latest # 使用的镜像:版本
修改配置文件:
bash
sudo vi /home/docker/gitlab/config
# 修改完成后可以直接重启容器
docker restart gitlab
GitLab可以配置的东西就太多了,这里就不展开了。主要说一下备份,可以进入容器执行:gitlab-rake gitlab:backup:create
命令,该命令会将所有内容被分到gitlab/backups/ 目录下。拷贝到新机器后,需要设一下权限:chomd 777 1561597102_2021_07_21_22.0.1_gitlab_backup.tar
。
bash
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
# 例如:备份文件名为1561597102_2021_07_21_22.0.1_gitlab_backup.tar,则编号为1561597102_2021_07_21_22.0.1。
gitlab-rake gitlab:backup:restore BACKUP=备份文件编号
恢复完了后直接重启容器就可以。
3.2 GitLab Runner
这里我们直接用GitLab Runner打造CI/CD了,你可以选择使用Jenkins。
bash
# 添加GitLab官方库:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
# 通过命令安装
sudo apt-get install gitlab-ci-multi-runner
这就安装好了,具体Gitlab Runner的使用教程可以看我这篇文章:基于Docker快速实现Spring项目Gitlab自动部署。
3.3 MINIO
这里安装我们也得采用压缩包的形式,官方文档。
bash
wget http://dl.minio.org.cn/server/minio/release/darwin-amd64/minio
chmod +x minio
执行我建议可以做个shell脚本:
bash
vim ./start.sh
# 复制到sh文件中
export MINIO_ACCESS_KEY=username
export MINIO_SECRET_KEY=password
nohup sudo /usr/local/minio/minio server --address=0.0.0.0:9000 --config-dir /etc/minio /data/minioData > /usr/local/minio/minio.log 2>&1&
给用户分配执行权限chmod u+x *.sh,然后执行就可以运行起来了,可以直接打开9000端口查看。
MINIO的客户端:
bash
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
./mc --help
可以直接通过以下命令来登录到MINIO中。
bash
mc config host add minio http://xxx:7002 minioadmin minioadmin --api s3v4
登录成功后可以对MINIO进行一些配置。
bash
# 查看现有桶
./mc ls minio
# 设置每个桶的访问权限
mc policy set public minio/video
Java访问MINIO的代码示例:
java
MinioClient minioClient = MinioClient.builder()
.endpoint("http://xxx:6002")
.credentials("minioadmin", "minioadmin")
.build();
minioClient.putObject(
PutObjectArgs.builder().bucket("bucket").object(filename).stream(
file.getResource().getInputStream(), -1, 10485760)
.contentType("image/" + suffix)
.build());
String imageUrl = "https://xxx:6002/bucket/" + filename;
3.4 Nacos
由于Nacos还没兼容好JDK 11,所以我们直接跑在Docker里了。官方安装文档
bash
git clone --depth 1 https://github.com/nacos-group/nacos-docker.git
cd nacos-docker
docker-compose -f example/standalone-derby.yaml up
3.5 RabbitMQ
直接Docker部署吧,以下是compose文件:
bash
docker run -d \
--restart=always \
--name rmqnamesrv \
-p 7008:9876 \
-v /usr/local/docker/rocketmq/namesrv/logs:/root/logs \
-v /usr/local/docker/rocketmq/namesrv/store:/root/store \
-e "MAX_POSSIBLE_HEAP=100000000" \
rocketmqinc/rocketmq \
sh mqnamesrv
docker run -d \
--restart=always \
--name rmqbroker \
--link rmqnamesrv:namesrv \
-p 7009:7009 \
-p 10909:10909 \
-v /usr/local/docker/rocketmq/broker/logs:/root/logs \
-v /usr/local/docker/rocketmq/broker/store:/root/store \
-v /usr/local/docker/rocketmq/broker/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf \
-e "NAMESRV_ADDR=namesrv:9876" \
-e "MAX_POSSIBLE_HEAP=200000000" \
rocketmqinc/rocketmq \
sh mqbroker -c /opt/rocketmq-4.4.0/conf/broker.conf
docker run -d \
--restart=always \
--name rmqadmin \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=xxx:7008 \
-Dcom.rocketmq.sendMessageWithVIPChannel=false" \
-p 6001:8080 \
pangliang/rocketmq-console-ng
Broker配置文件:
bash
# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = DefaultCluster
#broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-a
#0表示Master,大于0表示不同的slave
brokerId = 0
#表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
#在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
#有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
#刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
# 设置broker节点所在服务器的ip地址
brokerIP1 = xxx
listenPort=7009
4. 上层应用
到这一步其实你想装什么都可以了,我这里装的都是和开发业务强相关的软件了。比如通过GitLab Runner部署的应用,供前后端查看的接口文档的YAPI,日志分析的ELK......
完结
这是我周末刚装的一台服务器的记录文章,如果对你有帮助的话,希望给我点个赞。有问题可以留言交流~