Python Flask 框架 终极部署教程,超详细。Uwsgi+Nginx+mysql+Supervisor+Virtualenv, 基于阿里云默认Linux

我发现网上还没完整详细版本的Flask 部署教程,而我在部署中遇到很多坑,所以在这里写下来,完整的教程以下是部署流程:

处理本地的代码

假设你已经完成了项目的开发,本地已经安装了git,那么首先将你的代码提交到git;

#进项目根目录
pip freeze > requirements.txt  #导flask 全部包,方便新环境下一次性安装。
git init # 之前如果没有做,那么需要做
git add --all #提交所有修改后的文件
git remote add origin http:xxxx.git  #这一步如果之前没做,那么你需要做。
git commmit -w 'first commit'

安装Mysql

现在进入服务器正式开始搭建环境,首先安装mysql.

新鲜出炉的阿里云需要更新下apt.
apt-get update
然后安装mysql, 注意一定记住root 密码,还要在配置文件中设置字符为UTF8!
增加新的数据库,注意名字和你项目的一样,
create database xxx;

安装虚拟环境 Vitualenv

pip install virtualenvwrapper #直接安装虚拟环境容器来顺便安装virtualenv
注意需要先修改环境变量。否则命名无法使用
vim ~/.bashrc   在最底部增加
#这是为了让 WORKON 命令能用。
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

然后你需要用 mkvirtualenv xxx   来创建一个叫xxx 的python 虚拟环境
workon xxx #切换到你的虚拟环境
在这个环境里,你可以升级你的python 到python3, 当然根据你的需求。

安装 Git 拿到全部源码

现在在服务器上安装git 拿到源码
apt install git
git init
git remote add origin http:xxx.git
git pull origin master # 拿到全部源码

正式部署源码

进去项目根目录:
pip install -r requirements.txt  #导入你项目的flask 依赖
pip manager.py db migerate #初始化数据库  
# 这里如果出现初始化失败,那么清空你的 migration 文件夹,你会丢掉你的测试数据,当然有不丢的办法
pip manager.py db upgrade #导入数据库,代码迁移完成

安装Nginx

apt install nginx #安装nginx 
贴下配置文件位于: /etc/nginx/conf.d/xxx.conf
# 配置nginx与uwsgi的通信方式和名称,mysite就是名称
upstream xxx {
    # nginx使用socket的方式与uwsgi进行通信
    # 这里指向你项目的目录下的socket文件,
    # 这个socket文件不需要单独创建,在运行的时候会自动创建。
    server unix:///srv/xxx/xxx.sock;
}
# 配置服务器
server {
    # 监听的端口号
    listen 80;
    # 域名或者本机的ip地址
    server_name dev.wudizu.com 47.104.22.138;
    charset     utf-8;
    # 最大的上传大小
    client_max_body_size 75M;  
    # adjust to taste

    # 访问根目录下的任何url的配置
    location / {
        # 指定访问哪个upstream
        uwsgi_pass wudi;
        # 包括uwsgi参数的文件
        include     /etc/nginx/uwsgi_params;
    }
    location /static {
        alias /srv/xxx/static;
   }

}

安装Uwsgi

pip install uwsgi

贴下配置文件:


[uwsgi]
chdir           = /srv/xxx
# 模块
module          = firstweb   #注意这里一定要你写的flask 首页文件名
# python的虚拟环境
home            = /root/.virtualenvs/flask-py2

# 是否启用mater模式
master          = true

# 进程数
processes       = 10

# socket文件地址

socket          = /srv/xxx/xxx.sock

# wsgi文件

wsgi-file       = /srv/xxx/xxx.ini

# wsgi文件中的app变量

callable        = app

# socket文件的权限

chmod-socket    = 666

安装Supervisor

sudo pip install supervisor
# supervisor的程序名字
[program:mysite]
# supervisor执行的命令
command=uwsgi --ini mysite_uwsgi.ini
# 项目的目录
directory = /srv/xxx 
# 开始的时候等待多少秒
startsecs=0
# 停止的时候等待多少秒
stopwaitsecs=0# 自动开始
autostart=true
# 程序挂了后自动重启
autorestart=true
# 输出的log文件
stdout_logfile=/srv/xxx/log/supervisord.log
# 输出的错误文件
stderr_logfile=/srv/xxx/log/supervisord.err

