Linux->Ubuntu安装FastDFS文件存储系统


一、FastDFS是什么?

FastDFS是分布式文件存储系统,由tracker 和 storage构成。

注意:

fdfs_trackerd /etc/fdfs/tracker.conf start在集群中会报错
所以建议使用/etc/init.d/fdfs_trackerd start

我只更改了启动方式,版本是5.0.8
在这里插入图片描述
但是可能有这个警告,换个5.11版本就好了…
在这里插入图片描述

二、安装前环境准备

0:ubuntu命令

1. ll

sudo vim ~/.bashrc
修改alias ll='ls -Alf' -> alias ll='ls -l'
保存
source ~/.bashrc

在这里插入图片描述

①:安装参考链接

https://www.cnblogs.com/yufeng218/p/8111961.html

②:所需安装包下载链接:

wget https://sourceforge.net/projects/fastdfs/files/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
http://nginx.org/download/

③:ubuntu 编译安装nginx 需要的依赖

sudo apt-get install libpcre3 libpcre3-dev openssl libssl-dev unzip libpcre3 libpcre3-dev zlib1g zlib1g-dev gcc -y

④:安装libfastcommon

1、下载 libfastcommonV1.0.7.tar.gz到ubuntu机器上;
2、将 libfastcommonV1.0.7.tar.gz解压至/usr/local/下:
3、 tar -zxvf libfastcommonV1.0.7.tar.gz -C /usr/local/
4、 切换目录到:/usr/local/libfastcommon-1.0.7/ 下,接着进行编译和安装;
5、cd /usr/local/libfastcommon-1.0.7/
./make.sh #编译
./make.sh install #安装
注:sudo unzip libfastcommon-master.zip -d /usr/local
成功:
在这里插入图片描述
创建软连接:
因为 FastDFS 主程序设置的 lib 目录是/usr/local/lib,所以需要创建函数库软链接

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

sudo ln -sf /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so

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

sudo ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

⑤:安装tracker

1、下载 FastDFS_v5.05.tar.gz 到 ubuntu上;
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
2、将FastDFS_v5.05.tar.gz 解压至/usr/local/下
sudo tar -zxvf FastDFS_v5.05.tar.gz -C /usr/local
3、切换目录到: /usr/local/FastDFS/ 下,编译和安装;
cd /usr/local/FastDFS/
sudo ./make.sh && sudo ./make.sh install
成功:
在这里插入图片描述
4、安装成功将安装目录下的conf下的这三个文件拷贝到/etc/fdfs/下;

sudo cp http.conf mime.types storage_ids.conf /etc/fdfs/

在这里插入图片描述
5、配置和启动tracker
a、切换目录到: /etc/fdfs/ 目录下;
b、拷贝一份新的tracker配置文件

sudo cp tracker.conf.sample tracker.conf

c、修改tracker.conf ;
sudo vim tracker.conf
base_path=/home/yuqing/fastdfs 改为: base_path=/data/fastdfs/tracker
base_path=/data/fastdfs/tracker
6、启动tracker,运行如下命令:

方法1:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
= fdfs_trackerd /etc/fdfs/tracker.conf restart
方法2:
/etc/init.d/fdfs_trackerd start

启动成功:
在这里插入图片描述

⑥:安装storage

1、切换目录到: /etc/fdfs/ 目录下;
cd /etc/fdfs/
2、拷贝一份新的storage配置文件
cp storage.conf.sample storage.conf
3、修改storage.conf ;
vim storage.conf
group_name=group1 #配置组名
base_path=/home/yuqing/fastdfs 改为:base_path=/data/fastdfs/storage/base

#store存放文件的位置(store_path)
store_path0=/home/yuqing/fastdfs 改为: store_path0=/data/fastdfs/storage/store
#如果有多个挂载磁盘则定义多个store_path,如下
#store_path1=…
#store_path2=…
#配置tracker服务器:IP
tracker_server=192.168.1.66:22122
#如果有多个则配置多个tracker
#tracker_server=192.168.1.189:22122

