Linux

词汇了解

内存泄露

现象

内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。 内存泄漏通常情况下只能由获得程序源代码的程序员才能分析出来。

后果

内存泄漏会因为减少可用内存的数量从而降低计算机的性能。过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。

一个短暂运行的应用程序中的内存泄漏不会导致严重后果。在应用程序结束后会释放内存

服务器

定义(服务器软、硬件)

服务器硬件

具有较高计算能力,能够提供给多个用户使用的计算机。

服务器和PC机的明显区别

PC机一个时刻内通常只为一个用户提供服务;

服务器基本24小时无休,通过终端网络给用户使用;技术更稳定,且通常多部连接在一起运作。

服务器分类

工作组级服务器、部门级服务器和企业级服务器。

服务器平台操作系统

Linux发行版

红帽企业Linux、SUSE、AIX、HP-UX、IRIX、FreeBSD、Solaris、Mac OS X Server、OpenBSD、NetBSD、和SCO OpenServer。

Microsoft Windows服务器版本

Windows NT Server、Windows 2000 Server、Windows Server 2003、Windows Server 2008、Windows Server 2012。

世纪互联

世纪互联数据中心有限公司是中国的电信中立第三方互联网基础设施服务提供商,向客户提供业界领先的服务器及网络设备托管服务、管理式网络服务、内容分发网络服务及云计算服务。

树莓派

​ 只有信用卡大小的微型计算机,基于Linux系统。特点外表小内心大,拥有计算机的基本功能,为学习计算机编程教育而设计。

CentOS(免费且商用)

​ 是Linux的发行版本之一,是一个安全、低维护、稳定、高预测性、高重复性的 Linux 环境。

​ CentOS 2014加入红帽,但是不收费

Linux命令

Linux常用快捷命令

清屏

方式一

clear

方式二

ctrl+l

查看PATH变量的值

echo $PATH 查看当前环境变量的值

which 软件名 查看当前软件的环境变量

快速登录退出

ctrl+d 快速退出

ctrl+shift+r 快速登录

查看当前占用端口及程序

netstat -tunple

修改主机名

hostnamectl set-hostname 主机名

查看服务器IP地址

方式一:

​ ip addr

方式二:

​ ifconfig

常用端口

ftp:23

sftp:22

dns:53

http:80

https:443

ssh:22

连接服务器

​ ssh 服务器IP,默认22端口,根据提示输入root,密码。

关闭防火墙(根据情况使用)

#清空防火墙规则

iptables -F

#关闭防火墙服务

systemctl stop firewalld

#临时关闭防火墙服务

systemctl stop firewalld

#永久关闭开机自启

systemctl disable firewalld

不同Linux主机中传输文件和目录(scp)

scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。

scp 本地文件 远程用户名@远程ip:远程文件夹/

scp 本地文件 远程用户名@远程ip:远程文件夹/远程文件名

-r 递归复制

-v 详细方式输出

-q 不显示传输进度条

-C 允许压缩

yum工具自动安装和源代码编译安装

解决软件依赖问题,需要yum安装以下rpm包

yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y

yum安装

yum install 软件名

源代码编译安装(可以自定义安装)

获取软件源代码压缩包

wget 软件下载url

解压源代码压缩包

tar -xvf 软件源码包

./configure --prefix(指定路径,释放makefile编译文件)

源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(make install)。

Configure是一个可执行脚本,它有很多选项,在待安装的源码路径下使用命令./configure –help输出详细的选项列表。

其中--prefix选项是配置安装的路径,如果不配置该选项,安装后可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr /local/share,比较凌乱。

如果配置--prefix,可以把所有资源文件放在指定的路径中,不会杂乱。用了—prefix选项的另一个好处是卸载软件或移植软件。当某个安装的软件不再需要时,只须简单的删除该安装目录,就可以把软件卸载得干干净净;移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统)。

当然要卸载程序,也可以在原来的make目录下用一次make uninstall,但前提是make文件指定过uninstall。

./configure --prefix=/安装目录/

编译并安装

使用gcc工具编译并安装

make && make install

rpm安装(不自动解析)

配置环境变量,方便调用软件(PATH)

  1. 查看软件的bin目录或者sbin目录

​ 在路径在 /etc/profile 这个文件中最后的PATH中加入上一步获取到的路径

  1. 读取文件,生效PATH

​ source /etc/profile

文件夹及文件的增删查改

查询绝对路径(pwd)

切换目录(cd)

cd ~ #当前用户所在家目录

cd / # 系统根目录

cd # 当前用户的home目录

cd ../../ #返回上上一层目录

查询文件夹及文件(ls)

-a 显示所有内容,包括隐藏内容

-g 以文件前分组目录

-i 显示索引

-p 对目录加上表示符号“/”

-R 递归显示子目录

-lh 列出信息及大小

条件查询、涉及筛选的(find、grep、管道符)

find 目录和文件

find 路径 -命令参数 【输出形式】

-name 按照文件名查找文件

-perm 按照文件权限查找文件

-type 查找某一类型的文件

b

块设备文件

d

目录

c

字符设备文件

p

管道文件

l

符号链接文件

f

普通文件

s

socket文件

管道符(|)

左|右

左边命令的输出会成为管道符右边命令的输入

grep

-i 忽略大小写

-n 输出行号

-v 反向选择

--color=auto 给关键词部分添加颜色

查找内容展示有条件要求的(head、tail)

head 显示文件前几行,默认10

tail 显示文件后几行,默认10

-f

持续刷新

统计目录或文件的大小(du)

du 参数 文件或目录

-s 显示总计

-h 以k,m,g单位显示

创建文件夹(mkdir)

[root@localhost ~]# mkdir aaa #创建目录

[root@localhost ~]# mkdir {aaa,bbb,ccc} #批量创建目录

[root@localhost ~]# mkdir -m a=rw bbb #创建指定属性的目录

[root@localhost ~]# mkdir -p 111/abc #创建目录,强制创建

创建文件(touch)

-c 不创建任何文件

-t 使用格式时间替代当前时间

示例:

[root@linux ~]# touch 1.txt #创建1.txt文件

[root@linux ~]# touch -c -t 05061803 1.txt #将档案时间改为,5月6日18点3分

移动文件/文件夹命令

用法:mv 旧文件名 新文件

或:mv 源文件 目录

或:mv 目录 源文件

将源文件重命名为目标文件,或将源文件移动至指定目录。

示例:

[root@localhost ~]$ mv -t ./database 1.sql #将1.sql移动到database目录下

文件/文件夹改名命令

[root@localhost ~]$ mv aaa bbb #将目录或者文件重命名,如果存在bbb目录,则是将aaa移到bbb目录下

删(rm)

-f 强制删除,忽略不存在的文件,不提示确认

-i 删除前需要确认

-d 删除空目录

-r 递归删除目录及内容

示例:

rm -rf 文件/目录

文件的读写操作