[supervisord]
# log的级别
loglevel=info

# 使用supervisorctl的配置
[supervisorctl]
# 使用supervisorctl登录的地址和端口号
serverurl = http://127.0.0.1:9001

# 登录supervisorctl的用户名和密码
username = admin
password = 123

[inet_http_server]
# supervisor的服务器
port = :9001
# 用户名和密码
username = admin
password = 123

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface


然后使用supervisor运行uwsgi:
supervisord -c supervisor.conf

使用supervisorctl管理supervisord:supervisor是一个C/S模型,跟redis一样,有一个服务器,也有一个客户端命令用来管理服务的,使用以下命令进入到命令界面:
supervisorctl -c supervisor.conf

指定的文件必须和supervisord服务端保持一致。 一些常用的命令有:
supervisorctl -c supervisor.conf
> status    # 查看状态
> start program_name # 启动程序
> restart program_name # 重新启动程序
> stop program_name # 停止程序
> reload # 重新加载配置文件
> quit # 退出当前的客户端

linux中firewalld几个使用场景

一、基础配置

查看当前配置

# firewall-cmd --get-active-zone 
public
  interfaces: eth0 eth1

改变域

# nmcli c mod eth0 connection.zone internal 
# nmcli c mod eth1 connection.zone external
# firewall-cmd --get-active-zone 
internal
  interfaces: eth0
external
  interfaces: eth1

设置IP伪装

# firewall-cmd --zone=external --add-masquerade --permanent 
success
# firewall-cmd --reload 
success

查看配置

# firewall-cmd --zone=external --query-masquerade 
yes

查看ip转发和ip伪装打开

# cat /proc/sys/net/ipv4/ip_forward 

场景1、本机端口转发

访问本机external网卡的8088端口转发到本机的22号端口

# firewall-cmd --zone=external --add-forward-port=port=8088:proto=tcp:toport=22  --permanent
success
# firewall-cmd --list-all --zone=external 
external (active)
  interfaces: eth1
  sources:
  services: ssh
  ports:
  masquerade: yes
  forward-ports: port=8088:proto=tcp:toport=22:toaddr=
  icmp-blocks:
  rich rules:  

未分类

场景2:端口映射

访问防火墙的external网卡eth1的8080端口直接转发到192.168.8.2的http端口

# firewall-cmd --zone=external --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.8.2 --permanent
# firewall-cmd --list-all --zone=external

未分类

场景3:内部服务器通过防火墙上网

设置ip伪装

# firewall-cmd --zone=internal --add-masquerade --permanent 
success
# firewall-cmd --reload 
Success

设置网卡IP的nat

# firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o eth1 -j MASQUERADE 

设置规则accept

# firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i eth0 -o eth1 -j ACCEPT 
# firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

未分类

linux三大利器–grep|sed|awk

  • grep 文本查找
  • sed 行编辑器
  • awk 文本处理工具

grep

grep 比较简单 查找文本离不开正则 具体用法如从简单到复杂如

grep '[1-9]' 文件名 //匹配含有1到9数字
grep '[^1-9]' 文件名 //匹配除了1-9数字的其他字符
grep '^root' 文件名 //^变成头字符 以root开头
grep '^$' 文件名 //头和尾加起来 匹配空行
grep '.' 文件名 //匹配.
grep 'w' 文件名 //等同([a-zA-Z1-9_])
grep 'W' 文件名 //等同([^a-zA-Z1-9_])
grep 'b' 文件名 //表示单词分隔 如 b[a]b 就是a
grep 'sb+' 文件名 //匹配至少出现一次的sb
grep 'sb*' 文件名 //有s或者b都可以
grep '.' 文件名 //匹配任意字符

sed

  • 可用自动处理文件
  • 分析日志文件
  • 修改配置文件

  • sed的处理原则是行处理,而且不改变源文件