4、创建 /data/fastdfs/storage/base 和/data/fastdfs/storage/store 目录
mkdir -p /data/fastdfs/storage/base /data/fastdfs/storage/store
5、启动storage, 运行命令如下:

与tracker一样两种方式,不赘述了哈
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start

成功:
在这里插入图片描述
6、使用FastDFS自带工具测试
a、切换目录到 /etc/fdfs/ 目录下;
cd /etc/fdfs/
b、拷贝一份新的client配置文件
cp client.conf.sample client.conf
d、修改client.conf ;
vim client.conf
修改基本路径和tracker_server如下:

注意:若tracker有多个,可以配置多个,如下:
在这里插入图片描述
#tracker_server=…

#tracker_server=…
e、进行测试,运行如下

fdfs_test /etc/fdfs/client.conf upload client.conf

在这里插入图片描述

⑦:FastDFS 和nginx整合

1、在每个tracker上安装nginx的主要目的是做负载均衡及实现高可用。如果只有一台tracker可以不配置nginx。 一个tracker对应多个storage,通过nginx对storage负载均衡;
2、在storage 上安装nginx
a、下载fastdfs-nginx-module_v1.16.tar.gz 到ubuntu服务器上;
wget https://sourceforge.net/projects/fastdfs/files/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz
b、解压 fastdfs-nginx-module_v1.16.tar.gz 到 /usr/local目录下;
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz -C /usr/local
c、切换目录到: /usr/local/fastdfs-nginx-module/src/ 目录下
cd /usr/local/fastdfs-nginx-module/src/
d、修改config文件,将文件中的所有 /usr/local/ 路径改为 /usr/
改之前:
在这里插入图片描述
改之后:
在这里插入图片描述
e、将fastdfs-nginx-module/src下的mod_fastdfs.conf拷贝至/etc/fdfs/下

sudo cp mod_fastdfs.conf /etc/fdfs/
并修改 /etc/fdfs/mod_fastdfs.conf 的内容;
vi /etc/fdfs/mod_fastdfs.conf

base_path=/home/fastdfs
tracker_server=192.168.1.66:22122
#tracker_server=192.168.1.189:22122 #(多个tracker配置多行)
url_have_group_name=true #url中包含group名称
store_path0=/data/fastdfs/storage/store #指定文件存储路径(上面配置的store路径)

在这里插入图片描述

创建网络访问存储服务的软连接

在上传文件到FastDFS后,FastDFS会返回group1/M00/00/00/xxxxxxxxxx.xxx。其中group1是卷名,在mod_fastdfs.conf配置文件中已配置了url_have_group_name,以保证URL解析正确。

而其中的M00是FastDFS保存数据时使用的虚拟目录,需要将这个虚拟目录定位到真实数据目录上。

sudo ln -s /data/fastdfs/storage/store/data/   /data/fastdfs/storage/store/data/M00

⑧:Nginx的安装
1、下载nginx-1.8.0.tar.gz 到ubuntu服务器上;
http://nginx.org/download/
2、解压 nginx-1.8.0.tar.gz 到 /usr/local目录下;

sudo tar -zxvf nginx-1.8.0.tar.gz -C /usr/local/

省略3.4.5,直接编译安装

sudo ./configure --prefix=/usr/local/tengine --add-module=/usr/local/fastdfs-nginx-module/src

3、安装nginx的依赖库

sudo apt-get install pcre
sudo apt-get install pcre-devel
sudo apt-get install zlib
sudo apt-get install zlib-devel
sudo apt-get install openssl
sudo apt-get install openssl-devel
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install gcc zlib1g-dev

4、进入nginx解压的目录下:

cd /usr/local/nginx-1.8.0/

5、加入模块命令配置

mkdir -p /var/temp/nginx
./configure
–prefix=/usr/local/nginx
–pid-path=/var/run/nginx/nginx.pid
–lock-path=/var/lock/nginx.lock
–error-log-path=/var/log/nginx/error.log
–http-log-path=/var/log/nginx/access.log
–with-http_gzip_static_module
–http-client-body-temp-path=/var/temp/nginx/client
–http-proxy-temp-path=/var/temp/nginx/proxy
–http-fastcgi-temp-path=/var/temp/nginx/fastcgi
–http-uwsgi-temp-path=/var/temp/nginx/uwsgi
–http-scgi-temp-path=/var/temp/nginx/scgi
–add-module=/usr/local/fastdfs-nginx-module/src

