2025年3月25日 星期二 甲辰(龙)年 月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 系统应用 > Linux

对刚装好系统的Linux系统配置软件开发生产环境,让你开发效率一飞冲天!

时间:10-09来源:作者:点击数:142

上一篇我们介绍了如何配置服务器,如何安装系统及安全加固:Dell服务器配置与安装Ubuntu Server20.04操作系统,超详细!。今天这篇文章就来介绍一下如何在一台空白的服务器上,稳定有序的搭建生产环境,让你免去复杂的开发环境带来的一系列烦恼。这里主要涉及软件工程方向的,包含:Java、Node、Docker、MySQL、Redis、Gitlab、RabbitMQ……

AI方向的GPU服务器的配置(CUDA、cuDNN、LXD虚拟化等)将后续单独出一篇文章更新,因为这俩用途相差很大一般不会在一台机器上。

前期规划

我们软件开发讲究自顶向下的设计方案,在配置服务器的过程中也不例外,我们需要先把底层的软件配置好。这样一些依赖于底层SDK的软件包也可以自由运行,比如你在运行Nacos之前必然需要先有Java环境。所以我这边列出了一个基本的安装配置顺序,可以从下到上依次安装配置。

由于我这台装的是Ubuntu Server 20.04系统,所以很多已经有的基础的环境就不多说了。接下来我就按照这台服务器为主,来操作一边安装配置流程。

1.底层基础

1.1 Java

上篇文章我说过为什么喜欢采用apt安装的形式,所以如果apt有的我基本都会采用这种方式进行安装。

一条命令即可,不用wget,不用配置环境变量,就是这么省心。

  • 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

  • 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文件,添加如下内容:

  • <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

  • sudo apt install nodejs npm
  • nodejs --version
  • npm --version

1.4 Docker

这里建议直接跟着官网一步步走即可,在Ubuntu中安装Docker。我这里也二次说明一下每一个步骤。

首先用官方脚本卸载一下旧版本,没有装的运行也没事:

  • sudo apt-get remove docker docker-engine docker.io containerd runc

安装 apt 依赖包,用于通过HTTPS来获取仓库:

  • sudo apt-get update
  • sudo apt-get install \\
  • apt-transport-https \\
  • ca-certificates \\
  • curl \\
  • gnupg \\
  • lsb-release

添加 Docker 的官方 GPG 密钥:

  • curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

设置稳定版仓库:

  • 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 :

  • sudo apt-get install docker-ce docker-ce-cli containerd.io

安装完成后,我们可以运行这条命令测试一下:

  • sudo docker run hello-world

能看到如下的信息,就代表安装成功了!

最后,我们配置一下Docker的远程访问,开启Remote API 访问 2375端口,这样就可以用API来控制Docker了。

  • # 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,然后重启即可:

  • systemctl daemon-reload
  • systemctl restart docker

1.5 Docker-Compose

没有Compose的Docker怎么飞起呢,接下来安它!同样可以参考官方的文档

首先使用 curl 将Compose文件下载到/usr/local/bin目录中:

  • 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

下载完成后,将可执行文件权限应用于文件:

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

然后就配置成功了,验证一下:

  • docker-compose --version

2. 系统支撑

2.1 Nginx

  • sudo apt install nginx
  • sudo systemctl status nginx

安装好后先别着急访问,别忘了上一篇文章我们开启了UFW防火墙,这里开启一下,可以直接用别名开启:

  • sudo ufw allow 'Nginx Full'

Nginx常用命令:

  • # 停止服务
  • systemctl stop nginx
  • # 启动服务
  • systemctl start nginx
  • # 重启服务
  • systemctl restart nginx
  • # 重新加载配置文件
  • nginx -s reload -c /etc/nginx/nginx.conf

修改完Nginx配置文件后执行重新加载就可以了,不用重启服务。

2.2 MySQL

  • sudo apt install mysql-server