sed的格式

sed [options] ‘command’ file(s) //命令行格式
sed 'p' passwd #会打印出两行,因为sed的原理是读入一行,输出一行,此处再加上p命令打印出来的一行,所以最后会打印出两行
sed -n 'p'passwd #加了-n选项之后,只会打印出相关的行,那些不相关的行则不会打印出来

Linux grep和find使用方法和区别(四)

在linux下面工作,有些命令能够大大提高效率。本文就向大家介绍find、grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们。本文结构如下:

  • find命令
    • find命令的一般形式
    • find命令的常用选项及实例
    • find与xargs
  • grep命令
    • grep命令的一般形式
    • grep正则表达式元字符集(基本集)
    • grep命令的常用选项及实例

一、find命令

find命令是一个无处不在命令,是linux中最有用的命令之一。find命令用于:在一个目录(及子目录)中搜索文件,你可以指定一些匹配条件,如按文件名、文件类型、用户甚至是时间戳查找文件。下面就通过实例来体验下find命令的强大。

1.1 find命令的一般形式

man文档中给出的find命令的一般形式为:

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path…] [expression]

其实[-H] [-L] [-P] [-D debugopts] [-Olevel]这几个选项并不常用,上面的find命令的常用形式可以简化为:

find [path…] [expression]
  • path:find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录
  • expression:expression可以分为——“-options [-print -exec -ok …]”
  • -options,指定find命令的常用选项,下节详细介绍
  • -print,find命令将匹配的文件输出到标准输出
  • -exec,find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } ;,注意{ }和;之间的空格
    find ./ -size 0 -exec rm {} ; 删除文件大小为零的文件 (还可以以这样做:rm -i find ./ -size 0 或 find ./ -size 0 | xargs rm -f &)
    为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中:find . -type f -exec ls -l { } ;
    在/logs目录中查找更改时间在5日以前的文件并删除它们:find /logs -type f -mtime +5 -exec rm { } ;
  • -ok,和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
    find . -name “*.conf” -mtime +5 -ok rm { } ; 在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示

也有人这样总结find命令的结构:

find start_directory test 
     options 
     criteria_to_match 
     action_to_perform_on_results

1.2 find命令的常用选项及实例

  • -name
    按照文件名查找文件。
    find /dir -name filename 在/dir目录及其子目录下面查找名字为filename的文件
    find . -name “*.c” 在当前目录及其子目录(用“.”表示)中查找任何扩展名为“c”的文件
find /dir -name filename
find . name ".c"
  • -perm
    按照文件权限来查找文件。
    find . -perm 755 –print 在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件

  • -prune
    使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
    find /apps -path “/apps/bin” -prune -o –print 在/apps目录下查找文件,但不希望在/apps/bin目录下查找
    find /usr/sam -path “/usr/sam/dir1” -prune -o –print 在/usr/sam目录下查找不在dir1子目录之内的所有文件

  • -user
    按照文件属主来查找文件。
    find ~ -user sam –print 在$HOME目录中查找文件属主为sam的文件

  • -group
    按照文件所属的组来查找文件。
    find /apps -group gem –print 在/apps目录下查找属于gem用户组的文件

  • -mtime -n +n
    按照文件的更改时间来查找文件, – n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。
    find / -mtime -5 –print 在系统根目录下查找更改时间在5日以内的文件
    find /var/adm -mtime +3 –print 在/var/adm目录下查找更改时间在3日以前的文件

  • -nogroup
    查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
    find / –nogroup -print

  • -nouser
    查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
    find /home -nouser –print

  • -newer file1 ! file2
    查找更改时间比文件file1新但比文件file2旧的文件。

  • -type
    查找某一类型的文件,诸如:

b – 块设备文件。
d – 目录。
c – 字符设备文件。
p – 管道文件。
l – 符号链接文件。
f – 普通文件。

