数据库架构之【FastDFS+Nginx+Keepalived】
FastDFS 是一个开源的(遵循GPL协议)高性能的轻量级分布式文件系统,主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。
本方案基于CentOS8系统设计,建议在RedHat/CentOS系统中使用。方案使用服务器及网络资源较多,建议在实施前做好规划工作,有利于部署工作顺利、有序进行。
目录
1.前言
2.FastDFS 架构
-- 2.1.部署模式
-- 2.2.处理流程
3.FastDFS 单点部署
4.FastDFS+Nginx 单点部署
5.FastDFS 集群部署
-- 5.1.集群部署拓补图
-- 5.2.FastDFS 集群部署
---- 5.2.1.部署调度服务器
---- 5.2.2.部署存储服务器
---- 5.2.3.部署 FastDFS Client 客户端
6.FastDFS+Keepalived+Nginx 集群部署
-- 6.1.集群部署拓补图
-- 6.2.FastDFS+Keepalived+Nginx 集群部署
---- 6.2.1.部署调度服务器
---- 6.2.2.部署 Nginx Web 存储服务器
---- 6.2.3.部署 Nginx Proxy 服务器
---- 6.2.4.部署 Nginx Proxy Keepalived 服务器
---- 6.2.5.部署客户端
7.Java开发集成示例
1.前言
1、FastDFS 的主要特性
1)分布式的文件存储系统,存储节点和调度节点能够无限扩容,分离部署;
2)支持廉价磁盘(如:IDE 磁盘)的在线扩容,解决了海量文件存储的问题;
3)存储采用逻辑分组概念,通过在同组内配置多个存储实现软 RAID,解决了数据容错恢复的问题;
4)用于文件的存储、同步、访问,支持文件读取负载均衡,解决了高并发访问的问题;
5)通过 Client API 进行文件操作,存在单点性能瓶颈(主要是写入性能,读取性能可通过 Web 负载均衡优化)。
2、FastDFS 的适用场景
1)特别适合以中小文件(建议范围:4KB < 文件大小 < 500MB)作为内容的 B/S 应用,如:相册网站、视频网站等;
2)不支持文件分块存储,不适合分布式计算场景;
3)相比使用 RDBMS 数据库存储文件(RDBMS 数据库一般采用二进制流字段存储文件)性能更高(尤其在读取文件时),但是在写入文件时则无法利用 RDBMS 的事务功能,在程序异常时可能产生垃圾文件。比如:某个应用程序负责提交订单(订单信息,扫描文件等)。当客户提交订单时发生异常,如果订单信息和扫描文件都存储在 RDBMS 中,则会事务回滚机制保证订单信息和扫描文件都不入库;如果订单信息存储在 RDBMS 中,扫描文件存储在 FastDFS 中,则有可能订单信息不入库但扫描文件入库的现象,针对这种现象,必须在程序编码中进行优化处理。
3、核心组件简介
1) FastDFS:由存储服务器(Storage Server)、调度服务器(Tracker Server)和客户端(Client)三部分组成:
-
Storage Server(存储服务器):主要提供容量和备份服务,以组(Group)为组织单位,每个 Group 包含多台 Storage Server 且数据互为备份,存储空间以 Group 中容量最小的 Storage Server 为准。组与组之间相互独立,可以存放不同的文件数据。
-
Tracker Server(调度服务器):主要提供调度服务,在读取文件时提供负载均衡,负责管理所有的Storage Server 和 Group。每个 Storage Server 在启动后会连接 Tracker Server,通知自己所属的 Group 信息并保持周期性心跳,Tracker Server 根据心跳信息,建立 Group => [ Storage Server List ] 映射表。为避免单点故障应提供多个 Tracker Server ,多个 Tracker Server 之间是对等(点对点)的主备关系。
-
Client(客户端):主要提供连接 Tracker Server ,进行文件上传下载的工具。
2) Nginx:轻量级、高性能的 Web 服务器和反向代理服务器,提供 Web 协议负载均衡的能力。它实现通过 Web 协议访问跳过 Tracker Server 直接访问 Storage Server 中的文件,且只能读取。
3) Keepalived:基于 VRRP 协议的轻量级服务高可用和负载均衡方案,提供避免服务器单点故障和请求分流的能力。它为 Nginx 扩展了高可用能力,共同组成完整的 Web 服务集群模式(高可用+负载均衡)。
2.FastDFS 架构
2.1.部署模式
1、FastDFS 单点模式
-
1台服务器部署 FastDFS 的 Storage Server 、Tracker Server 。
-
通过 Client API 进行文件读写。
2、FastDFS + Nginx 单点模式
FastDFS+Nginx 单点模式部署结构图-
1台服务器部署 FastDFS 的 Storage Server 、Tracker Server 、Nginx(Web 服务器)。
-
通过 Client API 进行文件读写,扩展通过 Web 协议进行文件读取。
3、FastDFS 分布式集群模式
-
≥4台服务器部署 FastDFS 的 Storage Server,至少2台服务器为一组,组内节点互为备份,组与组之间相互独立,存放不同的文件数据。
-
≥3台服务器部署 FastDFS 的 Tracker Server,实现 Client API 连接的负载均衡和高可用。
-
通过 Client API 进行文件读写。
4、FastDFS + Nginx + Keepalived 分布式集群模式
-
≥4台服务器部署 FastDFS 的 Storage Server,至少2台服务器为一组,组内节点互为备份,组与组之间相互独立,存放不同的文件数据;每台服务器扩展部署 Nginx(Web 服务器)。
-
≥3台服务器部署 FastDFS 的 Tracker Server ,实现 Client API 连接的负载均衡和高可用。
-
≥3台服务器部署 Nginx(反向代理服务器)、Keepalived ,实现 Web 服务的负载均衡和高可用。
-
通过 Client API 进行文件读写,扩展通过 Web 协议进行文件读取。
2.2.处理流程
1、通过 Tracker 进行文件上传的处理流程
file_id(路径信息和文件名)格式为:volume0/M00/00/02/Cs8b8lFJIIyAH841AAAbpQt7xVI4715674。其中:
- 组名(volume0):文件所在的 Storage Server Group 的名称。
- 虚拟磁盘(M00):Storage Server 配置的虚拟路径,与磁盘选项 store_path 对应。如果配置了 store_path0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。
- 文件目录(00/02):Storage Server 在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
- 文件名:(Cs8b8lFJIIyAH841AAAbpQt7xVI4715674):采用base64编码,信息包含源storage server Ip、文件创建时间、文件大小、文件CRC32效验码和随机数。
2、通过 Tracker 进行文件下载的处理流程
Tracker Server 和 Storage Server 内置 HTTP 协议支持,客户端可以通过 HTTP 协议下载文件,Tracker Server 在接收到请求后,通过 HTTP 协议的 Redirect 机制将请求重定向至文件所在的 Storage Server 上,可以通过 Nginx 扩展文件下载的支持。
3.FastDFS 单点部署
假设当前主机 IP 地址为:192.168.216.128
1、打开 FastDFS 下载页面【https://github.com/happyfish100/】,下载 fastdfs 和 libfastcommon 的源代码 zip 或 tar.gz 包到用户主目录中。
FastDFS 下载页面2、验证并安装依赖软件。通过源代码编译的方式安装 FastDFS,需要依赖软件"make"、"gcc"、"libevent",验证或安装依赖软件。
[centos@host ~]$ sudo dnf install make gcc libevent perl-devel
补充知识:
① "gcc"是一个C/C++、FORTRAN、JAVA、OBJC、ADA等多种语言的编译器,用来将源代码编译成可发布的软件程序。
② "make"是一个工程管理工具,能够根据 Makefile 中的脚本执行编译、安装流程。
③ "libevent"是一个事件通知库,如系统安装了GUI模块则已默认安装。
④ "perl-devel"是一个 Perl 语言开发库。
在Linux系统中,大多数通过源代码编译来安装的软件都需要依赖"make"和"gcc"。
3、解压缩 libfastcommon 和 fastdfs 的源代码 tar 包到用户主目录下。
[centos@host ~]$ tar zxvf libfastcommon-1.0.43.tar.gz
[centos@host ~]$ tar zxvf fastdfs-6.06.tar.gz
[centos@host ~]$ ll
drwxrwxr-x. 12 centos centos 4096 12月 31 07:36 fastdfs-6.06
drwxrwxr-x. 5 centos centos 4096 12月 25 20:35 libfastcommon-1.0.43
4、安装 libfastcommon,进入源代码目录,编译安装程序。
[centos@host ~]$ cd libfastcommon-1.0.43
[centos@host libfastcommon-1.0.43]$ ./make.sh
[centos@host libfastcommon-1.0.43]$ sudo ./make.sh install
[centos@host ~]$ ll /usr/lib64/libfast*
-rwxr-xr-x. 1 root root 1186112 5月 14 14:58 /usr/lib64/libfastcommon.so
lrwxrwxrwx. 1 root root 20 5月 14 2019 /usr/lib64/libfastjson.so.4 -> libfastjson.so.4.2.0
-rwxr-xr-x. 1 root root 49216 5月 14 2019 /usr/lib64/libfastjson.so.4.2.0
[centos@host ~]$ ll /usr/lib/libfast*
lrwxrwxrwx. 1 root root 27 5月 14 14:58 /usr/lib/libfastcommon.so -> /usr/lib64/libfastcommon.so
库文件目录是"/usr/lib64"和"/usr/lib"。
5、安装 fastdfs,进入源代码目录,编译安装程序。
[centos@host ~]$ cd fastdfs-6.06
[centos@host fastdfs-6.06]$ ./make.sh
[centos@host fastdfs-6.06]$ sudo ./make.sh install
[centos@host ~]$ ll /usr/bin/fdfs*
-rwxr-xr-x. 1 root root 448528 5月 14 15:04 /usr/bin/fdfs_appender_test
-rwxr-xr-x. 1 root root 448360 5月 14 15:04 /usr/bin/fdfs_appender_test1
-rwxr-xr-x. 1 root root 435112 5月 14 15:04 /usr/bin/fdfs_append_file
-rwxr-xr-x. 1 root root 433448 5月 14 15:04 /usr/bin/fdfs_crc32
-rwxr-xr-x. 1 root root 435144 5月 14 15:04 /usr/bin/fdfs_delete_file
-rwxr-xr-x. 1 root root 436128 5月 14 15:04 /usr/bin/fdfs_download_file
-rwxr-xr-x. 1 root root 435760 5月 14 15:04 /usr/bin/fdfs_file_info
-rwxr-xr-x. 1 root root 456224 5月 14 15:04 /usr/bin/fdfs_monitor
-rwxr-xr-x. 1 root root 435312 5月 14 15:04 /usr/bin/fdfs_regenerate_filename
-rwxr-xr-x. 1 root root 1578400 5月 14 15:04 /usr/bin/fdfs_storaged
-rwxr-xr-x. 1 root root 458032 5月 14 15:04 /usr/bin/fdfs_test
-rwxr-xr-x. 1 root root 457352 5月 14 15:04 /usr/bin/fdfs_test1
-rwxr-xr-x. 1 root root 634920 5月 14 15:04 /usr/bin/fdfs_trackerd
-rwxr-xr-x. 1 root root 435872 5月 14 15:04 /usr/bin/fdfs_upload_appender
-rwxr-xr-x. 1 root root 437248 5月 14 15:04 /usr/bin/fdfs_upload_file
[centos@host ~]$ ll /etc/fdfs
-rw-r--r--. 1 root root 1909 5月 14 15:04 client.conf.sample
-rw-r--r--. 1 root root 10246 5月 14 15:04 storage.conf.sample
-rw-r--r--. 1 root root 620 5月 14 15:04 storage_ids.conf.sample
-rw-r--r--. 1 root root 9138 5月 14 15:04 tracker.conf.sample
程序安装目录是"/usr/bin",配置文件目录是"/etc/fdfs"。
6、创建 FastDFS 工作根目录,并将系统管理用户设置为目录的拥有者。
[centos@host ~ ]$ sudo mkdir -p /data/fdfs
[centos@host ~ ]$ sudo chown -R centos:centos /data/fdfs
7、配置调度服务器(Tracker Server)。
1)创建调度服务器工作子目录,并将系统管理用户设置为目录的拥有者。
[centos@host ~ ]$ sudo mkdir -p /data/fdfs/tracker
[centos@host ~ ]$ sudo chown -R centos:centos /data/fdfs/tracker
2)进入程序配置目录"/etc/fdfs",通过拷贝从模板文件中创建配置文件"tracker.conf"。
[centos@host ~ ]$ sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
3)设置调度服务器配置文件参数。
使用文本编辑器打开配置文件:
[centos@host ~ ]$ sudo gedit /etc/fdfs/tracker.conf
修改或验证文件中的以下参数并保存:
# 表示工作目录位置。
base_path = /data/fdfs/tracker
# 表示服务监听的 IP 地址,设置为空时监听全部地址。默认为空。
bind_addr =
# 表示服务的端口号。默认为 22122 。
port = 22122
# 表示当前配置是否禁用,设置为 true 表示禁用,设置为 false 表示启用。默认为 false 。
disabled = false
# 表示连接超时的时长(单位为秒)。默认为30秒。
connect_timeout = 5
# 表示网络超时的时长(单位为秒)。默认为30秒。
network_timeout = 60
# 最大并发连接数。默认为256个。
max_connections = 1024
# 表示日志记录级别,记录级别依次为:emerg/alert/crit/error/warn/notice/info/debug。默认为info
log_level = info
# 表示运行该程序的用户组,为空表示当前用户组。默认为空。
run_by_group =
# 表示运行该程序的用户,为空表示当前用户。默认为空。
run_by_user =
# 客户端访问策略,* 表示所有客户端均可访问。默认为 * 。
# 例如:allow_hosts=10.0.1.[1-15,20]
allow_hosts = *
4)启动调度服务器。
[centos@host ~ ]$ /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
5)配置调度服务器开机自启动。
使用文本编辑器修改开机启动脚本文件:
[centos@host ~ ]$ sudo gedit /etc/rc.d/rc.local
在文件中追加内容并保存如下:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
修改开机启动脚本文件确保其具有可执行权限:
[centos@host ~ ]$ sudo chmod +x /etc/rc.d/rc.local
注意:需要在系统管理用户(本例为 centos 用户)登录系统后才会自启动。
6)设置防火墙端口(CentOS8默认安装firewall防火墙),允许"22122" 端口(FastDFS Tracker Server 默认端口)访问服务器。
[centos@host ~ ]$ sudo firewall-cmd --zone=public --add-port=22122/tcp --permanent
[centos@host ~ ]$ sudo firewall-cmd --reload
7)管理调度服务器。
启动服务:
[centos@host ~ ]$ /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
启动/重新启动服务:
[centos@host ~ ]$ /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
停止服务:
[centos@host ~ ]$ /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop
查看服务状态:
[centos@host ~ ]$ sudo ps -ef | grep fdfs_trackerd
centos 65825 5765 0 5月14 ? 00:00:12 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
查看服务端口:
[centos@host ~ ]$ sudo netstat -ntap | grep fdfs_trackerd
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 65825/fdfs_trackerd
8、配置存储服务器(Storage Server)。
1)创建存储服务器工作子目录,并将系统管理用户设置为目录的拥有者。
[centos@host ~ ]$ sudo mkdir -p /data/fdfs/storage
[centos@host ~ ]$ sudo chown -R centos:centos /data/fdfs/storage
2)进入程序配置目录"/etc/fdfs",通过拷贝从模板文件中创建配置文件"storage.conf"。
[centos@host ~ ]$ sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
3)设置存储服务器配置文件参数。
使用文本编辑器打开配置文件:
[centos@host ~ ]$ sudo gedit /etc/fdfs/storage.conf
修改或验证文件中的以下参数并保存:
# 表示存储服务器的组标识。默认为group1 。
group_name = group1
# 表示调度服务器的 IP:PORT
# 可以配置多个调度服务器
# 127.0.0.1回路地址无效
tracker_server = 192.168.216.128:22122
# 表示工作目录位置。
base_path = /data/fdfs/storage
# 表示数据存储目录的数量。默认为1。
store_path_count = 1
# 可以配置多个数据存储目录,使用参数名后缀的序号区分,序号默认从0开始。
store_path0 = /data/fdfs/storage
# 表示服务监听的 IP 地址,设置为空时监听全部地址。默认为空。
bind_addr =
# 表示服务的端口号。默认为 23000 。
port = 23000
# 表示当前配置是否禁用,设置为 true 表示禁用,设置为 false 表示启用。默认为 false 。
disabled = false
# 表示连接超时的时长(单位为秒)。默认为30秒。
connect_timeout = 5
# 表示网络超时的时长(单位为秒)。默认为30秒。
network_timeout = 60
# 最大并发连接数。默认为256个。
max_connections = 1024
# 表示日志记录级别,记录级别依次为:emerg/alert/crit/error/warn/notice/info/debug。默认为info
log_level = info
# 表示运行该程序的用户组,为空表示当前用户组。默认为空。
run_by_group =
# 表示运行该程序的用户,为空表示当前用户。默认为空。
run_by_user =
# 客户端访问策略,* 表示所有客户端均可访问。默认为 * 。
# 例如:allow_hosts=10.0.1.[1-15,20]
allow_hosts = *
4)启动存储服务器。
[centos@host ~ ]$ /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
5)配置存储服务器开机自启动。
使用文本编辑器修改开机启动脚本文件:
[centos@host ~ ]$ sudo gedit /etc/rc.d/rc.local
在文件中追加内容并保存如下:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
修改开机启动脚本文件确保其具有可执行权限:
[centos@host ~ ]$ sudo chmod +x /etc/rc.d/rc.local
注意:需要在系统管理用户(本例为 centos 用户)登录系统后才会自启动。
6)设置防火墙端口(CentOS8默认安装firewall防火墙),允许"23000" 端口(FastDFS Storage Server 默认端口)访问服务器。
[centos@host ~ ]$ sudo firewall-cmd --zone=public --add-port=23000/tcp --permanent
[centos@host ~ ]$ sudo firewall-cmd --reload
7)管理存储服务器。
启动服务:
[centos@host ~ ]$ /usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
启动/重新启动服务:
[centos@host ~ ]$ /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
停止服务:
[centos@host ~ ]$ /usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop
查看服务状态:
[centos@host ~ ]$ sudo ps -ef | grep fdfs_storaged
centos 66979 5765 0 5月14 ? 00:00:20 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
查看服务端口:
[centos@host ~ ]$ sudo netstat -ntap | grep fdfs_storaged
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 66979/fdfs_storaged
9、配置本地客户端(FastDFS Client)。
1)创建客户端工作子目录,并将系统管理用户设置为目录的拥有者。
[centos@host ~ ]$ sudo mkdir -p /data/fdfs/client
[centos@host ~ ]$ sudo chown -R centos:centos /data/fdfs/client
2)进入程序配置目录"/etc/fdfs",通过拷贝从模板文件中创建配置文件"client.conf"。
[centos@host ~ ]$ sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
3)设置客户端配置文件参数。
使用文本编辑器打开配置文件:
[centos@host ~ ]$ sudo gedit /etc/fdfs/client.conf
修改或验证文件中的以下参数并保存:
# 表示工作目录位置。
base_path = /data/fdfs/client
# 表示调度服务器的 IP:PORT
# 可以配置多个调度服务器
tracker_server = 192.168.216.128:22122
# 表示连接超时的时长(单位为秒)。默认为30秒。
connect_timeout = 5
# 表示网络超时的时长(单位为秒)。默认为30秒。
network_timeout = 60
4)测试客户端上传文件。
[centos@host ~ ]$ /usr/bin/fdfs_test /etc/fdfs/client.conf upload test.txt
上传文件成功反馈消息
4.FastDFS+Nginx 单点部署
假设当前主机 IP 地址为:192.168.216.128
1、部署 FastDFS 单点服务器。
参照章节 "3.FastDFS 单点部署" 安装、配置调度服务器(Tracker Server)、存储服务器(Stroage Server)、客户端(FastDFS Client)。
从 FastDFS 源代码中拷贝 Web 服务配置文件到配置目录:
1)将 FastDFS 源代码目录下"conf"目录中的"http.conf"、"mime.types"、"anti-steal.jpg"文件拷贝到 FastDFS 配置文件目录中。
[centos@host ~ ]$ cd fastdfs-6.06/conf
[centos@host conf ]$ sudo cp http.conf mime.types anti-steal.jpg /etc/fdfs
2)设置"http.conf"文件参数。
使用文本编辑器打开配置文件:
[centos@host ~ ]$ sudo gedit /etc/fdfs/http.conf
修改文件中的以下参数并保存:
http.anti_steal.token_check_fail = /etc/fdfs/anti-steal.jpg
2、打开 FastDFS 下载页面【https://github.com/happyfish100/】,下载 fastdfs-nginx-module 的源代码 zip 或 tar.gz 包到用户主目录中。
FastDFS 下载页面3、解压缩 fastdfs-nginx-module 的源代码 tar 包到"/usr/src"目录下。
[centos@host ~]$ sudo tar -zxvf fastdfs-nginx-module-1.22.tar.gz -C /usr/src
[centos@host ~]$ ll /usr/src
drwxrwxr-x. 3 root root 47 11月 19 12:29 fastdfs-nginx-module-1.22
程序源代码目录是"/usr/src/fastdfs-nginx-module-1.22"。
4、创建 FastDFS Nginx 模块工作子目录,并将系统管理用户设置为目录的拥有者。
[centos@host ~ ]$ sudo mkdir -p /data/fdfs/mod_fastdfs
[centos@host ~ ]$ sudo chown -R centos:centos /data/fdfs/mod_fastdfs
5、将 "/程序源代码目录/src/mod_fastdfs.conf" 文件拷贝到 FastDFS 配置文件目录中。
[centos@host ~]$ sudo cp /usr/src/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs
6、设置 FastDFS Nginx 模块配置文件参数。
使用文本编辑器打开配置文件:
[centos@host ~ ]$ sudo gedit /etc/fdfs/mod_fastdfs.conf
修改或验证文件中的以下参数并保存:
# 表示存储服务器的组标识。默认为group1 。
group_name = group1
# 表示调度服务器的 IP:PORT
# 可以配置多个调度服务器
tracker_server = 192.168.216.128:22122
# 表示工作目录位置。
base_path = /data/fdfs/mod_fastdfs
# 表示数据存储目录的数量。默认为1。
store_path_count = 1
# 可以配置多个数据存储目录,使用参数名后缀的序号区分,序号默认从0开始。
store_path0 = /data/fdfs/storage
# 表示存储服务器的端口号。默认为23000。
storage_server_port = 23000
# 表示请求URI中是否包含从组名开始,设置为true时,uri格式为:/group1/M00/00/00/xxx;设置为false时,uri格式为:/M00/00/00/xxx。默认为false。
url_have_group_name = true
# 表示连接超时的时长(单位为秒)。默认为30秒。
connect_timeout = 2
# 表示网络超时的时长(单位为秒)。默认为30秒。
network_timeout = 60
# 表示日志记录级别,记录级别依次为:emerg/alert/crit/error/warn/notice/info/debug。
log_level = info
# 表示日志文件位置,为空表示输出到控制台。默认为空。
log_filename =
7、打开 Nginx 下载页面【http://nginx.org/en/download.html】,下载 Nginx 的源代码 tar.gz 包到用户主目录中。
图片.png8、验证并安装依赖软件。通过源代码编译的方式安装 Nginx,需要依赖软件"make"、"gcc"、"pcre"、"pcre-devel"、"zlib"、"zlib-devel"、"openssl"、"openssl-devel",验证或安装依赖软件。
[centos@host ~]$ sudo dnf install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
补充知识:
① "gcc"是一个C/C++、FORTRAN、JAVA、OBJC、ADA等多种语言的编译器,用来将源代码编译成可发布的软件程序。
② "make"是一个工程管理工具,能够根据 Makefile 中的脚本执行编译、安装流程。
③ "pcre"是一个正则表达式函数库;"pcre-devel"是它的开发库。
④ "zlib"是一个数据压缩函数库;"zib-devel"是它的开发库。
⑤ "openssl"是一个实现安全通信,避免窃听,同时确认另一端连接者身份的软件程序;"openssl-devel"是它的开发库。
9、解压缩 Nginx 的源代码 tar 包到用户主目录下。
[centos@host ~]$ tar -zxvf nginx-1.18.0.tar.gz
[centos@host ~]$ ll
drwxr-xr-x. 8 centos centos 4096 4月 21 22:09 nginx-1.18.0
10、安装 Nginx,进入源代码目录,配置、编译、安装程序。在配置 Nginx 时,需要指定"--add-module"参数,设置为 fastdfs-nginx-module 的程序源代码目录。
[centos@host ~]$ cd nginx-1.18.0
[centos@host nginx-1.18.0]$ ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream --add-module=/usr/src/fastdfs-nginx-module-1.22/src
Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
[centos@host nginx-1.18.0]$ make
[centos@host nginx-1.18.0]$ sudo make install
[centos@host ~]$ ll /usr/local/nginx
drwxr-xr-x. 2 root root 4096 5月 18 09:39 conf
drwxr-xr-x. 2 root root 40 5月 18 09:39 html
drwxr-xr-x. 2 root root 6 5月 18 09:39 logs
drwxr-xr-x. 2 root root 19 5月 18 09:39 sbin
程序安装目录是"/usr/local/nginx"。
11、设置 Nginx 配置文件参数。
使用文本编辑器打开配置文件:
[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf
修改或验证文件中的以下参数并保存:
http {
server {
# 监听端口
listen 80;
# 服务器域名(主机头)
server_name localhost;
# 资源URL前缀,设置存储服务器的"/组名/虚拟磁盘名"。
location /group1/M00/ {
# 资源根目录,设置为存储服务器的数据目录,工作目录下的"data"文件夹。
root /data/fdfs/storage/data;
# 声明启用 FastDFS Nginx 模块
ngx_fastdfs_module;
}
}
}
12、配置 Nginx 开机自启动。
使用文本编辑器创建配置文件:
[centos@host ~ ]$ sudo gedit /usr/lib/systemd/system/nginx.service
编写文件内容并保存如下:
[Unit]
Description=Nginx
After=syslog.target network.target
[Service]
Type=forking
User=root
Group=root
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
设置开机启动:
[centos@host ~ ]$ sudo systemctl daemon-reload
[centos@host ~ ]$ sudo systemctl enable nginx.service
13、启动 Nginx 服务。
[centos@host ~ ]$ sudo systemctl start nginx.service
14、设置防火墙端口(CentOS8默认安装firewall防火墙),允许"80"端口(Nginx 默认端口)访问服务器。
[centos@host ~ ]$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
[centos@host ~ ]$ sudo firewall-cmd --reload
15、测试通过 Nginx 访问文件。
1)上传测试文件。
[centos@host ~ ]$ /usr/bin/fdfs_test /etc/fdfs/client.conf upload test.txt
2)通过浏览器访问测试文件。
16、扩展 Nginx 客户端身份认证。
1)安装 httpd-tools 。
[centos@host ~ ]$ sudo dnf install httpd-tools
2)创建账户/口令数据文件。
[centos@host ~ ]$ sudo htpasswd -bc /usr/local/nginx/conf/auth.db root password
指令格式为:htpasswd -b[c] <数据文件位置> <账号> <口令>。参数 b 表示创建一组账号/口令,参数 c 表示创建数据文件。
3)设置 Nginx 配置文件参数。
使用文本编辑器打开配置文件:
[centos@host ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf
修改或验证文件中的以下参数并保存:
http {
server {
......
location / {
......
auth_basic "input password";
auth_basic_user_file /usr/local/nginx/conf/auth.db;
}
}
}
4)重新启动 Nginx 服务。
[centos@host ~ ]$ sudo systemctl restart nginx.service
17、Nginx 运维管理。
1)启动 Nginx 服务(任选一种方式)
[centos@host ~ ]$ sudo systemctl start nginx.service
或者
[centos@host ~ ]$ sudo -u /usr/local/nginx/sbin/nginx
2)停止 Nginx 服务(任选一种方式)
[centos@host ~ ]$ sudo systemctl stop nginx.service
或者
[centos@host ~ ]$ /usr/local/nginx/sbin/nginx -s quit
3)重启 Nginx 服务
[centos@host ~ ]$ sudo systemctl restart nginx.service
或者
[centos@host ~ ]$ /usr/local/nginx/sbin/nginx -s reload
4)查看 Nginx 服务状态
[centos@host ~ ]$ sudo systemctl status nginx.service
或者
[centos@host ~ ]$ sudo ps -ef | grep nginx
root 119777 1 0 10:16 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
[centos@host ~ ]$ sudo netstat -ntap | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 119777/nginx: maste
[centos@host ~ ]$ sudo tail /usr/local/nginx/logs/error.log
[centos@host ~ ]$ sudo tail /usr/local/nginx/logs/access.log
5)开启 Nginx 服务开机自启动
[centos@host ~ ]$ sudo systemctl enable nginx.service
6)禁用 Nginx 服务开机自启动
[centos@host ~ ]$ sudo systemctl disable nginx.service
5.FastDFS 集群部署
5.1.集群部署拓补图
FastDFS 分布式集群模式部署结构图网络资源规划:
1、调度服务器节点(Tracker Server Node)
节点名 | 主机名 | IP:PORT | 程序 | 操作系统 |
---|---|---|---|---|
Tracker 集群节点-1 | Tracker-1 | 192.168.216.128:22122 | FastDFS Tracker | CentOS8 |
Tracker 集群节点-2 | Tracker-2 | 192.168.216.129:22122 | FastDFS Tracker | CentOS8 |
Tracker 集群节点≥3 | Tracker-3 | 192.168.216.130:22122 | FastDFS Tracker | CentOS8 |
2、存储服务器节点(Storage Server Node)
节点名 | 主机名 | IP:PORT | 程序 | 操作系统 |
---|---|---|---|---|
Storage 集群节点-1 | G1_Storage-1 | 192.168.216.11:23000 | FastDFS Storage | CentOS8 |
Storage 集群节点-2 | G1_Storage-2 | 192.168.216.12:23000 | FastDFS Storage | CentOS8 |
Storage 集群节点-3 | G2_Storage-3 | 192.168.216.21:23000 | FastDFS Storage | CentOS8 |
Storage 集群节点≥4 | G2_Storage-4 | 192.168.216.22:23000 | FastDFS Storage | CentOS8 |
3、客户端(FastDFS Client)
- 节点名:FastDFS Client
- 主机名:Cllient
- IP地址:192.168.216.254
- 程序:FastDFS Client
- 操作系统:CentOS8
注意:调度服务器可以合并部署到存储服务器节点上。
5.2.FastDFS 集群部署
5.2.1.部署调度服务器
各个 "Tracker 集群节点" (Tracker-1、Tracker-2、Tracker-3)参照章节 "3.FastDFS 单点部署" 之第1-7步安装、配置调度服务器(Tracker Server)。
5.2.2.部署存储服务器
各个 "Storage 集群节点" (G1_Storage-1、G1_Storage-2、G2_Storage-3、G2_Storage-4)参照章节 "3.FastDFS 单点部署" 之第1-6、8步安装、配置存储服务器(Storage Server)。
集群部署中,在设置存储服务器配置文件(/etc/fdfs/storage.conf)参数时注意:
① group_name 属性:同一组存储节点的 group_name 设置值必须一致。
② tracker_server 属性:必须指定集群中全部可用的调度服务器(Tracker Server)。
③ 其他设置与单点部署基本一致。
- G1_Storage-1 和 G1_Storage-2 配置文件中的 group_name 和 tracker_server 属性配置如下:
# 同一组存储节点的 group_name 设置值必须一致。
group_name = group1
# 需要指定集群中全部可用的调度服务器(Tracker Server)
tracker_server = 192.168.216.128:22122
tracker_server = 192.168.216.129:22122
tracker_server = 192.168.216.130:22122
- G2_Storage-3 和 G2_Storage-4 配置文件中的 group_name 和 tracker_server 属性配置如下:
# 同一组存储节点的 group_name 设置值必须一致。
group_name = group2
# 需要指定集群中全部可用的调度服务器(Tracker Server)
tracker_server = 192.168.216.128:22122
tracker_server = 192.168.216.129:22122
tracker_server = 192.168.216.130:22122
5.2.3.部署 FastDFS Client 客户端
在 "FastDFS Client 节点" 上参照章节 "3.FastDFS 单点部署"之第1-6、9步安装、配置 FastDFS 客户端。
集群部署中,在设置客户端配置文件(/etc/fdfs/client.conf)参数时注意:
① tracker_server 属性:必须指定集群中全部可用的调度服务器(Tracker Server)。
② 其他设置与单点部署基本一致。
# 需要指定集群中全部可用的调度服务器(Tracker Server)
tracker_server = 192.168.216.128:22122
tracker_server = 192.168.216.129:22122
tracker_server = 192.168.216.130:22122
6.FastDFS+Keepalived+Nginx 集群部署
6.1.集群部署拓补图
FastDFS + Nginx + Keepalived 分布式集群模式部署结构图网络资源规划:
1、调度服务器节点(Tracker Server Node)
节点名 | 主机名 | IP:PORT | 程序 | 操作系统 |
---|---|---|---|---|
Tracker 集群节点-1 | Tracker-1 | 192.168.216.128:22122 | FastDFS Tracker | CentOS8 |
Tracker 集群节点-2 | Tracker-2 | 192.168.216.129:22122 | FastDFS Tracker | CentOS8 |
Tracker 集群节点≥3 | Tracker-3 | 192.168.216.130:22122 | FastDFS Tracker | CentOS8 |
2、Nginx Web 存储服务器节点(Nginx Web+Storage Server Node)
节点名 | 主机名 | IP:PORT | 程序 | 操作系统 |
---|---|---|---|---|
Storage 集群节点-1 | G1_Storage-1 | 192.168.216.11:23000 / 80 | FastDFS Storage / Nginx | CentOS8 |
Storage 集群节点-2 | G1_Storage-2 | 192.168.216.12:23000 / 80 | FastDFS Storage / Nginx | CentOS8 |
Storage 集群节点-3 | G2_Storage-3 | 192.168.216.21:23000 / 80 | FastDFS Storage / Nginx | CentOS8 |
Storage 集群节点≥4 | G2_Storage-4 | 192.168.216.22:23000 / 80 | FastDFS Storage / Nginx | CentOS8 |
3、Nginx Proxy 高可用服务器节点(Nginx Proxy+Keepalived Server Node)
节点名 | 主机名 | IP:PORT | 程序 | 操作系统 |
---|---|---|---|---|
Proxy 集群节点-1 | Proxy-1 | 192.168.216.91:80 / 112 | Nginx / Keepalived | CentOS8 |
Proxy 集群节点-2 | Proxy-2 | 192.168.216.92:80 / 112 | Nginx / Keepalived | CentOS8 |
Proxy 集群节点≥3 | Proxy-3 | 192.168.216.93:80 / 112 | Nginx / Keepalived | CentOS8 |
Keepalived Virtual IP:192.168.216.90。
4、客户端(FastDFS Client)
- 节点名:FastDFS Client
- 主机名:Client
- IP地址:192.168.216.254
- 程序:FastDFS Client / Firefox
- 操作系统:CentOS8
注意:调度服务器可以合并部署到 Nginx Web 存储服务器节点上。
6.2.FastDFS+Keepalived+Nginx 集群部署
6.2.1.部署调度服务器
各个 "Tracker 集群节点"(Tracker-1、Tracker-2、Tracker-3)参照章节 "3.FastDFS 单点部署" 之第1-7步安装、配置调度服务器(Tracker Server)。
6.2.2.部署 Nginx Web 存储服务器
1、各个 "Storage 集群节点"(G1_Storage-1、G1_Storage-2、G2_Storage-3、G2_Storage-4)参照章节 "3.FastDFS 单点部署" 之第1-6、8步安装、配置存储服务器(Storage Server)。
集群部署中,在设置存储服务器配置文件(/etc/fdfs/storage.conf)参数时注意:
① group_name 属性:同一组存储节点的 group_name 设置值必须一致。
② tracker_server 属性:必须指定集群中全部可用的调度服务器(Tracker Server)。
③ 其他设置与单点部署基本一致。
- G1_Storage-1 和 G1_Storage-2 配置文件中的 group_name 和 tracker_server 属性配置如下:
# 同一组存储节点的 group_name 设置值必须一致。
group_name = group1
# 需要指定集群中全部可用的调度服务器(Tracker Server)
tracker_server = 192.168.216.128:22122
tracker_server = 192.168.216.129:22122
tracker_server = 192.168.216.130:22122
- G2_Storage-3 和 G2_Storage-4 配置文件中的 group_name 和 tracker_server 属性配置如下:
# 同一组存储节点的 group_name 设置值必须一致。
group_name = group2
# 需要指定集群中全部可用的调度服务器(Tracker Server)
tracker_server = 192.168.216.128:22122
tracker_server = 192.168.216.129:22122
tracker_server = 192.168.216.130:22122
2、各个 "Storage 集群节点"(G1_Storage-1、G1_Storage-2、G2_Storage-3、G2_Storage-4)参照章节 "4.FastDFS+Nginx 单点部署" 安装、配置 Nginx Web 服务器。
集群部署中,在设置 FastDFS Nginx 模块配置文件(/etc/fdfs/mod_fastdfs.conf)参数时注意:
① group_name 属性:本地存储服务器所属的组名称。
② tracker_server 属性:必须指定集群中全部可用的调度服务器(Tracker Server)。
③ 其他设置与单点部署基本一致。
- G1_Storage-1 和 G1_Storage-2 配置文件中的 group_name 和 tracker_server 属性配置如下:
# 与本地存储服务器配置文件中的 group_name 设置值必须一致。
group_name = group1
# 需要指定集群中全部可用的调度服务器(Tracker Server)
tracker_server = 192.168.216.128:22122
tracker_server = 192.168.216.129:22122
tracker_server = 192.168.216.130:22122
- G2_Storage-3 和 G2_Storage-4 配置文件中的 group_name 和 tracker_server 属性配置如下:
# 与本地存储服务器配置文件中的 group_name 设置值必须一致。
group_name = group2
# 需要指定集群中全部可用的调度服务器(Tracker Server)
tracker_server = 192.168.216.128:22122
tracker_server = 192.168.216.129:22122
tracker_server = 192.168.216.130:22122
集群部署中,在设置 Nginx 配置文件(/usr/local/nginx/conf/nginx.conf)参数时注意:
① location 属性:设置本地存储服务器的"/组名/虚拟磁盘名"。
③ 其他设置与单点部署基本一致。
- G1_Storage-1 和 G1_Storage-2 配置文件中的 location 属性配置如下:
http {
server {
......
# 设置本地存储服务器的"/组名/虚拟磁盘名"。组名必须与本地存储服务器配置文件中的 group_name 设置值必须一致。
location /group1/M00/ {
......
}
}
}
- G2_Storage-3 和 G2_Storage-4 配置文件中的 location 属性配置如下:
http {
server {
......
# 设置本地存储服务器的"/组名/虚拟磁盘名"。组名必须与本地存储服务器配置文件中的 group_name 设置值必须一致。
location /group2/M00/ {
......
}
}
}
6.2.3.部署 Nginx Proxy 服务器
在各个 "Proxy 集群节点" (Proxy-1、Proxy-2、Proxy-3)安装、配置 Nginx。以 "Proxy-1" 为例:
1、打开 Nginx 下载页面【http://nginx.org/en/download.html】,下载 Nginx 的源代码 tar.gz 包到用户主目录中。
图片.png2、验证并安装依赖软件。通过源代码编译的方式安装 Nginx,需要依赖软件"make"、"gcc"、"pcre"、"pcre-devel"、"zlib"、"zlib-devel"、"openssl"、"openssl-devel",验证或安装依赖软件。
[centos@Proxy-1 ~]$ sudo dnf install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
补充知识:
① "gcc"是一个C/C++、FORTRAN、JAVA、OBJC、ADA等多种语言的编译器,用来将源代码编译成可发布的软件程序。
② "make"是一个工程管理工具,能够根据 Makefile 中的脚本执行编译、安装流程。
③ "pcre"是一个正则表达式函数库;"pcre-devel"是它的开发库。
④ "zlib"是一个数据压缩函数库;"zib-devel"是它的开发库。
⑤ "openssl"是一个实现安全通信,避免窃听,同时确认另一端连接者身份的软件程序;"openssl-devel"是它的开发库。
3、解压缩 Nginx 的源代码 tar 包到用户主目录下。
[centos@Proxy-1 ~]$ tar -zxvf nginx-1.18.0.tar.gz
[centos@Proxy-1 ~]$ ll
drwxr-xr-x. 8 centos centos 4096 4月 21 22:09 nginx-1.18.0
4、安装 Nginx,进入源代码目录,配置、编译、安装程序。
[centos@Proxy-1 ~]$ cd nginx-1.18.0
[centos@Proxy-1 nginx-1.18.0]$ ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
Configuration summary
+ using system PCRE library
+ OpenSSL library is not used
+ using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
[centos@Proxy-1 nginx-1.18.0]$ make
[centos@Proxy-1 nginx-1.18.0]$ sudo make install
[centos@Proxy-1 ~]$ ll /usr/local/nginx
drwxr-xr-x. 2 root root 4096 5月 18 09:39 conf
drwxr-xr-x. 2 root root 40 5月 18 09:39 html
drwxr-xr-x. 2 root root 6 5月 18 09:39 logs
drwxr-xr-x. 2 root root 19 5月 18 09:39 sbin
程序安装目录是"/usr/local/nginx"。
5、设置 Nginx 配置文件参数。
使用文本编辑器打开配置文件:
[centos@Proxy-1 ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf
修改或验证文件中的以下参数并保存:
http {
# 第一组存储服务器负载均衡(G1_Storage-1 和 G1_Storage-2)
upstream fdfs.group1 {
server 192.168.216.11:80 weight=1;
server 192.168.216.12:80 weight=1;
}
# 第二组存储服务器负载均衡(G2_Storage-3 和 G2_Storage-4)
upstream fdfs.group2 {
server 192.168.216.21:80 weight=1;
server 192.168.216.22:80 weight=1;
}
server {
# 监听端口
listen 80;
# 服务器域名(主机头)
server_name localhost;
# 第一组存储服务器上的文件资源URL前缀,设置存储服务器的"/组名/虚拟磁盘名"。
location /group1/M00 {
# 代理转发的地址,格式为:"协议(http:// 或 https://)" + "upstream 设置值(本例为 upstream fdfs.group1)" 。
proxy_pass http://fdfs.group1;
# 代理转发时提交的客户端认证信息(若代理服务已设置客户端身份认证时配置),格式:"<账号>:<密码>" 的 base64 编码。
# 可以使用 "echo <账号>:<密码> | base64" 获取字符串的 base64 编码。
# 如:[centos@host ~ ]$ echo root:passwd | base64
# cm9vdDpwYXNzd2QK
# proxy_set_header Authorization "Basic cm9vdDpwYXNzd2QK";
}
# 第二组存储服务器上的文件资源URL前缀,设置存储服务器的"/组名/虚拟磁盘名"。
location /group2/M00 {
# 代理转发的地址,格式为:"协议(http:// 或 https://)" + "upstream 设置值(本例为 upstream fdfs.group2)" 。
proxy_pass http://fdfs.group2;
# 代理转发时提交的客户端认证信息(若代理服务已设置客户端身份认证时配置),格式:"<账号>:<密码>" 的 base64 编码。
# 可以使用 "echo <账号>:<密码> | base64" 获取字符串的 base64 编码。
# 如:[centos@host ~ ]$ echo root:passwd | base64
# cm9vdDpwYXNzd2QK
# proxy_set_header Authorization "Basic cm9vdDpwYXNzd2QK";
}
}
}
6、配置 Nginx 开机自启动。
使用文本编辑器创建配置文件:
[centos@Proxy-1 ~ ]$ sudo gedit /usr/lib/systemd/system/nginx.service
编写文件内容并保存如下:
[Unit]
Description=Nginx
After=syslog.target network.target
[Service]
Type=forking
User=root
Group=root
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
设置开机启动:
[centos@Proxy-1 ~ ]$ sudo systemctl daemon-reload
[centos@Proxy-1 ~ ]$ sudo systemctl enable nginx.service
7、启动 Nginx 服务。
[centos@Proxy-1 ~ ]$ sudo systemctl start nginx.service
8、设置防火墙端口(CentOS8默认安装firewall防火墙),允许"80"端口(Nginx 默认端口)访问服务器。
[centos@Proxy-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
[centos@Proxy-1 ~ ]$ sudo firewall-cmd --reload
注意:其他 "Proxy 集群节点" 全部需要按照以上步骤配置。
9、扩展 Nginx 客户端身份认证。
1)安装 httpd-tools 。
[centos@Proxy-1 ~ ]$ sudo dnf install httpd-tools
2)创建账户/口令数据文件。
[centos@Proxy-1 ~ ]$ sudo htpasswd -bc /usr/local/nginx/conf/auth.db root password
指令格式为:htpasswd -b[c] <数据文件位置> <账号> <口令>。参数 b 表示创建一组账号/口令,参数 c 表示创建数据文件。
3)设置 Nginx 配置文件参数。
使用文本编辑器打开配置文件:
[centos@Proxy-1 ~ ]$ sudo gedit /usr/local/nginx/conf/nginx.conf
修改或验证文件中的以下参数并保存:
http {
server {
......
location / {
......
auth_basic "input password";
auth_basic_user_file /usr/local/nginx/conf/auth.db;
}
}
}
4)重新启动 Nginx 服务。
[centos@Proxy-1 ~ ]$ sudo systemctl restart nginx.service
10、Nginx 运维管理。
1)启动 Nginx 服务(任选一种方式)
[centos@Proxy-1 ~ ]$ sudo systemctl start nginx.service
或者
[centos@Proxy-1 ~ ]$ sudo -u /usr/local/nginx/sbin/nginx
2)停止 Nginx 服务(任选一种方式)
[centos@Proxy-1 ~ ]$ sudo systemctl stop nginx.service
或者
[centos@Proxy-1 ~ ]$ /usr/local/nginx/sbin/nginx -s quit
3)重启 Nginx 服务
[centos@Proxy-1 ~ ]$ sudo systemctl restart nginx.service
或者
[centos@Proxy-1 ~ ]$ /usr/local/nginx/sbin/nginx -s reload
4)查看 Nginx 服务状态
[centos@Proxy-1 ~ ]$ sudo systemctl status nginx.service
或者
[centos@Proxy-1 ~ ]$ sudo ps -ef | grep nginx
root 119777 1 0 10:16 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
[centos@Proxy-1 ~ ]$ sudo netstat -ntap | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 119777/nginx: maste
[centos@Proxy-1 ~ ]$ sudo tail /usr/local/nginx/logs/error.log
[centos@Proxy-1 ~ ]$ sudo tail /usr/local/nginx/logs/access.log
6.2.4.部署 Nginx Proxy Keepalived 服务器
在各个 "Proxy 集群节点" (Proxy-1、Proxy-2、Proxy-3)安装、配置 Keepalived。以 "Proxy-1" 为例:
1、安装 EPEL 的 Yum源。
使用文本编辑器创建仓库配置文件:
[centos@Proxy-1 ~ ]$ sudo gedit /etc/yum.repos.d/epel.repo
在文件中编写以下内容并保存:
[epel-modular]
name=Extra Packages for Enterprise Linux Modular $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Modular/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8
更新 Yum 源:
[centos@Proxy-1 ~]$ sudo dnf clean all
[centos@Proxy-1 ~]$ sudo dnf makecache
Extra Packages for Enterprise Linux Modular 8 - 429 kB/s | 118 kB 00:00
Extra Packages for Enterprise Linux 8 - x86_64 3.7 MB/s | 6.9 MB 00:01
元数据缓存已建立。
EPEL(Extra Packages for Enterprise Linux)是企业级 Linux 操作系统的扩展包仓库,为 Redhat/CentOS系统提供大量的额外软件包。
2、安装 Keepalived。
[centos@Proxy-1 ~]$ sudo dnf install keepalived
程序安装目录是"/usr/sbin",配置文件目录是"/etc/keepalived"。
3、设置 Keepalived 配置文件参数。
使用文本编辑器打开配置文件:
[centos@Proxy-1 ~ ]$ sudo gedit /etc/keepalived/keepalived.conf
在文件中编写以下内容并保存:
# 定义全局配置
global_defs {
# 本地节点 ID 标识,一般设置为主机名。
router_id Proxy-1
}
# 定义周期性执行的脚本,脚本的退出状态码会被调用它的所有的 vrrp_instance 记录。
vrrp_script chk_nginx {
# 执行脚本的路径。
script "/etc/keepalived/nginx_check.sh"
# 脚本执行的间隔(单位是秒)。默认为1s。
interval 2
# 当脚本调整优先级,从 -254 到 254。默认为2。
# 1. 如果脚本执行成功(退出状态码为0),weight大于0,则priority增加。
# 2. 如果脚本执行失败(退出状态码为非0),weight小于0,则priority减少。
# 3. 其他情况下,priority不变。
weight -20
# 当脚本执行超过时长(单位是秒)则被认为执行失败。
# 运行脚本的用户和组。
user root root
# timeout 30
# 当脚本执行成功到设定次数时,才认为是成功。
# rise 1
# 当脚本执行失败到设定次数时,才认为是失败。
# fall 3
}
# 定义虚拟路由,可以定义多个。
vrrp_instance VI_1 {
# 本地节点初始状态,包括 MASTER(主节点) 和 BACKUP (备节点)。
state MASTER
# 本地节点绑定虚拟 IP 的网络接口。
interface ens33
# 本地节点优先级,优先级高的节点将动态变成 MASTER 节点,接管 VIP 。初始状态下,MASTER 节点的优先级必须高于 BACKUP 节点。
priority 100
# VRRP 实例 ID,范围是0-255。同一集群的所有节点应设置一致的值。
virtual_router_id 216
# 组播信息发送时间间隔。同一集群的所有节点必须设置一样,默认为1秒。
advert_int 1
# 设置验证信息。同一集群的所有节点必须一致
authentication {
# 指定认证方式。PASS 表示简单密码认证(推荐);AH:IPSEC认证(不推荐)。
auth_type PASS
# 指定认证所使用的密码,最多8位。
auth_pass 1111
}
# 声明调用已定义的 vrrp_script 脚本。
track_script {
chk_nginx
}
# 定义虚拟 IP 地址。
virtual_ipaddress {
192.168.216.90
}
}
# 定义对外提供服务 LVS (负载均衡)的 VIP 和 端口(当端口号设置为【0】时,表示所有端口),只实现高可用时可不配置。
# 注意:本方案中,通过 Nginx Proxy 实现 Nginx Web 负载均衡,Keepalived 只实现高可用,因此负载均衡既可以不配置,也可以配置成 Nginx Proxy 的负载均衡;当没有 Nginx Proxy 时,可以直接配置成 Nginx Web 的负载均衡。
virtual_server 192.168.216.90 80 {
# 设置健康检查时间,单位是秒
delay_loop 6
#负载均衡调度算法
lb_algo rr
# 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
lb_kind DR
# VIP 子网掩码
nat_mask 255.255.255.0
# 会话保持时间,一定时间之内用户无响应则下一次用户请求时需重新路由,一般设为0,表示不需要
persistence_timeout 0
# 网络协议
protocol TCP
# 定义后端 RealServer 的真实服务器属性,IP 地址和端口(当端口号设置为【0】时,表示所有端口)
real_server 192.168.216.91 80 {
# 配置节点权值,数字越大权重越高
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.216.92 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.216.93 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
初始化的主节点和备节点的区别体现在以下参数中:
- 初始主节点
vrrp_instance VI_1 {
# 必须设置为 MASTER 。
state MASTER
# 必须设置为最大值。
priority 100
}
- 初始备节点
vrrp_instance VI_1 {
# 必须设置为 BACKUP 。
state BACKUP
# 必须设置为小于主节点的值。
priority 90
}
4、创建或编辑 Nginx 检测脚本文件。文件路径对应配置文件中 vrrp_script 的 script 设置值。
使用文本编辑器创建脚本文件:
[centos@Proxy-1 ~ ]$ sudo gedit /etc/keepalived/nginx_check.sh
在脚本文件中编写以下内容并保存:
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
/usr/local/nginx/sbin/nginx
sleep 2
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
killall -9 keepalived
fi
fi
给脚本文件增加可执行权限:
[centos@Proxy-1 ~ ]$ sudo chmod 755 /etc/keepalived/nginx_check.sh
5、配置 Keepalived 系统服务。
使用文本编辑器创建配置文件:
[centos@Proxy-1 ~ ]$ sudo gedit /usr/lib/systemd/system/keepalived.service
验证或修改文件内容并保存如下:
[Unit]
Description=LVS and VRRP High Availability Monitor
After=network-online.target syslog.target nginx.service
Wants=network-online.target
Requires=nginx.service
[Service]
Type=forking
User=root
Group=root
PIDFile=/var/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
重新加载系统服务管理器:
[centos@Proxy-1 ~ ]$ sudo systemctl daemon-reload
6、设置防火墙端口(CentOS8默认安装firewall防火墙),允许"112"端口(Keepalived 默认端口)访问服务器。
[centos@Proxy-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=112/tcp --permanent
[centos@Proxy-1 ~ ]$ sudo firewall-cmd --reload
7、启动/重启 Keepalived 服务(不建议设置为开机自启动)。
启动 Keepalived 服务之前,应确保已正确启动了各节点的 Nginx 服务。各节点的启动或重启的顺序为:① 启动 Keepalived 主节点;② 依次启动 Keepalived 备节点。
[centos@Proxy-1 ~ ]$ sudo systemctl restart keepalived.service
8、启动 Keepalived 可能因为各种未知的原因失败,主要是由于引发了 SELinux 异常。有关如何解决 SELinux 引起的异常,请阅读文章《RedHat/CentOS8【SELinux】引起的安全策略问题解决方案》,文章地址【https://www.jianshu.com/p/a13f974f8bae】。
注意:其他 "Proxy 集群节点" 全部需要按照以上步骤配置。
6.2.5.部署客户端
1、 在 "FastDFS Client 节点" 上参照章节 "3.FastDFS 单点部署"之第1-6、9步安装、配置 FastDFS Client 客户端。
集群部署中,在设置客户端配置文件(/etc/fdfs/client.conf)参数时注意:
① tracker_server 属性:必须指定集群中全部可用的调度服务器(Tracker Server)。
② 其他设置与单点部署基本一致。
# 需要指定集群中全部可用的调度服务器(Tracker Server)
tracker_server = 192.168.216.128:22122
tracker_server = 192.168.216.129:22122
tracker_server = 192.168.216.130:22122
2、 在 "FastDFS Client 节点" 上通过浏览器使用虚拟 IP 访问测试文件。
7.Java开发集成示例
fastdfs-client-java 是 FastDFS 的 JavaAPI 包,以下是 Maven 项目的程序案例。
1、从 Maven 库中引入 fastdfs-client-java 包。
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-SNAPSHOT</version>
</dependency>
2、编写 FastDFS 连接文件 "fastdfs.properties"。
#Tracker Server IP地址
fastdfs.tracker_servers=192.168.216.128:22122,192.168.216.129:22122,192.168.216.130:22122
#连接soTimeout设置
fastdfs.soTimeout=10000
#连接超时设置
fastdfs.connectTimeout=5000
#连接池 maxTotal
fastdfs.maxTotal=200
#连接池 maxTotalPerKey
fastdfs.maxTotalPerKey=200
#连接池 maxIdlePerKey 最大空闲连接数(影响并发性能)
fastdfs.maxIdlePerKey=50
3、编写 FastDFS 会话类 "FastDFSSession.java"。
/**
*
* FastDFS Libs
*
* ©2018 张毅
*
*/
package zh.fdfs;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.FileInfo;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
/**
* FastDFS 会话类 (FastDFS Session)
*/
public class FastDFSSession {
/** FastDFS Tracker 客户端 */
private static TrackerClient trackerClient;
/** FastDFS Tracker 服务器端 */
private static TrackerServer trackerServer;
/** FastDFS Storage 服务器端 */
private static StorageServer storageServer;
/** FastDFS Storage 客户端 */
private static StorageClient storageClient;
/**
* 获取FastDFS Tracker 客户端。
*
* @return FastDFS Tracker 客户端。
*/
protected static TrackerClient getTrackerClient() {
return trackerClient;
}
/**
* 获取FastDFS Tracker 服务器端。
*
* @return FastDFS Tracker 服务器端。
*/
protected static TrackerServer getTrackerServer() {
return trackerServer;
}
/**
* 获取FastDFS Storage 服务器端。
*
* @return FastDFS Storage 服务器端。
*/
protected static StorageServer getStorageServer() {
return storageServer;
}
/**
* 获取FastDFS Storage 客户端。
*
* @return FastDFS Storage 客户端。
*/
protected static StorageClient getStorageClient() {
return storageClient;
}
/**
* 构造器。
*
* @param propFileName 配置文件名字。
* @param groupName Storage组名字。
*/
static {
try {
ClientGlobal.initByProperties("fastdfs.properties");
trackerClient = new TrackerClient(ClientGlobal.g_tracker_group);
trackerServer = trackerClient.getConnection();
storageServer = trackerClient.getStoreStorage(trackerServer);
storageClient = new StorageClient1(trackerServer, storageServer);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 上传文件。
*
* @param buffer 文件流。
* @param extName 文件扩展名。
* @param metaList 文件元数据。
* @return FastDFS 文件组名和ID。
*/
public static String[] upload(byte[] buffer, String extName, NameValuePair[] metaList) {
try {
String[] fileids = getStorageClient().upload_file(buffer, extName, metaList);
return fileids;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 上传文件。
*
* @param localFilePath 本地文件路径。
* @param extName 文件扩展名。
* @param metaList 文件元数据。
* @return FastDFS 文件组名和ID。
*/
public static String[] upload(String localFilePath, String extName, NameValuePair[] metaList) {
try {
String[] fileids = getStorageClient().upload_file(localFilePath, extName, metaList);
return fileids;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 上传文件。
*
* @param file 文件模型。
* @param extName 文件扩展名。
* @param metaList 文件元数据。
* @return FastDFS 文件组名和ID。
*/
public static String[] upload(File file, String extName, NameValuePair[] metaList) {
try {
if (file != null && file.isFile()) {
byte[] buffer = null;
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int n;
while ((n = fis.read(b)) != -1) {
bos.write(b, 0, n);
}
fis.close();
bos.close();
buffer = bos.toByteArray();
String[] fileids = getStorageClient().upload_file(buffer, extName, metaList);
return fileids;
} else {
return null;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 下载文件。
*
* @param group FastDFS 组名.
* @param fileid FastDFS 文件ID.
* @return 文件流。
*/
public static byte[] download(String group, String fileid) {
byte[] buffer;
try {
buffer = getStorageClient().download_file(group, fileid);
} catch (Exception e) {
throw new RuntimeException(e);
}
return buffer;
}
/**
* 下载文件。
*
* @param group FastDFS 组名.
* @param fileid FastDFS 文件ID.
* @param localFilePath 本地文件路径.
* @return 操作成功返回0,非0则操作失败,返回错误代码。
*/
public static int download(String group, String fileid, String localFilePath) {
try {
int result = getStorageClient().download_file(group, fileid, localFilePath);
return result;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 获取文件信息。
*
* @param group FastDFS 组名.
* @param fileid FastDFS 文件ID.
* @return 文件信息模型。
*/
public static FileInfo getFileInfo(String group, String fileid) {
try {
FileInfo info = getStorageClient().get_file_info(group, fileid);
return info;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 获取文件元数据。
*
* @param group FastDFS 组名.
* @param fileid FastDFS 文件ID.
* @return 文件元数据模型。
*/
public static NameValuePair[] getMetadata(String group, String fileid) {
try {
NameValuePair[] metas = getStorageClient().get_metadata(group, fileid);
return metas;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 删除文件。
*
* @param group FastDFS 组名.
* @param fileid FastDFS 文件ID.
* @return 操作成功返回0,非0则操作失败,返回错误代码。
*/
public static int delete(String group, String fileid) {
try {
int result = getStorageClient().delete_file(group, fileid);
return result;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
4、编写主程序。
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.FileInfo;
public class App {
public static void main(String[] args) {
// 上传文件
String localFilePath = "fastdfs.txt";
NameValuePair wnvps[] = new NameValuePair[] { new NameValuePair("title", "测试文件"),
new NameValuePair("summary", "摘要信息") };
String fileIds[] = FastDFSSession.upload(localFilePath, "txt", wnvps);
System.out.println("组名:" + fileIds[0]);
System.out.println("文件ID: " + fileIds[1]);
// 下载文件
byte[] data = FastDFSSession.download("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.txt");
System.out.println(data);
try {
FileOutputStream fos = new FileOutputStream("fastdfs.txt");
fos.write(data, 0, data.length);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 获取文件系信息
FileInfo fi = FastDFSSession.getFileInfo("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.txt");
System.out.println(fi.getSourceIpAddr());
System.out.println(fi.getFileSize());
System.out.println(fi.getCreateTimestamp());
System.out.println(fi.getCrc32());
// 获取文件元数据
NameValuePair rnvps[] = FastDFSSession.getMetadatas("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.txt");
for (NameValuePair rnvp : rnvps) {
System.out.println(rnvp.getName() + ":" + rnvp.getValue());
}
// 删除文件
int i = FastDFSSession.delete("group1", "M00/00/00/wKgRcFV_08OAK_KCAAAA5fm_sy874.txt");
System.out.println(i == 0 ? "删除成功" : "删除失败:" + i);
}
}