阿里雲平臺搭建高可用高負載SFTP服務

使用阿里雲產品搭建高可用sftp服務器(ECS主機、SLB負載均衡器、NAS存儲)使用的是阿里雲的vpc網絡環境
服務器架構簡圖以下:
阿里雲平臺搭建高可用高負載SFTP服務php

A、購買阿里雲的NAS存儲包,並配置。

一、購買存儲包
二、設置NAS存儲的訪問權限組,新建權限組(受權地址填寫兩臺ECS主機的ip地址)
阿里雲平臺搭建高可用高負載SFTP服務
三、添加權限組規則
阿里雲平臺搭建高可用高負載SFTP服務linux

四、建立文件系統 (協議類型-NFS 綁定存儲包) express

阿里雲平臺搭建高可用高負載SFTP服務
五、建立完文件系統之後 管理文件系統 建立掛載地址以及選擇建立的權限組
阿里雲平臺搭建高可用高負載SFTP服務
因爲我這邊VPC中兩臺ECS主機在不一樣的可用區A、B,因此這個VPC在A、B兩個可用區都建立了交換機,因此這邊能夠看到兩個文件系統的掛載點 即A、B區的掛載點
阿里雲平臺搭建高可用高負載SFTP服務vim

B、在VPC網絡中購買兩臺ECS主機分別在A、B可用區並配置

一、登陸centos系統安裝相關軟件,因爲ECS主機掛載NAS文件須要安裝nfs協議
yum install nfs-utils -ycentos

格式
sudo mount -t nfs -o vers=4.0 <掛載點域名>:<文件系統內目錄> <當前服務器上待掛載目標目錄\>
二、linux系統掛載NAS存儲並在NAS存儲上建立目錄(因爲直接掛載NAS根據的權限是1777 因此先掛載NAS根目錄再在NAS根目錄中建立目錄sftpdir,針對sftpdir目錄設置權限)bash

mount -t nfs -o vers=4.0 443d948306-ieh68.cn-shanghai-finance-1.nas.aliyuncs.com:/  /alidata1
mkdir -p /alidata1/sftp
chmod 755 /alidata1/sftp 
chown root.root /alidata1/sftp
umount  /alidata1

注意:
因爲sftp的目錄的權限設定有兩個要點:服務器

目錄開始一直往上到系統根目錄爲止的目錄擁有者都只能是root
目錄開始一直往上到系統根目錄爲止都不能夠具備羣組寫入權限

三、設置開機自啓動掛載NAS文件系統
分別登陸172.31.93.3八、172.31.142.157服務器執行如下命令(兩臺服務器的NAS掛載地址不同)
echo 'mount -t nfs -o vers=4.0 443d948306-ieh68.cn-shanghai-finance-1.nas.aliyuncs.com:/sftp /alidata1' >> /etc/rc.d/rc.local 網絡

chmod +x /etc/rc.d/rc.local

centos7 系統/etc/rc.d/rc.local沒有可執行權限,須要額外賦予架構

mkdir -pv /alidata1/sftpdir #建立sftp用戶的家目錄

四、在服務器172.31.93.38配置sftp服務負載均衡

vim /etc/ssh/sshd_config

\找到以下行,並註釋

#Subsystem sftp /usr/libexec/openssh/sftp-server

\修改認證配置

PasswordAuthentication no  修改成yes

在最後添加如下幾行

###########sftp###############
Subsystem       sftp    internal-sftp   #這行指定使用sftp服務使用系統自帶的internal-sftp   
Match Group sftpusers                    #這行用來匹配用戶組
ChrootDirectory /alidata1/sftpdir          #用chroot將用戶的根目錄指定到 /alidata1/sftpdir,這樣用戶就只能在 /alidata1/sftpdir下活動
ForceCommand    internal-sftp        #指定sftp命令

五、重啓sftp服務

systemctl restart sshd.service

六、在172.31.93.38建立sftp測試用戶組以及用戶