读文件(cat/vim)

cat 文件名

-A 一次性显示所有内容,且每行结束显示$

-n 显示行号

vim 文件名

-b 二进制模式

VIM编辑器的使用

查阅(vim 文件名后)

移动光标

w(e)

移动光标到下一个单词的首(尾)

b

移动到上一个单词的首部

0(非小数字键盘的0),^相同作用

移动到本行最开头

$

移动光标到本行结尾

H、M、L

移动光标到屏幕首行、屏幕中部、屏幕尾行

gg、G

移动光标到文档首行、文档尾行

ctrl+f、ctrl+b

下一页、上一页

查找

/单词、?单词

在整篇文档中查找单词,向下、向上查找

*

查找光标所在单词,n向下,N向上

%

找到括号的另一半

:行号

快速跳转第几行

复制、删除、粘贴

yy、3yy

拷贝光标所在行、拷贝光标所在的3行

dd、5dd

删除光标所在行、删除光标所在5行

D

删除光标至行尾的内容

dG

删除当前行到文档尾的内容

p

粘贴

x

删除光标所在的字符

u

撤销上一步操作

编辑(vim 文件名后)

i

插入

a

在当前光标处添加内容

o

下一行添加内容

结束

w

写入

q

退出

强制退出,无视错误

文件的快捷方式(软链接 ln)

语法:ln -s 目标文件的绝对路径 快捷方式绝对路径

安全、权限及创建用户

同步服务器时间到ntp.aliyun.com

ntpdate -u ntp.aliyun.com

创建普通用户

只有root能创建用户,用户拥有UID且唯一

系统管理员UID为0

系统用户UID为1-999 Linux安装的服务程序自己创建的独有的用户

普通用户UID为1000开始 由管理员创建

命令:

useradd 用户名

passwd 密码

useradd 用户名

-c

注释描述

-d

指定用户主目录

-g

指定用户组

-G

指定用户所属的附加组

-s

指定用户的登录shell

-u

指定用户号,如果同时有-o选项,则可以重复使用其他用户的标识号

userdel 用户名

-f

强制删除用户

-r

同时删除用户以及家目录

usermod 选项 用户名

选项同useradd的选项

passwd 选项 用户名

-l

锁定口令、禁用账号

-u

口令解锁

-d

使账号无口令

-f

强迫用户下次登录时修改口令

示例:

useradd -s /bin/sh -g group -G adm,root gem

此命令新建了一个用户gem,该用户的登录Shell是/bin/sh(有时要用/bin/bash),它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。

查看用户信息(id)

用户分组

给已有用户更改分组

usermod -g 组名 用户名

Linux中用户密码的破解

  1. 首先查询当前Linux系统的加密方式(MD5可以)

命令:authconfig --test | grep hashing

  1. 如果是MD5加密的,则可以按照以下步骤破解:

    /etc/shadow中查看用户名和密文,格式如下:

ghostcn_z:$6$TIzxZ1p7.N6t5RVS$TEM1d5OO01t6ElyCJ62hLi9bxaJIRdnZ2auTDKeMjdBGrz.VuiW1k4M3hzd3OwTwyBf1/.QdBT/t7qhrdwBPc1::0:99999:7:::

以上的ghostcn_z为用户名,密码为$后的一串密文。冒号后为权限等,我们取到密文

找MD5解密密文即可。

别名(alias)

为使用比较危险性的命令时得到提示,防止不可挽回的损失

示例(为rm设置别名):

#让系统显示 这是删除命令,谨慎

echo 这是删除命令,谨慎

#设置rm别名

alias rm='echo 这是删除命令,谨慎'

#设置别名永久生效,写入到/etc/profile(针对登录用户的合同,设置环境变量)

vim /etc/profile #编辑文件

G 快速到达最后一行

o 当前行下一行,创建一个新行,进入编辑模式

source /etc/profile #读取文件(合同生效)

---------------

#取消别名

unalias rm

加锁(chattr)

给文件加锁,只能写数据,无法删除文件

chattr +a test.py

chattr -a test.py

权限

权限的目的

保护账户的资料

权限分类的依据身份

user/owner 文件使用者,文件拥有者

group 属组

others 不属于前两者的

用户提权(sudo)

sudo命令用来以其他身份执行命令,预设身份为root,配置方法如下:

在/etc/sudoers中设置可执行sudo命令的用户

vim /etc/sudoers 打开sudoers

在root ALL=(ALL) ALL下写入需要设置的用户,格式类似root

visudo命令(带有验证的提权)

文件与文件夹权限

权限分析

-

rw

rw

r

普通文件

属主的读写权限

属组的读写权限

其他用户的读权限

r read可读

w write可写、编辑、删除

x 可执行

权限与数字转化

r 4

w 2

x 1

修改权限

命令

功能

示例

chown

修改属主

chown root 1.txt

chgrp

修改属组

chgrp root 1.txt

chmod 身份 参数 文件

身份

参数

示例

u、g、o、a

+、-、=

chmod a +w 1.txt chmod 444 1.txt

CentOS最简安装后必做流程

必定首做-配置网络

yum install vim

  1. 以root身份登录

  2. 修改网卡配置文件

​ vim /etc/sysconfig/network-scripts/ifcfg-ens33

​ 把“ONBOOT”的值修改为"yes"

reboot

  1. 安装yum install net-tools,以提供ifconfig的使用

***如果不能使用vim,就用vi。**

解决大部分程序依赖

yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y

yum源配置

yum仓库目录

/etc/yum.repos.d/

yum源配置阿里云的原因

速度快、方便使用第三方

配置阿里云的yum源步骤

  1. 阿里巴巴开源镜像站

https://opsx.alibaba.com/mirror

  1. 备份原本的yum仓库文件

cd /etc/yum.repos.d

mkdir 备份文件夹名

mv * ./备份文件夹名

  1. 下载新的阿里云的yum仓库文件

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

#-O 代表把Centos-7.repo下载到指定目录,且改名

  1. 配置额外的第三方仓库(存放互联网主流软件)

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

virtualenvwrapper自动整合虚拟环境工具的安装

安装

pip3 install -i https://pypi.douban.com/simple virtualenvwrapper

配置文件、使开机自启

个人配置文件:~/.bash_profile

系统配置文件:/etc/profile

vim ~/.bash_profile

写入以下内容:

export WORKON_HOME=目录 #设置virtualenv的统一管理目录

export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages' #添加virtualenvwrapper的参数,生成干净隔绝的环境

export VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python3 #指定python解释器

source /opt/python36/bin/virtualenvwrapper.sh #使工具生效

重新登录、查看是否加载工具

使用命令创建虚拟环境

mkvirtualenv 虚拟环境名

使用命令进入已经创建的虚拟环境

workon 查看已经创建的虚拟环境

workon 虚拟环境名

cdvirtualenv 进入已经激活的虚拟环境目录

