L B T

记 录 过 去 的 经 验

本文主要记录使用 docker compose 配置 Django + Mysql 的 web 站点的过程。

环境信息

  • Centos7
  • Docker version 20.10.17

目录结构及说明

项目目录结构及简要说明如下:

.
├── compose
│ └── mysql
│ └── my.cnf
├── django_project
│ ├── db.sqlite3
│ ├── django_app
│ │ ├── admin.py
│ │ ├── apps.py
│ │ ├── __init__.py
│ │ ├── migrations
│ │ ├── models.py
│ │ ├── tests.py
│ │ └── views.py
│ ├── django_project
│ │ ├── asgi.py
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ ├── Dockerfile
│ ├── manage.py
│ └── requirements.txt
├── docker-compose.yml

  • compose : 存放应用配置文件,如 mysql 配置文件 compose/mysql/my.cnf
  • django_project : Django project 项目目录, django-admin startproject django_project 生成
  • django_project/django_app : Django project 项目下的 app 目录,django-admin startapp django_app 生成
  • docker-compose.yml : 项目的 compose 文件
阅读全文 »

gzip

解压缩

$ file test.gz 
test.gz: gzip compressed data, from FAT filesystem (MS-DOS, OS/2, NT)

gzip -d test.gz

压缩

gzip test.txt

压缩后默认生成压缩文件 test.txt.gz

环境信息

  • Python3.10
  • Django 4.0

接收 post 中的 json 数据

示例通过 curl 命令模拟 post 请求,命令如下:

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST \
-d '{"id" : "yTP7PSsRxz53tJ56VVG", "type" : 5}' 127.0.0.1:8000/csapi

Django 处理程序示例:

views.py
from django.http import HttpResponse


def csapi(request):
post_body = request.body
print(f'****** POST body: {post_body}, type : {type(post_body)}')

#
data = eval(post_body)

print(f'****** data : {data} , type : {type(data)}')

return HttpResponse('ok')

Console 输出结果:

****** POST body: b'{"id" : "yTP7PSsRxz53tJ56VVG", "type" : 5}', type : <class 'bytes'>
****** data : {'id': 'yTP7PSsRxz53tJ56VVG', 'type': 5} , type : <class 'dict'>

以上输出可以看到,request.body 中的类型为 bytes

使用 eval 转换后类型变为 dict

使用 json.loadsrequest.body 转换为 dict 时,可能会报以下错误:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

可能原因 参考

Centos 7 内核版本由 3.10 升级到 5.4.212-1

环境息息

  • Centos7 3.10.0-1062.9.1.el7.x86_64

升级步骤

安装 elrepo 源

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
yum --disablerepo="*" --enablerepo="elrepo-kernel" repolist
阅读全文 »

命令格式

rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]host:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

: ssh 方式进行备份,ssh 非默认端口使用选项 -e 指定端口, -e 'ssh -p 30000'

:: socket 方式进行备份,rsync 以服务方式监听,SRC/DEST 为配置中定义的模块 []

  • rsync 命令使用中,如果源参数的末尾有斜线,只会复制指定目录的内容,而不复制目录本身,没有斜线,则会复制目录本身,包括目录
  • 客户端免密登录时,需要在客户端建立密码文件: /etc/rsync.passwd,文件中只保存密码,权限为600,用选项 --password-file 指明存放密码的文件位置
阅读全文 »

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

执行 docker compose [COMMAND] --help 可以查看具体某个命令的使用格式。

docker compose 命令的基本的使用格式是

docker compose [-f=<arg>...] [options] [COMMAND] [ARGS...]

常用选项

  • -f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
  • -p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
阅读全文 »

环境信息

  • Centos 7

vim 配置

vim 启动时会读取 /etc/vimrc(全局配置) 和 ~/.vimrc (用户配置)

常用配置如下,使用 " 注释

/etc/vimrc
" 自动缩进 
set ai
set autoindent

" 保存历史命令数量
set history=50

" 右下角显示当前鼠标位置(行列数)
set ruler

" 鼠标位置所在行显示下划线
set cursorline

" 开启语法高亮
syntax on

" 高亮搜索结果
set hlsearch

" 搜索时不区分大小写
set ignorecase

" 将 tab 转换为空格
set expandtab

" tab 转换为4个空格
set tabstop=4

" 删除时,可以一次删除4个空格
set softtabstop=4

" 显示行数
set nu
阅读全文 »

环境信息

  • Centos 7
  • iptables

