侧边栏壁纸
博主头像
★街角晚灯★ 博主等级

博观而约取 厚积而薄发

  • 累计撰写 468 篇文章
  • 累计创建 185 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

通用版系统部署方案

WinJay
2021-12-13 / 0 评论 / 0 点赞 / 185 阅读 / 0 字 / 正在检测是否收录...

通用版系统

部署方案

作者:WinJay日期:2019-8-20
审批:日期:

变更记录

日期版本变更说明作者
2019-8-201.0创建张文杰

软件环境要求

系统名称系统版本所需补丁部署机器部署位置
操作系统CentOS7.5、7.720台
操作系统Windows2012 R2 Standard14台
负载均衡调度Nginx1.16.1应用服务器
FastDFSFastDFS5.11文件服务器
点播、转码系统NTV Media3.6.6流媒体服务器
RabbitMQRabbitMQ3.7.17消息服务器
RedisRedis5.0.5缓存服务器
ElasticsearchElasticsearch7.2.0搜索服务器
ZabbixZabbix4.4监控服务器
Web应用IIS8应用服务器
数据库SQL Server2014WithSP3数据库服务器

2 应用环境配置

2.1 Nginx安装

2.1.1 新建文件

[root@10-1-14-148 ~]# vim /etc/yum.repos.d/nginx.repo

image.png

2.1.2 新增内容

# nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
# 或使用Yum方式添加:
yum localinstall http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

image.png

2.1.3 创建缓存

[root@10-1-14-148 ~]# yum makecache

image.png

2.1.4 安装

[root@10-1-14-148 ~]# yum install nginx –y

image.png

2.1.5 启动并加入到开机启动项

[root@10-1-14-148 ~]# systemctl start nginx

[root@10-1-14-148 ~]# systemctl enable nginx

image.png

2.2 FastDFS集群部署

2.2.1 所需组件安装

安装所需组件:yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y

image.png

image.png

2.2.2 建立软件目录

新建文件夹,用于存放下载的软件。

image.png

2.2.3 下载软件

Github地址:https://github.com/happyfish100

分别下载fastdfs、fastdfs-nginx-modulelibfastcommon

wget https://github.com/happyfish100/fastdfs/archive/V5.11.zip
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.39.zip
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.zip

image.png

2.2.4 安装Libfastcommon

2.2.4.1 Libfastcommon解压

[root@10-1-14-144 software]# unzip V1.0.39.zip

image.png

2.2.4.2 进入目录

image.png

2.2.4.3 编译安装

[root@10-1-14-144 libfastcommon-1.0.39]# ./make.sh && ./make.sh install

image.png

2.2.4.4 创建连接

libfastcommon默认会被安装到/usr/lib64/libfastcommon.so但是FastDFS的主程序却在/usr/local/lib目录下
这个时候我们就要建立一个软链接了,实际上也相当于windows上的快捷方式。

ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

image.png

image.png

2.2.5 部署FastDFS

2.2.5.1 FastDFS解压

[root@10-1-14-144 software]# unzip V5.11.zip

image.png

2.2.5.2 进入目录

[root@10-1-14-144 software]# cd fastdfs-5.11

2.2.5.3 编译安装

[root@10-1-14-144 fastdfs-5.11]# ./make.sh && ./make.sh install

image.png

如果没有报错那么就成功了。安装log中会提示FastDFS安装到了/etc/fdfs目录下。进入此目录: cd /etc/fdfs。成功后查看安装目录:[root@10-1-14-142 fastdfs-5.11]# ll /etc/fdfs

image.png

2.2.5.4 生成配置文件

需要把这三个示例文件复制一份,去掉.sample

cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf

image.png

2.2.6 部署tracker

2.2.6.1 创建tracker工作目录

[root@10-1-14-142 fdfs]# mkdir –p /opt/fdfs_tracker

2.2.6.2 配置tracker

[root@10-1-14-142 fdfs]# vim /etc/fdfs/tracker.conf

  • 修改第8行与第22行

bind_addr=0.0.0.0

base_path=/opt/fdfs_tracker

2.2.6.3 启动tracker

[root@10-1-14-144 fdfs]# service fdfs_trackerd start

image.png

2.2.6.4 加入开机启动项

echo "service fdfs_trackerd start" |tee -a /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
ll /etc/rc.d/rc.local 
-rwxr-xr-x. 1 root root 529 Jul 1 15:40 /etc/rc.d/rc.local

image.png

image.png

2.2.7 部署storage

2.2.7.1 创建storage工作目录

与tracker不同的是,由于storage还需要一个目录用来存储数据,所以另外多建两个目录fdfs_storage_data,fdfs_storage

image.png

2.2.7.2 配置storage

image.png

修改以下四行

11:group_name=ahFastDFS
41: base_path=/opt/fdfs_storage
109:store_path0=/opt/fdfs_storage_data
118: tracker_server= 192.168.1.179:22122
#修改保存后创建软引用:
ln -s /usr/bin/fdfs_storaged /usr/local/bin

image.png

2.2.7.3 启动Storage

service fdfs_storaged start
Starting fdfs_storaged (via systemctl):          [ OK ]
echo "service fdfs_storaged start" |tee -a /etc/rc.d/rc.local
service fdfs_storaged start

image.png

image.png

2.2.7.4 校验整合

到这里,fastdfs的东西都已安装完成,最后我们还要确定一下,storage是否都注册到了tracker中去。查看命令:/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

image.png

image.png

image.png

2.2.8 FDFS存储目录扩容

2.2.8.1 获取当前配置的存储路径

image.png

2.2.8.2 获取数据大小

image.png

2.2.8.3 挂载存储

注:操作此步骤前,私有云管理员需要先将指定大小的存储分配到此服务器上,且必须保证此块存储的可扩展性

image.png

2.2.8.4 对vdb磁盘进行分区及格式化

fdisk /dev/vdb

mkfs.xfs /dev/vdb1 // 可支持PB级存储

2.2.8.5 停止服务、挂载磁盘到临时目录并转移数据

service fdfs_storaged stop
mkdir /mnt/sdb
mount /dev/sdb1 /mnt/sdb
cp -rf /opt/fdfs_storage_data/ /mnt/sdb

2.2.8.6 挂载扩容

umount /mnt/sdb
mount /dev/sdb1 /opt/fdfs_storage_data

2.2.8.7 配置开机自动挂载

Vim /etc/fstab

追加写入:/dev/sdb1 /opt/fdfs_stroage_data xfs defaults 0 0

2.2.8.8 启动服务并测试

Service fdfs_storaged start

做上传文件测试

2.2.9 功能测试

2.2.9.1 配置客户端

[root@192-168-1-179 fdfs]# vim /etc/fdfs/client.conf

修改如下信息:

10:base_path=/opt/fdfs_tracker

14:tracker_server=192.168.1.179:22122

58:http.tracker_server_port=8080

2.2.9.2 模拟上传

先上传一张图片至服务器的/root目录下。

image.png

确认图片位置后,输入上传图片命令:
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/fdfs.jpg

成功后会返回图片的路径:
[root@192-168-1-179 ~]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/fdfs.jpg

ahFastDFS/M00/00/00/wKgBs11otfCAeebpAANAcF2yBXk596.jpg

image.png

组名: ahFastDFS 
磁盘: M00 
目录: 00/00 
文件名称: wKgBs11otfCAeebpAANAcF2yBXk596.jpg

image.png

可以看到刚才上传的图片已经经过处理存储在data目录下了。
实际文件存储路径下有创建好的多级目录。data下有256个1级目录,每级目录下又有256个2级子目录,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中

2.2.10 FastDFS的Nginx模块安装

2.2.10.1 安装nginx