6、编译并安装

sudo make && sudo make install

安装成功后查看生成的目录,如下所示:
在这里插入图片描述
** 7,8跳过,直接修改conf/nginx.conf**

7、拷贝配置文件到 /etc/fdfs 下;
cd /usr/local/FastDFS/conf
cp http.conf mime.types /etc/fdfs/
8、修改nginx配置文件
mkdir /usr/local/nginx/logs # 创建logs目录
cd /usr/local/nginx/conf/
vim nginx.conf
做如下的修改:

        location ~ /group([0-9])/M00 {
                ngx_fastdfs_module;
        }

在这里插入图片描述
启动:
sudo ./nginx

三、集群安装

参考地址

ubunt参考地址

环境准备

在这里插入图片描述

编译环境

CentOS

yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y

Debian

apt-get -y install git gcc g++ make automake autoconf libtool pcre2-utils libpcre2-dev zlib1g zlib1g-dev openssl libssh-dev wget vim

磁盘目录
在这里插入图片描述

mkdir /home/dfs #创建数据存储目录
cd /usr/local/src #切换到安装目录准备下载安装包

安装libfastcommon

git clone https://github.com/happyfish100/libfastcommon.git --depth 1
cd libfastcommon/
./make.sh && ./make.sh install #编译安装

安装FastDFS

cd ../ #返回上一级目录
git clone https://github.com/happyfish100/fastdfs.git --depth 1
cd fastdfs/
./make.sh && ./make.sh install #编译安装
#配置文件准备
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf #客户端文件,测试用
cp /usr/local/src/fastdfs/conf/http.conf /etc/fdfs/ #供nginx访问使用
cp /usr/local/src/fastdfs/conf/mime.types /etc/fdfs/ #供nginx访问使用

安装fastdfs-nginx-module

cd ../ #返回上一级目录
git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs

安装nginx

wget http://nginx.org/download/nginx-1.15.4.tar.gz #下载nginx压缩包
tar -zxvf nginx-1.15.4.tar.gz #解压
cd nginx-1.15.4/
#添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/ 
make && make install #编译安装

单机部署

tracker配置

#服务器ip为 192.168.52.1
#我建议用ftp下载下来这些文件 本地修改
vim /etc/fdfs/tracker.conf
#需要修改的内容如下
port=22122  # tracker服务器端口(默认22122,一般不修改)
base_path=/home/dfs  # 存储日志和数据的根目录

storage配置

vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000  # storage服务端口(默认23000,一般不修改)
base_path=/home/dfs  # 数据和日志文件存储根目录
store_path0=/home/dfs  # 第一个存储目录
tracker_server=192.168.52.1:22122  # tracker服务器IP和端口
http.server_port=8888  # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)

client测试

vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/home/dfs
tracker_server=192.168.52.1:22122    #tracker服务器IP和端口
#保存后测试,返回ID表示成功 如:group1/M00/00/00/xx.tar.gz
fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz

配置nginx访问

vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=192.168.52.1:22122  #tracker服务器IP和端口
url_have_group_name=true
store_path0=/home/dfs
#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
#添加如下配置
server {
    listen       8888;    ## 该端口为storage.conf中的http.server_port相同
    server_name  localhost;
    location ~/group[0-9]/ {
        ngx_fastdfs_module;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
    }
}
#测试下载,用外部浏览器访问刚才已传过的nginx安装包,引用返回的ID
http://192.168.52.1:8888/group1/M00/00/00/wKgAQ1pysxmAaqhAAA76tz-dVgg.tar.gz
#弹出下载单机部署全部跑通

分布式部署

tracker配置

#服务器ip为 192.168.52.2,192.168.52.3,192.168.52.4
#我建议用ftp下载下来这些文件 本地修改
vim /etc/fdfs/tracker.conf
#需要修改的内容如下
port=22122  # tracker服务器端口(默认22122,一般不修改)
base_path=/home/dfs  # 存储日志和数据的根目录