cdsitepackages 进入虚拟环境下的第三方模块目录

deativate 退出虚拟环境

nginx的安装和启动

首先解决软件依赖

yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y

下载源码包

wget -c http://tengine.taobao.org/download/tengine-2.3.1.tar.gz

解压源码包

tar -zxvf tengine-2.3.1.tar.gz

指定目录编译并安装

./configure --prefix=/opt/tngx/ 指定安装目录

make && make install 编译和安装

nginx的操作

cd tngx/sbin

./nginx #启动

./nginx -s stop #关闭

./nginx -s reload #重新加载

nginx的配置

/opt/tngx/conf目录下的nginx.config

详解:

前面是参数 后面是值 红字为我添加的备注

#user nobody;

worker_processes 1; 工作进程数,可改,代表同时能进行的个数(工作进程是单线程进程, 如果Nginx正在进行CPU密集型工作(如SSL或gzipping),并且您有2个或更多CPU /核心,则可以将worker_processes设置为等于CPU或核心数。如果您提供大量静态文件并且文件的总大小大于可用内存,那么您可以增加worker_processes以充分利用磁盘带宽。)

#error_log logs/error.log; nginx的运行错误日志

#error_log logs/error.log notice;

#error_log logs/error.log info;

#error_log "pipe:rollback logs/error_log interval=1d baknum=7 maxsize=2G";

#pid logs/nginx.pid; nginx的进程id号,写入到一个文件,方便以后调用nginx的id

nginx的事件驱动连接

events {

​ worker_connections 1024;

}

nginx的主代码核心配置,web的配置

http {

​ include mime.types;

​ default_type application/octet-stream;

nginx的访问日志,功能参数定义

​ #log_format main '$remote_addr - $remote_user [$time_local] "$request" '

​ # '$status $body_bytes_sent "$http_referer" '

​ # '"$http_user_agent" "$http_x_forwarded_for"';

​ #access_log logs/access.log main; 日志文件,可以监测访问

​ #access_log "pipe:rollback logs/access_log interval=1d baknum=7 maxsize=2G" main;

​ sendfile on;

​ #tcp_nopush on;

​ #keepalive_timeout 0;

​ keepalive_timeout 65;

​ #gzip on; 开启网站压缩功能,在进行css、js、jpg等资源传输时进行压缩,节省带宽,加速访问

nginx的虚拟主机参数,网站的功能性参数定义

​ server {

​ listen 80; 监听端口,可自设

​ server_name localhost;

​ #charset koi8-r;

​ #access_log logs/host.access.log main;

​ #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main;

​ location / {

​ #deny 192.168.16.0/24; 拒绝访问ip段

​ root html;

​ index index.html index.htm;

​ }

以下内容自设:

​ location / {

​ #deny 192.168.16.0/24; 拒绝访问ip段

​ root html;

​ index index.html index.htm; #默认访问的主页

​ }

​ location / {

​ #deny 192.168.16.0/24; 拒绝访问ip段

​ root html;

​ index index.html index.htm;

​ }

以上内容自设

​ #error_page 404 /404.html;

​ # redirect server error pages to the static page /50x.html

​ #

​ error_page 500 502 503 504 /50x.html;

​ location = /50x.html {

​ root html;

​ }

​ # proxy the PHP scripts to Apache listening on 127.0.0.1:80

​ #

​ #location ~ .php$ {

​ # proxy_pass http://127.0.0.1;

​ #}

​ # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

​ #

​ #location ~ .php$ {

​ # root html;

​ # fastcgi_pass 127.0.0.1:9000;

​ # fastcgi_index index.php;

​ # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

​ # include fastcgi_params;

​ #}

​ # deny access to .htaccess files, if Apache's document root

​ # concurs with nginx's one

​ #

​ #location ~ /.ht {

​ # deny all;

​ #}

​ }

​ # another virtual host using mix of IP-, name-, and port-based configuration

​ #

​ #server {

​ # listen 8000;

​ # listen somename:8080;

​ # server_name somename alias another.alias;

​ # location / {

​ # root html;

​ # index index.html index.htm;

​ # }

​ #}

​ # HTTPS server

​ #

​ #server {

​ # listen 443 ssl;

​ # server_name localhost;

​ # ssl_certificate cert.pem;

​ # ssl_certificate_key cert.key;

​ # ssl_session_cache shared:SSL:1m;

​ # ssl_session_timeout 5m;

​ # ssl_ciphers HIGH:!aNULL:!MD5;

​ # ssl_prefer_server_ciphers on;

​ # location / {

​ # root html;

​ # index index.html index.htm;

​ # }

​ #}

}

在虚拟环境下安装uWSGI

pip3 install -i https://pypi.douban.com/simple uwsgi

uWSGI模板

[uwsgi]

# Django-related settings

# the base directory (full path)

#项目的绝对路径,定位到nbcrm的第一层

chdir = /opt/NBcrm

# Django's wsgi file

# 找到项目第二层的wsgi文件

module = NBcrm.wsgi

# the virtualenv (full path)

# 找到虚拟环境的绝对路径

home = /root/Envs/nbcrm

# process-related settings

# master

# 主进程

master = true

# maximum number of worker processes

# 开启uwsgi的多进程数,根据cpu核数来定义

processes = 1

# the socket (use the full path to be safe

# 基于socket链接运行crm,只有与nginx结合的时候,才使用socket形式

socket = 0.0.0.0:8000

# 当你没用nginx,调试项目的时候,使用http形式

#http = 0.0.0.0:8000

# ... with appropriate permissions - may be needed

# chmod-socket = 664

# clear environment on exit

vacuum = true

#指定一个参数,日志放在哪

#如果你使用了supervisor,请注释掉下面这个参数

#守护进程在后台运行,且将日志信息,输出到uwsgi.log日志中

#daemonize = uwsgi.log

Linux目录结构

bin

存放常用命令

boot

存放启动Linux时使用的核心文件、连接文件、镜像文件

dev

存放Linux外部设备

etc

存放所有系统管理所需要的配置文件和子目录

home

用户主目录,每个用户都有以自己用户名命名的目录

lib

基本的动态连接共享库

media

挂载设备

mnt

临时挂载别的文件系统

opt

给主机额外安装软件所摆放的目录

proc

虚拟目录,是系统内存映射,可以读取和更改系统信息。***这个目录内容是在内存里***

root

系统管理员主目录

run

临时文件系统、存储系统启动后的记录,重启时应该被清空

sbin

系统管理员使用的系统管理程序

srv

存放服务启动后需要提取的信息

sys

内核文件

tmp

存放临时文件

usr

应用程序和文件存放目录

var

存放不断扩充的目录,包括日志文件

DNS工作流程

实战部署vue+django的路飞学城

1.安装python3 环境

2.安装 mysql,redis,nginx

3.部署前端

​ 1.安装node.js的环境

​ 2.安装依赖包