find /etc -type d –print 在/etc目录下查找所有的目录
find . ! -type d –print 在当前目录下查找除目录以外的所有类型的文件
find /etc -type l –print 在/etc目录下查找所有的符号链接文件

  • -size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
    find . -size +1000000c –print 在当前目录下查找文件长度大于1 M字节的文件
    find /home/apache -size 100c –print 在/home/apache目录下查找文件长度恰好为100字节的文件
    find . -size +10 –print 在当前目录下查找长度超过10块的文件(一块等于512字节)

  • -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
    find / -name “CON.FILE” -depth –print 它将首先匹配所有的文件然后再进入子目录中查找

  • -mount:在查找文件时不跨越文件系统mount点。
    find . -name “*.XC” -mount –print 从当前目录开始查找位于本文件系统中文件名以XC结尾的文件(不进入其他文件系统)

  • -follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。

1.3 find与xargs

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

来看看xargs命令是如何同find命令一起使用的,并给出一些例子。

  • find . -type f -print | xargs file 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

  • find / -name “core” -print | xargs echo “” >/tmp/core.log 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:

  • find . -type f -print | xargs grep “hostname” 用grep命令在所有的普通文件中搜索hostname这个词

  • find ./ -mtime +3 -print|xargs rm -f –r 删除3天以前的所有东西 (find . -ctime +3 -exec rm -rf {} ;)

  • find ./ -size 0 | xargs rm -f & 删除文件大小为零的文件

find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

二、grep命令

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

2.1 grep命令的一般选项及实例

grep [OPTIONS] PATTERN [FILE…]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE…]

grep命令用于搜索由Pattern参数指定的模式,并将每个匹配的行写入标准输出中。这些模式是具有限定的正则表达式,它们使用ed或egrep命令样式。如果在File参数中指定了多个名称,grep命令将显示包含匹配行的文件的名称。对 shell 有特殊含义的字符 ($, *, [, |, ^, (, ), ) 出现在 Pattern参数中时必须带双引号。如果 Pattern参数不是简单字符串,通常必须用单引号将整个模式括起来。在诸如 [a-z], 之类的表达式中,-(减号)cml 可根据当前正在整理的序列来指定一个范围。整理序列可以定义等价的类以供在字符范围中使用。如果未指定任何文件,grep会假定为标准输入。

2.2 grep正则表达式元字符集(基本集)

^ 锚定行的开始 如:’^grep’匹配所有以grep开头的行。

$ 锚定行的结束 如:’grep$’匹配所有以grep结尾的行。

. 匹配一个非换行符的字符 如:’gr.p’匹配gr后接一个任意字符,然后是p。

* 匹配零个或多个先前字符 如:’ grep’匹配所有一个或多个空格后紧跟grep的行。 .一起用代表任意字符。

[] 匹配一个指定范围内的字符,如'[Gg]rep’匹配Grep和grep。

[^] 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep’匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行。

(..) 标记匹配字符,如:’(love)’,love被标记为1。

< 锚定单词的开始,如:’<grep’匹配包含以grep开头的单词的行。

> 锚定单词的结束,如’grep>’匹配包含以grep结尾的单词的行。

x{m} 连续重复字符x,m次,如:’o{5}’匹配包含连续5个o的行。

x{m,} 连续重复字符x,至少m次,如:’o{5,}’匹配至少连续有5个o的行。

x{m,n} 连续重复字符x,至少m次,不多于n次,如:’o{5,10}’匹配连续5–10个o的行。

w 匹配一个文字和数字字符,也就是[A-Za-z0-9],如:’Gw*p’匹配以G后跟零个或多个文字或数字字符,然后是p。

W w的反置形式,匹配一个非单词字符,如点号句号等。W*则可匹配多个。

b 单词锁定符,如: ‘bgrepb’只匹配grep,即只能是grep这个单词,两边均为空格。

2.3 grep命令的常用选项及实例

-?

同时显示匹配行上下的?行,如:grep -2 pattern filename同时显示匹配行的上下2行。

-b,–byte-offset

打印匹配行前面打印该行所在的块号码。

-c,–count

只打印匹配的行数,不显示匹配的内容。

-f File,–file=File

从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。

-h,–no-filename

当搜索多个文件时,不显示匹配文件名前缀。

-i,–ignore-case

忽略大小写差别。

-q,–quiet

取消显示,只返回退出状态。0则表示找到了匹配的行。

-l,–files-with-matches

打印匹配模板的文件清单。

-L,–files-without-match

打印不匹配模板的文件清单。

-n,–line-number

在匹配的行前面打印行号。

-s,–silent

不显示关于不存在或者无法读取文件的错误信息。

-v,–revert-match

反检索,只显示不匹配的行。

-w,–word-regexp

如果被<和>引用,就把表达式做为一个单词搜索。

-V,–version

显示软件版本信息。

=====

  • ls -l | grep ‘^a’ 通过管道过滤ls -l输出的内容,只显示以a开头的行。

  • grep ‘test’ d* 显示所有以d开头的文件中包含test的行。

  • grep ‘test’ aa bb cc 显示在aa,bb,cc文件中匹配test的行。

  • grep ‘[a-z]’ aa 显示所有包含每个字符串至少有5个连续小写字符的字符串的行。

  • grep ‘w(es)t.’ aa 如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.),这些字符后面紧跟着另外一个es(),找到就显示该行。如果用egrep或grep -E,就不用””号进行转义,直接写成’w(es)t.*’就可以了。

  • grep -i pattern files :不区分大小写地搜索。默认情况区分大小写

  • grep -l pattern files :只列出匹配的文件名,

  • grep -L pattern files :列出不匹配的文件名,

  • grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),

  • grep -C number pattern files :匹配的上下文分别显示[number]行,

  • grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,

  • grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。