storage配置

vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000  # storage服务端口(默认23000,一般不修改)
base_path=/home/dfs  # 数据和日志文件存储根目录
store_path0=/home/dfs  # 第一个存储目录
tracker_server=192.168.52.2:22122  # 服务器1
tracker_server=192.168.52.3:22122  # 服务器2
tracker_server=192.168.52.4:22122  # 服务器3
http.server_port=8888  # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)

client测试

vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/home/moe/dfs
tracker_server=192.168.52.2:22122  # 服务器1
tracker_server=192.168.52.3:22122  # 服务器2
tracker_server=192.168.52.4:22122  # 服务器3
#保存后测试,返回ID表示成功 如:group1/M00/00/00/xx.tar.gz
fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz

配置nginx访问

vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=192.168.52.2:22122  # 服务器1
tracker_server=192.168.52.3:22122  # 服务器2
tracker_server=192.168.52.4:22122  # 服务器3
url_have_group_name=true
store_path0=/home/dfs
#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
#添加如下配置
server {
    listen       8888;    ## 该端口为storage.conf中的http.server_port相同
    server_name  localhost;
    location ~/group[0-9]/ {
        ngx_fastdfs_module;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
    }
}

启动

防火墙

#不关闭防火墙的话无法使用
systemctl stop firewalld.service #关闭
systemctl restart firewalld.service #重启

tracker

/etc/init.d/fdfs_trackerd start #启动tracker服务
/etc/init.d/fdfs_trackerd restart #重启动tracker服务
/etc/init.d/fdfs_trackerd stop #停止tracker服务
chkconfig fdfs_trackerd on #自启动tracker服务

storage

/etc/init.d/fdfs_storaged start #启动storage服务
/etc/init.d/fdfs_storaged restart #重动storage服务
/etc/init.d/fdfs_storaged stop #停止动storage服务
chkconfig fdfs_storaged on #自启动storage服务

nginx

/usr/local/nginx/sbin/nginx #启动nginx
/usr/local/nginx/sbin/nginx -s reload #重启nginx
/usr/local/nginx/sbin/nginx -s stop #停止nginx

检测集群

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
# 会显示会有几台服务器 有3台就会 显示 Storage 1-Storage 3的详细信息

说明

配置文件

tracker_server #有几台服务器写几个
group_name #地址的名称的命名
bind_addr #服务器ip绑定
store_path_count #store_path(数字)有几个写几个
store_path(数字) #设置几个储存地址写几个 从0开始

可能遇到的问题

如果不是root 用户 你必须在除了cd的命令之外 全部加sudo
如果不是root 用户 编译和安装分开进行 先编译再安装
如果上传成功 但是nginx报错404 先检查mod_fastdfs.conf文件中的store_path0是否一致
如果nginx无法访问 先检查防火墙 和 mod_fastdfs.conf文件tracker_server是否一致
如果不是在/usr/local/src文件夹下安装 可能会编译出错
如果 unknown directive "ngx_fastdfs_module" in /usr/local/nginx/conf/nginx.conf:151,可能是nginx一直是启动的,必须要重启nginx才可以,`nginx -s reload`无效。
教程是在上一位huayanYu(小锅盖)的基础上添加了一些东西,本质上还是huayanYu(小锅盖)写的教程

参考文章

FastDFS配置防盗链

防盗链

四、keepalived + Nginx做高可用主备

问题

问题1.keepalived在Ubuntu中如果无法设置成系统服务

参考链接:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题2. 如果有2个tracker,其中一个挂了,storage很有可能进入僵尸状态

参考

问题3. 如果tracker启动报错"group_count" is not found

[2017-03-23 13:49:20] ERROR - file: tracker_mem.c, line: 596, in the file “/fastdfs/tracker/data/storage_groups_new.dat”, item “group_count” is not found
解决方案:

是多个tracker data数据不一致,没有自动同步。
删掉新加入节点的/data目录,拷贝当前Leader tracker目录下的 /data文件 过去即可(.pid不要拷贝)