​ 3.修改axios的发送的端口接口

​ 4.打包

4.部署后端

​ 1.安装virtualenv

​ 2.创建虚拟环境

​ 3.安装django和uwsgi,以及项目的依赖包

​ 4.修改uwsgi的配置文件

​ 5.通过uwsgi -ini 配置文件启动django项目

5.配置nginx

​ 1.创建两个虚拟主机,分别监听80和8000端口

​ 2.访问80端口是访问呢vue

​ 3.访问8000端口是vue发起的8000端口请求,反向代理到9000的uwsgi

6.启动nginx,mysql,redis

7.通过supervisor来管理

在已经配置好自动整合虚拟环境工具、python3、nginx、配置好阿里源的虚拟机中进行以下操作

  1. 首先在/opt/目录下载好路飞学城的Django和vue代码

wget https://files.cnblogs.com/files/pyyu/luffy_boy.zip

wget https://files.cnblogs.com/files/pyyu/07-luffy_project_01.zip

  1. 因为要在服务器上编译打包vue项目,所以得安装配置node环境

wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz

​ 因为node这个包是已经编译好的软件包,所以不需要编译并安装,直接解压后在它的目录下找到bin目录下的文件,有node npm npx三个文件,配置环境变量,配置方法查上方笔记。因为个人习惯,所以将解压好的包改名为了node

​ 测试path是否配好,查看以下命令是否报错:

​ node -v

​ npm -v

  1. 解压vue源码包,并且改名为luffy_vue,找到配置文件,更改服务器地址:

​ 配置文件在/opt/luffy_vue/src/restful/下的api.js,批量替换api.js中的127.0.0.1:8000为服务器地址和端口,举例设置为192.168.73.132:9000

  1. 确保vue的route模式是history:

​ 配置文件地址/opt/luffy_vue/src/router/下的index.js

​ // 配置路由规则