Linux查找含有某字符串的所有文件

如果你想在当前目录下 查找”hello,world!”字符串,可以这样:

grep -rn "hello,world!" *
  • * : 表示当前目录所有文件,也可以是某个文件名
  • -r 是递归查找
  • -n 是显示行号
  • -R 查找所有文件包含子目录
  • -i 忽略大小写

下面是一些有意思的命令行参数:

  • grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
  • grep -l pattern files :只列出匹配的文件名,
  • grep -L pattern files :列出不匹配的文件名,
  • grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),
  • grep -C number pattern files :匹配的上下文分别显示[number]行,
  • grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
  • grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。

这里还有些用于搜索的特殊符号:

  • < 和 > 分别标注单词的开始与结尾。

例如:

  • grep man * 会匹配 ‘Batman’、‘manic’、‘man’等,

  • grep ‘<man’ * 匹配‘manic’和‘man’,但不是‘Batman’,

  • grep ‘<man>’ 只匹配‘man’,而不是‘Batman’或‘manic’等其他的字符串。

  • ‘^’:指匹配的字符串在行首,

  • ‘$’:指匹配的字符串在行尾,

Linux下Redis服务器搭建

一、系统环境

  • 操作系统:CentOS 6.9

  • redis版本:redis-4.0.2

二、安装步骤

1. 安装预环境

运行以下命令安装预环境。

[root@redis02 redis-4.0.2]# yum -y install gcc make

2. 下载redis源代码文件并解压缩

下载完redis源代码后,运行以下命令进行解压缩。

[root@redis02 softwares]# tar -xzf redis-4.0.2.tar.gz

未分类

3. redis编译

运行make命令进行编译。

未分类

make命令执行完成编译后,会在src目录下生成6个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump、redis-sentinel。

4. redis安装配置

运行make install命令。

未分类

命令执行后会将make编译生成的可执行文件拷贝到/usr/local/bin目录下,如下图。

未分类

然后,运行./utils/install_server.sh配置向导来配置redis,并且可以将redis服务加到开机自启动中。【重要】

未分类

5. redis服务查看,开启和关闭

此时redis服务已经启动了。可以通过以下命令来操作redis了。

查看redis的运行状态:

[root@redis02 redis-4.0.2]# service redis_6379 status

关闭redis服务:

[root@redis02 redis-4.0.2]# service redis_6379 stop

开启redis服务:

[root@redis02 redis-4.0.2]# service redis_6379 start

