Ubuntu下安装nodejs,npm

前提

GCC 4.2 以上、G++ 4.2 以上、python2.7环境、wget 工具、make 工具

安装以上环境

sudo apt-get install python gcc g++ wget make

在官网找到符合自己系统的源文件(source code), 官网地址:https://nodejs.org/en/download/ 。

1、使用wget工具下载

wget https://nodejs.org/dist/v8.9.1/node-v8.9.1.tar.gz

2、解压

tar -zxvf node-v8.9.1.tar.gz //注意下载.tar.gz

3、进入解压文件,运行configure文件配置源代码

sudo ./configure

4、使用make install 编译安装nodejs

sudo make install

5、编译源文件需要一段时间,编译结束后,检查nodejs的版本号

node -v

如果能显示版本号,表明安装成功。

nodejs安装的同时也安装了npm,检测npm版本号。

npm安装的不一定是最新版本。

npm -v // 检测版本号。

sudo npm install -g npm   //安装最新版本npm

卸载node:(通过源文件编译安装的node)

进入安装时的源文件 cd 源文件

如果源文件不存在,下载一份,解压,进入源文件

sudo make uninstall           //使用 make 卸载

进入/usr/local/lib/ 删除node_modules目录

在命令行输入 node -v 系统提示安装node

如果没有进入/usr/local/lib删除node_modules目录,执行 node -v 时,系统提示在/usr/local/bin中无执行文件

— END

ubuntu下安装wireshark(以及配置非root)

Wireshark是世界上最流行的网络分析工具。这个强大的工具可以捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息。与很多其他网络工具一样,Wireshark也使用pcap network library来进行封包捕捉。

对于学习计算机网络协议有不小的帮助。

工具/原料

  • ubuntu 系统
  • 网络畅通

方法/步骤

1、首先,安装只要一个命令行(由于之前装过了,所以没有在安装什么了):sudo apt-get install wireshark

未分类

2、上一步,已经将wireshark安装完毕,接下来我没就可以通过:wireshark 用来启动它的图形界面。

未分类

3、然而,dumpcap需要root权限才能使用的,以普通用户打开Wireshark,Wireshark当然没有权限使用dumpcap进行截取封包。虽然可以用:sudo wireshark来完成。但是,以sudo的方式用root打开Wireshark显然是不安全的,也不是很方便,因为得到的封包数据也属于root用户。

4、于是,我们提供下面的方法来完成普通用户下的操作。

(1).添加wireshark用户组
#sudo groupadd wireshark

未分类

(2).将dumpcap更改为wireshark用户组
#sudo chgrp wireshark /usr/bin/dumpcap

未分类

(3).让wireshark用户组有root权限使用dumpcap #sudo chmod 4755 /usr/bin/dumpcap

未分类