[详见2.1](## 2.1 Nginx安装)

image.png

2.2.10.2 nginx-module解压

[root@192-168-1-179 software]# unzip V1.20.zip

image.png

2.2.10.3 安装依赖组件

[root@192-168-1-179 nginx-1.16.0]# yum -y install pcre pcre-devel && yum -y install zlib zlib-devel && yum -y install openssl openssl-devel

image.png

2.2.10.4 下载解压Nginx源码包

[root@192-168-1-179 software]# wget http://nginx.org/download/nginx-1.16.0.tar.gz

image.png

[root@192-168-1-179 software]# tar -zxvf nginx-1.16.0

image.png

2.2.10.5 编译安装Nginx模块

解压后进入nginx目录编译安装nginx,并添加fastdfs-nginx-module:

./configure --prefix=/etc/nginx --add-module=/root/software/fastdfs-nginx-module-1.20/src

image.png

[root@192-168-1-179 nginx-1.16.0]# make && make install

image.png

2.2.11 配置StorageNginx

2.2.11.1 新增Storage配置文件

[root@192-168-1-179 nginx-1.16.0]# vim /etc/nginx/conf.d/storage.conf

image.png

下图配置信息为使用80端口而非默认9991端口的配置信息。

image.png

2.2.11.2 拷贝文件

[root@192-168-1-179 conf]# cp http.conf mime.types /etc/fdfs/

image.png

[root@192-168-1-179 conf]# cp ../../fastdfs-nginx-module-1.20/src/mod_fastdfs.conf /etc/fdfs/

image.png

2.2.11.3 修改配置文件

修改如下:

10 base_path=/opt/fdfs_storage
40 tracker_server=192.168.1.179:22122
53 url_have_group_name = true
62 store_path0=/opt/fdfs_storage_data
113 group_count = 1

# 最后新增如下内容:
[group1]
group_name=ahFastDFS
storage_server_port=23000
store_path_count=1
store_path0=/opt/fdfs_storage_data

修改完后的文件内容如下:

image.png

2.2.11.4 创建连接

创建M00至storage存储目录的符号连接:
[root@192-168-1-179 fdfs]# ln -s /opt/fdfs_storage_data/data/ /opt/fdfs_storage_data/data/M00

image.png

2.2.11.5 启动Nginx

[root@192-168-1-179 fdfs]# systemctl restart nginx

image.png

2.2.12 配置TrackerNginx

2.2.12.1 新增配置文件

[root@192-168-1-179 fdfs]# vim /etc/nginx/conf.d/tracker.conf

image.png

2.2.12.2 重启Nginx

image.png

2.2.12.3 Http测试

访问一下2.2.8.2中模拟上传文件返回的地址:

http://192.168.1.179:9991/ahFastDFS/M00/00/00/wKgBs11otfCAeebpAANAcF2yBXk596.jpg

这个时候已经能成功访问。

image.png

2.3 RabbitMQ集群部署

2.3.1 安装依赖包

[root@192-168-1-199 ~]# yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto –y

image.png

2.3.2 下载安装包

新建文件夹用于存放下载的软件包,进入目录后进行下载

mkdir software
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.17/rabbitmq-server-3.7.17-1.el7.noarch.rpm
wget https://packages.erlang-solutions.com/erlang/rpm/centos/7/x86_64/esl-erlang_22.0.7-1~centos~7_amd64.rpm

image.png

image.png

2.3.3 安装socta

[root@192-168-1-199 ~]# yum install socat.x86_64 -y

image.png

2.3.4 部署Erlang、RabbitMQ

[root@192-168-1-199 software]# rpm -ivh esl-erlang_22.0.7-1_centos_7_amd64.rpm

[root@192-168-1-199 software]# rpm -ivh rabbitmq-server-3.7.17-1.el7.noarch.rpm

image.png

2.3.5 启动并加入开机启动项

[root@192-168-1-199 software]# systemctl start rabbitmq-server.service

[root@192-168-1-199 software]# systemctl enable rabbitmq-server.service

image.png

2.3.6 修改配置文件

复制一份模板文件进行修改, 使外部可以访问;

[root@192-168-1-199 ~]# cp /usr/share/doc/rabbitmq-server-3.7.17/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

image.png

[root@192-168-1-199 ~]# vim /etc/rabbitmq/rabbitmq.config

image.png

将第61行的注释符及最后的,删除修改成为: {loopback_users, []}

2.3.7 安装插件

[root@192-168-1-199 ~]# /sbin/rabbitmq-plugins enable rabbitmq_management

image.png

安装完成后重启服务:

[root@192-168-1-199 ~]# systemctl restart rabbitmq-server.service

image.png

2.3.8 登录测试

打开浏览器输入地址:http://192.168.1.212:15672 默认用户名与密码均为:guest

image.png
image.png

2.4 Redis集群部署

2.4.1 安装依赖

[root@192-168-1-210 ~]# yum install gcc –y

image.png

2.4.2 下载安装包

[root@192-168-1-210 software]# wget http://download.redis.io/releases/redis-5.0.5.tar.gz

image.png

2.4.3 解压并进入

[root@192-168-1-210 software]# tar xzf redis-5.0.5.tar.gz

image.png

image.png

2.4.4 启动Redis

[root@192-168-1-210 redis-5.0.5]# src/redis-server

image.png

2.4.5 修改配置文件

[root@192-168-1-210 redis-5.0.5]# mkdir /etc/redis //新建文件夹

[root@192-168-1-210 redis-5.0.5]# cp redis.conf sentinel.conf /etc/redis/ //将当前目录下的文件拷贝至/etc/redis目录下

image.png

[root@192-168-1-210 redis-5.0.5]# vi /etc/redis/redis.conf

image.png

修改69、136、507行,如下:

bind 0.0.0.0
daemonize yes
requirepass “ahtvu”

2.4.6 配置从服务器

从服务器配置文件新增两项内容如下:

slaveof 192.168.1.210 6379

masterauth “ahtvu”

image.png

image.png

2.4.7 配置哨兵

2.4.7.1 主服务器配置

17 protected-mode no
26 daemonize yes
84 sentinel monitor mymaster 192.168.1.210 6379 2
86 sentinel auth-pass RedisMaster ahtvu
113 sentinel down-after-milliseconds RedisMaster 60000
121 sentinel parallel-syncs RedisMaster 1
146 sentinel failover-timeout RedisMaster 180000

2.4.7.2 从服务器配置

scp /etc/redis/sentinel.conf root@ca2:/etc/redis/
scp /etc/redis/sentinel.conf root@ca3:/etc/redis/

image.png

2.4.8 启动服务

三台服务器均需启动

2.4.8.1 启动Redis

[root@192-168-1-210 redis-5.0.5]# src/redis-server /etc/redis/redis.conf

image.png

2.4.8.2 启动哨兵

[root@192-168-1-210 redis-5.0.5]# src/redis-sentinel /etc/redis/sentinel.conf

image.png

2.4.9 配置开机自动启动

先将当前的目录移动至/usr/sbin下

[root@192-168-1-210 software]# mv -f redis-5.0.5 /usr/sbin/redis

image.png

编辑开机启动服务文件,并新增相应内容:

[root@192-168-1-210 software]# vim /etc/systemd/system/redis.service

[Unit]
Description=Redis
After=network.target

[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/sbin/redis/src/redis-server /etc/redis/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

image.png

[root@192-168-1-210 software]# systemctl daemon-reload

image.png

[root@192-168-1-210 software]# systemctl start redis

[root@192-168-1-210 software]# systemctl status redis

image.png

[root@192-168-1-210 software]# systemctl enable redis

image.png

2.5 ELK集群部署

2.5.1 ELK简介

ELK主要由ElasticSearch、LogstashKibana三个开源工具组成,还有其他专门由于收集数据的轻量型数据采集器Beats。

Elasticsearch :分布式搜索引擎。具有高可伸缩、高可靠、易管理等特点。可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 是用Java 基于 Lucene 开发,现在使用最广的开源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基于它来构建自己的搜索引擎。

在elasticsearch中,所有节点的数据是均等的。

Logstash :数据收集处理引擎。支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储以供后续使用。

Kibana :可视化化平台。它能够搜索、展示存储在 Elasticsearch中索引数据。使用它可以很方便的用图表、表格、地图展示和分析数据。

2.5.2 依赖包安装

首先要安装epel软件源

[root@192-168-1-221 ~]# yum install epel-rpm-macros.noarch

image.png

2.5.3 导入Elastic PGP Key

[root@192-168-1-221 software]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

image.png

2.5.4 部署Elasticsearch

2.5.4.1 创建安装库文件

新建文件并输入以下内容:

image.png

2.5.4.2 开始安装

[root@192-168-1-221 software]# yum install elasticsearch –y 受网速影响,时间较长。

image.png

2.5.4.3 修改配置文件

17 cluster.name: ahELS
23 node.name: se1
33 path.data: /mnt/els_data
37 path.logs: /var/log/els_log
55 network.host: 192.168.1.221
59 http.port: 9200

最终如下图中所示内容

image.png

2.5.4.4 创建数据及日志目录

mkdir /mnt/els_data
mkdir /var/log/els_log
chown -Rf elasticsearch:elasticsearch /mnt/els_data/
chown -Rf elasticsearch:elasticsearch /var/log/els_log/

image.png

2.5.4.5 安装分词器

[root@Nerc elasticsearch]# cd /usr/share/elasticsearch/bin

[root@Nerc bin]# ./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.2/elasticsearch-analysis-ik-7.3.2.zip -y

分词器版本必须要与Elasticsearch版本一致。

image.png

2.5.4.6 启动服务

启动服务并加入至开机启动项:

[root@192-168-1-221 ~]# systemctl start elasticsearch.service

[root@192-168-1-221 ~]# systemctl enable elasticsearch.service

image.png

2.5.4.7 测试访问

image.png
image.png

Node节点配置参考Master节点配置,注意修改IP及Node.Name选项。

集群状态:http://192.168.1.221:9200/_cluster/health?pretty

image.png

节点状态:

http://192.168.1.221:9200/_nodes/process?pretty

image.png

2.5.5 部署kibana

2.5.5.1 创建安装库文件

https://www.elastic.co/guide/en/kibana/7.3/rpm.html#rpm-repo

新建文件并输入以下内容:

[root@192-168-1-221 ~]# vim /etc/yum.repos.d/kibana.repo

image.png

[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

2.5.5.2 开始安装

[root@192-168-1-221 ~]# yum install kibana.x86_64 -y 受网速影响,时间较长。

image.png

2.5.5.3 修改配置文件

2 server.port: 5601
7 server.host: "192.168.1.221" 
28 elasticsearch.hosts: ["http://192.168.1.221:9200"]
37 kibana.index: ".kibana" 
96 logging.dest: /var/log/kibana/kibana.log

最终如下图中所示内容

image.png

2.5.5.4 创建数据及日志目录

mkdir /var/log/kibana
touch /var/log/kibana/kibana.log
chmod o+rw /var/log/kibana/kibana.log

image.png

2.5.5.5 启动服务

启动服务并加入至开机启动项:

[root@192-168-1-221 ~]# systemctl start kibana.service

[root@192-168-1-221 ~]# systemctl enable kibana.service

image.png

2.5.5.6 测试访问

image.png

image.png

2.5.6 部署logstash

2.5.6.1 创建安装库文件

新建文件并输入以下内容:

[root@192-168-1-221 ~]# vim /etc/yum.repos.d/logstash.repo

image.png

2.5.6.2 开始安装

[root@192-168-1-221 ~]# yum install logstash.noarch -y 受网速影响,时间较长。

image.png

2.5.6.3 修改配置文件

28 path.data: /mnt/logstash_data
190 http.host: "192.168.1.221"
195 http.port: 9600-9700

最终如右侧图中所示内容

2.5.6.4 创建数据目录

[root@192-168-1-221 ~]# mkdir /mnt/logstash_data

image.png

2.5.6.5 启动服务

启动服务并加入至开机启动项:

[root@192-168-1-221 ~]# systemctl start logstash.service

[root@192-168-1-221 ~]# systemctl enable logstash.service

image.png

2.6 Keepalived安装部署

2.6.1 Keepalived简介

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉。keepalived基于vrrp协议,两台主机之间生成一个虚拟的ip,我们称漂移ip,漂移ip由主服务器承担,一但主服务器宕机,备份服务器就会抢占漂移ip,继续工作,有效的解决了群集中的单点故障。

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。在elasticsearch中,所有节点的数据是均等的。

2.6.2 安装KeepAlived

主Haproxy  192.168.1.242
备Haproxy  192.168.1.226
Http1:   192.168.1.240
Http2:   192.168.1.241
漂移ip:  192.168.1.243  虚拟IP

主:[root@192-168-1-242 ~]# yum install keepalived.x86_64 -y

备:root@192-168-1-226 ~]# yum install keepalived.x86_64 -y

image.png

image.png

2.6.3 修改配置文件

2.6.3.1 主服务器配置

[root@192-168-1-242 ~]# vim /etc/keepalived/keepalived.conf

image.png

image.png

配置文件信息如下:

  ! Configuration File for keepalived
global_defs {
    smtp_connect_timeout 30
    router_id LVS_load1
  }

vrrp_script check_haproxy {
  script "killall -0 haproxy"  
  interval 3
  weight -2
  fall 10
  rise 2
}

vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
   authentication {
    auth_type PASS
    auth_pass 35f18af7190d51c9f7f78f37300a0cbd
  }

  virtual_ipaddress {
    192.168.1.243  #虚拟ip,即VIP
  }

  track_script {
    check_haproxy
  }
}

2.6.3.2 备服务器配置

[root@192-168-1-226 ~]# vim /etc/keepalived/keepalived.conf

image.png

image.png

配置文件信息如下:

! Configuration File for keepalived
global_defs {
    smtp_connect_timeout 30
    router_id LVS_load2
  }

vrrp_script check_haproxy {
  script "killall -0 haproxy"  
  interval 3
  weight -2
  fall 10
  rise 2
}

vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 90
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 35f18af7190d51c9f7f78f37300a0cbd
  }
  
  virtual_ipaddress {
    192.168.1.243  
  }

  track_script {
    check_haproxy
  }
}

