# Centos 環境下的部署(基于Docker容器)
服務器配置要求:
最低配置:8核16GB,帶寬建議動態帶寬按量收費。峰值設置50M。
OSS:阿里云,騰訊云 二選一
**注意:docker部署的127.0.0.0和localhost全部改為服務器內網IP,否則會鏈接失敗。**
**商城后端服務啟動順序:**
~~~shell
mall-gateway.jar
mall-auth.jar
mall-account.jar
mall-admin.jar
mall-shop.jar
mall-sns.jar
mall-pay.jar
mall-im.jar
mall-cms.jar
mall-search.jar
~~~
**端口開放:**
| 服務名稱 | 版本 | 開放端口 |
| --- | --- | --- |
| mall-gateway.jar | | 服務端口:8201 |
| mall-auth.jar | | 服務端口:8401 |
| mall-account.jar | | 服務端口:8088 |
| mall-admin.jar | | 服務端口:8080 |
| mall-shop.jar | | 服務端口:8089 |
| mall-sns.jar | | 服務端口:8085 |
| mall-pay.jar | | 服務端口:8086 |
| mall-edu.jar | | 服務端口:8082 |
| mall-im.jar | | 服務端口:8099 |
| mall-cms.jar | | 服務端口:8087 |
| mall-search.jar | | 服務端口:8081 |
| nacos | 2.0.0 | 服務端口:8848 |
| Seata | 1.3.0 | 服務端口:8091 |
| Nginx | 最新 | 服務端口:80,443 |
| MySQL | 5.6.51 或者8.0 | 服務端口:3306 |
| Redis | 5.0 | 服務端口:6379 |
| elasticsearch | 7.17.3 | 服務端口:9200, 9300 |
| Logstash | 7.17.3 | 服務端口:4560, 4561,4562,4563 |
| Kibana | 7.17.3 | 服務端口:5601 |
| RabbitMQ | 3.7.4 | 服務端口:5672 15672 |
| Sentinel | 最新 | 服務端口:8858 |
| Portainer | | 服務端口:9000 |
# 可視化管理工具
Portainer 是一款輕量級的應用,它提供了圖形化界面,用于方便的管理Docker環境,包括單機環境和集群環境,下面我們將用Portainer來管理Docker容器中的應用。
獲取Docker鏡像文件:
~~~shell
docker pull portainer/portainer
~~~
使用docker容器運行Portainer:
~~~shell
docker run -p 9000:9000 -p 8000:8000 --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/localtime:/etc/localtime \
-v /data/portainer/data:/data \
-d portainer/portainer
~~~
查看Portainer的DashBoard信息,訪問地址:[http://192.168.3.101:9000](http://192.168.3.101:9000/)
# MySQL安裝
**也可以使用MySQL8.0 但是要注意修改參數:sql-mode=NO\_ENGINE\_SUBSTITUTION。可以不使用docker部署MySQL,使用你認為比較合適的方式部署。**
下載 MySQL:8.0.36 的docker鏡像:
~~~shell
docker pull mysql:8.0.36
~~~
創建物理機掛載目錄:
~~~shell
sudo mkdir -p /data/mysql/data /data/mysql/logs /data/mysql/conf
~~~
進入mysql配置目錄:
~~~shell
cd /data/mysql/conf
~~~
創建MySql的my.cnf配置文件,補充mysql8.0的配置文件(如下):
~~~shell
touch my.cnf
~~~
my.cnf 內容:
~~~shell
# =============== 配置內容如下(可根據自己情況修改)==============
[mysql]
#設置服務器默認字符集為utf8mb4
default-character-set=utf8mb4
[mysqld]
#配置服務器的服務號,具備日后需要集群做準備
server-id = 1
#開啟MySQL數據庫的二進制日志,用于記錄用戶對數據庫的操作SQL語句,具備日后需要集群做準備
log-bin=mysql-bin
#設置清理超過30天的日志,以免日志堆積造過多成服務器內存爆滿
expire_logs_days=30
#允許最大的連接數
max_connections=16384
# 禁用符號鏈接以防止各種安全風險
symbolic-links=0
# 設置東八區時區
default-time_zone = '+8:00'
#wait_timeout參數值,由默認的8小時,修改為30分鐘。
wait_timeout=1800
#修改back_log參數值:由默認的50修改為500 每個線程256K 1.6W線程2G左右
back_log=500
character_set_server=utf8mb4
default_authentication_plugin = mysql_native_password
sql-mode=NO_ENGINE_SUBSTITUTION
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect=SET NAMES utf8mb4
# =========================== 結 束 ===========================
~~~
啟動mysql:8.0.36:
~~~shell
docker run -p 3306:3306 --name mysql \
-v /data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /data/mysql/logs:/logs \
-v /data/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=B1x1GuKZr55PPmox \
-v /etc/localtime:/etc/localtime \
--restart always \
-d mysql:8.0.36
~~~
**如下MySQL5.6演示**
1. 下載MySQL5.6.51的docker鏡像:
~~~shell
docker pull mysql:5.6.51
~~~
2. 使用如下命令啟動MySQL服務:
~~~shell
docker run -p 3306:3306 --name mysql \
-v /data/mysql/log:/var/log/mysql \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf:/etc/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=root \
--restart=always \
-d mysql:5.6.51
~~~
3. 參數說明
* \-p 3306:3306:將容器的3306端口映射到主機的3306端口
* \-v /data/mysql/conf:/etc/mysql:將配置文件夾掛在到主機
* \-v /data/mysql/log:/var/log/mysql:將日志文件夾掛載到主機
* \-v /data/mysql/data:/var/lib/mysql/:將數據文件夾掛載到主機
* \-e MYSQL\_ROOT\_PASSWORD=root:初始化root用戶的密碼
4. 進入運行MySQL的docker容器:
~~~shell
docker exec -it mysql /bin/bash
~~~
5. 使用MySQL命令打開客戶端:
~~~shell
mysql -uroot -proot --default-character-set=utf8mb4
~~~
6. 創建mall數據庫:
~~~shell
create database mall character set utf8mb4;
~~~
7. 先將 store\_dev.sql 上傳到/data/,將`store_dev.sql`文件拷貝到mysql容器的/目錄下:
~~~shell
docker cp /data/store_dev.sql mysql:/
~~~
8. 將sql文件導入到數據庫:
~~~shell
use mall;
source /store_dev.sql;
~~~
9. 創建一個reader:123456帳號并修改權限,使得任何ip都能訪問:
**注意:此處請自定義自己的賬號密碼,這里只是示例。**
MySQL5.6:
~~~shell
grant all privileges on *.* to 'mall' @'%' identified by '123456';
~~~
MySQL8.0:
~~~shell
### 創建賬號密碼
CREATE USER 'mall'@'%' IDENTIFIED BY '1111111';
###為用戶 mall 授予對數據庫 mall 的所有權限
GRANT ALL PRIVILEGES ON mall.* TO 'mall'@'%';
###最后,執行以下命令以刷新權限
FLUSH PRIVILEGES;
~~~
10. 備份數據庫腳本
mysqlback.sh
~~~shell
#!/bin/bash
# 備份文件保存的目錄
backup_dir="/data/mysqlbak/"
# 獲取當前日期和時間作為時間戳
timestamp=$(date +"%Y%m%d_%H%M%S")
# 備份MySQL數據庫到帶有時間戳的文件名中
docker exec mysql sh -c 'exec mysqldump dataname -uuser -p"password"' > "${backup_dir}db_backup_${timestamp}.sql"
# 列出備份目錄下的所有備份文件,并按時間戳降序排序
backup_files=($(ls -t "${backup_dir}"*.sql))
# 計算備份文件數量
num_backup_files=${#backup_files[@]}
# 如果備份文件數量超過50份,則刪除較舊的備份文件
if [ $num_backup_files -gt 50 ]; then
# 計算要刪除的備份文件數量
num_to_delete=$((num_backup_files - 50))
# 循環刪除較舊的備份文件
for ((i = 0; i < $num_to_delete; i++)); do
rm "${backup_files[$i]}"
done
fi
# 將最新的備份文件打包成壓縮包
tar -czvf "${backup_dir}backup_${timestamp}.tar.gz" "${backup_dir}db_backup_${timestamp}.sql"
# 刪除原始的備份文件(可選,如果需要節省磁盤空間)
rm "${backup_dir}db_backup_${timestamp}.sql"
~~~
添加計劃任務:
打開終端。
輸入以下命令來編輯你的cron表(計劃任務表):
~~~shell
crontab -e
~~~
如果是第一次編輯cron表,系統會要求你選擇一個文本編輯器。你可以選擇自己熟悉的編輯器,比如`nano`或`vim`。
在打開的cron表中,添加以下行來每三十分鐘執行一次任務:
~~~shell
*/30 * * * * your_command_here
~~~
將`your_command_here`替換為你想要定期執行的命令或腳本路徑。
* \*/30:表示每隔30分鐘執行一次。
* \*:表示任意的取值,這里代表每小時的任意分鐘。
* \*:表示任意的取值,這里代表任意一天的日期。
* \*:表示任意的取值,這里代表任意一個月份。
* \*:表示任意的取值,這里代表任意一周的星期幾。
編輯完成后,保存并退出編輯器。
系統會自動保存你的cron表,并開始按照你的設置定期執行任務。
# Redis安裝
1. 下載Redis5.0的docker鏡像:
~~~shell
docker pull redis:5
~~~
2. 使用如下命令啟動Redis服務:
~~~shell
docker run -p 6379:6379 --name redis \
-v /etc/localtime:/etc/localtime \
-v /data/redis/data:/data \
--restart=always \
-d redis:5 redis-server --appendonly yes --requirepass "pwd_123"
~~~
3. 進入Redis容器使用`redis-cli`命令進行連接,驗證是否啟動成功:
~~~shell
docker exec -it redis redis-cli
~~~
# Nacos 安裝
1. 下載Nacos的docker鏡像:
~~~shell
docker pull nacos/nacos-server:2.0.0
~~~
2. 啟動nacos容器 從容器中復制配置文件和日志文件:
~~~shell
docker run -p 8848:8848 --name nacos -d nacos/nacos-server:2.0.0
~~~
3. 創建掛載目錄 方便修改配置 查看日志:
~~~shell
#配置文件復制
docker cp nacos:/home/nacos /data/nacos
~~~
4. 停止用來復制日志和配置文件的nacos 容器
~~~shell
#停止容器
docker stop nacos
#刪除容器
docker rm nacos
~~~
5. 重新啟動容器 并掛載目錄 啟動命令
~~~shell
docker run -d \
-e MODE=standalone \
-v /etc/localtime:/etc/localtime \
-v /data/nacos/logs:/home/nacos/logs \
-v /data/nacos/conf:/home/nacos/conf \
-v /data/nacos/data:/home/nacos/data \
-p 8848:8848 \
--name nacos \
--restart=always \
nacos/nacos-server:2.0.0
~~~
# Seata 安裝
1. 下載Seata的docker鏡像:
~~~shell
docker pull seataio/seata-server:1.3.0
~~~
2. 啟動nacos容器 獲取配置文件:
~~~shell
docker run --name seata-server -p 8091:8091 -d seataio/seata-server:1.3.0
~~~
3. 創建掛載目錄 方便修改配置:
~~~shell
docker cp seata-server:/seata-server /data/seata
~~~
4. 停止用來復制配置文件的Seata容器
~~~shell
#停止容器
docker stop seata-server
#刪除容器
docker rm seata-server
~~~
5. 修改配置文件,進入目錄/data/seata/resources中修改file.conf和registry.conf中的內容
6. 修改文件 file.conf
~~~shell
## transaction log store, only used in seata-server
store {
## store mode: file、db、redis
mode = "db"
## file store property
file {
## store location dir
dir = "sessionStore"
# branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
maxBranchSessionSize = 16384
# globe session size , if exceeded throws exceptions
maxGlobalSessionSize = 512
# file buffer size , if exceeded allocate new buffer
fileWriteBufferCacheSize = 16384
# when recover batch read size
sessionReloadReadSize = 100
# async, sync
flushDiskMode = async
}
## database store property
db {
## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
datasource = "druid"
## mysql/oracle/postgresql/h2/oceanbase etc.
dbType = "mysql"
## 注意使用mysql8.0及以上版本的需要更改:driverClassName = "com.mysql.cj.jdbc.Driver"
driverClassName = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://127.0.0.1:3306/mallsuite?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&&zeroDateTimeBehavior=convertToNull"
user = "mall"
password = "mall"
minConn = 5
maxConn = 30
globalTable = "global_table"
branchTable = "branch_table"
lockTable = "lock_table"
queryLimit = 100
maxWait = 5000
}
## redis store property
redis {
host = "127.0.0.1"
port = "6379"
password = "pwd_123"
database = "0"
minConn = 1
maxConn = 10
queryLimit = 100
}
}
~~~
7. 修改文件 registry.conf,參考一下配置。
(nacos服務對應的ip地址假設為:127.0.0.1;nacos服務的用戶名密碼假設都為:nacos):
~~~shell
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "127.0.0.1:8848"
group = "SEATA_GROUP"
namespace = ""
cluster = "default"
username = "nacos"
password = "nacos"
}
redis {
serverAddr = "localhost:6379"
db = 0
password = "pwd_123"
cluster = "default"
timeout = 0
}
file {
name = "file.conf"
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "file"
nacos {
serverAddr = "127.0.0.1:8848"
namespace = ""
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
}
file {
name = "file.conf"
}
}
~~~
8. 準備 config.txt 文件 放入 /data/seata/文件夾中,內容參考以下配置(主要注意數據庫連接串和用戶名密碼的修改):
~~~shell
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=true
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
service.vgroupMapping.my_test_tx_group=default
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=false
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.sagaJsonParser=fastjson
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
store.mode=db
store.lock.mode=file
store.session.mode=file
store.publicKey=
store.file.dir=file_store/data
store.file.maxBranchSessionSize=16384
store.file.maxGlobalSessionSize=512
store.file.fileWriteBufferCacheSize=16384
store.file.flushDiskMode=async
store.file.sessionReloadReadSize=100
store.db.datasource=druid
store.db.dbType=mysql
#注意使用mysql8.0及以上版本的需要更改:driverClassName = "com.mysql.cj.jdbc.Driver"
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/mallsuite?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&&zeroDateTimeBehavior=convertToNull
store.db.user=root #數據庫用戶名
store.db.password=root #數據庫密碼
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.distributedLockExpireTime=10000
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
log.exceptionRate=100
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h
~~~
9. 新建 nacos-config.sh 放入 /data/seata/resources文件夾中;參考配置如下:
~~~shell
#!/bin/sh
# Copyright 1999-2019 Seata.io Group.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at、
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
while getopts ":h:p:g:t:u:w:" opt
do
case $opt in
h)
host=$OPTARG
;;
p)
port=$OPTARG
;;
g)
group=$OPTARG
;;
t)
tenant=$OPTARG
;;
u)
username=$OPTARG
;;
w)
password=$OPTARG
;;
?)
echo " USAGE OPTION: $0 [-h host] [-p port] [-g group] [-t tenant] [-u username] [-w password] "
exit 1
;;
esac
done
if [ -z ${host} ]; then
host=localhost
fi
if [ -z ${port} ]; then
port=8848
fi
if [ -z ${group} ]; then
group="SEATA_GROUP"
fi
if [ -z ${tenant} ]; then
tenant=""
fi
if [ -z ${username} ]; then
username=""
fi
if [ -z ${password} ]; then
password=""
fi
nacosAddr=$host:$port
contentType="content-type:application/json;charset=UTF-8"
echo "set nacosAddr=$nacosAddr"
echo "set group=$group"
urlencode() {
length="${#1}"
i=0
while [ $length -gt $i ]; do
char="${1:$i:1}"
case $char in
[a-zA-Z0-9.~_-]) printf $char ;;
*) printf '%%%02X' "'$char" ;;
esac
i=`expr $i + 1`
done
}
failCount=0
tempLog=$(mktemp -u)
function addConfig() {
dataId=`urlencode $1`
content=`urlencode $2`
curl -X POST -H "${contentType}" "http://$nacosAddr/nacos/v1/cs/configs?dataId=$dataId&group=$group&content=$content&tenant=$tenant&username=$username&password=$password" >"${tempLog}" 2>/dev/null
if [ -z $(cat "${tempLog}") ]; then
echo " Please check the cluster status. "
exit 1
fi
if [ "$(cat "${tempLog}")" == "true" ]; then
echo "Set $1=$2 successfully "
else
echo "Set $1=$2 failure "
failCount=`expr $failCount + 1`
fi
}
count=0
for line in $(cat $(dirname "$PWD")/config.txt | sed s/[[:space:]]//g); do
count=`expr $count + 1`
key=${line%%=*}
value=${line#*=}
addConfig "${key}" "${value}"
done
echo "========================================================================="
echo " Complete initialization parameters, total-count:$count , failure-count:$failCount "
echo "========================================================================="
if [ ${failCount} -eq 0 ]; then
echo " Init nacos config finished, please start seata-server. "
else
echo " init nacos config fail. "
fi
~~~
10. 準備好以上4步驟的文件后:
~~~shell
#進入/data/seata/resources
cd /data/seata/resources
# 導入配置(注意替換nacos的用戶名密碼)
sh nacos-config.sh -h 127.0.0.1 -p 8848 -g SEATA_GROUP -u nacos -w nacos
~~~
11. 重新啟動seata:
注意:這里啟動的時候檢查一下掛載的配置文件目錄,/data/seata根據實際目錄配置。有的環境可能是/data/seata/seata-server
~~~shell
docker run -d --restart always \
--name seata-server \
-v /etc/localtime:/etc/localtime \
-p 8091:8091 -v /data/seata:/seata-server \
seataio/seata-server:1.3.0
~~~
1. 確認是否注冊成功,如圖是成功的內容。


# Elasticsearch安裝
1. 下載Elasticsearch`7.17.3`的docker鏡像
~~~shell
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.3
~~~
2. 修改虛擬內存區域大小,否則會因為過小而無法啟動:
~~~shell
sysctl -w vm.max_map_count=262144
~~~
3. 創建Elasticsearch 相關掛載目錄
~~~shell
mkdir -p /data/elasticsearch/config
mkdir -p /data/elasticsearch/data
mkdir -p /data/elasticsearch/plugins
~~~
4. 創建文件
~~~shell
vi /data/elasticsearch/config/elasticsearch.yml
~~~
5. elasticsearch.yml如下內容:
~~~shell
http.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
~~~
6. 設置目錄權限,否則會報錯
~~~shell
cd /data/elasticsearch/
chmod +x config/elasticsearch.yml
~~~
7. 使用如下命令啟動Elasticsearch服務,內存小的服務器可以通過`ES_JAVA_OPTS`來設置占用內存大小:
~~~shell
docker run -p 9200:9200 -p 9300:9300 --name elasticsearch \
-e "discovery.type=single-node" \
-e "cluster.name=elasticsearch" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx1024m" \
-v /etc/localtime:/etc/localtime \
-v /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /data/elasticsearch/data:/usr/share/elasticsearch/data \
--restart=always \
-d docker.elastic.co/elasticsearch/elasticsearch:7.17.3
~~~
8. 啟動時如果發現/usr/share/elasticsearch/data目錄沒有訪問權限,只需要修改/data/elasticsearch/data目錄的權限,再重新啟動即可;
~~~shell
chmod 777 /data/elasticsearch/data/
~~~
9. 安裝中文分詞器IKAnalyzer,注意下載與Elasticsearch對應的版本,下載地址:[https://github.com/medcl/elasticsearch-analysis-ik/releases](https://github.com/medcl/elasticsearch-analysis-ik/releases)

10. 創建存放目錄:
~~~shell
cd /data/elasticsearch/plugins
mkdir elasticsearch-analysis-ik
~~~
11. 下載完成后解壓到Elasticsearch的/data/elasticsearch/plugins/elasticsearch-analysis-ik目錄下;

12. 重新啟動服務:
~~~shell
docker restart elasticsearch
~~~
13. 進入運行elasticsearch的docker容器:
~~~shell
docker exec -it elasticsearch /bin/bash
~~~
14. 配置訪問es密碼步驟
~~~shell
./bin/elasticsearch-setup-passwords interactive
~~~
15. 開啟防火墻:
~~~shell
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --reload
~~~
# Logstash安裝
1. 下載Logstash7.17.3的docker鏡像:
~~~shell
docker pull docker.elastic.co/logstash/logstash:7.17.3
~~~
2. 創建Logstash 相關掛載目錄:
~~~shell
mkdir /data/logstash
~~~
3. 創建Logstash的配置文件logstash.conf
~~~shell
cd /data/logstash
touch logstash.conf
vim logstash.conf
~~~
4. 放入一下內容:配置文件logstash.conf中output節點下的Elasticsearch連接地址為es:9200
~~~shell
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
type => "debug"
}
tcp {
mode => "server"
host => "0.0.0.0"
port => 4561
codec => json_lines
type => "error"
}
tcp {
mode => "server"
host => "0.0.0.0"
port => 4562
codec => json_lines
type => "business"
}
tcp {
mode => "server"
host => "0.0.0.0"
port => 4563
codec => json_lines
type => "record"
}
}
filter{
if [type] == "record" {
mutate {
remove_field => "port"
remove_field => "host"
remove_field => "@version"
}
json {
source => "message"
remove_field => ["message"]
}
}
}
output {
elasticsearch {
hosts => "es:9200"
index => "%{project}-%{service}"
user => "elastic"
password => "**********"
}
}
~~~
創建創建Logstash的配置文件logstash.yml.
~~~shell
cd /data/logstash
touch logstash.yml
vim logstash.yml
~~~
logstash.yml文件內容:
~~~shell
http.host: "0.0.0.0"
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: *****
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
~~~
在logstash.yml中配置用戶名和密碼
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password:**\***
賬號密碼為es初始化中設置的密碼
5. 啟動logstash :
~~~shell
docker run --name logstash -p 4560:4560 -p 4561:4561 -p 4562:4562 -p 4563:4563 \
--link elasticsearch:es \
-v /etc/localtime:/etc/localtime \
-v /data/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /data/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
--restart=always \
-d docker.elastic.co/logstash/logstash:7.17.3
~~~
6. 進入容器內部,安裝`json_lines`插件。
~~~shell
docker exec -it logstash /bin/bash
logstash-plugin install logstash-codec-json_lines
~~~

# Kibana安裝
1. 下載`Kibana7.17.3`的docker鏡像:
~~~shell
docker pull docker.elastic.co/kibana/kibana:7.17.3
~~~
2. 創建kibana掛載的相關目錄:
~~~shell
mkdir -p /data/kibana
~~~
3. 創建kibana的配置文件kibana.yml
~~~shell
cd /data/kibana
touch kibana.yml
vim kibana.yml
~~~
4. kibana.yml文件內容:
~~~shell
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
elasticsearch.username: "elastic"
elasticsearch.password: "*****"
i18n.locale: "zh-CN"
~~~
在kibana.yml中配置用戶名和密碼
elasticsearch.username: “elastic”
elasticsearch.password: “**\***“
賬號密碼為es初始化中設置的密碼
重啟kibana
輸入[http://ip:5601打開登錄頁面,使用elastic賬號登錄](http://ip:5601%E6%89%93%E5%BC%80%E7%99%BB%E5%BD%95%E9%A1%B5%E9%9D%A2%EF%BC%8C%E4%BD%BF%E7%94%A8elastic%E8%B4%A6%E5%8F%B7%E7%99%BB%E5%BD%95/).
1. 使用如下命令啟動Kibana服務:
~~~shell
docker run --name kibana -p 5601:5601 \
--link elasticsearch:es \
-e "elasticsearch.hosts=http://es:9200" \
-v /etc/localtime:/etc/localtime \
-v /data/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml \
--restart=always \
-d docker.elastic.co/kibana/kibana:7.17.3
~~~
2. 開啟防火墻:
~~~shell
firewall-cmd --zone=public --add-port=5601/tcp --permanent
firewall-cmd --reload
~~~
訪問地址進行測試:[http://ip:5601](http://ip:5601/)
Analytics–>Discover–>mall-suite\*
# RabbitMQ
1. 拉取 RabbitMQ 鏡像
~~~shell
docker pull rabbitmq:3.7.4
~~~
2. 創建 RabbitMQ 容器
~~~shell
docker run --name rabbitmq -v /etc/localtime:/etc/localtime -p 5672:5672 -p 15672:15672 --restart=always -d rabbitmq:3.7.4
~~~
這個命令將創建一個后臺運行的 RabbitMQ 容器,并將容器的 5672 端口映射到主機的 5672 端口(用于 AMQP 連接),并將容器的 15672 端口映射到主機的 15672 端口(用于 RabbitMQ 的管理界面)。
3. 訪問 RabbitMQ 管理界面
在瀏覽器中訪問[http://localhost:15672,你將看到](http://localhost:15672%EF%BC%8C%E4%BD%A0%E5%B0%86%E7%9C%8B%E5%88%B0/)RabbitMQ 的管理界面。
使用默認的用戶名和密碼 guest/guest 登錄。
# Sentinel
1. 拉取 Sentinel 鏡像
~~~shell
docker pull bladex/sentinel-dashboard
~~~
2. 創建 Sentinel 容器
~~~shell
docker run -d -p 8858:8718 --name sentinel bladex/sentinel-dashboard
~~~
# 商城服務端
(這種方式非必須,最終會使用docker部署,詳看《搭建docker私有化鏡像倉庫》和《使用jenkins實現自動化部署》)
**商城后端服務啟動順序:**
~~~shell
mall-gateway.jar
mall-auth.jar
mall-account.jar
mall-admin.jar
mall-shop.jar
mall-sns.jar
mall-pay.jar
mall-im.jar
mall-cms.jar
mall-search.jar
~~~
1. 上傳服務包jra包。
~~~shell
#創建目錄
mkdir -p /data/www
~~~
~~~shell
nohup java -jar -Xms128m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256M mall-account.jar >/data/logs/mall-account.log 2>&1 &
nohup java -jar -Xms128m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256M mall-admin.jar >/data/logs/mall-admin.log 2>&1 &
nohup java -jar -Xms128m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256M mall-auth.jar >/data/logs/mall-auth.log 2>&1 &
nohup java -jar -Xms128m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256M mall-cms.jar >/data/logs/mall-cms.log 2>&1 &
nohup java -jar -Xms128m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256M mall-gateway.jar >/data/logs/mall-gateway.log 2>&1 &
nohup java -jar -Xms128m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256M mall-im.jar >/data/logs/mall-im.log 2>&1 &
nohup java -jar -Xms128m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256M mall-pay.jar >/data/logs/mall-pay.log 2>&1 &
nohup java -jar -Xms128m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256M mall-shop.jar >/data/logs/mall-shop.log 2>&1 &
nohup java -jar -Xms128m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256M mall-sns.jar >/data/logs/mall-sns.log 2>&1 &
nohup java -jar -Xms128m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256M mall-search.jar >/data/logs/mall-sns.log 2>&1 &
~~~
# Nginx安裝
1. 下載Nginx的docker鏡像:
~~~shell
docker pull nginx
~~~
2. 先運行一次容器(為了拷貝配置文件):
~~~shell
docker run -p 80:80 --name nginx \
-v /data/nginx/html:/usr/share/nginx/html \
-v /data/nginx/logs:/var/log/nginx \
-v /etc/localtime:/etc/localtime \
-d nginx:latest
~~~
3. 將容器內的配置文件拷貝到指定目錄:
~~~shell
docker container cp nginx:/etc/nginx /data/nginx/
~~~
4. 修改文件名稱:
~~~shell
# 進入/data/nginx/
cd /data/nginx/
# 修改文件名
mv nginx conf
~~~
5. 終止并刪除容器:
~~~shell
docker stop nginx
docker rm nginx
~~~
6. 修改nginx配置,設置最大上傳文件:client\_max\_body\_size,這里不修改移動端裝修會保存失敗。
~~~shell
vim /data/nginx/conf/nginx.conf
client_max_body_size 50m;
~~~

1. 上傳ssl證書:
~~~shell
#進入/data/nginx
cd /data/nginx
#創建ssl文件存放證書
mkdir ssl
~~~
2. 上傳代碼包:
~~~shell
#創建目錄
mkdir -p /data/nginx/www/mallsuite
cd /data/nginx/www/mallsuite
~~~

3. 配置站點域名:
~~~shell
#進入存放配置文件目錄
cd /data/nginx/conf/conf.d
#創建文件
touch mallsuite.conf
#編輯文件
vim mallsuite.conf
~~~
放入以下內容:注意修改接口請求地址,這里127.0.0.1為示例。
~~~shell
upstream nacos {
server 127.0.0.1:8848 weight=1;
}
upstream backend {
server 127.0.0.1:8099;
}
server {
listen 80;
server_name yourdomain; #需要將yourdomain替換成證書綁定的域名。
rewrite ^(.*)$ https://$host$1; #將所有HTTP請求通過rewrite指令重定向到HTTPS。
location / {
index index.html index.htm;
}
}
server
{
#listen 80;
listen 443 ssl ;
server_name yourdomain;
index index.php index.html index.htm default.php default.htm default.html;
root /www/mallsuite/; #啟動nginx鏡像掛載目錄
#SSL-START SSL相關配置,請勿刪除或修改下一行帶注釋的404規則
#error_page 404/404.html;
ssl_certificate /etc/nginx/ssl/7959472.com.pem;#修改為自己ssl證書
ssl_certificate_key /etc/nginx/ssl/7959472.com.key;#修改為自己ssl證書
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
#SSL-END
#ERROR-PAGE-START 錯誤頁配置,可以注釋、刪除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#PHP-INFO-START PHP引用配置,可以注釋或修改
#include enable-php-00.conf;
#PHP-INFO-END
#REWRITE-START URL重寫規則引用,修改后將導致面板設置的偽靜態規則失效
#include /www/server/panel/vhost/rewrite/101.133.142.46.conf;
#REWRITE-END
#禁止訪問的文件或目錄
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一鍵申請SSL證書驗證目錄相關設置
location ~ \.well-known{
allow all;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
location ~* \.(eot|ttf|woff|woff2|svg)$ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}
location ^~ /im/ {
root /www/mallsuite/admin/; #保持一致,在root /www/mallsuite/ 加admin #啟動nginx鏡像已掛載目錄
}
location ^~ /api/shop/static/ {
proxy_pass http://127.0.0.1:8201/shop/static/;
}
location ^~ /api/admin/static/ {
proxy_pass http://127.0.0.1:8201/admin/static/;
}
location ^~ /api/doc.html {
proxy_pass http://127.0.0.1:8201/doc.html;
}
location ^~ /api/webjars/ {
proxy_pass http://127.0.0.1:8201/webjars/;
}
location /h5/ {
try_files $uri $uri/ @router;
index index.html index.htm;
}
location @router {
rewrite ^.*$ /h5/index.html last;
}
location /admin/ {
try_files $uri $uri/ @routeradmin;
index index.html index.htm;
}
location @routeradmin {
rewrite ^.*$ /admin/index.html last;
}
location /mobile/ {
proxy_pass http://127.0.0.1:8201/mobile/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect default;
}
location /api/ {
proxy_pass http://127.0.0.1:8201/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect default;
}
location /mallsuiteImSocketServer {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
#圖片本地存儲上傳的靜態文件訪問路徑
location ^~ /admin/oss/upload/ {
proxy_pass http://localhost:8201/admin/oss/upload/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect default;
}
#上傳的靜態文件訪問路徑
location ^~ /static/ {
root /opt/apps/mall/public/;
}
access_log /wwwlogs/access.log;
error_log /wwwlogs/error.log;
}
~~~
4. 使用如下命令啟動Nginx服務:
~~~shell
docker run -p 80:80 -p 443:443 --name nginx \
-v /etc/localtime:/etc/localtime \
-v /data/nginx/html:/usr/share/nginx/html \
-v /data/nginx/www:/www \
-v /data/nginx/wwwlogs:/wwwlogs \
-v /data/nginx/logs:/var/log/nginx \
-v /data/nginx/conf:/etc/nginx \
-v /data/nginx/ssl:/etc/nginx/ssl/ \
-v /data/nginx/www:/opt/apps/mall/public/static \
--restart=always \
-d nginx:latest
~~~