问题4.

多tracker server情况下,出现一下错误:
1、FastDFS read bytes: 237 != expect bytes: 238
2、response status 5 != 0
3、fastdfs errno: 32, error info: Broken pipe
4、recv failed, connection disconnected fastdfs
5、Transport endpoint is not connected
6、response status 11 !
出现以上错误提示,建议先检查多tracker是否正常启动,多tracker部署时,FastDFS仅5.10版本以上才支持,更新版本即可

问题5. fastdfs存储空间不足

修改两个配置文件
https://blog.csdn.net/qq_42910468/article/details/120004928
在这里插入图片描述

问题6. Keepalived启动后,vip没有虚拟化出来

配置文件煤气作用

vim /usr/local/keepalived/etc/sysconfig/keepalived

在这里插入图片描述

其他人问题汇总:

汇总问题

之前有搜索到说是BUG导致,后来验证并不是,V5.09一样可以解决

五、相关资源

soolco.com也是不错的网站
访问原理及缩略图
缩略图看这个

六、配置开机自启动

ubuntu下可以通过sysv-rc-conf进行自启动配置,空格打开
https://blog.csdn.net/Zhou_Andy/article/details/51566702
https://blog.csdn.net/gatieme/article/details/45251389
但是这种方式的fasdtdfs开机启动是/usr/local/fdfs_trackerd方式,怎么才能用/etc/init.d/fdfs_trackerd呢?
nginx自启动脚本

#! /bin/sh
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: nginx init.d dash script for Ubuntu or other *nix.
# Description:       nginx init.d dash script for Ubuntu or other *nix.
### END INIT INFO
#------------------------------------------------------------------------------
# nginx - this Debian Almquist shell (dash) script, starts and stops the nginx
#         daemon for Ubuntu and other *nix releases.
#
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server.  This \
#               script will manage the initiation of the \
#               server and it's process state.
#
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# pidfile:     /usr/local/nginx/logs/nginx.pid
# Provides:    nginx
#
# Author:  Jason Giedymin
#          <jason.giedymin AT gmail.com>.
#
# Version: 3.5.1 11-NOV-2013 jason.giedymin AT gmail.com
# Notes: nginx init.d dash script for Ubuntu.
# Tested with: Ubuntu 13.10, nginx-1.4.3
# 
# This script's project home is:
#   http://github.com/JasonGiedymin/nginx-init-ubuntu
#
#------------------------------------------------------------------------------
#                               MIT X11 License
#------------------------------------------------------------------------------
#
# Copyright (c) 2008-2013 Jason Giedymin, http://jasongiedymin.com
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#------------------------------------------------------------------------------
 
#------------------------------------------------------------------------------
#                               Functions
#------------------------------------------------------------------------------
LSB_FUNC=/lib/lsb/init-functions
 
# Test that init functions exists
test -r $LSB_FUNC || {
    echo "$0: Cannot find $LSB_FUNC! Script exiting." 1>&2
    exit 5
}
 
. $LSB_FUNC
 
#------------------------------------------------------------------------------
#                               Consts
#------------------------------------------------------------------------------
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/nginx/sbin/nginx
 
PS="nginx"
PIDNAME="nginx"                     #lets you do $PS-slave
PIDFILE=$PIDNAME.pid                #pid file
PIDSPATH=/usr/local/nginx/logs      #default pid location, you should change it
 
DESCRIPTION="Nginx Server..."
 
RUNAS=root                          #user to run as
 
SCRIPT_OK=0                         #ala error codes
SCRIPT_ERROR=1                      #ala error codes
TRUE=1                              #boolean
FALSE=0                             #boolean
 
lockfile=/var/lock/subsys/nginx
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
 
#------------------------------------------------------------------------------
#                               Simple Tests
#------------------------------------------------------------------------------
 
# Test if nginx is a file and executable
test -x $DAEMON || {
    echo "$0: You don't have permissions to execute nginx." 1>&2
    exit 4
}
 
# Include nginx defaults if available
if [ -f /etc/default/nginx ]; then
    . /etc/default/nginx