groupadd -g 500 sftpusers
useradd -G sftpusers -M  -s /sbin/nologin -u 501  admin   #建立sftp用戶並不建立家目錄
echo  'Admin123' | passwd --stdin admin
mkdir -pv  /alidata1/sftpdir/admin admin     #建立用戶家目錄
usermod -d  /alidata1/sftpdir/admin admin  #修改用戶家目錄

chown admin.sftpusers /alidata1/sftpdir/admin   修改家目錄權限

七、測試sftp用戶登陸

sftp  admin@127.0.0.1

兩臺服務器須要同步的文件以下

一、兩臺ECS必須建立指定GID的用戶組
二、兩臺ECS也必須建立指定的UID用戶
由於NAS存儲的權限是根據系統用戶的GID以及UID,因此兩個系統必須建立相同UID以及GID的用戶
注須要使用sersync2軟件同步兩臺ECS主機的用戶名文件passwd、passwd- 和用戶組文件 group、group- 以及用戶的密碼 shadown、shadown-文件

客戶端鏈接的時候會由於known_hosts 文件衝突,鏈接失敗。
客戶端解決方法:
有如下兩個解決方案:

  1. 手動刪除修改known_hsots裏面的內容;
  2. 修改ssh的客戶端配置文件 vim /etc/ssh/ssh_config
    StrictHostKeyChecking no
    由於須要和第三方對接,沒法讓第三方的生產服務器作ssh客戶端的配置要求,因此採用服務端解決方法。
    服務端解決方式:
    須要同步兩臺ECS主機下/etc/ssh/下配置文件

C、配置同步服務(以172.31.93.38爲準同步文件到172.31.142.157)
一、在172.31.93.38服務器上安裝sersync2,下載以後直接解壓放到/usr/local/sersync目錄之下,sersync目錄下有兩個文件 confxml.xml 爲配置文件 sersync2爲服務文件

二、在172.31.142.157服務器上安裝rsync服務並修改配置文件/etc/rsyncd.conf

```# /etc/rsyncd: configuration file for rsync daemon mode

#See rsyncd.conf man page for more options.
#configuration example:
#uid = nobody
#gid = nobody
use chroot = yes
max connections = 40
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
*hosts allow = 172.31.93.38*  #容許哪一個服務器同步過來
hosts deny = *
#exclude = lost+found/
#transfer logging = yes
#timeout = 900
#ignore nonreadable = yes
#dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

#[ftp]
#path = /home/ftp
#comment = ftp export are
################# 同步etc中配置文件 #######################
*[etc-ssh]    #同步任務名
path = /etc/ssh/ #須要同步到本地的目錄
comment = Synchronous directory /etc/ssh/
ignore errors
read only = no
write only = yes*

[etc]    #同步任務名
path = /etc/ #須要同步到本地的目錄
comment = Synchronous directory /etc/ssh/
ignore errors
read only = no
write only = yes*
三、重啓rsyncd服務  
   systemctl restart rsyncd

四、在172.31.93.38服務器上修改serysnc配置文件
 echo ‘Abcd123’ > /etc/rsync.pas  #建立同步用戶的密碼文件
 五、修改/usr/local/sersync的配置文件 以下: etc_ssh_confxml.xml
` <?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>
    <fileSystem xfs="false"/>
    <filter start="false">
    <exclude expression="(.*)\.svn"></exclude>
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></exclude>
    </filter>
    <inotify>
    <delete start="true"/>
    <createFolder start="true"/>
    <createFile start="false"/>
    <closeWrite start="true"/>
    <moveFrom start="true"/>
    <moveTo start="true"/>
    <attrib start="false"/>
    <modify start="false"/>
    </inotify>

    <sersync>
    <localpath watch="/etc/ssh/"> #同步的目錄  
        <remote ip="172.31.142.157" name="etc_ssh"/>  #定義在同步對方的任務名
        <!--<remote ip="192.168.8.39" name="tongbu"/>-->
        <!--<remote ip="192.168.8.40" name="tongbu"/>-->
    </localpath>
    <rsync>
        <commonParams params="-artuz --bwlimit=100"/>
        <auth start="true" users="root" passwordfile="/etc/rsync.pas"/>  #指定同步的用戶和密碼
        <userDefinedPort start="false" port="874"/><!-- port=874 -->
        <timeout start="false" time="100"/><!-- timeout=100 -->
        <ssh start="false"/>
    </rsync>
    <failLog path="/usr/local/sersync/script/cron_rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    <crontab start="false" schedule="600"><!--600mins-->
        <crontabfilter start="false">
        <exclude expression="*.php"></exclude>
        <exclude expression="info/*"></exclude>
        </crontabfilter>
    </crontab>
    <plugin start="false" name="command"/>
    </sersync>

    <plugin name="command">
    <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->
    <filter start="false">
        <include expression="(.*)\.php"/>
        <include expression="(.*)\.sh"/>
    </filter>
    </plugin>

    <plugin name="socket">
    <localpath watch="/opt/tongbu">
        <deshost ip="192.168.138.20" port="8009"/>
    </localpath>
    </plugin>
    <plugin name="refreshCDN">
    <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
        <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
        <sendurl base="http://pic.xoyo.com/cms"/>
        <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
    </localpath>
    </plugin>