一旦安装完成,MySQL 服务将会自动启动。想要验证 MySQL 服务器正在运行,输入:

  • sudo systemctl status mysql

输出应该显示服务已经被启用,并且正在运行:

  • 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自带的安全脚本来进行安全配置:

  • sudo mysql_secure_installation

然后就根据要求填写你的密码强度、root密码、上线相关配置了。

  • 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的验证方式:

  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'very_strong_password';
  • FLUSH PRIVILEGES;

当然,这里更推荐你新建一个管理员账户,这样更安全一些:

  • # 创建账户:
  • create user '用户名'@'访问主机' identified by '密码';
  • # 赋予权限:
  • grant 权限列表 on 数据库 to '用户名'@'访问主机' WITH GRANT OPTION; ;

最后,如果想远程访问别忘了配置一下mysql的配置文件:

  • vim /etc/mysql/mysql.conf.d/mysqld.cnf
  • # 将下面这句话注释
  • # bind-adress = 127.0.0.1
  • service mysql restart

重启后就可以远程访问了。

2.3 Redis

  • sudo apt install redis-server

检查是否运行成功:

  • sudo systemctl status redis-server

为了保障安全性,我们这里配置个密码:

  • vim /etc/redis.conf
  • # 取消注释下面这行配置
  • requirepass YOUR_PASSWORD

重启Redis服务:

  • systemctl restart redis-server

这里推荐一个免费开源的Redis客户端:AnotherRedisDesktopManager,一点也不比收费的RDM差。

2.4 Harbor

Harbor 是 VMware 公司开源了企业级 Registry 项目, 其的目标是帮助用户迅速搭建一个企业级的 Docker registry 服务。可以通过 docker-compose 安装部署。

在官方Github仓库下载运行包:goharbor/harbor,可以直接wget下载,也可以电脑下载好传到服务器中。

  • # 解压缩包
  • 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

配置设置完成运行安装脚本:

  • sudo ./install.sh

这个脚本会帮你生成一个Docker-Compose.yaml文件后自动启动,以后直接操作这个compose即可。要更改 Harbour 的配置,请先停止现有的 Harbor 实例并更新 harbour.cfg。 然后运行 prepare 脚本来填充配置,最后重新创建并启动Harbor的实例:

  • docker-compose down -v
  • # 注:其实上面是停止 docker-compose.yml 中定义的所有容器
  • vim harbor.cfg
  • prepare
  • docker-compose up -d

Docker服务要想使用Harbor需要先登录:

  • # 镜像推送
  • 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文件,配置如下:

  • 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版本一致,这样才可以恢复备份文件。如果是新装使用,则可以直接按官网文档用最新的版本。

  • $ 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 # 使用的镜像:版本

修改配置文件:

  • 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

  • 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。

  • # 添加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

这里安装我们也得采用压缩包的形式,官方文档

  • wget http://dl.minio.org.cn/server/minio/release/darwin-amd64/minio
  • chmod +x minio

执行我建议可以做个shell脚本:

  • 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的客户端:

  • wget https://dl.min.io/client/mc/release/linux-amd64/mc
  • chmod +x mc
  • ./mc --help

可以直接通过以下命令来登录到MINIO中。

  • mc config host add minio http://xxx:7002 minioadmin minioadmin --api s3v4

登录成功后可以对MINIO进行一些配置。

  • # 查看现有桶
  • ./mc ls minio
  • # 设置每个桶的访问权限
  • mc policy set public minio/video

Java访问MINIO的代码示例:

  • 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里了。官方安装文档

  • 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文件:

  • 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
  • docker run -p 8003:8000 -d --name jupyterhub -v /usr/local/docker/jupyterhub/data:/srv/jupyterhub -v /usr/local/docker/jupyterhub/home:/home --restart=always 564239555/jupyterhub_r jupyterhub

Broker配置文件:

  • # 所属集群名称,如果节点较多可以配置多个
  • 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……

完结

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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门