fi
 
#set exit condition
#set -e
 
#------------------------------------------------------------------------------
#                               Functions
#------------------------------------------------------------------------------
 
setFilePerms(){
    if [ -f $PIDSPATH/$PIDFILE ]; then
        chmod 400 $PIDSPATH/$PIDFILE
    fi
}
 
configtest() {
    $DAEMON -t -c $NGINX_CONF_FILE
}
 
getPSCount() {
    return `pgrep -f $PS | wc -l`
}
 
isRunning() {
    if [ $1 ]; then
        pidof_daemon $1
        PID=$?
 
        if [ $PID -gt 0 ]; then
            return 1
        else
            return 0
        fi
    else
        pidof_daemon
        PID=$?
 
        if [ $PID -gt 0 ]; then
            return 1
        else
            return 0
        fi
    fi
}
 
#courtesy of php-fpm
wait_for_pid () {
    try=0
 
    while test $try -lt 35 ; do
        case "$1" in
            'created')
            if [ -f "$2" ]; then
                try=''
                break
            fi
            ;;
 
            'removed')
            if [ ! -f "$2" ]; then
                try=''
                break
            fi
            ;;
        esac
 
        try=`expr $try + 1`
        sleep 1
    done
}
 
status(){
    isRunning
    isAlive=$?
 
    if [ "${isAlive}" -eq $TRUE ]; then
        log_warning_msg "$DESCRIPTION found running with processes:  `pidof $PS`"
        rc=0
    else
        log_warning_msg "$DESCRIPTION is NOT running."
        rc=3
    fi
 
    return
}
 
removePIDFile(){
    if [ $1 ]; then
        if [ -f $1 ]; then
            rm -f $1
        fi
    else
        #Do default removal
        if [ -f $PIDSPATH/$PIDFILE ]; then
            rm -f $PIDSPATH/$PIDFILE
        fi
    fi
}
 
start() {
    log_daemon_msg "Starting $DESCRIPTION"
     
    isRunning
    isAlive=$?
     
    if [ "${isAlive}" -eq $TRUE ]; then
        log_end_msg $SCRIPT_ERROR
        rc=0
    else
        start-stop-daemon --start --quiet --chuid \
        $RUNAS --pidfile $PIDSPATH/$PIDFILE --exec $DAEMON \
        -- -c $NGINX_CONF_FILE
        setFilePerms
        log_end_msg $SCRIPT_OK
        rc=0
    fi
 
    return
}
 
stop() {
    log_daemon_msg "Stopping $DESCRIPTION"
     
    isRunning
    isAlive=$?
     
    if [ "${isAlive}" -eq $TRUE ]; then
        start-stop-daemon --stop --quiet --pidfile $PIDSPATH/$PIDFILE
 
        wait_for_pid 'removed' $PIDSPATH/$PIDFILE
 
        if [ -n "$try" ]; then
            log_end_msg $SCRIPT_ERROR
            rc=0 # lsb states 1, but under status it is 2 (which is more prescriptive). Deferring to standard.
        else
            removePIDFile
            log_end_msg $SCRIPT_OK
            rc=0
        fi
    else
        log_end_msg $SCRIPT_ERROR
        rc=7
    fi
 
    return
}
 
reload() {
    configtest || return $?
 
    log_daemon_msg "Reloading (via HUP) $DESCRIPTION"
 
    isRunning
 
    if [ $? -eq $TRUE ]; then
        kill -HUP `cat $PIDSPATH/$PIDFILE`
        log_end_msg $SCRIPT_OK
        rc=0
    else
        log_end_msg $SCRIPT_ERROR
        rc=7
    fi
 
    return
}
 
