Linux 服务器搭建配置,开发效率一飞冲天 - Ubuntu 篇

上一篇我们介绍了如何配置服务器,如何安装系统及安全加固: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......

完结

这是我周末刚装的一台服务器的记录文章,如果对你有帮助的话,希望给我点个赞。有问题可以留言交流~

相关推荐
黄小耶@7 分钟前
linux常见命令
linux·运维·服务器
叫我龙翔8 分钟前
【计网】实现reactor反应堆模型 --- 框架搭建
linux·运维·网络
古驿幽情10 分钟前
CentOS AppStream 8 手动更新 yum源
linux·运维·centos·yum
BillKu11 分钟前
Linux(CentOS)安装 Nginx
linux·运维·nginx·centos
BillKu15 分钟前
Linux(CentOS)yum update -y 事故
linux·运维·centos
a2663789619 分钟前
解决yum命令报错“Could not resolve host: mirrorlist.centos.org
linux·运维·centos
2739920291 小时前
Ubuntu20.04 安装build-essential问题
linux
wowocpp5 小时前
查看 linux ubuntu 分区 和 挂载 情况 lsblk
linux·运维·ubuntu
wowocpp5 小时前
查看 磁盘文件系统格式 linux ubuntu blkid ext4
linux·数据库·ubuntu
龙鸣丿6 小时前
Linux基础学习笔记
linux·笔记·学习