上一篇我們介紹了如何配置服務器,如何安裝系統及安全加固: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……
完結
這是我周末剛裝的一臺服務器的記錄文章,如果對你有幫助的話,希望給我點個贊,有問題可以留言交流~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296696.html
標籤:其他