最后可以通过redis内置的客户端工具来测试下:

[root@redis02 ~]# redis-cli
127.0.0.1:6379> get name

(nil)

127.0.0.1:6379> set name mcgrady

OK

127.0.0.1:6379> get name

"mcgrady"

127.0.0.1:6379>

可以看到,redis服务已经成功配置好了!

三、注意事项

1. 运行make命令报错?

错误信息如下:

make[3]: gcc: Command not found

/bin/sh: cc: command not found

解决方案:

因为预环境没有安装,运行以下命令安装预环境。

[root@redis02 redis-4.0.2]# yum -y install gcc make

2. 安装完预环境后运行make命令报以下错误?

错误信息:

zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory

zmalloc.h:55:2: error: #error "Newer version of jemalloc required"

解决方案:

运行以下命令。

make MALLOC=libc

3. 运行make test命令报以下错误?

错误信息:

You need tcl 8.5 or newer in order to run the Redis test

解决方案:

运行以下命令安装tcl。

[root@redis02 redis-4.0.2]# yum -y install tcl

4. 调用ConnectionMultiplexer.Connect创建连接的时候报错?

错误信息:

It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail. UnableToResolvePhysicalConnection on TIME

解决方案:

1)关闭保护模式,注意默认是打开的。

未分类

2)绑定IP,注意默认只绑定了127.0.0.1。

未分类

有用命令:

telnet 192.168.1.29 6379,可以直接测试客户端是否能连上服务器,如果通的话,基本上就没有什么问题。

ps -aux | grep redis ,查看redis的进程,看redis是否正常启动。

Linux下通过SSH实现服务器间简单的分发文件与执行命令

SSH介绍

SSH服务由服务端软件OpenSSH(openssl)和客户端(常见的有SSH(linux),SecureCRT,xshell,Putty)组成,SSH服务默认使用22端口提供服务,它有两个不兼容的SSH协议版本,分别是1.x和2.x.

SSH 1.x协议存在被黑客针对联机的Key pair插入恶意程序代码的风险,而SSH 2.x针对这个问题,多加了一个确认联机正确性的Diffie-Hellman机制,每次数据传输中,都会以该机制检查输出来源是否正确.

SSH的服务认证类型主要分为:

  • 基于口令的安全认证
  • 基于密钥的安全认证:首先建立一对密钥对,把公钥(public key)放在需要访问的目标服务器上.另外还需要吧私有密钥(private key)放到SSH的客户端或对应的客户端服务器上.

SSH的操作命令

SSH连接其他服务器

ssh -p22 [email protected] #被连接的主机

SSH通过远程连接执行命令

ssh -p22 [email protected] /sbin/ifconfig eht0

ssh 链接主机记录信息位置

~/.ssh/known_hosts

ssh客户端文件拷贝至远端服务器

可以通过 -l 参数限制传输速度.

scp -P22 -rp /tmp/oldboy [email protected]:/tmp/oldboy #方向由左至右

sftp功能?(不要用)

sftp无法显示登陆用户的目录,可以随时跳到别的目录

sftp -oPort=55555 [email protected]
get(download) put(upload)

实现SSH密钥批量分发

#确认系统版本信息
cat /etc/redhat-release
uname -r
uname -m
#添加批量分发账号
useradd fenfa (所有计算器创建分发账号)
echo 123456|passwd --stdin fenfa
#分发账号需要sudo授权rsync
echo "fenfa ALL=(ALL) NOPASSWD: /usr/bin/rsync" >>/etc/sudosers
visudo -c
#生成密钥对
ssh-keygen -t dsa
#查看密钥对
ls -l .ssh/
#分发密钥
ssh-copy-id -i .ssh/id_dsa.pub "-p [email protected]"
#测试
ssh -p55555 [email protected] /sbin/ifconfig

增量,加密传输文件:

rsync -avz hosts -e 'ssh -p55555' [email protected]:~

简单文件批量分发脚本(有待修改)