Fail2ban 是 Linux 上的一个著名的入侵保护的开源框架。它通过监视相应服务的日志记录文件,匹配日志记录中的错误信息(正则式匹配),然后与系统的 iptables 联动执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽),比如:当有人在试探你的 HTTPSSHSMTPFTP 密码,只要达到你预设的次数,Fail2ban 就会调用防火墙屏蔽这个 IP,并且可以发送 e-mail 通知系统管理员。

由于 Fail2ban 需要与系统的 iptablesfirewalld 等联动来达到封禁 IP 的目的, iptables 使用与 firewalld 有少许不同。

本文以 iptables 为例

安装

yum install epel-release
yum install -y fail2ban
systemctl enable fail2ban
阅读全文 »

Confluence 是一个专业的企业知识管理与协同软件,也可以用于构建企业 wiki。通过它可以实现团队成员之间的协作和知识共享。在这里,团队成员齐心协力,各擅其能,协同地编写文档和管理项目。从此打破不同团队、不同部门以及个人之间信息孤岛的僵局,Confluence 真正实现了组织资源共享。Confluence 使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论。

阅读全文 »

环境信息

  • Centos 7

系统默认的日志托管服务,部分系统服务(如 crond, 邮件系统,安全审计等)会将日志发送给 rsyslog 服务来进行日志管理。

rsyslog 服务是依赖其配置文件 /etc/rsyslog.conf 来确定哪个服务的什么等级的日志信息会被记录在哪个位置的。也就是说,日志服务的配置文件中主要定义了服务的名称、日志等级和日志记录位置。

阅读全文 »

环境信息

  • Centos 7

常用选项

命令格式:

find   path   -option   [ -print ]   [ -exec   -ok   command ]   {} \;

常用查找选项(-option):

选项 说明 示例
-amin n
-amin +n
-amin -n
在过去 n 分钟内被读取过
更改时间超过 n
更改时间在 n 以内
-anewer file 比文件 file 更晚被读取过的文件
-atime n 在过去 n 天内被读取过的文件
-cmin n 在过去 n 分钟内被修改过
-cnewer file 比文件 file 更新的文件
-ctime n 在过去 n 天内创建的文件
-mtime n 在过去 n 天内修改过的文件
-empty 空的文件
-gid n
-group name
gid 是 n
group 名称是 name
-user u 根据用户名查找
-nouser 属主不存在
-ipath p
-path p
路径名称符合 p 的文件,ipath 会忽略大小写
-name name
-iname name
文件名称符合 name 的文件。iname 会忽略大小写
-size n
-size +n
-size -n
文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。
文件大小大于 n
文件大小小于 n
-type c 文件类型是 c 的文件,c 包括:
d : 目录
c : 字符设备
b : 块设备
p : 通道设备
f : 文件
l : 链接文件
s : socker
-pid n process id 是 n 的文件
-perm 0644 权限
-maxdepth
-mindepth
查找深度
阅读全文 »

环境信息

  • Centos 7

TCP_wrappers 主要是工作在应用层的一个安全工具,使用访问控制列表(ACL)来防止主机名和主机地址的欺骗,用于过滤对 类 Unix 系统的网络访问。

在一个安全的系统中,Linux 自身具有两层安全的防火墙。第一层是通过 IP/Port 过滤机制的 iptables 来实现,第二层,也就是 TCP_wrappers 了,它主要是通过对系统中的某些服务进行开放与关闭,允许和禁止来有效保证系统安全运行。
可以简单理解为 Linux 系统访问控制的流程:

Client -> iptables -> TCP_wrappers -> Server 的访问控制

  • iptables :基于源 IP/端口、目的 IP/端口进行访问控制
  • TCP_wrappers:基于服务自身运行情况进行访问控制
  • Server:基于服务器本身行为包括文件、目录等权限进行访问控制
阅读全文 »

环境信息

  • python 3.10
  • django 4.0

Python logging 模块说明

Django 使用 Python 内置的 logging 模块处理系统日志,一份 Python logging 配置由下面四个部分组成:

  • Loggers
  • Handlers
  • Filters
  • Formatters

Loggers

logger 是日志系统的入口。每个 logger 都是命名了的 bucket, 消息写入 bucket 以便进一步处理
logger 可以配置 日志级别。日志级别描述了由该 logger 处理的消息的严重性。Python 定义了下面几种日志级别:

  • DEBUG:排查故障时使用的低级别系统信息
  • INFO:一般的系统信息
  • WARNING:描述系统发生了一些小问题的信息
  • ERROR:描述系统发生了大问题的信息
  • CRITICAL:描述系统发生严重问题的信息