quietupgrade() {
    log_daemon_msg "Peforming Quiet Upgrade $DESCRIPTION"
 
    isRunning
    isAlive=$?
     
    if [ "${isAlive}" -eq $TRUE ]; then
        kill -USR2 `cat $PIDSPATH/$PIDFILE`
        kill -WINCH `cat $PIDSPATH/$PIDFILE.oldbin`
         
        isRunning
        isAlive=$?
 
        if [ "${isAlive}" -eq $TRUE ]; then
            kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin`
            wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin
            removePIDFile $PIDSPATH/$PIDFILE.oldbin
 
            log_end_msg $SCRIPT_OK
            rc=0
        else
            log_end_msg $SCRIPT_ERROR
             
            log_daemon_msg "ERROR! Reverting back to original $DESCRIPTION"
 
            kill -HUP `cat $PIDSPATH/$PIDFILE`
            kill -TERM `cat $PIDSPATH/$PIDFILE.oldbin`
            kill -QUIT `cat $PIDSPATH/$PIDFILE.oldbin`
 
            wait_for_pid 'removed' $PIDSPATH/$PIDFILE.oldbin
            removePIDFile $PIDSPATH/$PIDFILE.oldbin
 
            log_end_msg $SCRIPT_OK
            rc=0
        fi
    else
        log_end_msg $SCRIPT_ERROR
        rc=7
    fi
 
    return
}
 
terminate() {
    log_daemon_msg "Force terminating (via KILL) $DESCRIPTION"
         
    PIDS=`pidof $PS` || true
 
    [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE`
 
    for i in $PIDS; do
        if [ "$i" = "$PIDS2" ]; then
            kill $i
            wait_for_pid 'removed' $PIDSPATH/$PIDFILE
            removePIDFile
        fi
    done
 
    log_end_msg $SCRIPT_OK
    rc=0
}
 
destroy() {
    log_daemon_msg "Force terminating and may include self (via KILLALL) $DESCRIPTION"
    killall $PS -q >> /dev/null 2>&1
    log_end_msg $SCRIPT_OK
    rc=0
}
 
pidof_daemon() {
    PIDS=`pidof $PS` || true
 
    [ -e $PIDSPATH/$PIDFILE ] && PIDS2=`cat $PIDSPATH/$PIDFILE`
 
    for i in $PIDS; do
        if [ "$i" = "$PIDS2" ]; then
            return 1
        fi
    done
 
    return 0
}
 
action="$1"
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart|force-reload)
        stop
        # if [ $rc -ne 0 ]; then
        #     script_exit
        # fi
        sleep 1
        start
        ;;
    reload)
        $1
        ;;
    status)
        status
        ;;
    configtest)
        $1
        ;;
    quietupgrade)
        $1
        ;;
    terminate)
        $1
        ;;
    destroy)
        $1
        ;;
    *)
        FULLPATH=/etc/init.d/$PS
        echo "Usage: $FULLPATH {start|stop|restart|force-reload|status|configtest|quietupgrade|terminate|destroy}"
        echo "       The 'destroy' command should only be used as a last resort."
        exit 3
        ;;
esac
 
exit $rc

keepalived配置

! Configuration File for keepalived
  

global_defs {
   ## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP
   router_id NK1
}
vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"  ## 检测 nginx 状态的脚本路径
    interval 2  ## 检测时间间隔
    weight -20  ## 如果条件成立,权重-20
}
vrrp_instance VI_1 {
    state MASTER
    interface enp2s0  ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,这个就是ifconfig后,ip所在的网卡名
    virtual_router_id 51  ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用,  相同的 VRID 为一个组,他将决定多播的 MAC 地址
    mcast_src_ip 192.168.1.59  ## 本机 IP 地址
    priority 100  ## 节点优先级,值范围 0-254,MASTER 要比BACKUP 高
    nopreempt
    advert_int 1  ## 组播信息发送间隔,两个节点设置必须一样,默认 1s
    ## 将 track_script 块加入instance 配置块
    track_script {
        chk_nginx  ## 执行 Nginx 监控的服务
    }
    virtual_ipaddress {
        192.168.1.138/24   dev  enp2s0  label  enp2s0:2
    }
}

keepalived自启动待验证
1;systemctl daemon-reload 重新加载

2:systemctl enable keepalived.service 设置开机自动启动

3:systemctl disable keepalived.service 取消开机自动启动

4:systemctl start keepalived.service 启动

5:systemctl stop keepalived.service停止

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值