#!/bin/sh
. /etc/init.d/functions
if [ $# -ne 2 ]
then
echo "USAGE:/bin/sh $0 localfile remotedir"
exit 1
fi
for n in 1 2 3
do
scp -P55555 -r ~/$1 [email protected].$n:~ &>dev/null &&
ssh -p55555 -t [email protected].$n sudo rsync ~/$1 $2 &>/dev/null
if [ $? -eq 0 ]
then
action "fenfa $1 192.$n is ok" /bin/true
else
action "fenfa $1 192.$n is false" /bin/false
fi
done

简单的批量查看脚本

#!/bin/sh
if [ $# -ne 1 ]
then
echo "USAGE:$0 COMMAND"
exit 1
fi
for n in 1 2 3
do
echo ============192.168.117.$n========
ssh -p55555 [email protected].$n $1
done

非交互式生成密钥并实现批量管理

1、为所有机器创建传输用用户及密码

useradd key888
echo 123456|passwd --stdin key888
id key888
echo "key888 ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers 
visudo -c
su - key888

2、管理机创建密钥对

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1

3、分发密钥

yum install expect -y #只安装在管理机
ssh-copy-id -i.ssh/id_dsa.pub "-p 52113 [email protected]"

4、此处需要三个脚本实现

fenfa_auto.sh

ssh_expect.exp

~/intall.sh

vi ssh_expect.exp
#!/usr/bin/expect
if { $argc != 2 }{
send_user "usage: expect ssh_expect.exp file hostn"
exit
}
#define var
set file [lindex $argv 0]
set host [lindex $argv 1]
set password "123456"
#spawn scp /etc/hosts [email protected]:/etc/hosts
#spawn scp -P55555 $file kendally@$host:$dirn
spawn ssh-copy-id -i $file "-p 55555 key888@host"
expect {
"yes/no"   {send "yes/r";exp_continue}
"*password"{send "$passwordr"}
}
expect eof
exit -onexit {
send_user "kendall say good bye to you!n"
}
#script usage
#expect kendall-6.exp file host 
#expaple
#expect ssh_expect.exp file host 
#expect ssh_expect.exp ~/.ssh/id_dsa.pub 172.16.1.31
vi fenfa_auto.sh
#!/bin/sh
. /etc/init.d/functions
shh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
if [ $? -eq 0 ];then
action "ccreat dsa $ip" /bin/true
else
action "create dsa $ip" /bin/false
exit 1
fi
for ip in 8 31 41
do
expect ssh_expect.exp ~/.ssh/id_dsa.pub 172.16.1.$ip >dev/null 2>&1
if [ $? -eq 0 ];then
action "$ip" /bin/true
else
action "$ip" /bin/false
fi
done
#dis fenfa scripts
for m in 8 31 41
do
scp -P55555 -rp ~/scripts [email protected].$m:~
done
#install service
for n in 8 31 41
do
ssh -t -p55555 [email protected].$n sudo /bin/bash ~/scripts/install.sh
done
vim intall.sh
yum install httpd -y

Linux下rsync数据同步工具简易配置

rsync 服务端配置步骤

创建配置文件:

文件本身不存在需要手动创建

vi /etc/rsyncd.conf
#Rsync server 
#created by kendall 2017.10.18
##rsyncd.conf start##
uid = rsync                     #客户端连过来具有什么权限
gid = rsync
use chroot = no                 #安全相关,程序出bug开启有好处
max connections = 2000          #最大客户端连接数
timeout = 300                   #超时断开时间
pid file = /var/run/rsyncd.pid  #daemon进程号记录
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log  #日志文件位置
ignore errors                   #忽略错误
read only = false               #只读 假的(可读写)
list = false                    #不可以查看服务端列表
hosts allow = 172.16.1.0/24     #允许IP段
#hosts deny = 0.0.0.0/32        #拒绝
auth users = rsync_backup       #远程连接的用户(纯虚拟用户,不是系统用户)
secrets file = /etc/rsync.password #存放用户密码的文件位置
[backup]                        #第一个模块
path = /backup                  #共享的目录
[oldboy]                        #第二个模块
path = /data                    #共享的目录

创建用户,及共享目录

useradd rsync -s /sbin/nologin -M
id rsync
mkdir /backup /data
chown -R rsync.rsync /backup/ /data/

创建密码文件

echo "rsync_backup:654321" >/etc/rsync.password
chmod 600 /etc/rsync.password

启动rsync

rsync --daemon
netstat -lntup|grep rsync
ps -ef|grep rsync|grep -v grep

加入开机自启动

echo "rsync --daemon" >>/etc/rc.local
cat /etc/rc.local

rsync 客户端配置步骤

创建密码文件

echo "654321" >/etc/rsync.password
chmod 600 /etc/rsync.password
ll /etc/rsync.password
cat /etc/rsync.password

推送文件测试

rsync -avz /tmp/ rsync_backup@server_ip::backup --password-file=/etc/rsync.password
rsync -avz /tmp/ rsync://rsync_backup@servr_ip/backup/tmp/  --password-file=/etc/rsync.password

相关其他内容

rsync服务端配置修改后,需要重启rsync

pkill rsync
rsync --daemon
lsof -i:873

推送时,排除特定文件

rsync -avz --exlude={a,b} /backup/ rsync_backup@server_ip::backup --password-file=/etc/rsync.password
rsync -avz --exlude={a..g} /backup/ rsync_backup@server_ip::backup --password-file=/etc/rsync.password
rsync -avz --exlude-from=paichu.log /backup/ rsync_backup@server_ip::backup --password-file=/etc/rsync.password

无差异同步,增量同步千万别用

rsync -avz --delete /backup/ rsync_backup@server_ip::backup --password-file=/etc/rsync.password

限速推送

dd if=/dev/zero of=test1 bs=1M count=128
rsync -avz --bwlimit=100 /tmp/ rsync_backup@server_ip::backup --password-file=/etc/rsync.password

rsync的三种工作模式

本地   cp
通道   rsync -avzP -e 'ssh -p22' /etc root@server_ip:/tmp/
daemon 内网明文传输

题外:操作文件前的备份方法:

cp /etc/rsyncd.conf{,.bak}

linux服务器下如何查看memcached的运行情况

查看memcached的运行情况有两种办法:

方法一、登录服务器通过命令查询

通过SSL登录服务器,在命令行输入:

echo stats | nc 127.0.0.1 11211

能看到如下内容:

未分类

重点关注两行数据即可:

STAT get_hits xxxx

命中了多少次缓存,也就是从 Memcached 缓存中成功获取数据的次数

STAT get_misses xxxx

没有命中的次数

方法二、使用memcached官方的探针

具体方法参见: https://www.liangshare.com/linux/8340.html

安装探针之后,访问探针页面,能看到如下信息:

未分类

其中右边长方形的柱形图,绿色表示命中率,橘色表示未命中率。

简述linux下lvm 磁盘扩容

查看扩容之前的磁盘状况

[root@localhost ~]# df -h

[root@localhost ~]# fdisk -l

创建物理卷(PV)

#pvcreate /dev/sdc ---输入磁盘实际路径

格式化新硬盘

[root@localhost ~]# mkfs.ext4 /dev/sdc

mke2fs 1.41.12 (17-May-2010)

/dev/sda is entire device, not just one partition!

Proceed anyway? (y,n) y

***询问是否继续,输入Y,确定

查看系统PV的情况:

[root@localhost ~]# pvdisplay

--- NEW Physical volume ---

PV Name               /dev/sdc

VG Name                //新建的PV的VG name是空的,下一步就是把PV加入VG

PV Size               15.00 GiB

Allocatable           NO

......

查看原VG的情况

[root@localhost ~]# vgdisplay

--- Volume group ---

VG Name               VolGroup //注意记录此名字,扩容时将新的pv加入指定的名字

System ID

Format                lvm2

Metadata Areas        1

Metadata Sequence No  3

......

扩展卷组,将/dev/sdc物理卷添加到VolGroup卷组中

[root@localhost ~]# vgextend VolGroup /dev/sdb

Volume group "VolGroup" successfully extended

至此完成新硬盘扩展!