</head>`

建立etc_confxml.xml配置文件
`<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>
    <fileSystem xfs="false"/>
    <filter start="true">
    <exclude expression="((?!\bpasswd\b|\bpasswd-\b|\bshadow\b|\bshadow-\b|\bgroup\b|\bgroup-\b).)+"></exclude> #指定同步的文件
<!--    <exclude expression="(.*)\.svn"></exclude>
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></exclude>
    <exclude expression="^[a-yA-Y]*"></exclude> -->
    </filter>
    <inotify>
    <delete start="true"/>
    <createFolder start="true"/>
    <createFile start="true"/>
    <closeWrite start="true"/>
    <moveFrom start="true"/>
    <moveTo start="true"/>
    <attrib start="true"/>
    <modify start="true"/>
    </inotify>

    <sersync>
    <localpath watch="/etc">
        <remote ip="172.31.142.157" name="etc"/>
        <!--<remote ip="192.168.8.39" name="tongbu"/>-->
        <!--<remote ip="192.168.8.40" name="tongbu"/>-->
    </localpath>
    <rsync>
        <commonParams params="-atuz --bwlimit=100"/>
        <auth start="true" users="root" passwordfile="/etc/rsync.pas"/>
        <userDefinedPort start="false" port="874"/><!-- port=874 -->
        <timeout start="false" time="100"/><!-- timeout=100 -->
        <ssh start="false"/>
    </rsync>
    <failLog path="/usr/local/sersync/script/etc_rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
    <crontab start="true" schedule="600"><!--600mins-->
        <crontabfilter start="false">
        <exclude expression="*.php"></exclude>
        <exclude expression="info/*"></exclude>
        </crontabfilter>
    </crontab>
    <plugin start="false" name="command"/>
    </sersync>

    <plugin name="command">
    <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->
    <filter start="false">
        <include expression="(.*)\.php"/>
        <include expression="(.*)\.sh"/>
    </filter>
    </plugin>

    <plugin name="socket">
    <localpath watch="/opt/tongbu">
        <deshost ip="192.168.138.20" port="8009"/>
    </localpath>
    </plugin>
    <plugin name="refreshCDN">
    <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
        <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
        <sendurl base="http://pic.xoyo.com/cms"/>
        <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
    </localpath>
    </plugin>
</head>`

六、編寫啓動sersync2腳本start.sh  以下

/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/conf/etc_ssh_confxml.xml
/usr/local/sersync/sersync2 -d -r -o /usr/local/sersync/conf/etc_confxml.xml

七、編寫sersync2服務監控腳本 check_sersync.sh

#!/bin/bash
cat /usr/local/sersync/start.sh|grep -v "^#" | grep -v grep | while read line;do
ps -ef | grep "$line"| grep -v grep
if [ $? -ne 0 ];then
$line
fi
done

八、設置定時檢查腳本執行
    */5 *  *   *  *  /bin/bash /usr/local/sersync/check_sersync.sh

九、測試同步是否正常

十、測試sftp用戶是否輪詢登陸到兩臺ECS
相關文章
相關標籤/搜索