​ export default new Router({

​ linkActiveClass:'is-active',

​ mode: 'history',//改成history模式

  1. 安装vue模块,以及打包vue项目,生成dist静态文件夹

​ 防止因网速导致出错,这里设置npm下载源

​ npm config set registry https://registry.npm.taobao.org

​ 然后再进行以下操作

​ npm install

​ npm run build

  1. vue代码完成后,配置nginx,找到vue项目的主页文件

​ nginx配置文件在/opt/tngx/conf/下的nginx.conf文件

​ server {

​ listen 80;

​ server_name localhost;

​ location / {

​ root /opt/s20luffy/07-luffy_project_01/dist;

​ index index.html index.htm;

​ #确保刷新不出现404

​ try_files $uri $uri/ /index.html;

​ }

​ error_page 500 502 503 504 /50x.html;

​ location = /50x.html {

​ root html;

​ }

​ 以上黄色部分为修改部分

再添加第二个虚拟主机配置反向代理

​ server {

​ listen 9000; #vue中配置的端口

​ server_name localhost;

​ location / {

​ include uwsgi_params;

​ uwsgi_pass 127.0.0.1:9999; #指向本地django项目

​ }

​ error_page 500 502 503 504 /50x.html;

​ location = /50x.html {

​ root html;

​ }

​ }

  1. 后端uWSGI+Django的部署

​ 1.解压路飞学城的django包

​ 2.激活虚拟环境

​ mkvirtualenv luffy

​ 3.安装运行路飞学城所需的环境依赖:

​ 在虚拟环境目录下创建requirements.txt文件,内写需要的环境依赖:

​ certifi==2018.11.29

​ chardet==3.0.4

​ crypto==1.4.1

​ Django==2.1.4

​ django-redis==4.10.0

​ django-rest-framework==0.1.0

​ djangorestframework==3.9.0

​ idna==2.8

​ Naked==0.1.31

​ pycrypto==2.6.1

​ pytz==2018.7

​ PyYAML==3.13

​ redis==3.0.1

​ requests==2.21.0

​ shellescape==3.4.1

​ urllib3==1.24.1

​ uWSGI==2.0.17.1

​ 批量安装:pip3 install -i https://pypi.douban.com/simple -r requirements.txt

  1. 在django项目下创建并配置uwsgi.ini文件

[uwsgi]

# Django-related settings

# the base directory (full path)

#项目的绝对路径,定位到nbcrm的第一层

chdir = /opt/luffy_boy/

# Django's wsgi file

# 找到项目第二层的wsgi文件

module = luffy_boy.wsgi

# the virtualenv (full path)

# 找到虚拟环境的绝对路径

home = /opt/XN/luffy

# process-related settings

# master

# 主进程

master = true

# maximum number of worker processes

# 开启uwsgi的多进程数,根据cpu核数来定义

processes = 1

# the socket (use the full path to be safe

# 基于socket链接运行crm,只有与nginx结合的时候,才使用socket形式

socket = 0.0.0.0:9999

# 当你没用nginx,调试项目的时候,使用http形式

#http = 0.0.0.0:8000

# ... with appropriate permissions - may be needed

# chmod-socket = 664

# clear environment on exit

vacuum = true

#指定一个参数,日志放在哪

#如果你使用了supervisor,请注释掉下面这个参数

#守护进程在后台运行,且将日志信息,输出到uwsgi.log日志中

#daemonize = uwsgi.log

  1. 启动uwsgi后端

​ uwsgi --ini uwsgi.ini

  1. 启动redis

​ 才能添加购物车

​ 最省事的安装

​ yum install redis -y

​ systemctl start redis

mysql(mariadb)+centos7+主从复制

安装

centos官方的yum源(完整)

配置如下方式

​ 1.找到yum仓库目录,创建repo文件

​ touch /etc/yum.repos.d/mariadb.repo

​ 2.写入如下内容,指定mysql官方的yum源

​ [mariadb]

​ name = MariaDB

​ baseurl = http://yum.mariadb.org/10.1/centos7-amd64

​ gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

​ gpgcheck=1

​ 3.此时yum会自动的加载这个repo文件,读取内容

​ 4.下载mariadb数据库,服务端和客户端

​ yum install MariaDB-server MariaDB-client

​ yum源就是配置在/etc/yum.repos.d/底下的*.repo文件而已

阿里云的yum源(下载速度快、版本低、精简)

​ yum install mariadb-server mariadb

启动mariadb数据库

systemctl start mariadb

初始化数据库,清除匿名用户,以及test数据库,保证数据库安全,允许mysql远程登录

mysql_secure_installation

登录数据库

mysql -uroot -p

修改mariadb数据库的的中文支持

退出数据库的情况下,打开MySQL的配置文件,在/etc/my.cnf文件

配置内容如下,黄色部分为自己添加的和修改的:

#服务端的编码添加如下内容

[mysqld]

character-set-server=utf8

collation-server=utf8_general_ci

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

# Settings user and group are ignored when systemd is used.

# If you need to run mysqld under a different user or group,

# customize your systemd unit file for mariadb according to the

# instructions in http://fedoraproject.org/wiki/Systemd

#客户端的编码如下

[client]

default-character-set=utf8

[mysql]

default-character-set=utf8

[mysqld_safe]

log-error=/var/log/mariadb/mariadb.log

pid-file=/var/run/mariadb/mariadb.pid

#

# include all files from the config directory

#

!includedir /etc/my.cnf.d

重启mariadb生效编码

​ systemctl restart mariadb

mysql远程登录的授权设置

grant all privileges on . to root@'%' identified by '123';

远程登录命令

mysql -uroot -p -h192.168.94.132

mysql的备份与恢复

备份命令

mysqldump -uroot -p --all-databases > /opt/alldb.sql

恢复命令

方式1

进入数据库后,用source命令读取sql文件

[mysql] > source /opt/alldb.sql

方式2

用登录命令导入数据

mysql -uroot -p < /opt/alldb.sql

方式3

当数据量特别大的时候,以上方式不推荐,使用第三方工具进行导入

主从复制技术

OS1:192.168.94.132(master机器)

  1. 修改mysql的配置文件,开启binlog日志功能

vim /etc/my.cnf,写入如下信息

[mysqld]

server-id=1

log-bin=s20mysql-bin

  1. 重启数据库生效binlog日志文件

systemctl restart mariadb

  1. 进入数据库,在主库上,创建一个用户,用于主从复制

create user 'zhao'@'%' identified by '123';

  1. 给这个账号,授予slave的身份

grant replication slave on . to 'zhao'@'%';

  1. 进行锁表,防止数据写入

flush table with read lock;

  1. 在数据库外,导出此时的主库数据,发送给从库,保证起点一致性

mysqldump -uroot -p --all-databases > /tmp/alldb.sql

scp /tmp/alldb.sql root@192.168.94.130:/tmp/

**当从库配置好复制之后,回到这里解锁写入数据,查看从库数据是否写入***

OS2:192.168.94.130(slave机器)

  1. 修改从库机器的配置文件,开启id,以及只读模式

vim /etc/my.cnf 如下

[mysqld]

server-id=1000

read-only=true

  1. 重启从库

systemctl restart mariadb

将主库数据导入

mysql -uroot -p < /tmp/alldb.sql

  1. 重启数据库,并重新进入数据库,一条命令,建立主从之间的复制关系

* 在主库中的数据库内输入命令show master status;查看日志文件以及pos*口\***

change master to master_host='192.168.94.132',

master_user='zhao',

master_password='123',

master_log_file='testmysql-bin.000001',

master_log_pos=465;

  1. 开启从库的slave功能

start salve;

  1. 重启主库和从库

systemctl restart mariadb

  1. 查看从库的状态,检测是否复制成功

show slave status\G

  1. 查看如下两个参数是否是yes,主从复制即为正确

​ Slave_IO_Running: Yes

​ Slave_SQL_Running: Yes

redis内存高速缓存数据库(非关系型数据库、键值对存储数据库)

特征

​ Redis 是一个开源(BSD许可)的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件

​ redis是c语言编写的,单线程的、支持数据持久化,是key-value类型数据库。应用在缓存,队列系统中

​ redis支持数据备份,也就是master-slave模式

优势

​ 性能高,读取速度10万次每秒、写入速度8万次每秒、所有操作支持原子性,用作缓存数据库,数据放在内存中,替代某些场景下的mysql,减少与MySQL交互。

缺点

因为redis是存储在内存中的,所以断电即消失。为解决这种缺点,redis提供了持久化机制。

安装

yum安装

yum install redis -y

rpm

源码编译(卸载掉之前yum安装的redis)

  1. 卸载掉之前yum安装的redis

yum remove redis -y

  1. 下载redis的源代码包(我电脑本地有包)

wget http://download.redis.io/releases/redis-4.0.10.tar.gz

  1. 解压缩源码包

  2. 因此redis压缩包,已经提供好了makefile,只需要执行编译并安装即可,会安装在当前目录并自动配置

  3. 重新登录,检查redis环境变量是否配置成功

which redis-server

通过redis-加上tab补全查看所有命令

redis-benchmark(性能测试)、redis-check-rdb(持久化)、redis-sentinel(守护)、redis-check-aof(持久化)、redis-cli(客户端登录)、redis-server(启动服务端)

软件配置

redis-cli登录

默认直接输入redis-server可以启动服务端,默认端口6379,且没有密码

更改端口

设置密码

开启redis的安全启动模式

以上三步都在redis.conf文件中配置

bind 服务器地址 #绑定redis启动的地址,服务器地址

protected-mode yes #开启redis的安全模式,必须输入密码才可以远程登录

port 端口 #指定redis的端口

daemonize yes #让redis以守护进程方式在后台运行,不占用窗口

pidfile /var/run/redis_端口号.pid #记录redis的进程id号的文件

loglevel notice #日志运行等级:严重级别,警告级别,debug调试界别logging

requirepass 密码 #设置redis的密码

使配置生效

redis-server 配置文件名

远程登录

redis-cli -p 端口号 -h 服务器地址

auth 密码

常用redis的公共命令

keys * 查看所有key

type key 查看key类型

expire key seconds 过期时间

ttl key 查看key过期剩余时间、结果为-2表示key已经不存在了

persist 取消key的过期时间、结果为-1表示key存在,没有过期时间

exists key 判断key存在、存在返回1否则0

del keys 删除key、可以删除多个

flushall 删除所有key

dbsize 计算key的数量

string类型的操作

通过set设置的就是string类型的key -value

set key value 设置key

get key 获取key

append key value 追加string

mset key value key value … … 设置多个键值对

mget key key 获取多个键值对

del key 删除键值

incr key 递增+1

decr key 递减-1

list类型,双向队列

lpush/rpush key value value value 从列表左边/右边插

lrange key 索引 索引 获取一定长度的元素

ltrim key 索引 索引 截取一定长度列表

lpop/rpop key 删除最左边/右边一个元素

sets集合类型

sadd/srem 添加/删除 元素

sismember 判断是否为set的一个元素

smembers 返回集合所有的成员

sdiff 返回一个集合和其他集合的差异

sinter 返回几个集合的交集

sunion 返回几个集合的并集

有序集合

ZADD 顺序添加

ZREVERANGE 倒叙

ZRANGE 正序

ZREM 移除

哈希数据结构

hset 设置散列值

hget 获取散列值

hmset 设置多对散列值

hmget 获取多对散列值

hsetnx 如果散列已经存在,则不设置(防止覆盖key)

hkeys 返回所有keys

hvals 返回所有values

hlen 返回散列包含域(field)的数量

hdel 删除散列指定的域(field)

hexists 判断是否存在

redis的发布订阅

PUBLISH channel名 消息 #发消息的

SUBSCRIBE channel名 #接收消息的

PSUBSCRIBE channel名正则 #接收消息的

redis的数据持久化

RDB持久化

​ RDB持久化可以将redis在内存中的的状态保存到硬盘中,它可以手动执行save、也可以再redis.conf中配置,定期执行。

​ RDB持久化产生的RDB文件是一个经过压缩的二进制文件,这个文件被保存在硬盘中,redis可以通过这个文件还原数据库当时的状态。

优点

​ 速度快,适合做备份,主从复制就是基于RDB持久化功能实现

配置

先创建持久化文件存储的文件夹

在redis.conf中修改如下参数:

daemonize yes

port 端口号

logfile /data/端口号/redis.log #日志文件

dir /data/端口号 #定义持久化文件存储位置

dbfilename 持久化文件名.rdb #rdb持久化文件

bind IP地址 #redis绑定地址

requirepass 123 #redis登录密码

save 900 1 #rdb机制 每900秒 有1个修改记录

save 300 10 #每300秒 10个修改记录

save 60 10000 #每60秒内 10000修改记录

使用

输完数据等待时间,或者手动输 save 命令即可

AOF持久化

​ AOF记录服务器执行的所有变更操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集、命令全部以redis协议的格式保存,新命令追加到文件末尾。

优点

最大程度保证数据不丢

缺点

日志记录非常大

配置

配置参数:

appendonly yes

appendfsync always 总是修改类的操作

​ everysec 每秒做一次持久化(常用)

​ no 依赖于系统自带的缓存大小机制

redis.conf文件中修改以下参数:

daemonize yes

port 6380

logfile /data/6380/redis.log

dir /data/6380

dbfilename dbmp.rdb

requirepass redhat

save 900 1

save 300 10

save 60 10000

appendonly yes #开启

appendfsync everysec #每秒做一次持久化

使用

配置完成后直接使用即可

不重启redis的情况下,切换RDB中的数据到AOF中的操作

  1. 根据上面RDB配置操作配置redis服务端

  2. 基于这个文件启动redis支持RDB的数据库

  3. 操作并手动save生成RDB文件

  4. 通过登录redis输入以下两条命令切换为AOF持久化方式:

​ CONFIG set appendonly yes

​ CONFIG SET save ""

***以上仅仅是临时生效,永久生效需要修改配置文件***

redis的主从复制(基于RDB持久化功能实现)

环境准备,一个6379的redis(master),和一个6380的redis(slave)

redis-6379.conf(主):

port 6379

daemonize yes

pidfile /data/6379/redis.pid

loglevel notice

logfile "/data/6379/redis.log"

dbfilename dump.rdb

dir /data/6379

protected-mode no

redis-6380.conf (从):

port 6380

daemonize yes

pidfile /data/6380/redis.pid

loglevel notice

logfile "/data/6380/redis.log"

dbfilename dump.rdb

dir /data/6380

protected-mode no

slaveof 127.0.0.1 6379

分别启动2个redis实例

redis-server redis-6379.conf

redis-server redis-6380.conf

登录数据库,查看两人之间的关系

​ info replication

数据读写查看

在6379中是可以读写的

redis-cli -p 6379 set 键 值

redis-cli -p 6380 get 键

主从复制故障恢复

主库挂了得立即恢复主库,或者将从库切换为主库,继续工作

具体实现

  1. 分别启动 6379 6380 6381 三个数据库实例,建立好主从关系

  2. 杀死6379主库,此时6380 6381 群龙无首

  3. 选择让6381为新的主库,就要去除6381的从的身份

​ redis-cli -p 6381 slaveof no one

​ #查看此时6381的身份

​ redis-cli -p 6381 info replication

  1. 此时将6380的主人改为6381

​ redis-cli -p 6380 slaveof 127.0.0.1 6381

redis哨兵,自动的主从故障切换

配置步骤

  1. 环境准备,准备3个redis数据库实例,分别是 6379 6380 6381

redis-6379.conf

port 6379

daemonize yes

logfile "6379.log"

dbfilename "dump-6379.rdb"

dir "/var/redis/data/6379"

6380

redis-6380.conf

port 6380

daemonize yes

logfile "6380.log"

dbfilename "dump-6380.rdb"

dir "/var/redis/data/6380"

slaveof 127.0.0.1 6379

6381

redis-6381.conf

port 6381

daemonize yes

logfile "6380.log"

dbfilename "dump-6380.rdb"

dir "/var/redis/data/6381"

slaveof 127.0.0.1 6379

  1. 分别启动三个redis数据库实例

redis-server redis-6379.conf

redis-server redis-6380.conf

redis-server redis-6381.conf

  1. 准备三个redis-sentinel哨兵的配置文件

redis-sentinel-26379.conf

port 26379

dir /var/redis/data/26379

logfile "26379.log"

当前Sentinel节点监控 127.0.0.1:6379 这个主节点

2代表判断主节点失败至少需要2个Sentinel节点节点同意

mymaster是主节点的别名

sentinel monitor s20master 127.0.0.1 6379 2

每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达

sentinel down-after-milliseconds s20master 30000

当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,

原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1

sentinel parallel-syncs s20master 1

故障转移超时时间为180000毫秒

sentinel failover-timeout s20master 180000

让哨兵在后台运行

daemonize yes

如下26380和26381的配置文件,仅仅是端口的不同,可以快速生成

redis-sentinel-26380.conf

redis-sentinel-26381.conf

命令:

sed "s/26379/26380/g" redis-26379.conf > redis-26380.conf

sed "s/26379/26381/g" redis-26379.conf > redis-26381.conf

  1. 分别运行三个哨兵进程

(保证sentinel的配置正确,否则,你在启动报错后,配置文件的内容发发生变化)

创建哨兵的数据文件夹

mkdir -p /var/redis/data/26380

mkdir -p /var/redis/data/26379

mkdir -p /var/redis/data/26381

分别启动三个哨兵

redis-sentinel redis-26379.conf

redis-sentinel redis-26380.conf

redis-sentinel redis-26381.conf

  1. 检查redis的哨兵状态

redis-cli -p 26379 info sentinel

#查看到如下参数,哨兵就正确了

master0:name=s20master,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3

  1. 杀死主库,检查主从状态,是否会切换

redis-cluster(集群)配置

使用情况

并发量大、数据量大应用分布式分摊集中式的压力。

集群搭建

环境准备,6个redis数据库节点、准备6个配置文件

redis-7000.conf

redis-7001.conf

redis-7002.conf

redis-7003.conf

redis-7004.conf

redis-7005. conf

每个配置文件的内容,仅仅是端口的不同

内容如下:

port 7000

daemonize yes

dir "/opt/redis/data"

logfile "7000.log"

dbfilename "dump-7000.rdb"

cluster-enabled yes #开启集群模式

cluster-config-file nodes-7000.conf #集群内部的配置文件

cluster-require-full-coverage no #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no

启动6个redis节点

redis-server redis-7000.conf

redis-server redis-7001.conf

redis-server redis-7002.conf

redis-server redis-7003.conf

redis-server redis-7004.conf

redis-server redis-7005.conf

开启redis-cluster的集群功能以及分配redis的slot槽位,基于ruby语言的脚本工具自动分配

下载ruby的解释器

wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz

编译并安装且配置环境变量

下载ruby操作redis的模块

wget http://rubygems.org/downloads/redis-3.3.0.gem

安装ruby操作redis的模块

gem install -l redis-3.3.0.gem

一键分配redis集群的槽位

​ 查找一下这个命令的绝对路径

​ find / -name redis-trib.rb

​ 把查找到的路径拼接到create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 的前面,执行。(1代表每个主库只有1个从库)

登录数据库,查看数据写入流向

​ 上面查到的路径拼接 add-node --slave 127.0.0.1:7003 127.0.0.1:7000

redis节点故障

​ 可以搭配 redis-cluster+redis-sentinel ,用哨兵检测主节点状态,当主节点宕机,自动切换从节点为新的主库

原理

​ redis客户端任意访问一个redis实例,如果数据不在该实例中,通过重定向引导客户端访问所需要的redis实例

docker容器(软件)

优势

  • 环境一致

  • 启动快

  • 占用资源少

  • 一次封装到处运行

  • 持续交付

消息队列rabbitmq

概念

​ rabbitmq是消息代理,负责接收、存储、转发数据。

​ 消息队列是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。

作用

  1. 解耦

​ 队列两边可扩展性强,降低了耦合度,维护成本相对降低,只需要确保遵守接口约束。

  1. 冗余(安全)

​ 消息队列将数据持久化,直到数据被完全处理才释放,以此规避数据丢失风险。

  1. 峰值处理

​ 消息队列能够使关键组件顶住突发的访问压力,不会因突发的超负荷请求而完全崩溃。

  1. 可恢复性

​ 系统部分组件失效不会影响整个系统。

  1. 有序

​ 保证数据处理的顺序性。

  1. 缓冲

​ 有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。

  1. 异步通信

​ 消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

使用消息队列的情景

​ 异步处理,应用解耦,流量削锋和消息通讯四个场景

安装

  1. 已经配置过阿里云的yum源,所以在阿里第三方epel源中有rabbitmq

​ yum install rabbitmq-server erlang -y

  1. 启动rabbitmq-server

​ systemctl start rabbitmq-server

  1. 开启后台管理界面

​ rabbitmq-plugins enable rabbitmq_management

  1. 根据提示重启

​ systemctl restart rabbitmq-server

​ 然后进入浏览器访问服务器IP,端口为rabbitmq-server端口(一般为15672),检查是否正常启动。

  1. 创建rabbitmq的账号密码

​ rabbitmqctl add_user 用户名 密码

  1. 设置用户为管理员

​ sudo rabbitmqctl set_user_tags 用户名 administrator

  1. 设置用户有权限访问所有队列

​ 语法: [-p <主机路径>] <用户名> <配置文件> <可写> <可读>

​ rabbitmqctl set_permissions -p "/" 用户名 "." "." ".*"

  1. 重启rabbitmq-server,让用户生效

​ systemctl restart rabbitmq-server

  1. 访问web管理界面,登录,查看队列信息

http://**服务器IP**:15672/#/queues

使用实例

用python操作rabbitmq,实现生产消费者模型

安装pika模块,模块版本需要指定,因为代码参数发生了变化

​ pip3 install -i https://pypi.douban.com/simple pika==0.13.1

生产者的代码

#!/usr/bin/env python3

import pika

# 创建凭证,使用rabbitmq用户密码登录

# 去邮局取邮件,必须得验证身份

credentials = pika.PlainCredentials("zhao","123")

# 新建连接,这里localhost可以更换为服务器ip

# 找到这个邮局,等于连接上服务器

connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.94.132',credentials=credentials))

# 创建频道

# 建造一个大邮箱,隶属于这家邮局的邮箱,就是个连接

channel = connection.channel()

# 声明一个队列,用于接收消息,队列名字叫“queue1”

channel.queue_declare(queue='queue1')

# 注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),初学可以使用空字符串交换(exchange=''),它允许我们精确的指定发送给哪个队列(routing_key=''),参数body值发送的数据

channel.basic_publish(exchange='',

​ routing_key='queue1',

​ body='这是队列queue1的消息')

print("已经发送了消息")

# 程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接

connection.close()

消费者的代码

import pika

# 建立与rabbitmq的连接

credentials = pika.PlainCredentials("zhao","123")

connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.94.132',credentials=credentials))

channel = connection.channel()

channel.queue_declare(queue="queue1")

def callbak(ch,method,properties,body):

​ print("消费者接收到了数据:%r"%body.decode("utf8"))

# 有消息来临,立即执行callbak,没有消息则夯住,等待消息

channel.basic_consume(callbak,queue="queue1",no_ack=True)

# 开始消费,接收消息

channel.start_consuming()

消息确认机制的生产者代码

#!/usr/bin/env python3

import pika

# 创建凭证,使用rabbitmq用户密码登录

# 去邮局取邮件,必须得验证身份

credentials = pika.PlainCredentials("zhao","123")

# 新建连接,这里localhost可以更换为服务器ip

# 找到这个邮局,等于连接上服务器

connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.94.132',credentials=credentials))

# 创建频道

# 建造一个大邮箱,隶属于这家邮局的邮箱,就是个连接

channel = connection.channel()

# 新建一个hello队列,用于接收消息

# 这个邮箱可以收发各个班级的邮件,通过

channel.queue_declare(queue='queue2')

# 注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),初学可以使用空字符串交换(exchange=''),它允许我们精确的指定发送给哪个队列(routing_key=''),参数body值发送的数据

channel.basic_publish(exchange='',

​ routing_key='queue2',

​ body='这是queue2的消息')

print("已经发送了消息")

# 程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接

connection.close()

消息确认机制的消费者代码

import pika

credentials = pika.PlainCredentials("zhao","123")

connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.94.132',credentials=credentials))

channel = connection.channel()

# 声明一个队列(创建一个队列)

channel.queue_declare(queue='queue2')

def callback(ch, method, properties, body):

​ print("消费者接受到了任务: %r" % body.decode("utf-8"))

​ # 我告诉rabbitmq服务端,我已经取走了消息

​ # 回复方式在这

​ ch.basic_ack(delivery_tag=method.delivery_tag)

# 关闭no_ack,代表给与服务端ack回复,确认给与回复

channel.basic_consume(callback,queue='queue2',no_ack=False)

channel.start_consuming()

支持持久化的队列和消息

生产者的代码

import pika

# 有密码

credentials = pika.PlainCredentials("zhao","123")

connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.94.132',credentials=credentials))

channel = connection.channel()

# 声明一个队列(创建一个队列)

# 默认此队列不支持持久化,如果服务挂掉,数据丢失

# durable=True 开启持久化,必须新开启一个队列,原本的队列已经不支持持久化了

'''

实现rabbitmq持久化条件

delivery_mode=2

使用durable=True声明queue是持久化

'''

channel.queue_declare(queue='queue3',durable=True)

channel.basic_publish(exchange='',

​ routing_key='queue3', # 消息队列名称

​ body='这是queue3的消息',

​ # 支持数据持久化

​ properties=pika.BasicProperties(

​ delivery_mode=2,#代表消息是持久的 2

​ )

​ )

print(“已经发送了消息”)

connection.close()

持久化的消费者代码

import pika

credentials = pika.PlainCredentials("zhao","123")

connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.94.132',credentials=credentials))

channel = connection.channel()

# 确保队列持久化

channel.queue_declare(queue='queue3',durable=True)

'''

必须确保给与服务端消息回复,代表我已经消费了数据,否则数据一直持久化,不会消失

'''

def callback(ch, method, properties, body):

​ print("消费者接受到了任务: %r" % body.decode("utf-8"))

​ # 告诉服务端,我已经取走了数据,否则数据一直存在

​ ch.basic_ack(delivery_tag=method.delivery_tag)

# 关闭no_ack,代表给与回复确认

channel.basic_consume(callback,queue='queue3',no_ack=False)

channel.start_consuming()

saltstack运维工具(python编写的)

概念

​ 远程执行系统、可以进行大规模部署,也能进行小规模的系统部署。salt的设计架构适用于任意数量的服务器,从少量本地网络系统到跨越数个数据中心,拓扑架构都是c/s模型,配置简单。支持用户通过python自定义功能模块,也提供了大量的python API接口,用户可以根据需要进行简单快速的扩展。

实例

环境准备

1. 准备3台机器,配置IP地址确保可以互相通信

​ 一个master、两个minion

​ 配置hosts解析文件,强制进行主机名解析,加速salt的minion查找,分别在三台机器上,写入解析

​ vim /etc/hosts

内容添加如下:

192.168.94.130 os2

192.168.94.131 os3

192.168.94.132 os1

2. 三台都配置阿里云的源,下载saltstack软件包,注意区分服务端和客户端

​ 在master(即OS1)上安装

​ yum install salt-master -y

​ 在minion1(即OS2)上安装

​ yum install salt-minion -y

​ 在minion2(即OS3)上安装

​ yum install salt-minion -y

3. salt-master的配置和salt-minion的配置

配置文件路径如下:

salt-master的配置文件是/etc/salt/master

​ salt-minion的配置文件是/etc/salt/minion

salt-master的配置文件内容如下

interface:0.0.0.0 #绑定到本地的0.0.0.0地址

publish_port:4505 #管理端口,命令发送

user:root #运行salt进程的用户

worker_threads:1 #salt运行线程数,线程越多处理速度越快,不要超过cpu个数

ret_port:4506 #执行结果返回端口

pidfile:/var/run/salt-master.pid #pid文件位置

log_file:/var/log/salt/master #日志文件地址

auto_accept:False #自动接收minion的key

salt-minion1的配置文件信息如下

master: os1 #指定mastet的通信地址,此处冒号后必须有空格

master_port: 4506

user: root

id: os2 #id用于指定minion的身份信息 ,待会可以在master上查看到的

acceptance_wait_time: 10

log_file: /var/log/salt/minion

salt-minion2的配置

master: os1 #指定mastet的通信地址,此处冒号后必须有空格

master_port: 4506

user: root

id: os3 #id用于指定minion的身份信息 ,待会可以在master上查看到的

acceptance_wait_time: 10

log_file: /var/log/salt/minion

4. 都重启了master和minion之后,查看密钥接受情况,salt通信是在minion初次启动时候,建立新的连接的

​ systemctl start salt-master

​ systemctl start salt-minion

5. 在master机器上,查看minion的密钥信息

​ salt-key -L #查看所有密钥

​ salt-key -a os2 #-a参数 单独接受一个密钥信息

​ salt-key -A #-A 接受所有的key信息

6. 此时就可以在master上管理 minion的机器了

​ salt "*" test.ping #验证salt minion信息是否存活

7. 将输出的结果,转化为json信息,可以序列化后,丢给前端渲染

​ salt "*" test.ping --out=json

salt的命令学习

salt 核心命令

salt 目标匹配 你要执行的salt模块

salt的万能模块 cmd.run 代表让minion机器去做些什么事

让机器远程返回主机名给我

salt --summary '*' cmd.run 'hostname' #参数解释 --summary显示详细信息

salt "*" cmd.run "touch /tmp/1.txt "

salt "" cmd.run "rm -rf /tmp/"

远程安装软件

第一个方法 cmd.run

salt "*" cmd.run "yum install nginx -y"

salt还提供了更专业的安装软件的命令接口 pkg.install pkg.uninstall就是在调用yum而已

#远程卸载nginx

salt '*' pkg.remove "nginx"

#salt的服务管理模块 service模块,相当于在minion机器上,执行systemctl start nginx

salt '*' service.start "nginx"

salt '*' service.stop "nginx"

salt '*' service.restart "nginx"

#远程安装nginx,并且启动的方式

salt "*" pkg.install 'nginx'

salt "*" service.start 'nginx'

salt命令的输出格式 有json和yaml两种

远程安装redis,并且输出json格式

salt "*" pkg.install "redis" --out=json

salt "*" service.start 'redis' --out=json

salt "*" service.status 'redis' --out=json

yaml语法学习

yaml转化python的数据结构

yaml

​ first_key:

​ second_key:

python

用python的字典和列表表示班级 男女同学分配

{

​ "s20":{"男同学":["丽华","小黑","老徐"],"女同学":["大宝","b哥","超哥"],"不详":["self菊"]}

}

在线yaml语法解析:http://www.bejson.com/validators/yaml_editor/

python的数据结构,转为yaml

{ s20:

{ '男同学': [ '丽华', '小黑', '老徐' ],

​ '女同学': [ '大宝', 'b哥', '超弟' ],

​ '不详': [ 'self菊', '蔡旭困' ] } }

yaml如下

"s20":

​ "男同学":

​ - "丽华"

​ - "小黑"

​ - "老徐"

​ "女同学":

​ - "大宝"

​ - "b哥"

​ - "超弟"

​ "不详":

​ - "self菊"

​ - "蔡旭困"

salt工具之granis静态数据采集

当minion在启动的时候,发送自己所有的数据给master

#在启动时候发给master,如果后期服务器硬件修改了,数据就是旧的了,得重启salt-minion

#列出minion服务器所有的静态数据

salt '*' grains.items #列出服务器所有的静态数据

salt '*' grains.items --out=json #输出结果为json格式,可以序列化丢给其他程序使用

#指定key value取得数据

salt 's20minion1' grains.item osrelease

Last updated

Was this helpful?