(4).将需要使用的普通用户名加入wireshark用户组,我的用户是“cai”(需要根据具体用户名修改!在#前面可以找到哟),则需要使用命令:
#sudo gpasswd -a dengyi wireshark

未分类

接下来你就可以以普通用户登陆打开Wireshark,也会有权限进行抓包了。

ubuntu 安装MongoDB

ubuntu (16.04)下使用mongodb

ubuntu 安装MongoDB

安装mongodb

可以根据官网提供的方法进行安装

官网入口: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/#install-mongodb-community-edition

导入MongoDB public GPG Key

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

为mongodb创建一个列表文件

$ echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

更新

$ sudo apt-get update

安装mongodb

$ sudo apt-get install -y mongodb-org
  • 注:mongodb的配置文件所在目录为/etc/mongodb.conf

启动mongodb

$ sudo service mongod start

查看mongodb的守护进程

$ ps aux | grep mongodt

关闭mongodb

$ sudo service mongod stop

卸载mongodb

关闭mongodb

$ sudo service mongod stop

卸载所有安装包

$ sudo apt-get purge mongodb-org*

移除数据库和日志文件(具体看/etc/mongodb.conf配置文件)

$ sudo rm -r /var/log/mongodb
$ sudo rm -r /var/lib/mongodb

./etc/mongodb.conf配置文件如下(部分数据):

# mongodb.conf
sudo apt-get purge mongodb-org*

# Where to store the data.
dbpath=/var/lib/mongodb   //数据库路径

#where to log
logpath=/var/log/mongodb/mongodb.log  日志路径

logappend=true

bind_ip = 127.0.0.1
#port = 27017

# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
journal=true

# Enables periodic logging of CPU utilization and I/O wait
#cpu = true

Ubuntu查看硬件配置

1、查看系统内核

long@pc1:/proc$ uname -a
Linux XPS-15-9560 4.10.0-38-generic #42~16.04.1-Ubuntu SMP Tue Oct 10 16:32:20 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

2、查看CPU

long@pc1:/proc$ cat /proc/cpuinfo | grep model name
model name  : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
model name  : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
model name  : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
model name  : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
model name  : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
model name  : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
model name  : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
model name  : Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz

3、查看内存

long@pc1:/proc$ cat /proc/meminfo | grep MemTotal
MemTotal:        7807956 kB

4、查看显卡

long@pc1:/proc$ lspci | grep 'VGA'
00:02.0 VGA compatible controller: Intel Corporation Device 591b (rev 04)

5、查看声卡

long@pc1:/proc$ lspci | grep -i 'Audio'
00:1f.3 Audio device: Intel Corporation Device a171 (rev 31)

6、查看网卡

long@pc1:/proc$ lspci | grep -i 'Network'
02:00.0 Network controller: Qualcomm Atheros QCA6174 802.11ac Wireless Network Adapter (rev 32)

7、查看硬盘

long@pc1:/proc$ df -lh
Filesystem      Size  Used Avail Use% Mounted on
udev            3.7G     0  3.7G   0% /dev
tmpfs           763M   79M  684M  11% /run
/dev/nvme0n1p6   92G   75G   13G  86% /
tmpfs           3.8G   58M  3.7G   2% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           3.8G     0  3.8G   0% /sys/fs/cgroup
/dev/loop3      143M  143M     0 100% /snap/inkscape/2527
/dev/loop4       84M   84M     0 100% /snap/core/3017
/dev/loop1      146M  146M     0 100% /snap/inkscape/3080
/dev/loop0       84M   84M     0 100% /snap/core/3247
/dev/loop2       84M   84M     0 100% /snap/core/3440
tmpfs           763M  192K  763M   1% /run/user/1000

另外一个命令

其实就一个命令就搞定了:dmidecode 这个可以看具体的硬件信息,这个命令需要使用sudo

最常用的选项就是用 -t 或者 –type 来限定关键字:

bios, system, baseboard, chassis, processor, memory, cache, connector, slot

这里只介绍memory的检测。
直接上我自己Ubuntu测试的结果:

#sudo dmidecode -t memory
[sudo] password for superuser: 
# dmidecode 3.0
Getting SMBIOS data from sysfs.
SMBIOS 3.0 present.

Handle 0x0045, DMI type 16, 23 bytes
Physical Memory Array
    Location: System Board Or Motherboard
    Use: System Memory
    Error Correction Type: None
    Maximum Capacity: 32 GB
    Error Information Handle: Not Provided
    Number Of Devices: 2

Handle 0x0046, DMI type 17, 40 bytes
Memory Device
    Array Handle: 0x0045
    Error Information Handle: Not Provided
    Total Width: 64 bits
    Data Width: 64 bits
    Size: 4096 MB
    Form Factor: SODIMM
    Set: None
    Locator: DIMM A
    Bank Locator: BANK 0
    Type: DDR4
    Type Detail: Synchronous Unbuffered (Unregistered)
    Speed: 2400 MHz
    Manufacturer: SK Hynix
    Serial Number: 28326493
    Asset Tag: 01164700
    Part Number: HMA851S6AFR6N-UH    
    Rank: 1
    Configured Clock Speed: 2400 MHz
    Minimum Voltage: 1.2 V
    Maximum Voltage: 1.2 V
    Configured Voltage: 1.2 V

Handle 0x0047, DMI type 17, 40 bytes
Memory Device
    Array Handle: 0x0045
    Error Information Handle: Not Provided
    Total Width: 64 bits
    Data Width: 64 bits
    Size: 4096 MB
    Form Factor: SODIMM
    Set: None
    Locator: DIMM B
    Bank Locator: BANK 2
    Type: DDR4
    Type Detail: Synchronous Unbuffered (Unregistered)
    Speed: 2400 MHz
    Manufacturer: SK Hynix
    Serial Number: 283264D1
    Asset Tag: 01164700
    Part Number: HMA851S6AFR6N-UH    
    Rank: 1
    Configured Clock Speed: 2400 MHz
    Minimum Voltage: 1.2 V
    Maximum Voltage: 1.2 V
    Configured Voltage: 1.2 V

使用docker-compose一键部署分布式文件系统FastDFS

什么是FastDFS

百度百科:FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

FastDFS是由余庆所开发的开源、免费的分布式文件系统,GitHub项目地址请点这里,其基本架构图如下:

未分类

FastDFS仅提供源码包,必须从源码编译安装,且其提供了nginx插件,也必须与nginx源码一起编译安装nginx,安装过程较为繁复。为快速搭建简易的开发、测试环境,我采用docker方式将源码下载、编译、配置过程完全自动化,采用docker-compose来组织docker容器,并采用一台tracker+一台storage的最小系统架构,且部署在一个容器内,这样就以最小的系统代价、最快的速度搭建起fastdfs使用环境了。标题中的”一键”稍显夸张,但事实上下载GitHub项目文件到本地后,只需两三条命令即可搞定一个最简单的FastDFS环境搭建。

**关于docker及docker-compose的安装,请见《Ubuntu安装docker和docker-compose》。&&

创建Dockerfile

本DockerFile采用的软件版本:

  • fastdfs:5.11
  • libfastcommon:1.0.36
  • fastdfs-nginx-module: 最新版(截至2017/11/28,为1.20)
  • nginx: 1.12.2

各源码均为在线下载。

DockerFile内容如下:

# 使用超小的Linux镜像alpine
FROM alpine:3.6

MAINTAINER YoungCoding <[email protected]>

ENV HOME /root

# 安装准备
RUN    apk update 
        && apk add --no-cache --virtual .build-deps bash gcc libc-dev make openssl-dev pcre-dev zlib-dev linux-headers curl gnupg libxslt-dev gd-dev geoip-dev

# 下载fastdfs、libfastcommon、nginx插件的源码
RUN     cd /root 
        && curl -fSL https://github.com/happyfish100/libfastcommon/archive/V1.0.36.tar.gz -o fastcommon.tar.gz 
        && curl -fSL  https://codeload.github.com/happyfish100/fastdfs/tar.gz/V5.11 -o fastfs.tar.gz 
        && curl -fSL  https://github.com/happyfish100/fastdfs-nginx-module/archive/master.tar.gz -o nginx-module.tar.gz 
        && tar zxf fastcommon.tar.gz 
        && tar zxf fastfs.tar.gz 
        && tar zxf nginx-module.tar.gz

# 安装libfastcommon
RUN     cd ${HOME}/libfastcommon-1.0.36/ 
        && ./make.sh 
        && ./make.sh install

# 安装fastdfs v5.11
RUN     cd ${HOME}/fastdfs-5.11/ 
        && ./make.sh 
        && ./make.sh install

# 配置fastdfs: base_dir
RUN     cd /etc/fdfs/ 
        && cp storage.conf.sample storage.conf 
        && cp tracker.conf.sample tracker.conf 
        && cp client.conf.sample client.conf 
        && sed -i "s|/home/yuqing/fastdfs|/var/local/fdfs/tracker|g" /etc/fdfs/tracker.conf 
        && sed -i "s|/home/yuqing/fastdfs|/var/local/fdfs/storage|g" /etc/fdfs/storage.conf 
        && sed -i "s|/home/yuqing/fastdfs|/var/local/fdfs/storage|g" /etc/fdfs/client.conf 

# 获取nginx源码,与fastdfs插件一起编译
RUN     cd ${HOME} 
        && curl -fSL http://nginx.org/download/nginx-1.12.2.tar.gz -o nginx-1.12.2.tar.gz 
        && tar zxf nginx-1.12.2.tar.gz 
        && chmod u+x ${HOME}/fastdfs-nginx-module-master/src/config 
        && cd nginx-1.12.2 
        && ./configure --add-module=${HOME}/fastdfs-nginx-module-master/src 
        && make && make install

# 设置nginx和fastdfs联合环境,并配置nginx
RUN     cp ${HOME}/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/ 
        && sed -i "s|^store_path0.*$|store_path0=/var/local/fdfs/storage|g" /etc/fdfs/mod_fastdfs.conf 
        && sed -i "s|^url_have_group_name =.*$|url_have_group_name = true|g" /etc/fdfs/mod_fastdfs.conf 
        && cd ${HOME}/fastdfs-5.11/conf/ 
        && cp http.conf mime.types anti-steal.jpg /etc/fdfs/ 
        && echo -e "
events {n
    worker_connections  1024;n
}n
http {n
    include       mime.types;n
    default_type  application/octet-stream;n
    server {n
        listen 8888;n
        server_name localhost;n

        location ~ /group[0-9]/M00 {n
            ngx_fastdfs_module;n
        }n
    }n
}">/usr/local/nginx/conf/nginx.conf

# 清理文件
RUN rm -rf ${HOME}/*
RUN apk del .build-deps gcc libc-dev make openssl-dev linux-headers curl gnupg libxslt-dev gd-dev geoip-dev
RUN apk add bash pcre-dev zlib-dev


# 配置启动脚本,在启动时中根据环境变量替换nginx端口、fastdfs端口
# 默认nginx端口
ENV WEB_PORT 8888
# 默认fastdfs端口
ENV FDFS_PORT 22122
# 创建启动脚本
RUN     echo -e "
mkdir -p /var/local/fdfs/storage/data /var/local/fdfs/tracker; n
ln -s /var/local/fdfs/storage/data/ /var/local/fdfs/storage/data/M00; nn
sed -i "s/listen .*$/listen $WEB_PORT;/g" /usr/local/nginx/conf/nginx.conf; n
sed -i "s/http.server_port=.*$/http.server_port=$WEB_PORT/g" /etc/fdfs/storage.conf; nn
if [ "$IP" = "" ]; then n
    IP=`ifconfig eth0 | grep inet | awk '{print $2}'| awk -F: '{print $2}'`; n
fi n
sed -i "s/^tracker_server=.*$/tracker_server=$IP:$FDFS_PORT/g" /etc/fdfs/client.conf; n
sed -i "s/^tracker_server=.*$/tracker_server=$IP:$FDFS_PORT/g" /etc/fdfs/storage.conf; n
sed -i "s/^tracker_server=.*$/tracker_server=$IP:$FDFS_PORT/g" /etc/fdfs/mod_fastdfs.conf; nn
/etc/init.d/fdfs_trackerd start; n
/etc/init.d/fdfs_storaged start; n
/usr/local/nginx/sbin/nginx; n
tail -f /usr/local/nginx/logs/access.log 
">/start.sh 
&& chmod u+x /start.sh

# 暴露端口。改为采用host网络,不需要单独暴露端口
# EXPOSE 80 22122

ENTRYPOINT ["/bin/bash","/start.sh"]

docker-compose.yaml

在DockerFile所在目录创建docker-compose.yaml,内容如下:

version: '3.0'

services:
    fastdfs:
        build: .
        image: youngcoding/fastdfs:5.11
        # 该容器是否需要开机启动+自动重启。若需要,则取消注释。
        #restart: always
        container_name: fastdfs
        environment:
            # nginx服务端口
            - WEB_PORT=8888
            # docker所在主机的IP地址
            - IP=192.168.56.110
        volumes:
            # 将本地目录映射到docker容器内的fastdfs数据存储目录,将fastdfs文件存储到主机上,以免每次重建docker容器,之前存储的文件就丢失了。
            - ${HOME}/docker-data/fdfs:/var/local/fdfs
        # 使docker具有root权限以读写主机上的目录
        privileged: true
        # 网络模式为host,即直接使用主机的网络接口
        network_mode: "host"

准备

$ cd <保存Dockerfile文件的路径>
# 检查文件夹下各文件是否齐全
$ ls
docker-compose.yaml     Dockerfile      log.sh

# 确保本机供挂载的存储文件夹存在,如不存在,则创建。注意,此文件夹需与docker-compose.yaml中设置的volume挂载目录一致,可以自行更改到其他文件夹。
$ mkdir -p ${HOME}/docker-data/fdfs

启动

$ docker-compose up -d
# 因为要下载软件包和源码,并编译,所以过程比较漫长,期间可能会出现红字的warning,不必理会。若报错,请根据提示排查。
...
Successfully built 4baafa5d2e75
Successfully tagged youngcoding/fastdfs:5.11
WARNING: Image for service fastdfs was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating fastdfs ...
Creating fastdfs ... done

# 查看容器运行状态
$ docker ps
或 $ docker-compose ps
CONTAINER ID        IMAGE                       COMMAND                 CREATED             STATUS              PORTS               NAMES
2a294bc410bd        youngcoding/fastdfs:5.11    "/bin/bash /start.sh"   4 minutes ago       Up 4 minutes                            fastdfs

测试

# 进入docker容器内终端
$ docker exec -it fastdfs或ID的前几位 /bin/bash

# 在容器内部终端执行上传测试
bash-4.3$ echo "Hello FastDFS!">index.html
bash-4.3$ fdfs_test /etc/fdfs/client.conf upload index.html
This is FastDFS client test program v5.11
...
[2017-11-28 14:05:25] DEBUG - base_path=/var/local/fdfs/storage, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
tracker_query_storage_store_list_without_group:
        server 1. group_name=, ip_addr=192.168.56.110, port=23000
group_name=group1, ip_addr=192.168.56.110, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKg4blodbSWAImI9AAAADwA12ic71.html
source ip address: 192.168.56.110
file timestamp=2017-11-28 14:05:25
file size=15
file crc32=3529255
example file url: http://192.168.56.110/group1/M00/00/00/wKg4blodbSWAImI9AAAADwA12ic71.html

# 下载测试
bash-4.3$ fdfs_test /etc/fdfs/client.conf download group1 M00/00/00/wKg4blodbSWAImI9AAAADwA12ic71.html
...
storage=192.168.56.110:23000
download file success, file size=15, file save to wKg4blodbSWAImI9AAAADwA12ic71.html

# 外部http访问测试
# 在主机或其他同局域网内机器上用浏览器访问上面的url。注意:若nginx的端口设置不为80,则需加上端口号
http://192.168.56.110:8888/group1/M00/00/00/wKg4blodbSWAImI9AAAADwA12ic71.html
# 网页显示:Hello FastDFS!

# 删除测试
bash-4.3$ fdfs_test /etc/fdfs/client.conf delete group1 M00/00/00/wKg4blodbSWAImI9AAAADwA12ic71.html
storage=192.168.56.110:23000
delete file success

# 退出容器终端
bash-4.3$ exit

管理容器

# 停止容器
$ docker stop <容器NAMES,也可以为容器ID的前几位>
或 $ docker-compose stop

# 更改compose或Dockerfile后重新生成并运行
$ docker-compose stop
$ docker-compose build
$ docker-compose up -d
或 $ docker-compose up -d --build #本条命令可代替上述三条命令

# 删除容器
$ docker rm <容器NAMES,也可以为容器ID的前几位>
或 $ docker-compose rm

查看日志

为避免每次需要查看日志都要执行 docker exec -it <fdfs ID> /usr/bin/tail -f <log_file> 命令,我将常见的查看日志命令封装到一个脚本中,每次只需要执行脚本就能查看不同服务的日志了。

新建日志监控脚本log.sh

新建log.sh,用来快速查看日志。内容如下:

#!/bin/bash
STORAGE=/var/local/fdfs/storage/logs/storaged.log
TRACKER=/var/local/fdfs/tracker/logs/trackerd.log
NGINX=/usr/local/nginx/logs/access.log

ID=`docker ps|grep fastdfs|awk '{print $1}'`
echo fastdfs.ID:$ID
echo 'Use param tracker|storage|nginx to see log of each service such as "./log.sh tracker". No param equals to "storage".'
CAT=$1
LOG=""
if [[ "${CAT}" = "tracker" ]];then
    LOG=${TRACKER}
elif [[ "${CAT}" = "nginx" ]]; then
    LOG=${NGINX}
else 
    LOG=${STORAGE}
fi

docker exec -it $ID /usr/bin/tail -f ${LOG}

给log.sh添加执行权限

$ chmod u+x log.sh

查看日志

$ ./log.sh tracker或storage或nginx

# 查看nginx日志,可以看到刚刚从外部http方式访问fastdfs文件的日志
$ ./log.sh nginx
192.168.56.100 - - [28/Nov/2017:14:10:33 +0000] "GET /group1/M00/00/00/wKg4blodbSWAImI9AAAADwA12ic71_big.html HTTP/1.1" 200 15 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36"

至此,fastDFS简易测试环境搭建完毕,开发搞起来!!完。

Ubuntu安装docker和docker-compose

未分类

百度百科:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

我的理解:docker就是轻量化的虚拟机,不需要你在每个虚拟机里安装操作系统,做到最简单的新建、运行、修改、删除;而且容器内服务直接调用本机的操作系统API,性能更高;可以用来实现快速虚拟化、快速部署、持续集成等等,是运维同学的神器。

本人不是搞运维的,主要做开发工作。为什么学习docker呢?主要是用来快速部署开发、测试环境,比如你开发、测试时要用redis、zookeeper、activemq、分布式存储等等,在个人电脑上该怎么玩儿?搭建N台虚拟机?不光内存不够,硬盘也不够啊,而且现在内存价格很贵,加不起。我之前开了6台虚拟机做zookeeper+redis集群,本机再开个eclipse、浏览器,8G内存见底,卡得不要不要的,而且虚拟机文件就有10G以上,苦也。这时候就需要docker这种轻量化的容器大显身手了。docker化后,开一台1G内存虚拟机,开个zookeeper+redis集群+activeMQ+fastdfs轻轻松松,具体应用可以看下一篇博文《docker超快速搭建redis集群、zookeeper集群、activeMQ、fastdfs分布式存储教程》。

测试平台系统: Ubuntu 16.04。如果想在Windows上玩儿Docker,可以去官方下载docker-toolbox或者先安装一台Ubuntu虚拟机。(ps: 其实docker-toolbox底层也是用的VirtualBox软件新建一台Linux虚拟机来实现的,因为当前docker只支持Linux。建议自建虚拟机安装docker,因为toolbox默认安装的虚拟机系统是tiny-core-linux,毕竟是一个超小型的非常用的linux,而且用的ISO镜像系统,无法安装软件。下面开始正题。)

1. 修改Ubuntu APT源为国内源

备份并编辑source.list

$ sudo cp /etc/apt/source.list /etc/apt/source.list.bak
$ sudo nano /etc/apt/source.list

注释掉光盘源及官方源

注释掉以下面开头的源(注释即在行首加#)

# deb cdrom:[Ubuntu-Server 16.04.3 LTS _Xenial Xerus
# deb http://cn.archive.ubuntu.com/ubuntu/
# deb http://security.ubuntu.com/ubuntu 

添加国内源

在文件末尾加入如下内容。注意:下面的xenial仅对应Ubuntu 16.04,其他版本的Ubuntu请自行更改为对应的版本名称

# 163 注释掉源码源
deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse
# deb-src http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse

# aliyun 注释掉src源
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse 
# 源码
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse

2. 安装docker-ce

安装必要环境

$ sudo apt-get update
$ sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

添加docker-ce仓库

两个安装源,二选一即可

使用阿里云docker-ce repository(版本基本同官方,速度快,推荐)

$ curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

使用官方docker-ce repository(版本最新,速度稍慢)

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

安装docker-ce

$ sudo apt-get -y update
$ sudo apt-get -y install docker-ce

# 添加当前用户到docker用户组
$ sudo usermod -aG docker `whoami`

# 检查docker
$ docker -v
Docker version 17.09.0-ce, build afdb6d4

修改镜像地址

$ sudo vim /etc/docker/daemon.json

# 输入如下内容:(此处采用docker中国官方镜像地址,若要采用aliyun等镜像仓库,请自行更改网址)
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

# 重启docker
$ sudo /etc/init.d/docker restart

安装 docker-compose

$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.17.1, build 1719ceb

完。

分布式实时日志分析解决方案ELK部署架构

一、概述

ELK 已经成为目前最流行的集中式日志解决方案,它主要是由Beats、Logstash、Elasticsearch、Kibana等组件组成,来共同完成实时日志的收集,存储,展示等一站式的解决方案。本文将会介绍ELK常见的架构以及相关问题解决。

  1. Filebeat:Filebeat是一款轻量级,占用服务资源非常少的数据收集引擎,它是ELK家族的新成员,可以代替Logstash作为在应用服务器端的日志收集引擎,支持将收集到的数据输出到Kafka,Redis等队列。
  2. Logstash:数据收集引擎,相较于Filebeat比较重量级,但它集成了大量的插件,支持丰富的数据源收集,对收集的数据可以过滤,分析,格式化日志格式。
  3. Elasticsearch:分布式数据搜索引擎,基于Apache Lucene实现,可集群,提供数据的集中式存储,分析,以及强大的数据搜索和聚合功能。
  4. Kibana:数据的可视化平台,通过该web平台可以实时的查看 Elasticsearch 中的相关数据,并提供了丰富的图表统计功能。

二、ELK常见部署架构

2.1、Logstash作为日志收集器

这种架构是比较原始的部署架构,在各应用服务器端分别部署一个Logstash组件,作为日志收集器,然后将Logstash收集到的数据过滤、分析、格式化处理后发送至Elasticsearch存储,最后使用Kibana进行可视化展示,这种架构不足的是:Logstash比较耗服务器资源,所以会增加应用服务器端的负载压力。

未分类

2.2、Filebeat作为日志收集器

该架构与第一种架构唯一不同的是:应用端日志收集器换成了Filebeat,Filebeat轻量,占用服务器资源少,所以使用Filebeat作为应用服务器端的日志收集器,一般Filebeat会配合Logstash一起使用,这种部署方式也是目前最常用的架构。

未分类

2.3、引入缓存队列的部署架构

该架构在第二种架构的基础上引入了Kafka消息队列(还可以是其他消息队列),将Filebeat收集到的数据发送至Kafka,然后在通过Logstasth读取Kafka中的数据,这种架构主要是解决大数据量下的日志收集方案,使用缓存队列主要是解决数据安全与均衡Logstash与Elasticsearch负载压力。

未分类

2.4、以上三种架构的总结

第一种部署架构由于资源占用问题,现已很少使用,目前使用最多的是第二种部署架构,至于第三种部署架构个人觉得没有必要引入消息队列,除非有其他需求,因为在数据量较大的情况下,Filebeat 使用压力敏感协议向 Logstash 或 Elasticsearch 发送数据。如果 Logstash 正在繁忙地处理数据,它会告知 Filebeat 减慢读取速度。拥塞解决后,Filebeat 将恢复初始速度并继续发送数据。

三、问题及解决方案

问题:如何实现日志的多行合并功能?

系统应用中的日志一般都是以特定格式进行打印的,属于同一条日志的数据可能分多行进行打印,那么在使用ELK收集日志的时候就需要将属于同一条日志的多行数据进行合并。

解决方案:使用Filebeat或Logstash中的multiline多行合并插件来实现

在使用multiline多行合并插件的时候需要注意,不同的ELK部署架构可能multiline的使用方式也不同,如果是本文的第一种部署架构,那么multiline需要在Logstash中配置使用,如果是第二种部署架构,那么multiline需要在Filebeat中配置使用,无需再在Logstash中配置multiline。

1、multiline在Filebeat中的配置方式

filebeat.prospectors:
    -
       paths:
          - /home/project/elk/logs/test.log
       input_type: log 
       multiline:
            pattern: '^['
            negate: true
            match: after
output:
   logstash:
      hosts: ["localhost:5044"]
  • pattern:正则表达式
  • negate:默认为false,表示匹配pattern的行合并到上一行;true表示不匹配pattern的行合并到上一行
  • match:after表示合并到上一行的末尾,before表示合并到上一行的行首

如:

pattern: '['
negate: true
match: after

该配置表示将不匹配pattern模式的行合并到上一行的末尾

2、multiline在Logstash中的配置方式

input {
  beats {
    port => 5044
  }
}

filter {
  multiline {
    pattern => "%{LOGLEVEL}s*]"
    negate => true
    what => "previous"
  }
}

output {
  elasticsearch {
    hosts => "localhost:9200"
  }
}

(1)Logstash中配置的what属性值为previous,相当于Filebeat中的after,Logstash中配置的what属性值为next,相当于Filebeat中的before。
(2)pattern => “%{LOGLEVEL}s*]” 中的LOGLEVEL是Logstash预制的正则匹配模式,预制的还有好多常用的正则匹配模式,详细请看:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

问题:如何将Kibana中显示日志的时间字段替换为日志信息中的时间?

默认情况下,我们在Kibana中查看的时间字段与日志信息中的时间不一致,因为默认的时间字段值是日志收集时的当前时间,所以需要将该字段的时间替换为日志信息中的时间。

解决方案:使用grok分词插件与date时间格式化插件来实现

在Logstash的配置文件的过滤器中配置grok分词插件与date时间格式化插件,如:

input {
  beats {
    port => 5044
  }
}

filter {
  multiline {
    pattern => "%{LOGLEVEL}s*][%{YEAR}%{MONTHNUM}%{MONTHDAY}s+%{TIME}]"
    negate => true
    what => "previous"
  }

  grok {
    match => [ "message" , "(?<customer_time>%{YEAR}%{MONTHNUM}%{MONTHDAY}s+%{TIME})" ]
  }

  date {
        match => ["customer_time", "yyyyMMdd HH:mm:ss,SSS"] //格式化时间
        target => "@timestamp" //替换默认的时间字段
  }
}

output {
  elasticsearch {
    hosts => "localhost:9200"
  }
}

如要匹配的日志格式为:“[DEBUG][20170811 10:07:31,359][DefaultBeanDefinitionDocumentReader:106] Loading bean definitions”,解析出该日志的时间字段的方式有:

① 通过引入写好的表达式文件,如表达式文件为customer_patterns,内容为:
CUSTOMER_TIME %{YEAR}%{MONTHNUM}%{MONTHDAY}s+%{TIME}
注:内容格式为:[自定义表达式名称] [正则表达式]
然后logstash中就可以这样引用:

filter {
  grok {
      patterns_dir => ["./customer-patterms/mypatterns"] //引用表达式文件路径
      match => [ "message" , "%{CUSTOMER_TIME:customer_time}" ] //使用自定义的grok表达式
  }
}

② 以配置项的方式,规则为:(?<自定义表达式名称>正则匹配规则),如:

filter {
  grok {
    match => [ "message" , "(?<customer_time>%{YEAR}%{MONTHNUM}%{MONTHDAY}s+%{TIME})" ]
  }
}

问题:如何在Kibana中通过选择不同的系统日志模块来查看数据

一般在Kibana中显示的日志数据混合了来自不同系统模块的数据,那么如何来选择或者过滤只查看指定的系统模块的日志数据?

解决方案:新增标识不同系统模块的字段或根据不同系统模块建ES索引

1、新增标识不同系统模块的字段,然后在Kibana中可以根据该字段来过滤查询不同模块的数据

这里以第二种部署架构讲解,在Filebeat中的配置内容为:

filebeat.prospectors:
    -
       paths:
          - /home/project/elk/logs/account.log
       input_type: log 
       multiline:
            pattern: '^['
            negate: true
            match: after
       fields: //新增log_from字段
         log_from: account

    -
       paths:
          - /home/project/elk/logs/customer.log
       input_type: log 
       multiline:
            pattern: '^['
            negate: true
            match: after
       fields:
         log_from: customer
output:
   logstash:
      hosts: ["localhost:5044"]

通过新增:log_from字段来标识不同的系统模块日志

2、根据不同的系统模块配置对应的ES索引,然后在Kibana中创建对应的索引模式匹配,即可在页面通过索引模式下拉框选择不同的系统模块数据。

这里以第二种部署架构讲解,分为两步:
① 在Filebeat中的配置内容为:

filebeat.prospectors:
    -
       paths:
          - /home/project/elk/logs/account.log
       input_type: log 
       multiline:
            pattern: '^['
            negate: true
            match: after
       document_type: account

    -
       paths:
          - /home/project/elk/logs/customer.log
       input_type: log 
       multiline:
            pattern: '^['
            negate: true
            match: after
       document_type: customer
output:
   logstash:
      hosts: ["localhost:5044"]

通过document_type来标识不同系统模块

② 修改Logstash中output的配置内容为:

output {
  elasticsearch {
    hosts => "localhost:9200"
    index => "%{type}"
  }
}

在output中增加index属性,%{type}表示按不同的document_type值建ES索引

四、总结

本文主要介绍了ELK实时日志分析的三种部署架构,以及不同架构所能解决的问题,这三种架构中第二种部署方式是时下最流行也是最常用的部署方式,最后介绍了ELK作在日志分析中的一些问题与解决方案,说在最后,ELK不仅仅可以用来作为分布式日志数据集中式查询和管理,还可以用来作为项目应用以及服务器资源监控等场景,更多内容请看官网。

ELK之Logstash安装与配置及使用

1、Logstash介绍

Logstash 是开源的服务器端数据处理管道,能够同时 从多个来源采集数据、转换数据,然后将数据发送到您最喜欢的 “存储库” 中。(我们的存储库当然是 Elasticsearch。)

2、安装jdk

# yum -y install java-1.8.0  
# java -version  
java version "1.8.0_51"  
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)  
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)  

3、安装logstash

# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.tar.gz  
# tar zxf logstash-6.0.0.tar.gz -C /Data/apps/  

配置logstash的环境变量

# echo "export PATH=$PATH:/Data/apps/logstash-6.0.0/bin" > /etc/profile.d/logstash.sh  
# . /etc/profile  

4、查看帮助

# logstash --help

未分类

5、logstash常用参数

-e :指定logstash的配置信息,可以用于快速测试;
-f :指定logstash的配置文件;可以用于生产环境;

6、启动logstash

6.1 通过-e参数指定logstash的配置信息,用于快速测试,直接输出到屏幕。–quiet:日志输出安静模式

$ logstash -e "input {stdin{}} output {stdout{}}" --quiet

6.2

$ logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'

7、logstash以配置文件方式启动

$ vim logstash.conf  
input { stdin {} }  
output {  
   stdout { codec=> rubydebug }  
}  
$ logstash -f logstash.conf --quie  
yes ,i can  
{  
      "@version" => "1",  
          "host" => "wechat1-dev.bj1.xxxx.net",  
    "@timestamp" => 2017-11-25T10:28:38.763Z,  
       "message" => "yes ,i can"  
}  

8、更多样例

请参考官方文档样例:https://www.elastic.co/guide/en/logstash/current/config-examples.html

8.1 样例 elasticsearch

input { stdin { } }  
output {  
  elasticsearch { hosts => ["localhost:9200"] }  
  stdout { codec => rubydebug }  
}  

8.2 样例 access_log

input {  
  file {  
    path => "/tmp/access_log"  
    start_position => "beginning"  
  }  
}  


filter {  
  if [path] =~ "access" {  
    mutate { replace => { "type" => "apache_access" } }  
    grok {  
      match => { "message" => "%{COMBINEDAPACHELOG}" }  
    }  
  }  
  date {  
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]  
  }  
}  


output {  
  elasticsearch {  
    hosts => ["localhost:9200"]  
  }  
  stdout { codec => rubydebug }  
}  

8.3 写入redis

input { stdin { } }  
output {  
    stdout { codec => rubydebug }  
    redis {  
        host => '192.168.1.104'  
        data_type => 'list'  
        key => 'logstash:redis'  
    }  
}  

Centos6.9安装vsftpd并配置多用户的方法

本文介绍了Centos6.9安装vsftpd并配置多用户的方法,分享给大家,具体如下:

一、安装vsftpd

#安装vsftpd
yum -y install vsftpd
#设置开机启动
chkconfig vsftpd on
#查看服务状态
service vsftpd status
#默认是关闭的,如下
# vsftpd is stopped

二、修改系统保留FTP

#添加组
groupadd -g 1002 vsftpd
#创建用户组目录
mkdir -p /home/vsftpd
#添加用户
useradd -c "FTP User" -d /home/vsftpd/vsftpd -g vsftpd -s /sbin/nologin -u 1002 vsftpd
useradd -c "FTP User" -d /home/vsftpd/test -g vsftpd -s /sbin/nologin test
#设置密码(格式:passswd 用户名),输入密码回车,再次输入密码回车
passwd vsftpd
#创建指定访问目录
mkdir -p /data/vsftpd
#更改权限
chown vsftpd:vsftpd /data/vsftpd
chmod -R 775 /data/vsftpd

可以查看添加进来的新用户

cat /etc/passwd
#如下
# vsftpd:x:1002:1002:FTP User:/home/vsftpd/vsftpd:/sbin/nologin
# test:x:1003:1002:FTP User:/home/vsftpd/test:/sbin/nologin

说下/bin/false跟/sbin/nologin的区别

1、/bin/false什么也不做只是返回一个错误状态,然后立即退出。将用户的shell设置为/bin/false,用户会无法登录,并且不会有任何提示。

2、/sbin/nologin会礼貌的向用户显示一条信息,并拒绝用户登录:This account is currently not available.

3、有一些软件,比如一些ftp服务器软件,对于本地非虚拟账户,只有用户有有效的shell才能使用ftp服务。这时候就可以使用/sbin/nologin使用户即不能登录系统,还能使用一些系统服务,比如ftp服务。/bin/false则不行,这是二者的重要区别之一

三、修改配置文件

#备份原文件
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.txt
#生成新的配置文件
touch /etc/vsftpd/vsftpd.conf
#编辑配置文件
vim /etc/vsftpd/vsftpd.conf

粘贴下面这些配置进去

# Example config file /etc/vsftpd/vsftpd.conf
#
# 如果vsftpd处于独立模式,则这是它将侦听传入FTP连接的端口。
listen_port=21
#
# 登入目录
local_root=/data/vsftpd
#
# 是否允许匿名用户登录
anonymous_enable=NO
#
# 设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为NO的情况下所有虚拟用户将无法访问
local_enable=YES
#
# 设定允许进行写操作(上传、删除),默认为YES
write_enable=YES
#
# 是否使用本地时间
#use_localtime=YES
#
# 此参数在VSFTPD使用单独(standalone)模式下有效。此参数定义了FTP服务器最大的并发连接数,当超过此连接数时,服务器拒绝客户端连接。默认值:0(无限制)。
#max_clients=5
#
# 此参数在VSFTPD使用单独(standalone)模式下有效。此参数定义每个IP地址最大的并发连接数目。超过这个数目将会拒绝连接。此选项的设置将影响到象网际快车这类的多进程下载软件。默认值为0,表示不限制。
#max_per_ip=3
#
# 掩饰码
local_umask=002
#
# 是否允许匿名FTP用户上传文件。
#anon_upload_enable=NO
#
# 是否允许匿名FTP用户能够创建新目录
#anon_mkdir_write_enable=NO
#
# 激活目录消息 - 当远程用户进入某个目录时发送的消息。
dirmessage_enable=YES
#
# 设置为yes时,用户上传和下载文件都会被记录下来,记录文件位置与xferlog_file=/var/log/vsftpd/xferlog
xferlog_enable=YES
#
# 在vsftpd_log_file和xferlog_file文件之间切换登录文件信息,NO 写入 vsftpd_log_file, YES 写入 xferlog_file
xferlog_std_format=YES
#
# 设置另外一个vsftpd的日记文件,也可以不设置
dual_log_enable=YES
xferlog_file=/var/log/vsftpd/xferlog
#
# 设置日志目录
vsftpd_log_file=/var/log/vsftpd/vsftpd.log
#
# 端口样式连接始发的端口(只要名称不正确的 connect_from_port_20 启用),默认值:20
connect_from_port_20=YES
#
# 是否修改匿名用户所上传文件的所有权。YES,匿名用户所上传的文件的所有权将改为另外一个不同的用户所有,用户由chown_username参数指定。此选项默认值为NO。 
#chown_uploads=YES
#
# 指定拥有匿名用户上传文件所有权的用户
#chown_username=whoever
#
# 远程客户端建立与PASV样式数据连接的连接的超时(以秒为单位),默认值:60。
#accept_timeout=60
#
# 远程客户端响应我们的端口样式数据连接的超时时间(秒)。默认值:60。
#connect_timeout=60
#
# 远程客户端可能在FTP命令之间花费的最长时间(以秒为单位)。如果超时触发,远程客户端将被启动。默认值:300
#idle_session_timeout=300
#
# 超时时间(以秒为单位),大概是允许数据传输停止而无进度的最大时间。如果超时触发,远程客户端将被启动。默认值:300
#data_connection_timeout=300
#
# 创建上传文件的权限。Umasks应用于此值的顶部。如果要上传的文件可执行,您可能希望更改为0777。默认值:0666
#file_open_mode=002
#
# 本地认证用户允许的最大数据传输速率(以字节为单位)。默认值:0(无限制)
#local_max_rate=0
#
# 建议您在系统上定义一个唯一的用户,ftp服务器可以用作完全独立且无特权的用户。
#nopriv_user=ftpsecure
#
# 是否启动异步传输功能
#async_abor_enable=YES
#
# 是否启用ASCII功能
ascii_upload_enable=YES
ascii_download_enable=YES
#
# 自定义登录显示的字符串
#ftpd_banner=Welcome to blah FTP service.
#
# 指定某个纯文本作为用户登录时显示的欢迎字眼,也可以放置一些让用户知道本FTP服务器的目录架构
#banner_file=/etc/vsftpd/welcome.txt
#
# 您可以指定一个不允许的匿名电子邮件地址的文件。 显然有助于打击某些DoS攻击。
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails
#
# 锁定某些用户在自家目录中。即当这些用户登录后,不可以转到系统的其他目录,只能在自家目录(及其子目录)下。
# 当chroot_local_user=YES,chroot_list_enable=YES时,chroot_list_file目录里面的用户不被chroot在主目录中。
# 当chroot_local_user=YES,chroot_list_enable=NO时,chroot_list_file目录里面的用户全部给被chroot在主目录中
chroot_local_user=YES
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
#
# 此选项默认值为NO , 此时ftpusers 文件中的用户禁止登录FTP 服务器;若此项设为YES ,则 user_list 文件中的用户允许登录 FTP 服务器,而如果同时设置了 userlist_deny=YES ,则 user_list 文件中的用户将不允许登录FTP 服务器,甚至连输入密码提示信息都没有,直接被FTP服务器拒绝
userlist_enable=YES
#
# 此项默认为YES ,设置是否阻扯user_list 文件中的用户登录FTP 服务器,设置为NO时只允许user_list 当中的用户使用ftp,对于后新建的用户起到屏蔽作用,如果想要使用ftp则必须加入这个列表文件中
userlist_deny=NO
#
# 当userlist_enable=YES,当userlist_deny=YES,这里面的用户不能登录,当userlist_deny=NO时,只有这里面的用户才能登录ftp 。
userlist_file=/etc/vsftpd/user_list
#
# 当启用“listen”指令时,vsftpd以独立模式运行,并在IPv4套接字上侦听。 该指令不能与listen_ipv6指令一起使用。
listen=YES
#
# 此指令允许侦听IPv6套接字。 要监听IPv4和IPv6套接字,您必须运行两个vsftpd副本和两个配置文件。请确保其中一个listen选项被注释!
#listen_ipv6=YES
#
# 设置 PAM 外挂模块提供的认证服务所使用的配置文件名 ,即/etc/pam.d/vsftpd 文件
pam_service_name=vsftpd
#
# 是否开启用虚拟用户功能
#guest_enable=YES
#
# 指定虚拟用户的宿主用户,CentOS中已经有内置的ftp用户了
#guest_username=ftp
#
# 匿名客户端允许的最大数据传输速率(以字节为单位)。默认值:0(无限制)
#anon_max_rate=0
#
# 为匿名用户设置文件创建的umask的值。注意!如果要指定八进制值,请记住“0”前缀,否则该值将被视为基数10整数!默认值:077
#anon_umask=002
#
# 设定虚拟用户个人vsftp的CentOS FTP服务文件存放路径。存放虚拟用户个性的CentOS FTP服务文件(配置文件名=虚拟用户名)
#user_config_dir=/etc/vsftpd/virtual_conf
#
# 如果要禁止PASV方法获取数据连接,请设置为NO。
pasv_enable=YES
#
# 设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界,0 表示任意。默认值为0。把端口范围设在比较高的一段范围内
pasv_min_port=20000
pasv_max_port=30000
#
# 默认值为NO。为YES时,将关闭PASV模式的安全检查。该检查确保数据连接和控制连接是来自同一个IP地址。小心打开此选项。此选项唯一合理的用法是存在于由安全隧道方案构成的组织中。
#pasv_promiscuous=YES
#
# 如果您不想使用PORT方法获取数据连接,则设置为NO。
#port_enable=YES
#
# 默认值为NO。如果要禁用PORT安全检查,确保传出数据连接只能连接到客户端,请设置为YES。
#port_promiscuous=YES
#
# 表明服务器使用 tcp_wrappers 作为主机访问控制方式,tcp_wrappers 可以实现linux 系统中网络服务的基于主机地址的访问控制,在/etc 目录中的hosts.allow 和hosts.deny 两个文件用于设置tcp_wrappers 的访问控制,前者设置允许访问记录,后者设置拒绝访问记录。例如想限制某些主机对FTP 服务器12.36.126.141 的匿名访问,编缉/etc/hosts.allow 文件,如在下面增加两行命令:vsftpd:192.168.2.1:DENY 和vsftpd:192.168.2.20:DENY 表明限制IP 为192.168.2.1/192.168.2.20 主机访问IP 为12.36.126.141 的FTP 服务器,此时FTP 服务器虽可以PING 通,但无法连接
tcp_wrappers=YES
#

四、设置FTP用户信息

#建立限制用户访问目录的空文件
touch /etc/vsftpd/chroot_list

#添加ftp用户进来
vim /etc/vsftpd/user_list

#注释掉上面的用户,在后面加上
vsftpd
test

#创建日志文件
mkdir -p /var/log/vsftpd
touch /var/log/vsftpd/xferlog
touch /var/log/vsftpd/vsftpd.log

五、开启防火墙20000到30000端口

# 查看防火墙是否有端口,有就退出编辑,没有就执行下句
vim /etc/sysconfig/iptables

#添加端口
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 20000:30000 -j ACCEPT

#保存
/etc/init.d/iptables save

#另外需要注意,如果是阿里云的,还需要登录阿里云在安全组里面添加入方向规则

#重启iptables 服务
service iptables restart

六、重启vsftpd服务

#停止vsftpd 服务
service vsftpd stop

#启动vsftpd 服务
service vsftpd start

#重启vsftpd 服务
service vsftpd restart
可以查看ftp端口是否已经给占用,一般情况下是21端口

netstat -lnp|grep 21

以上就是本文的全部内容,希望对大家的学习有所帮助。

CentOS7部署vsftpd服务

vsftp安装 创建用户 并限定用户在自己的目录

1、查看是否已经安装了vsftpd

vsftpd -version

2、安装vsftpd(CentOS7)

yum install -y vsftpd

3、新建FTP目录

创建的FTP目录如下:

/data/KodServer/data/User/tomas/home

4、创建新用户

ftpname为你为该ftp创建的用户名,/data/KodServer/data/User/tomas/home 为登录进去后的位置

useradd -d /data/KodServer/data/User/tomas/home -s /bin/bash ftpname

5、为新建的用户设置密码

passwd ftpname

【备注:用cat etc/passwd可以查看当前系统用户】

6、设置主目录(更改登录时看到的目录,看个人需要更改,如果第4步已设置好,此步可忽略)

usermod -d /data/KodServer/data/User/tomas/home ftpname

7、添加用户组(这步可忽略)

groupadd ftpgroup

8、防火墙添加FTP服务

firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload

解决办法:

①、查看ftp的Selinux状态:sestatus -b | grep ftp
②、在结果中可以看到: ftp_home_dir off
③、将状态改为on:setsebool -P ftp_home_dir on
④、重启vsftp服务:systemctl restart vsftpd.service

setsebool -P ftpd_full_access on

systemctl restart firewalld.service

9、配置只能访问自身目录(/data/KodServer/data/User/tomas/home),不能访问其他路径

修改/etc/vsftpd.conf

cd /etc/vsftpd/
vi vsftpd.conf

#去掉前面的注释
chroot_local_user=YES

ascii_upload_enable=YES
ascii_download_enable=YES

#文件末尾添加
allow_writeable_chroot=YES

保存,重启vsftpd

设置开机启动:

systemctl enable vsftpd.service

启动vsftpd服务

systemctl start  vsftpd.service

禁止ftp用户通过22端口登录ftp服务器:

由于需要限制ftp用户在自己的目录,在21端口下没有问题,但当ftp用户用sftp登录时,还是可以访问上级目录,于是禁止ftp用户ssh登录,切断22端口的通信。

首先,执行如下命令,找到nologin的shell:

vi /etc/shells

可以看到禁止登录的shell文件为/usr/sbin/nologin,然后执行如下命令:

usermod -s /usr/sbin/nologin tomas

如果要恢复tomas的ssh登录,执行如下命令:

usermod -s /bin/bash tomas