每一条写入 logger 的消息都是一条 日志记录。每一条日志记录也包含 日志级别,代表对应消息的严重程度。日志记录还包含有用的元数据,来描述被记录了日志的事件细节,例如堆栈跟踪或者错误码。

logger 处理一条消息时,会将自己的 日志级别 和这条消息的 日志级别 做对比。如果消息的日志级别匹配或者高于 logger 的日志级别,它就会被进一步处理。否则这条消息就会被忽略掉。

logger 确定了一条消息需要处理之后,会把它传给 Handler

阅读全文 »

环境信息

  • Python 3.10

虚拟环境创建步骤

假定项目名为 project01, 目录名为 project01

mkdir project01
cd project01
python3 -m venv .

以上命令会在目录 project01 中创建虚拟环境,查看当前目录,会产生以下目录和文件

$ ls
bin include lib lib64 pyvenv.cfg

观察 bin 目录的内容,里面有 python3pip3 等可执行文件,实际上是链接到 Python 系统目录的软链接。

$ ls -l bin/
total 36
-rw-r--r-- 1 root root 1991 Aug 16 17:35 activate
-rw-r--r-- 1 root root 917 Aug 16 17:35 activate.csh
-rw-r--r-- 1 root root 2059 Aug 16 17:35 activate.fish
-rw-r--r-- 1 root root 9033 Aug 16 17:35 Activate.ps1
-rwxr-xr-x 1 root root 234 Aug 16 17:35 pip
-rwxr-xr-x 1 root root 234 Aug 16 17:35 pip3
-rwxr-xr-x 1 root root 234 Aug 16 17:35 pip3.10
lrwxrwxrwx 1 root root 10 Aug 16 17:35 python -> python3.10
lrwxrwxrwx 1 root root 10 Aug 16 17:35 python3 -> python3.10
lrwxrwxrwx 1 root root 25 Aug 16 17:35 python3.10 -> /usr/local/bin/python3.10

Linux 环境使用以下命令激活虚拟环境

$ source bin/activate
(project01) [root@localhost project01]#

命令提示符变了,有个 (project01) 前缀,表示当前环境是一个名为 project01 的 Python 环境。
在此虚拟环境中安装包,都会被安装到 (project01) 环境下,具体目录为 project01/lib/python3.10/site-packages/,系统 Python 环境不受任何影响,也就是说,project01 这个环境是专门针对 project01 应用(项目)创建的,和系统 python 环境或其他应用互不影响。

要退出当前虚拟环境,可以执行以下命令

deactivate

退出虚拟环境后,再执行如 pip3 install 命令安装的包,会安装到系统 Python 环境。
完全可以针对每个应用创建独立的Python运行环境,这样就可以对每个应用的Python环境进行隔离。

如果不再使用某个 venv ,例如 project01,删除它也很简单。首先确认该 venv 没有处于 激活 状态,然后直接把整个目录 project01 删掉就行。

环境信息

  • os: linux 3.10.0-1160.62.1.el7.x86_64 CentOS Linux 7 (Core)
  • hexo: 6.2.0
  • hexo-cli: 4.3.0
  • node: 16.16.0
  • Next 8.12.2

安装 canvas-nest

参考 canva-nest 官网 安装

npm
npm install --save canvas-nest.js

可选操作,主要是为了生成 canvas-nest.js 文件

配置 Next

编辑 next配置文件,新增以下配置

_config.next.yml
# background settings
# add canvas-nest effect
# see detail from https://github.com/hustcc/canvas-nest.js
canvas_nest:
enable: true
url: https://s.csms.tech/js/canvas-nest.js
color: 0,0,255
opacity: 0.7
zIndex: -2
count: 99

引入 canvas-nest.js

编辑文件 themes/next/layout/_layout.njk, 在</body> 之前新增以下内容

themes/next/layout/_layout.njk
{% if theme.canvas_nest.enable %}
<script type="text/javascript" color="{{ theme.canvas_nest.color }}" opacity='{{ theme.canvas_nest.opacity }}' zIndex="{{ theme.canvas_nest.zIndex }}" count="{{ theme.canvas_nest.count }}" src="{{ theme.canvas_nest.url }}">
</script>
{% endif %}

awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

阅读全文 »

常用选项说明

-n    使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN (例如文件内容)的内容一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-i 直接修改读取的内容,而不是由屏幕输出。
-f 直接将 sed 的动作写在一个文件内, -f filename 则可以执行 filename 内的sed 动作;
阅读全文 »