2.6.3.3 启动服务

以下操作均需要在主、备服务器上操作。

[root@192-168-1-242 ~]# systemctl stop NetworkManagerimage.png

[root@192-168-1-226 ~]# systemctl stop NetworkManagerimage.png

[root@192-168-1-242 ~]# systemctl start keepalivedimage.png

image.png

[root@192-168-1-226 ~]# systemctl start keepalived

image.png

image.png

systemctl enable keepalived # 加入开机启动项

2.6.3.4 验证及模拟故障

ip addr show|ip a 可以看到漂移ip在主服务器上。

image.png

而备服务器上则只有一个本机的IP地址

image.png

通过关闭主服务器网络让漂移IP移至备服务器上。

image.png

image.png

可以看到虚拟IP在Backup上面。那我们对Backup进行关机,看是否还可以访问通。

image.png

关机操作。

image.png

image.png

再次访问192.168.1.243看是否还能访问通。

image.png

可以看到已经跳到lo1上去了。。。同时虚拟Vip已经跳到242上去了。

image.png

2.7 Nginx负载均衡配置

使用Nginx负载只需新增nginx配置文件即可。

image.png

image.png

2.7.1 缓存清除

2.7.1.1 插件下载

wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz

wget http://nginx.org/download/nginx-1.16.1.tar.gz

img

2.7.1.2 解压插件

tar -xzvf nginx-1.16.1.tar.gz
tar -xzvf ngx_cache_purge-2.3.tar.gz

image.png

image.png

2.7.1.3 安装编译组件

yum install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel -y

image.png

编译:

image.png

image.png

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=/root/tools/ngx_cache_purge-2.3 

make && make install

image.png

完成后重启服务即可。以下为配置文件信息:

[root@iZ2zednzb8iugw8j2n64bsZ nginx]# cat /etc/nginx/nginx.conf

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid    /var/run/nginx.pid;
events {
  worker_connections 1024;
}
http {
  include    /etc/nginx/mime.types;
  default_type application/octet-stream;
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
           '$status $body_bytes_sent "$http_referer" '
           '"$http_user_agent" "$http_x_forwarded_for" ';
  access_log /var/log/nginx/access.log main;
  sendfile    on;
#tcp_nopush   on;
  keepalive_timeout 65;
  gzip on;
#  etag off

  #  ##HTTP缓存设置开始##
  proxy_connect_timeout 500;
#跟后端服务器连接的超时时间_发起握手等候响应超时时间
  proxy_read_timeout 600;
#连接成功后_等候后端服务器响应的时间_其实已经进入后端的排队之中等候处理
  proxy_send_timeout 500;
#后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有数据
  proxy_buffer_size 128k;
#代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可 
  proxy_buffers 4 128k;
#同上 告诉Nginx保存单个用的几个Buffer最大用多大空间
  proxy_busy_buffers_size 256k;
#如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
  proxy_temp_file_write_size 128k;
#proxy缓存临时文件的大小
#设置web缓存区名为activityweek_cache,内存缓存空间大小为500M,自动清除超过6小时没有被访问过的缓存数据,硬盘缓存空间大小10g
  proxy_cache_path   /var/cache_data levels=1:2 keys_zone=activityweek_cache:500m inactive=360m max_size=10g; 

  proxy_temp_path   /var/cache_temp;
##缓存设置结束##
  
upstream activityweek.nerc-edu.com {
  server  172.17.103.234:80 max_fails=3 fail_timeout=30s;
  server  172.17.103.235:80 max_fails=3 fail_timeout=30s;
  server  172.17.103.236:80 max_fails=3 fail_timeout=30s;
}

server {
 listen    80;
 server_name activityweek.nerc-edu.com;
 add_header X-Via $server_addr;
 add_header X-Cache-Status $upstream_cache_status;
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico)$ { 
   proxy_pass http://$host;  
   proxy_redirect off; 
   proxy_set_header Host $host; 
   proxy_cache activityweek_cache; 
   proxy_cache_valid 200 302 30d;        
   proxy_cache_valid 301 30d; 
   proxy_cache_valid any 30d; 
   expires 30d; 
   proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie" "Vary";
 } 
    
 location ~ .*\.(js|css)$ { 
   proxy_pass http://$host;  
   proxy_redirect off; 
   proxy_set_header Host $host; 
   proxy_cache activityweek_cache; 
   proxy_cache_valid 200 302 30d;        
   proxy_cache_valid 301 30d; 
   proxy_cache_valid any 30d; 
   expires 30d; 
   proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie" "Vary";
 }

 location ~ .*\.html$ {
    proxy_pass http://$host;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_cache activityweek_cache;
    #对不同的HTTP状态码设置不同的缓存时间,h小时,d天数
    proxy_cache_valid 200 302 30d;
    proxy_cache_valid 301 30d;
    proxy_cache_valid any 30d;
    #浏览器过期时间设置
    expires 30d;
    proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie" "Vary";
 }

 location ^~ /values/ {
   proxy_pass    http://$host;
   proxy_set_header   Host $host;
   proxy_set_header   X-Real-IP $remote_addr;
   proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
 }

 location / {
   proxy_cache activityweek_cache; 
   proxy_cache_revalidate on;
   proxy_cache_min_uses 1;
   proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; 
   proxy_cache_background_update on;
   proxy_cache_lock on; 
   proxy_cache_key $host$uri$is_args$args;
   proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
   proxy_cache_methods GET HEAD POST;
   proxy_cache_valid 200 5m;
   proxy_cache_valid any 5m;
   expires 5m;
   proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
   proxy_pass    http://$host;
   proxy_set_header    Host $host;
   proxy_set_header    X-Real-IP $remote_addr;
   proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
 }

 location ~ /purge(/.*) {
    allow 172.17.103.234;
    allow 172.17.103.235;
    allow 172.17.103.236;
    deny all;
    proxy_cache_purge activityweek_cache $host$1$is_args$args;
 }

 }

}

示例2:

