Alpine linux apk 命令使用
更新索引
apk update |
从远程镜像源中更新本地镜像源索引,update 命令会从各个镜像源列表下载 APKINDEX.tar.gz 并存储到本地缓存,一般在 /var/cache/apk/ (Alpine 在该目录下)
$ apk update |
从远程镜像源中更新本地镜像源索引,update 命令会从各个镜像源列表下载 APKINDEX.tar.gz 并存储到本地缓存,一般在 /var/cache/apk/ (Alpine 在该目录下)
为了使容器互联,新版本建议将容器加入自定义的 Docker 网络 来连接多个容器,而不是使用 --link 参数。
从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过容器名称通信。方法很简单,只要在创建容器时使用 --name 为容器命名即可。但是使用 Docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的,所以我们就需要自定义网络。
docker network create -d bridge docker-network-for-openldap |
之后为 LDAP 创建的相关容器,都连接到此网络。
为 openldap 容器创建本地持久化数据目录,容器启动时将此目录以数据卷的形式挂载使用
mkdir /data/OpenLDAPData |
启动容器,挂载数据卷,使用自定义网络
docker run -d -p 389:389 -p 636:636 \ |
本文主要记录使用 docker compose 配置 Django + Mysql 的 web 站点的过程。
项目目录结构及简要说明如下:
. |
compose : 存放应用配置文件,如 mysql 配置文件 compose/mysql/my.cnfdjango_project : Django project 项目目录, django-admin startproject django_project 生成django_project/django_app : Django project 项目下的 app 目录,django-admin startapp django_app 生成docker-compose.yml : 项目的 compose 文件示例通过 curl 命令模拟 post 请求,命令如下:
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST \ |
Django 处理程序示例:
from django.http import HttpResponse |
Console 输出结果:
****** POST body: b'{"id" : "yTP7PSsRxz53tJ56VVG", "type" : 5}', type : <class 'bytes'> |
以上输出可以看到,request.body 中的类型为 bytes
使用 eval 转换后类型变为 dict
使用 json.loads 将 request.body 转换为 dict 时,可能会报以下错误:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) |
可能原因 参考
rsync [OPTION]... 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 指定项目名称,默认将使用所在目录名称作为项目名。Fail2ban 是 Linux 上的一个著名的入侵保护的开源框架。它通过监视相应服务的日志记录文件,匹配日志记录中的错误信息(正则式匹配),然后与系统的 iptables 联动执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽),比如:当有人在试探你的 HTTP、SSH、SMTP、FTP 密码,只要达到你预设的次数,Fail2ban 就会调用防火墙屏蔽这个 IP,并且可以发送 e-mail 通知系统管理员。
由于 Fail2ban 需要与系统的 iptables、firewalld 等联动来达到封禁 IP 的目的, iptables 使用与 firewalld 有少许不同。
本文以 iptables 为例
yum install epel-release |
命令格式:
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 |
查找深度 |
TCP_wrappers 主要是工作在应用层的一个安全工具,使用访问控制列表(ACL)来防止主机名和主机地址的欺骗,用于过滤对 类 Unix 系统的网络访问。
在一个安全的系统中,Linux 自身具有两层安全的防火墙。第一层是通过 IP/Port 过滤机制的 iptables 来实现,第二层,也就是 TCP_wrappers 了,它主要是通过对系统中的某些服务进行开放与关闭,允许和禁止来有效保证系统安全运行。
可以简单理解为 Linux 系统访问控制的流程:
Client -> iptables -> TCP_wrappers -> Server 的访问控制
Django 使用 Python 内置的 logging 模块处理系统日志,一份 Python logging 配置由下面四个部分组成:
logger 是日志系统的入口。每个 logger 都是命名了的 bucket, 消息写入 bucket 以便进一步处理logger 可以配置 日志级别。日志级别描述了由该 logger 处理的消息的严重性。Python 定义了下面几种日志级别:
DEBUG:排查故障时使用的低级别系统信息INFO:一般的系统信息WARNING:描述系统发生了一些小问题的信息ERROR:描述系统发生了大问题的信息CRITICAL:描述系统发生严重问题的信息每一条写入 logger 的消息都是一条 日志记录。每一条日志记录也包含 日志级别,代表对应消息的严重程度。日志记录还包含有用的元数据,来描述被记录了日志的事件细节,例如堆栈跟踪或者错误码。
当 logger 处理一条消息时,会将自己的 日志级别 和这条消息的 日志级别 做对比。如果消息的日志级别匹配或者高于 logger 的日志级别,它就会被进一步处理。否则这条消息就会被忽略掉。
当 logger 确定了一条消息需要处理之后,会把它传给 Handler。
假定项目名为 project01, 目录名为 project01
mkdir project01 |
以上命令会在目录 project01 中创建虚拟环境,查看当前目录,会产生以下目录和文件
$ ls |
观察 bin 目录的内容,里面有 python3、pip3 等可执行文件,实际上是链接到 Python 系统目录的软链接。
$ ls -l bin/ |
Linux 环境使用以下命令激活虚拟环境
$ source bin/activate |
命令提示符变了,有个 (project01) 前缀,表示当前环境是一个名为 project01 的 Python 环境。
在此虚拟环境中安装包,都会被安装到 (project01) 环境下,具体目录为 project01/lib/python3.10/site-packages/,系统 Python 环境不受任何影响,也就是说,project01 这个环境是专门针对 project01 应用(项目)创建的,和系统 python 环境或其他应用互不影响。
要退出当前虚拟环境,可以执行以下命令
deactivate |
退出虚拟环境后,再执行如 pip3 install 命令安装的包,会安装到系统 Python 环境。
完全可以针对每个应用创建独立的Python运行环境,这样就可以对每个应用的Python环境进行隔离。
如果不再使用某个 venv ,例如 project01,删除它也很简单。首先确认该 venv 没有处于 激活 状态,然后直接把整个目录 project01 删掉就行。
参考 canva-nest 官网 安装
npm install --save canvas-nest.js |
可选操作,主要是为了生成
canvas-nest.js文件
编辑 next配置文件,新增以下配置
# background settings |
编辑文件 themes/next/layout/_layout.njk, 在</body> 之前新增以下内容
{% if theme.canvas_nest.enable %} |
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。