上一篇我们介绍了如何配置服务器,如何安装系统及安全加固:Dell服务器配置与安装Ubuntu Server20.04操作系统,超详细!。今天这篇文章就来介绍一下如何在一台空白的服务器上,稳定有序的搭建生产环境,让你免去复杂的开发环境带来的一系列烦恼。这里主要涉及软件工程方向的,包含:Java、Node、Docker、MySQL、Redis、Gitlab、RabbitMQ……
AI方向的GPU服务器的配置(CUDA、cuDNN、LXD虚拟化等)将后续单独出一篇文章更新,因为这俩用途相差很大一般不会在一台机器上。
我们软件开发讲究自顶向下的设计方案,在配置服务器的过程中也不例外,我们需要先把底层的软件配置好。这样一些依赖于底层SDK的软件包也可以自由运行,比如你在运行Nacos之前必然需要先有Java环境。所以我这边列出了一个基本的安装配置顺序,可以从下到上依次安装配置。
由于我这台装的是Ubuntu Server 20.04系统,所以很多已经有的基础的环境就不多说了。接下来我就按照这台服务器为主,来操作一边安装配置流程。
上篇文章我说过为什么喜欢采用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)
-
- 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>
-
-
- sudo apt install nodejs npm
- nodejs --version
- npm --version
-
这里建议直接跟着官网一步步走即可,在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
-
没有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
-
- 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配置文件后执行重新加载就可以了,不用重启服务。
- 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
-
重启后就可以远程访问了。
- 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差。
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下拉镜像可以直接在页面中点击拉取命令:
这里我们可以直接创建一个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 即可。
这里分两个情况,如果你已有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=备份文件编号
-
恢复完了后直接重启容器就可以。
这里我们直接用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自动部署。
这里安装我们也得采用压缩包的形式,官方文档。
- 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;
-
由于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
-
直接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
-
到这一步其实你想装什么都可以了,我这里装的都是和开发业务强相关的软件了。比如通过GitLab Runner部署的应用,供前后端查看的接口文档的YAPI,日志分析的ELK……
这是我周末刚装的一台服务器的记录文章,如果对你有帮助的话,希望给我点个赞。有问题可以留言交流~