[root@192-168-1-242 tools]# cat /etc/nginx/nginx.conf

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid    /var/run/nginx.pid;
events {
  worker_connections 1024;
}
http {
  include    /etc/nginx/mime.types;
  default_type application/octet-stream;
  log_format main '$remote_addr - $remote_user [$time_local] "$request" '
           '$status $body_bytes_sent "$http_referer" '
           '"$http_user_agent" "$http_x_forwarded_for" ';
  access_log /var/log/nginx/access.log main;
  sendfile    on;
#tcp_nopush   on;
  keepalive_timeout 65;
  gzip on;
  #etag off
##HTTP缓存设置开始##
  proxy_connect_timeout 500;
# 跟后端服务器连接的超时时间_发起握手等候响应超时时间
  proxy_read_timeout 600;
# 连接成功后_等候后端服务器响应的时间_其实已经进入后端的排队之中等候处理
  proxy_send_timeout 500;
# 后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有数据
  proxy_buffer_size 128k;
# 代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可 
  proxy_buffers 4 128k;
# 同上 告诉Nginx保存单个用的几个Buffer最大用多大空间
  proxy_busy_buffers_size 256k;
# 如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
  proxy_temp_file_write_size 128k;
# proxy缓存临时文件的大小
# 设置web缓存区名为zyk_cache,内存缓存空间大小为500M,自动清除超过1小时没有被访问过的缓存数据,硬盘缓存空间大小10g
  proxy_cache_path   /var/cache_data levels=1:2 keys_zone=zyk_cache:500m inactive=12d max_size=10g; 
  proxy_temp_path   /var/cache_temp;
##缓存设置结束##
  
##加入文件上传限制
  client_max_body_size 500m;
  include /etc/nginx/conf.d/*.conf;
}

[root@192-168-1-242 tools]# cat /etc/nginx/conf.d/zyk.ahtvu.ah.cn.conf

upstream zyk.ahtvu.ah.cn {
    server  192.168.1.230:80 max_fails=3 fail_timeout=30s;
    server  192.168.1.240:80 max_fails=3 fail_timeout=30s;
    server  192.168.1.241:80 max_fails=3 fail_timeout=30s;
  }
server {
  listen    80;
  server_name zyk.ahtvu.ah.cn;
# 响应头设置开始
  add_header X-Via $server_addr;
  add_header X-Cache-Status $upstream_cache_status; #在响应客户端时添加 HTTP 标头,以便在浏览器中看到是否命中缓存
# 响应头设置结束

# 缓存静态文件

  location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|mp4|pdf|txt)$ { 
     proxy_pass http://$host;  
     proxy_redirect off; 
     proxy_set_header Host $host; 
     proxy_cache zyk_cache; 
     proxy_cache_valid 200 302 30d;        
     proxy_cache_valid 301 30d; 
     proxy_cache_valid any 30d; 
     expires 30d; 
     proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie" "Vary";
     add_header Cache-Control public;
  } 

# 缓存静态文件
  location ~ .*\.(js|css)$ { 
     proxy_pass http://$host;  
     proxy_redirect off; 
     proxy_set_header Host $host; 
     proxy_cache zyk_cache; 
     proxy_cache_valid 200 302 30d;        
     proxy_cache_valid 301 30d; 
     proxy_cache_valid any 30d; 
     expires 30d; 
     proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie" "Vary";
     # proxy_ignore_headers Cache-Control Expires Set-Cookie Vary;
     add_header Cache-Control public;
  }

# 缓存html页面,缓存伪静态
  location ~ .*\.html$ {
     proxy_pass http://$host;
     proxy_redirect off;
     proxy_set_header Host $host;
     proxy_cache zyk_cache;
     proxy_cache_valid 200 302 60m;
     proxy_cache_valid 301 60m;
     proxy_cache_valid any 60m;
      expires 60m;
     proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie" "Vary";
     add_header Cache-Control public;
  }

# 设置缓存黑名单,不缓存指定页面,比如后台或其他需要登录态的页面,用分隔符隔开
  location ^~ /(admin|login|register|ajax|oauth)(.*)$ {
     proxy_pass      http://$host;
     proxy_set_header    Host $host;
     proxy_set_header    X-Real-IP $remote_addr;
     proxy_set_header     X-Forwarded-For $proxy_add_x_forwarded_for;
  }

# 动态请求代理给相应服务器
  location / {
     proxy_cache zyk_cache; 
     proxy_cache_revalidate on; 
     proxy_cache_min_uses 1;
     proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; 
     proxy_cache_background_update on;
     proxy_cache_lock on;
     proxy_cache_key $host$uri$is_args$args;
     proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
     proxy_cache_methods GET HEAD POST;
     proxy_cache_valid 200 5m;
     proxy_cache_valid any 5m;
     expires 5m;
     proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
     proxy_pass http://$host;
     proxy_set_header    Host $host;
     proxy_set_header    X-Real-IP $remote_addr;
     proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  }
  #  error_page  500 502 503 504 /50x.html;
  # location = /50x.html {
      #root  /usr/share/nginx/html;
#     proxy_set_header    Host $host;
#     proxy_set_header    X-Real-IP $remote_addr;
#     proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
#  }
}

2.8 Zabbix监控部署

2.8.1 MariaDB安装

2.8.1.1 添加源

首先添加用于RHEL / CentOS和Fedora系统的MariaDB YUM存储库文MariaDB.repo

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

image.png

2.8.1.2 安装MariaDB

[root@192-168-1-222 ~]# yum install mariadb mariadb-server.x86_64 -y

image.png

image.png

2.8.1.3 启动并加入开机启动项

[root@192-168-1-222 ~]# systemctl start mariadb

[root@192-168-1-222 ~]# systemctl enable mariadb

[root@192-168-1-222 ~]# systemctl status mariadb.service

image.png

2.8.1.4 初始化MariaDB

[root@192-168-1-222 ~]# mysql_secure_installation

image.png

MariaDB-Password:ahTvu

2.8.2 Nginx安装

详见2.1

image.png

2.8.3 PHP安装

2.8.3.1 安装源

[root@192-168-1-222 /]# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

[root@192-168-1-222 /]# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

image.png

2.8.3.2 安装PHP7.2

[root@192-168-1-222 /]# yum -y install php72w php72w-fpm

image.png

[root@192-168-1-222 /]# yum -y install php72w-mbstring php72w-common php72w-gd

image.png

[root@192-168-1-222 /]# yum -y install php72w-mysql php72w-xml php72w-cli php72w-devel

image.png

2.8.3.3 启动并加入开机启动项

[root@192-168-1-222 /]# systemctl start php-fpm.service

[root@192-168-1-222 /]# systemctl enable php-fpm.service

image.png

2.8.3.4 配置Nginx

[root@192-168-1-222 conf.d]# cp default.conf zabbix.conf

image.png

[root@192-168-1-222 conf.d]# vim zabbix.conf

image.png

2.8.3.5 访问测试

[root@192-168-1-222 conf.d]# systemctl restart nginx

[root@192-168-1-222 conf.d]# systemctl restart php-fpm.service

在网站根目录下创建index.php并输入:

<?php 
echo phpinfo();
?>

保存退出

image.png

打开浏览器访问: http://192.168.1.222

image.png

2.8.4 Zabbix安装部署

2.8.4.1 安装Zabbix仓库

[root@192-168-1-222 ~]# rpm -Uvh https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4-1.el7.noarch.rpm

image.png

2.8.4.2 安装服务、前端、代理

[root@192-168-1-222 yum.repos.d]# yum -y install zabbix-server-mysql

image.png

[root@192-168-1-222 yum.repos.d]# zabbix-web-mysql zabbix-nginx-conf abbix-agent

image.png

2.8.4.3 创建初始数据库

MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'ahTvu';

image.png

导入表结构:

[root@192-168-1-222 yum.repos.d]# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

image.png

2.8.4.4 配置数据库

[root@192-168-1-222 /]# vim /etc/zabbix/zabbix_server.conf

image.png

2.8.4.5 Zabbix前端配置PHP

[root@192-168-1-222 /]# vim /etc/httpd/conf.d/zabbix.conf

php_value date.timezone Asia/Shanghai

2.8.4.6 重启服务并加入开机启动项

[root@192-168-1-222 /]# systemctl restart zabbix-server.service zabbix-agent.service

[root@192-168-1-222 /]# systemctl enable zabbix-server.service zabbix-agent.service

image.png

2.8.5 Zabbix前端配置

浏览器访问http://192.168.1.222

image.png

image.png

根据报错信息逐条修改,修改完成后重新刷新页面。

image.png

配置数据库,填入数据库信息。

image.png

服务端信息,保持默认。

image.png

Zabbix安装前信息列表

image.png

安装完成,并点击完成按钮以跳转至前端登录页面。

image.png

输入默认用户名及密码Admin/zabbix以登录。

image.png

由于还未添加其它主机,可以在仪表盘看到只有一台本机显示为正常可用状态。

image.png

当添加完主机后会看到如下效果,可以显示出所监控的主机信息及报警情况:

image.png

image.png

配置完毕后,为保障数据安全,需将Guest用户组禁用:

管理à用户群组àGuestà状态列,点击已启用,即变为停用的状态。可点击进行状态切换。

image.png

关于Zabbix的使用请参考官方文档:https://www.zabbix.com/documentation/4.4/manual/web_interface

2.9 数据库集群部署

2.9.1 数据库镜像配置

2.9.1.1 配置主机

数据库服务器在安装数据库系统后更改计算机名称,将会导致复制订阅出现问题,所以需要将名称更改为一致,以下SQL语句用于处理此问题:

1)先执行如下脚本,看下名称是否一致

use master 
go 
select @@servername
select serverproperty('servername') 

2)如果一致就不需要修改,不一致时执行如下脚本:

EXEC sp_dropserver 'old_server_name' 
go
EXEC sp_addserver 'current_computer_name','local'

--注意:old_server_name为上面查询出的第一行的值,current_computer_name为第二行的值
--注意:需要重启服务之后,再次运行第1个脚本,如下:
--观察发现已经保持一致。再次新建发布订阅,观察一切正常。

也可以通过批处理的方式处理此问题

if serverproperty('servername') <> @@servername
begin
declare @server sysname
set @server = @@servername
exec sp_dropserver @server = @server
set @server = cast(serverproperty('servername') as sysname)
exec sp_addserver @server = @server , @local = 'LOCAL'
end

数据库服务器在安装数据库系统后更改计算机名称,通过执行下述SQL,会发现数据库的所有者是更名前的计算机名,将其更改为“sa”:

select name, suser_sname(owner_sid) from sys.databases -- where name = 'AH_AnalyticalData'
USE AH_AnalyticalData
GO
sp_changedbowner 'sa'

主机名称为:masterdb01,IP地址为:192.168.1.158

备机名称为:mirrordb01, IP地址为:192.168.1.197

2.9.1.2 主备实例互通

2.9.1.2.1 创建证书
**--****主机执行:**
--如果有endpoint,master key先删除
 --SELECT * FROM master.sys.database_mirroring_endpoints
 --DROP ENDPOINT Endpoint_Mirroring
 --DROP master key;
 
 USE master; 
 ALTER SERVICE MASTER KEY FORCE REGENERATE
 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'adh21xdl_Zy'; 
 CREATE CERTIFICATE Matser_cert WITH SUBJECT = 'HOST_A certificate' , 
 START_DATE = '2019-09-24', 
 EXPIRY_DATE = '2099-09-24'; 

 ----数据库中已存在主密钥。执行此语句前,请先删除该主密钥
 --DROP CERTIFICATE Matser_cert
 ----删除数据库主密钥
 --DROP MASTER KEY
  **--****备机执行:**
--如果有endpoint,master key先删除
--select * from master.sys.database_mirroring_endpoints
--DROP ENDPOINT Endpoint_Mirroring
--drop master key;

USE master; 
ALTER SERVICE MASTER KEY FORCE REGENERATE
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'adh21xdl_Zy'; 
CREATE CERTIFICATE Slave_cert WITH SUBJECT = 'HOST_B certificate', 
START_DATE = '2019-09-24', 
EXPIRY_DATE = '2099-09-24'; 

----数据库中已存在主密钥。执行此语句前,请先删除该主密钥
--DROP CERTIFICATE Slave_cert
----删除数据库主密钥
--DROP MASTER KEY
2.9.1.2.2 创建连接的端点
  **--****主机执行:** 
  CREATE ENDPOINT Endpoint_Mirroring 
 STATE = STARTED 
 AS 
 TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL ) 
 FOR 
 DATABASE_MIRRORING 
 ( AUTHENTICATION = CERTIFICATE Matser_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL ); 

  **--****备机执行:**
  CREATE ENDPOINT Endpoint_Mirroring 
 STATE = STARTED 
 AS 
 TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL ) 
 FOR 
 DATABASE_MIRRORING 
 ( AUTHENTICATION = CERTIFICATE Slave_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );
2.9.1.2.3 备份证书以备建立互联
**--****主机执行:**
      BACKUP CERTIFICATE Matser_cert TO FILE = 'C:\SQLBackup\Matser_cert.cer'; 
**--****备机执行:**
      BACKUP CERTIFICATE Slave_cert TO FILE = 'C:\SQLBackup\Slave_cert.cer';
2.9.1.2.4 互换证书

--将备份到C:\SQLBackup\的证书进行互换,即Matser_cert.cer复制到备机的C:\SQLBackup\。Slave_cert.cer复制到主机的C:\SQLBackup\

2.9.1.2.5 添加登录名与用户
**--****以下操作只能通过命令行运行,通过图形界面无法完成。**
**--****主机执行:**
CREATE LOGIN Slave_01_login WITH PASSWORD = 'ayhrrfl_19brsyj'; 
 CREATE USER Slave_01_user FOR LOGIN Slave_01_login; 
 CREATE CERTIFICATE Slave_cert AUTHORIZATION Slave_01_user FROM FILE = 'C:\SQLBackup\Slave_cert.cer'; 
 GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [Slave_01_login]; 

**--****备机执行:**
CREATE LOGIN Matser_01_login WITH PASSWORD = 'ayhrrfl_19brsyj'; 
 CREATE USER Matser_01_user FOR LOGIN Matser_01_login; 
 CREATE CERTIFICATE Matser_cert AUTHORIZATION Matser_01_user FROM FILE = 'C:\SQLBackup\Matser_cert.cer'; 
 GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [Matser_01_login];

2.9.1.3 建立镜像关系

以下步骤是针对每个数据库进行,例如:现主机中有7个数据库,以下过程就要执行7次。

2.9.1.3.1 手工同步登录名和密码

数据库镜像的缺点之一是无法维护登录名,所以需要我们手工维护登录。

通常来说数据库都将会有若干个用户作为访问数据库的用户,并且数据库会有相应的登录名,但是在备机中缺少与之相对应的登录名,例如业务系统使用’webuser’作为登录名访问数据库,但是在备机中没有’ webuser’这个登录名,因此一旦主备切换,业务系统就无法登录数据库了,这种情况称为"孤立用户"。在主机和备机数据库上建立相同用户名及密码即可。

2.9.1.3.2 准备备机数据库(主机备份及镜像还原)

在主机上备份数据库,先做完整备份,再做日志事务备份。

主数据必须设置成完整模式进行备份,如下图:

image.png

上图中将“恢复模式”选成“完整模式”。

A. 备份数据库,如下图:

image.png

备份时将“备份类型”选成“完整”。

B. 备份事务日志,如下图:

image.png

将“备份类型”选成“事务日志”且备份目录与备份数据库的目录一致。

1) 在备机上使用主机的备份文件进行还原(将主机的备份文件拷贝到备机上,)。

A. 还原要点

数据库还原时,在“还原”菜单选项中,完整备份选择“文件和文件组”进行还原,日志事务备份还原选择 “事务日志”。

B. 还原数据库

image.png

在还原数据库的时候需要使用选上“WITH NORECOVERY”。如图所示:

https://images2015.cnblogs.com/blog/58846/201607/58846-20160705151526858-1940661671.jpg

还原的路径建议设置成和主体服务器一致的路径。

如果数据库还原成功,将会变成如下所示的样子:

https://images2015.cnblogs.com/blog/58846/201607/58846-20160705151540749-915727141.jpg

C. 还原日志备份

在还原日志备份的时候需要使用选上**“WITH NORECOVERY”** (重要,否则后面执行镜像会报错)****。如图所示:

image.png

2.9.1.3.3 启动镜像操作(先备机后主机)
--备机执行:
ALTER DATABASE AH_AnalyticalData SET PARTNER = 'TCP://192.168.1.158:5022';
--说明:AH_AnalyticalData为数据库名。192.168.1.158为主机IP地址。

--主机执行:
ALTER DATABASE AH_AnalyticalData SET PARTNER = 'TCP://192.168.1.254:5022'; 
--说明:AH_AnalyticalData为数据库名。192.168.1.254为备机IP地址。

到此,SQL镜像热备配置完成。以下为镜像配置界面:

image.png

说明:目前为止,还没有配置见证服务器,所以上图为空,另外运行模式只有“高性能(异步)”和“高安全(同步)”可选择。

目前主体数据库和镜像数据库的状态显示界面如下:

image.pngimage.png

2.9.1.3.4 镜像可用性解决办法
2.9.1.3.4.1 运行模式切换

image.png

2.9.1.3.4.2 主体与镜像转换
--主机(A) 
use master;
alter database dataName set partner failover;  --dataName为指定的数据库名称

执行成功后原主体数据库会显示正在还原,备机数据库显示主体正在同步字样

2.9.1.3.4.3 测试主备切换

主机(A)崩溃,强制备机(B)当主机,原主机(A)恢复后再切换回去

--备机(B)
use master;
--强制接收
alter database dataName set partner FORCE_SERVICE_ALLOW_DATA_LOSS; 

停止主机(A)的SQL SERVER 服务(比如断电),此时备机(B)上的数据库会显示正在恢复状态,大概持续几十秒,最后变成dataName(主体,已断开链接),即现在的镜像(B)可以用来充当主机。此时往数据库里插入数据能成功。数据库显示状态见下图(模拟AH_AnalyticalData、AH_JournalData数据库实现故障转移):

image.png

把原主机(A)恢复(通电),然后在备机(B)里操作

--备机(B)
use master;
alter database dataName set partner resume;

此时原主机(A)是作为镜像的,原备机(B)是作为主机的,要再切换一下,则再在B上执行

alter database dataName set partner failover;

2.9.2 数据库复制配置

2.9.2.1 配置分发服务器

在发布服务器、分发服务器和订阅服务器配置hosts文件,加入如下配置:

发布数据库:192.168.1.158,机器名WIN-3-100

镜像数据库:192.168.1.254,机器名WIN-3-101

分发数据库:192.168.1.197,机器名WIN-3-102

订阅数据库1:192.168.1.235,机器名WIN-3-103

将192.168.1.197配置成分发服务器,分发数据库的快照文件建议配置相应的访问权限,因为我的账户有访问权限,所以略去这步在分发服务器上,选择复制->配置分发,按照下图操作:

clip_image360.gif

点击添加
clip_image362.gif

clip_image364.gif

剩下的就直接下一步,直到完成即可

在分发服务器属性对话框中启用发布服务器

在分发服务器复制选项->分发服务器属性->发布服务器,点击添加按钮,选择发布服务器WIN-3-100,在弹出需要设置管理链接密码的对话框中,输入管理链接的密码

clip_image366.gif
clip_image368.jpg

在主体数据库(发布数据库)和镜像数据库中指定分发数据库

首先在WIN-3-100上配置,在复制功能上右键->配置分发,按照图中指示配置,选择"使用以下服务器作为分发服务器",点击添加按钮,选择WIN-3-102作为分发服务器

clip_image370.jpg

clip_image372.gif

输入管理密码与步骤3中配置的管理链接密码一致
clip_image373.gif
clip_image375.gif

下一步,直至完成。然后如法炮制,在镜像服务器中将WIN-3-102配置为分发服务器,指向同一分发数据库和快照文件。

2.9.2.2 配置发布服务器

在发布服务器打开SQLSERVER视窗界面,在左侧功能选项中选择“复制”菜单,右键点击“本地发布”,如下图所示:
clip_image377.jpg

弹出发布向导窗体,选择要发布的数据库,点击下一步,如下图所示:

clip_image379.jpg

在新窗体中选择“事务发布” ,点击下一步,如下图所示:

clip_image381.jpg

在新窗体中点开树形“表”列表,勾选要发布的数据表及其字段,再点击“项目属性”按钮,在弹出的新窗体中将“复制聚集索引”与“复制非聚集索引”两项设定为true,点击确定关闭窗体,再点击下一步,如下图所示:

clip_image383.jpg

在新船体中点击“添加”按钮,在弹出的新窗体“1.”中选择要发布的数据表,“2.”中选择数据表字段,并在右侧输入框架中填写要发布的数据条件,如下图所示:

clip_image385.jpg

点击下一步,在新窗体中勾选立即创建快照,如下图所示:

clip_image387.jpg

在弹出的新窗体中为两个代理配置独立的帐号,如下图所示:
clip_image389.jpg
clip_image391.jpg

点击下一步,弹出新窗体,如下图所示:
clip_image391.jpg

勾选“创建发布”复选框,点击下一步,进入新窗体,如下图所示:

clip_image395.jpg

为此次创建的发布命名,在点击“完成”按钮后,结束此次发布操作。

2.9.2.3 配置订阅服务器

在订阅服务器打开SQLSERVER视窗界面,在左侧功能选项中选择“复制”菜单,右键点击“本地订阅”,如下图所示:

clip_image397.jpg

在弹出的窗体中选择发布服务器名称,并选择发布服务器上的数据库及其创建的发布,以进行订阅,如下图所示:

clip_image399.jpg

点击下一步,在新窗体上选择在分发服务器上运行所有代理,如下图所示:

clip_image401.jpg

点击下一步,在新窗体上选择订阅服务器和订阅数据库,如下图所示:

clip_image403.jpg

点击下一步,在新窗体上配置分发代理的安全性,如下图所示:

clip_image405.jpg

点击下一步,在新窗体中采用默认设置,如下图所示:

clip_image407.jpg

点击下一步,在新窗体中采用默认设置,如下图所示:

clip_image409.jpg

点击下一步,在新窗体中采用默认设置,如下图所示:

clip_image411.jpg

点击下一步,在新窗体中采用默认设置,如下图所示:

clip_image413.jpg

至此,完成指定数据库发布的订阅配置。

2.9.2.4 配置分发属性

clip_image415.jpg

clip_image417.jpg

clip_image419.jpg

在弹出的窗体中,按下图所示进行配置,在值一项中填写镜像服务器的机器名称。

clip_image421.jpg

clip_image423.jpg

在弹出的窗体中,按下图所示进行配置,在值一项中填写镜像服务器的机器名称。

clip_image425.jpg

创建完成之后还有关键的一步,就是在主体和镜像服务器上执行 DBCC TRACEON(1448,-1),如果可以重启最好加入到实例的启动参数中去。如果不设置该参数,会报复制的事务正等待下一次日志备份或等待镜像伙伴更新。

2.9.3 常用命令

--切换主备(在主机数据库所在HOST上执行)
use master;
ALTER DATABASE testdb set partner failover;
-- 备机强制切换(在备机上数据库状态非同步状态下可执行)
use master;
ALTER DATABASE testdb set partner force_service_allow_data_loss;
--恢复镜像
use master;
ALTER DATABASE testdb set partner resume;
--取消镜像(在主机数据库所在HOST上执行)
ALTER DATABASE testdb SET PARTNER OFF;
--设置镜像数据库还原为正常
RESTORE DATABASE testdb WITH RECOVERY;
备份主数据库出现:Backup a database on a HDD with a different sector size,可以执行以下语句备份:
BACKUP DATABASE MyDB TO DISK = N'D:\MyDB.bak' WITH INIT , NOUNLOAD , NAME = N'MyDB backup', STATS = 10, FORMAT

2.10 Web服务器

2.10.1 IIS安装

  • 点击开始,选择服务器管理器

clip_image427.jpg
clip_image429.jpg

  • 点击右上角管理菜单选择添加角色和功能,以打开向导并点击下一步。

clip_image431.jpg

clip_image433.jpg

  • 安装类型保持默认,点击下一步。

clip_image435.jpg

  • 选择要安装的服务器,保持默认,点击下一步。

clip_image437.jpg

服务器角色处,选择Web服务器(IIS),并在弹出的窗口中点击“添加功能”,然后点击下一步。

clip_image439.jpg

  • 功能选择“.NET Framework4.5功能”默认即可,然后选择下一步。

clip_image441.jpg

clip_image443.jpg

  • 选择详细安装的角色服务,勾选完成后点击下一步。

clip_image445.jpg

  • 点击安装,直至安装完成。

clip_image447.jpg

2.10.2 IIS配置

2.10.2.1 删除IIS默认网站

  • 打开IIS后,选择默认站点后右键点击浏览;弹出目录所在位置。

clip_image449.jpg

  • 点击上级目录后,删除wwwroot目录。

clip_image451.jpg

  • 回到IIS,再次选择默认站点右键选择删除即可。

clip_image453.jpg

2.10.2.2 日志存放路径

  • 打开IIS,左侧选择IIS,右侧在IIS功能模块里选择“日志”并双击打开。

clip_image455.jpg

  • 将日志目录修改为指定日志存储路径即可。

clip_image455.jpg

2.10.2.3 限制目录浏览

  • 左侧选择IIS,右侧IIS功能模块里选择“目录浏览”并双击打开。

clip_image459.jpg

  • 在右侧将启用状态点击变成禁用并保存

clip_image461.jpg

2.10.2.4 限制执行权限

Ø 原因描述:在处理程序映射中,把编辑功能权限中的脚本的执行权限去掉,这样即使网站目录中被上传了木马文件,也无法自动执行。

  • 左侧选择IIS,右侧IIS功能模块里选择“处理程序映射”并双击打开。

clip_image463.jpg

  • 在右侧点击“编辑功能权限”,取消勾选“执行”选项,然后点击确定返回。

clip_image465.jpg

2.10.2.5 请求筛选

Ø 配置拒绝文件扩展名前,通过浏览器能获取到配置在xml文档中的信息,造成泄密,配置后就可以解决此问题。

  • 左侧选择IIS,右侧IIS功能模块里选择“请求筛选”并双击打开。

clip_image467.jpg

  • 选择“文件扩展名”选项,在右侧点击“拒绝文件扩展名…”,在弹出的对话框中填入拒绝访问的文件扩展名,如“xml”,然后点击确定即可。

clip_image469.jpg

  • 左侧选择IIS,右侧IIS功能模块里选择“请求筛选”并双击打开。

clip_image467.jpg

  • 选择“HTTP谓词”选项,在右侧点击“拒绝谓词”,在弹出的对话框中填入“TRACE”、“PUT”、“DELETE”、“TRACE”然后点击确定返回。

clip_image471.jpg

clip_image473.jpg

2.10.2.6 添加HTTP响应标头

HTTP``响应标头配置说明:
Ø ``The X-Frame-Options``:是用来给浏览器 指示允许一个页面 可否在 <frame>, <iframe>, <embed> 或者 <object> 中展现的标记。站点可以通过确保网站没有被嵌入到别人的站点里面,从而避免 clickjacking 攻击。
Ø ``X-Content-Type-Options``:相当于一个提示标志,被服务器用来提示客户端一定要遵循在 Content-Type 首部中对 MIME 类型 的设定,而不能对其进行修改。这就禁用了客户端的 MIME 类型嗅探行为,换句话说,也就是意味着网站管理员确定自己的设置没有问题。
Ø ``HTTP X-XSS-Protection``:是 Internet Explorer,Chrome 和 Safari 的一个特性,当检测到跨站脚本攻击 (XSS (en-US))时,浏览器将停止加载页面。若网站设置了良好的 Content-Security-Policy 来禁用内联 JavaScript ('unsafe-inline'),现代浏览器不太需要这些保护, 但其仍然可以为尚不支持 CSP 的旧版浏览器的用户提供保护。
Ø ``Referrer-Policy``:当用户在浏览器上点击一个链接时,会产生一个 HTTP 请求,用于获取新的页面内容,而在该请求的报头中,会包含一个 Referrer,用以指定该请求是从哪个页面跳转页来的,常被用于分析用户来源等信息(如防盗链)。但是也有成为用户的一个不安全因素,比如有些网站直接将 sessionid 或是 token 放在地址栏里传递的,会原样不动地当作 Referrer 报头的内容传递给第三方网站。在Referrer Policy策略发面前,浏览器可以按自己的默认规则来决定是否加上Referrer。2014年W3C下Web应用安全工作组(Web Application Security Working Group)发布了Referrer Policy草案,对浏览器发送Referrer做了详细规定。在新的Referrer Policy中,可以实现隐藏Referrer,也可以只发送来源URL的host地址(不过不允许伪造)。新的Referrer Policy规定了五种Referrer策略。
Ø ``Access-Control-Allow-Origin``:是HTML5中定义的一种解决资源跨域的策略。当两个域具有相同的协议(如http), 相同的端口(如80),相同的host(如www.google.com),那么就可以认为它们是相同的域(协议,域名,端口都必须相同)。跨域就指着协议,域名,端口不一致,出于安全考虑,跨域的资源之间是无法交互的(例如一般情况跨域的JavaScript无法交互,当然有很多解决跨域的方案)。
Access-Control-Allow-Origin``是通过服务器端返回带有Access-Control-Allow-Origin标识的Response header,用来解决资源的跨域权限问题。
Ø ``Content-Security-Policy``:是一种声明的安全机制,可以让网站运营者能够控制遵循CSP的用户代理(通常是浏览器)的行为。通过控制要启用哪些功能,以及从哪里下载内容,可以减少网站的攻击面。
CSP``的主要目的是防御跨站点脚本(cross-ste scripting,XSS)攻击。例如,CSP可以完全禁止内联的JavaScript,并且控制外部代码从哪里加载。它也可以禁止动态代码执行。禁用了所有的攻击源,XSS攻击变得更加困难。
CSP``由Mozilla开发,曾经有几年试验过概念,一开始称为内容限制(content restriction),后来改称为内容安全策略。2012年11月CSP 1.0成为W3C的候选议案。
网站通过设置Content-Security-Policy响应头启用所需的CSP策略。
  • 左侧选择IIS,右侧IIS功能模块里选择“HTTP响应标头”并双击打开。

clip_image475.jpg

  • 在右侧点击“添加”,然后添加自定义的Http响应头名称与对应值即可。

clip_image477.jpg

  • 最终配置选项如下图

clip_image479.jpg

Ø ``删除X-Powered-By配置,避免泄漏系统信息。
  • 左侧选择IIS,右侧IIS功能模块里选择“HTTP响应标头”并双击打开。

clip_image475.jpg

  • 选中“X-Powered-By: ASP.NET”,在右侧点击“删除”后选择“是”即可。

clip_image481.jpg

3 应用部署

根据应用软件的要求发布应用,配置各项软硬环境,使应用程序与服务能正常运行。

3.1 数据库连接字符串

系统中的所有数据库连接字符串都采用3DES加密算法进行加密处理,以避免明文配置泄漏数据库信息。

系统数据库连接字符串通过ConfigServer项目进行节点配置,采用API请求方式加载节点配置项。

系统采用读写分离的数据架构,需要配置Slave(读库连接)与Master(写库连接)两个配置节点。

配置界面如下:
clip_image483.jpg

参数说明:

Name: 数据库连接名称;

ProviderName: 数据库提供程序;

ConnectionString: 数据库加密字符串;

注意:安装或部署人员在系统部署时请一定确保系统中所有的数据库连接字符串都做了加密处理,以免程序出错。

3.2 Web应用程序

3.2.1 静态站点配置

3.2.1.1 站点配置

configServer.json配置:

文件位置:Config目录下

文件内容: ["http://{host}/api/config?appid={id}" ]

{host}:ConfigServer项目访问地址;

{id}:节点配置appid;

log4net.config配置:

文件位置:Config目录下

该文件无需修改

3.2.1.2 IIS配置

编辑网站绑定:

clip_image485.jpg

主机名为:static.zyk.ahtvu.ah.cn

编辑应用程序池:

clip_image487.jpg

.NET CLR版本:无托管代码

托管管道模式:集成

3.2.1.3 部署测试

打开浏览器输入地址:http://stas.zyk.ahtvu.ah.cn/

clip_image489.jpg

3.2.2 前后端站点配置

3.2.2.1 前端站点配置

3.2.2.1.1 站点配置

configServer.json配置:

文件位置:Config目录下

文件内容: ["http://{host}/api/config?appid={id}" ]

{host}:ConfigServer项目访问地址;

{id}:节点配置appid;

log4net.config配置:

文件位置:Config目录下

该文件无需修改

3.2.2.1.2 IIS配置

编辑网站绑定:

clip_image490.jpg

主机名为:zyk.ahtvu.ah.cn

编辑应用程序池:

clip_image492.jpg

.NET CLR版本:V4.0.30319

托管管道模式:集成

3.2.2.1.3 部署测试

打开浏览器输入地址:http://zyk.ahtvu.ah.cn

clip_image494.jpg

3.2.2.2 后端站点配置

3.2.2.2.1 站点配置

configServer.json配置:

文件位置:Config目录下

文件内容: ["http://{host}/api/config?appid={id}" ]

{host}:ConfigServer项目访问地址;

{id}:节点配置appid;

log4net.config配置:

文件位置:Config目录下

该文件无需修改

3.2.2.2.2 IIS配置

编辑网站绑定:

img

主机名为:admin.zyk.ahtvu.ah.cn

编辑应用程序池:

img

.NET CLR版本:V4.0.30319

托管管道模式:集成

3.2.2.2.3 部署测试

打开浏览器输入地址:http://admin.zyk.ahtvu.ah.cn

clip_image496.jpg

3.2.3 前后端单点配置

3.2.3.1 前台单点配置

3.2.3.1.1 站点配置

configServer.json配置:

文件位置:Config目录下

文件内容: ["http://{host}/api/config?appid={id}" ]

{host}:ConfigServer项目访问地址;

{id}:节点配置appid;

log4net.config配置:

文件位置:Config目录下

该文件无需修改

3.2.3.1.2 IIS配置

编辑网站绑定:

clip_image497.jpg

http://oauth.zyk.ahtvu.ah.cn

img

3.2.3.2 后端单点配置

3.2.3.2.1 站点配置

configServer.json配置:

文件位置:Config目录下

文件内容: ["http://{host}/api/config?appid={id}" ]

{host}:ConfigServer项目访问地址;

{id}:节点配置appid;

log4net.config配置:

文件位置:Config目录下

该文件无需修改

3.2.3.2.1 IIS配置

编辑网站绑定:

clip_image497.jpg

主机名为:adminoauth.zyk.ahtvu.ah.cn

编辑应用程序池:

clip_image487.jpg

.NET CLR版本:无托管代码

托管管道模式:集成

3.2.3.2.2 部署测试

打开浏览器输入地址:http://admin.zyk.ahtvu.ah.cn/

clip_image500.jpg

3.2.4 接口配置

3.2.4.1 API接口配置

3.2.4.1.1 站点配置

configServer.json配置:

文件位置:Config目录下

文件内容: ["http://{host}/api/config?appid={id}" ]

{host}:ConfigServer项目访问地址;

{id}:节点配置appid;

log4net.config配置:

文件位置:Config目录下

该文件无需修改

3.2.4.1.2 IIS配置

编辑网站绑定:

img

主机名为:api.zyk.ahtvu.ah.cn

编辑应用程序池:

img

.NET CLR版本:无托管代码

托管管道模式:集成

3.2.4.2 流媒体接口配置

3.2.4.2.1 站点配置

configServer.json配置:

文件位置:Config目录下

文件内容: ["http://{host}/api/config?appid={id}" ]

{host}:ConfigServer项目访问地址;

{id}:节点配置appid;

log4net.config配置:

文件位置:Config目录下

该文件无需修改

3.2.4.2.2 IIS配置

编辑网站绑定:

img

主机名为:sm.zyk.ahtvu.ah.cn

编辑应用程序池:

img

.NET CLR版本:无托管代码

托管管道模式:集成

3.2.5 订阅站点配置

3.2.5.1 站点配置

configServer.json配置:

文件位置:Config目录下

文件内容: ["http://{host}/api/config?appid={id}" ]

{host}:ConfigServer项目访问地址;

{id}:节点配置appid;

log4net.config配置:

文件位置:Config目录下

该文件无需修改

3.2.5.2 配置开机启动服务

  • 1创建.service文件:

clip_image502.jpg

ExecStart=/usr/bin/dotnet /usr/local/src/SubscriberService/Nerc.ResourceLibrary.SubscriberService.dll

/usr/bin/dotnet为:dotnet命令位置

/usr/local/src/SubscriberService/Nerc.ResourceLibrary.SubscriberService.dll为:订阅程序执行dll地址

  • 2拷贝服务脚本

cp NercSubscriber.service /usr/lib/systemd/system/

  • 3创建启动项

systemctl enable NercSubscriber

  • 4服务相关命令

  • 服务重启命令

systemctl restart NercSubscriber

  • 服务启动命令

systemctl start NercSubscriber

  • 服务停止命令

systemctl stop NercSubscriber

3.2.5.3 部署测试

输入命令:ps -ef | grep Nerc.ResourceLibrary.SubscriberService

clip_image504.jpg

输入命令:systemctl status NercSubscriber

clip_image506.jpg

3.2.6 作业站点配置

3.2.6.1 站点配置

configServer.json配置:

文件位置:Config目录下

文件内容:

["http://{host}/api/config?appid={id}" ]

{host}:		# ConfigServer项目访问地址;

{id}:		# 节点配置appid;

log4net.config配置:

文件位置:Config目录下

该文件无需修改

3.2.6.2 配置开机启动服务

  • 1创建.service文件:

clip_image508.jpg

ExecStart=/usr/bin/dotnet /usr/local/src/TaskScheduler/Nerc.TaskScheduler.ServiceBus.dll

/usr/bin/dotnet为:dotnet命令位置

/usr/local/src/TaskScheduler/Nerc.TaskScheduler.ServiceBus.dll为:作业程序执行dll地址

  • 2拷贝服务脚本

cp NercTaskScheduler.service /usr/lib/systemd/system/

  • 3创建启动项

systemctl enable NercTaskScheduler

  • 4服务相关命令
  • 服务重启命令

systemctl restart NercTaskScheduler

  • 服务启动命令

systemctl start NercTaskScheduler

  • 服务停止命令

systemctl stop NercTaskScheduler

3.2.6.3 部署测试

输入命令:ps -ef | grep Nerc.TaskScheduler.ServiceBus

clip_image510.jpg

输入命令:systemctl status NercTaskScheduler

clip_image512.jpg

3.3 Windows应用程序

3.3.1 XXX

3.3.1.1 XXX

3.3.1.2 配置文件路径设置

3.3.1.3 系统配置

服务端API地址:资源库API接口路径

APIID、APIKEY:系统对应值

用户信息:后台管理员

管理员信息:后台管理员

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区