分类目录归档:生活

Tmux入门教程

WHY

使用Tmux有很多好处。我最看重的是,

  1. 远程服务器上持久地保存工作状态。比如,我在本地或服务器做某项工作,需要在Terminal打开几个窗口。每次换工作,还需要切换。用Tmux,便可以按照Session进行管理,每次轻松打开切换。
  2. 随时随地断开或连接Session。比如,在服务器上面运行一条命令,但是担心连接断开后命令终止,此时在tmux中运行命令,此时断网关机便问题不大,只需随后恢复Session便可以

Install

服务器上需要根据具体操作系统安装,包管理一般支持。若不支持,请参考GitHub – tmux/tmux: tmux source code。 Mac上只需如下命令:

brew install tmux
复制代码

Config

Tmux默认不支持鼠标滚动查看窗口中的前后内容。需要修改配置来支持。

touch ~/.tmux.conf

# 开启鼠标模式
set-option -g mouse on

# 允许鼠标选择窗格
# set -g mouse-select-pane on# 如果喜欢给窗口自定义命名,那么需要关闭窗口的自动命名
set-option -g allow-rename off
​
# 如果对 vim 比较熟悉,可以将 copy mode 的快捷键换成 vi 模式
set-window-option -g mode-keys vi
复制代码

如果对鼠标滚动效果依旧不满意,可以参考这篇blog:Better mouse scrolling in Tmux

Conception

tmux的主要元素分为三层:

  • Session 一组窗口的集合,通常用来概括同一个任务。session可以有自己的名字便于任务之间的切换。
  • Window 单个可见窗口。Windows有自己的编号,也可以认为和ITerm2中的Tab类似。
  • Pane 窗格,被划分成小块的窗口,类似于Vim中 C-w +v 后的效果。 一图以蔽之:
    conception.jpg

Session

Tmux为了防止与全局快捷键冲突,大部分快捷键需要先需要输入前缀Ctrl + b,下文用Prefix代替。

Session主要相关命令如下:

# 创建
tmux new # 不指定session name
tmux new -s [session-name]

# 删除Session
tmux kill-session -t [session-name]
tmux kill-server

# 列出当前Session
tmux ls # 
Prefix s # tmux 内

# 恢复Session
tmux a -t [session-name]
tmux a

# 断开Session
tmux detach
Prefix d

# 重命名Session
Prefix $
复制代码

Window

# 创建
Prefix c

# 选择窗口
Prefix + [number] # 选择第n个窗口
Prefix + p/n	# 前/后一个窗口

# 关闭窗口
Prefix &
exit

# 列出所有window(包含其他Session)
Prefix w 
j/k # 前后选择

# 搜索窗口
Prefix f

# 重命名当前窗口
Prefix ,
复制代码

Pane

# 创建
Prefix %	# 水平窗格
Prefix '"'	# 垂直窗格

# 关闭
Prefix x

# 切换
Prefix o # 在窗格间切换
Prefix q	# 显示窗格编号,输入编号切换

# 将当前窗格切换到新窗口
Prefix !

# 窗格交换位置
Prefix + {/}

作者:张伟杰
链接:https://juejin.im/post/5a8917336fb9a0633e51ddb9
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Gitbook 的使用和常用插件

Gitbook 是基于 Node.js 的命令行工具,用来创建漂亮的电子书,它使用 Markdown 或 AsciiDoc 语法来撰写内容,用 Git 进行版本控制,且可以托管在 Github 上。Gitbook 可以将作品编译成网站、 PDF、 ePub 和 MOBI 等多重格式。

如果你不擅长自己搭建 gitbook 环境,还可以使用 gitbook.com 在线服务来创建和托管你的作品,他们还提供了基于桌面的编辑器

如何使用

首先在全局安装 gitbook 客户端工具:

$ npm install gitbook-cli -g

然后在你的作品目录中创建两个必需的文件 README.md 和 SUMMARY.md,README.md 是作品的介绍,SUMMARY.md 是作品的目录结构,里面要包含一个章节标题和文件索引的列表:

# Summary

This is the summary of my book.

* [section 1](section1/README.md)
    * [example 1](section1/example1.md)
    * [example 2](section1/example2.md)
* [section 2](section2/README.md)
    * [example 1](section2/example1.md)

根据 SUMMARY.md 的目录结构初始化各个章节文件:

$ gitbook init

运行服务,在编辑内容后实时预览:

$ gitbook serve

服务器启动后,浏览器打开 http://localhost:4000 查看,撰写完后可以生成静态网站用来发布:

$ gitbook build

使用插件

Gitbook 本身功能丰富,但同时可以使用插件来进行个性化定制。Gitbook 插件 里已经有100多个插件,可以在 book.json 文件的 plugins 和 pluginsConfig 字段添加插件及相关配置,添加后别忘了进行安装。

// book.json
{
  "title": "Webpack 中文指南",
  "description": "Webpack 是当下最热门的前端资源模块化管理和打包工具,本书大部分内容翻译自 Webpack 官网。",
  "language": "zh",
  "plugins": [
    "disqus",
    "github",
    "editlink",
    "prism",
    "-highlight",
    "baidu",
    "splitter",
    "sitemap"
  ],
  "pluginsConfig": {
    "disqus": {
      "shortName": "webpack-handbook"
    },
    "github": {
      "url": "https://github.com/zhaoda/webpack-handbook"
    },
    "editlink": {
      "base": "https://github.com/zhaoda/webpack-handbook/blob/master/content",
      "label": "编辑本页"
    },
    "baidu": {
        "token": "a9787f0ab45d5e237bab522431d0a7ec"
    },
    "sitemap": {
        "hostname": "http://zhaoda.net/"
    }
  }
}
# 安装插件
$ gitbook install ./

常用插件

内容顶部显示 编辑本页 链接。

在每个页面顶部和底部添加广告或任何自定义内容。

splitter

在左侧目录和右侧内容之间添加一个可以拖拽的栏,用来调整两边的宽度。

image-captions

抓取内容中图片的 alt 或 title 属性,在图片下面显示标题。

github

在右上角显示 github 仓库的图标链接。

anchors

标题带有 github 样式的锚点。

chart

使用 C3.js 图表。

styles-sass

使用 SASS 替换 CSS。

styles-less

使用 LESS 替换 CSS。

ga

添加 Google 统计代码。

disqus

添加 disqus 评论插件。

sitemap

生成站点地图。

latex-codecogs

使用数学方程式。

mermaid

使用流程图。

book-summary-scroll-position-saver

自动保存左侧目录区域导航条的位置。

sharing

默认的分享插件。

fontsettings

默认的字体、字号、颜色设置插件。

默认搜索插件。

自定义页脚,显示版权和最后修订时间。

prism

基于 Prism 的代码高亮。

atoc

插入 TOC 目录。

ace

插入代码高亮编辑器。

highlight

默认的代码高亮插件,通常会使用 prism 来替换。

github-buttons

显示 github 仓库的 star 和 fork 按钮。

sectionx

分离各个段落,并提供一个展开收起的按钮。

mcqx

使用选择题。

include-codeblock

通过引用文件插入代码。

fbqx

使用填空题。

spoiler

隐藏答案,当鼠标划过时才显示。

anchor-navigation

锚点导航。

youtubex

插入 YouTube 视频。

redirect

页面跳转。

expandable-chapters

收起或展开章节目录中的父节点。

baidu

使用百度统计。

duoshuo

使用多说评论。

jsfiddle

插入 JSFiddle 组件。

jsbin

插入 JSBin 组件。

开发插件

最好先查看别人的插件是怎么做的,然后再看官方文档

在NAT下tcp_tw_recycle参数调整

一,故障描述:

从昨天开始,在值班群中陆续值班人员反映系统后台存在卡顿问题,如下图:
记一次由tcp_tw_recycle参数引发的血案
而且在卡顿的同时登陆服务器也会卡好久。此现象只在一台服务器有出现。

二,故障分析:

1,登陆服务器查看资源使用top,vmstat等命令查看了一番发现服务器各项指标都没有异常。于是将问题转向了网络层。
2,客户端端值班人员反映只有在访问系统后台的时候才会出现卡顿,访问其他网站正常。
3,本地使用ping服务器外网ip正常返回,无丢包,延迟也正常。
4,使用http-ping工具时,问题出现了,会经常性的出现连接失败:
(http-ping工具下载地址https://www.softpedia.com/get/Network-Tools/IP-Tools/http-ping.shtml)
记一次由tcp_tw_recycle参数引发的血案
为什么会连接失败呢?
5,使用tcpdump抓包在卡顿的时候会抓到大量的syn请求,但服务器没有响应:
记一次由tcp_tw_recycle参数引发的血案
6,登录服务器查看tcp相关数据

$ netstat -s | grep -i listen
    326 times the listen queue of a socket overflowed
    751346 SYNs to LISTEN sockets dropped

发现在卡顿时有大量tcp syn包被丢弃,数值一直在增长。

三,故障处理:

在查阅资料并结合实际情况后,发现该服务器同时启用了 tcp_timestamps和tcp_tw_recycle参数。
后想起,之前同事为改善time_wait连接数过多问题曾改过该内核参数。
解决办法是,关闭tcp_tw_recycle:

$ vi  /etc/sysctl.conf
#修改为如下
net.ipv4.tcp_tw_recycle = 0
#保存退出,使之生效
$ sysctl -p

再观察,发现服务已正常,卡顿现象消失。

四,总结:

我们先来man一下这两个参数(man tcp):

 tcp_timestamps (Boolean; default: enabled; since Linux 2.2)
              Enable RFC 1323 TCP timestamps.

tcp_timestamp 是 RFC1323 定义的优化选项,主要用于 TCP 连接中 RTT(Round Trip Time) 的计算,开启 tcp_timestamp 有利于系统计算更加准确的 RTT,也就有利于 TCP 性能的提升。(默认开启)
关于tcp_timestamps详情请见:https://tools.ietf.org/pdf/rfc7323.pdf

 tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)
              Enable fast recycling of TIME_WAIT sockets.  Enabling this option is not recommended since this causes problems when working with NAT (Network Address
              Translation).

开启tcp_tw_recycle会启用tcp time_wait的快速回收,这个参数不建议在NAT环境中启用,它会引起相关问题。

tcp_tw_recycle是依赖tcp_timestamps参数的,在一般网络环境中,可能不会有问题,但是在NAT环境中,问题就来了。比如我遇到的这个情况,办公室的外网地址只有一个,所有人访问后台都会通过路由器做SNAT将内网地址映射为公网IP,由于服务端和客户端都启用了tcp_timestamps,因此TCP头部中增加时间戳信息,而在服务器看来,同一客户端的时间戳必然是线性增长的,但是,由于我的客户端网络环境是NAT,因此每台主机的时间戳都是有差异的,在启用tcp_tw_recycle后,一旦有客户端断开连接,服务器可能就会丢弃那些时间戳较小的客户端的SYN包,这也就导致了网站访问极不稳定。

主机A SIP:P1 (时间戳T0) —> Server 主机A断开后
主机B SIP:P1 (时间戳T2) T2 < T0 —> Server 丢弃

ansible-tower装以及破解

一、环境准备:
CentOS Linux release 7.5.1804 (Core)
主机地址:9.110.187.203
ansible版本:2.6.4
ansible-tower版本:3.2.6

[root@localhost ~]#yum -y install ansible

[root@localhost ~]# ansible –version

ansible 2.6.4

二、安装ansible-tower:

[root@localhost ~]#wget https://releases.ansible.com/ansible-tower/setup-bundle/ansible-tower-setup-bundle-3.2.6-1.el7.tar.gz

[root@localhost ~]#tar -zxvf ansible-tower-setup-bundle-3.2.6-1.el7.tar.gz

[root@localhost ~]#cd ansible-tower-setup-bundle-3.2.6-1.el7

修改配置文件inventory将里面所有的密码都修改为自己的密码,如下三处的标红地方:

[root@localhost ansible-tower-setup-bundle-3.2.6-1.el7]# pwd

/root/ansible-tower-setup-bundle-3.2.6-1.el7

image.png

[root@localhost ansible-tower-setup-bundle-3.2.6-1.el7]# ./setup.sh

如果网络没有问题的话耐心等待安装完成即可.

安装完成没报错的话即可访问web页面:https://9.110.187.203/#/,默认初始页面如下:

默认用户为admin,密码为inventory文件admin_password字段配置的密码,我这里配置的密码也为admin.

导入license,没有的话,点击REQUEST LICENSE,去官方(https://www.ansible.com/license)申请免费试用,填写个人信息后(邮箱要填写正确,其他信息可随便填写)会把license发到填写的邮箱.

提交license并登录成功后默认初始页面如下:

[root@localhost ansible-tower-setup-bundle-3.2.6-1.el7]# cd /var/lib/awx/venv/awx/lib/python2.7/site-packages/tower_license

vi __init__.py将119行和120行修改为如下内容,特别需要注意格式,如下:

即:_check_cloudforms_subscription,添加return True

修改完重新编译一下:

[root@localhost  tower_license]# python -m py_compile __init__.py

[root@localhost  tower_license]# python -O -m py_compile __init__.py

重启服务:

[root@localhost  tower_license]# ansible-tower-service restart

重新打开settings–VIEW YOUR LICENSE,发现”Hosts Available”变成了9999999台,说明破解成功

nginx的日志配置

nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义。 ngx_http_log_module 是用来定义请求日志格式的。

nginx日志相关的配置有log_format、access_log、open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log。这些配置主要分2类:日志记录格式,日志类型及位置。

  • access_log指令

语法: access_log path [format [buffer=size [flush=time]]];

access_log path format gzip[=level] [buffer=size] [flush=time];
access_log syslog:server=address[,parameter=value] [format];
access_log off;

默认值: access_log logs/access.log combined;
配置段: http, server, location, if in location, limit_except

gzip压缩等级。
buffer设置内存缓存区大小。
flush保存在缓存区中的最长时间。
不记录日志:access_log off;
使用默认combined格式记录日志:access_log logs/access.log 或 access_log logs/access.log combined;

  • log_format指令

语法: log_format name string …;
默认值: log_format combined “…”;
配置段: http

name表示格式名称,string表示等义的格式。log_format有一个默认的无需设置的combined日志格式,相当于apache的combined日志格式,如下所示:

log_format  combined  ‘$remote_addr – $remote_user  [$time_local]  ‘
‘ “$request”  $status  $body_bytes_sent  ‘
‘ “$http_referer”  “$http_user_agent” ‘;

如果nginx位于负载均衡器,squid,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址了。 $remote_addr获取反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录 客户端IP地址和客户端请求的服务器地址。如下所示

log_format  porxy  ‘$http_x_forwarded_for – $remote_user  [$time_local]  ‘
‘ “$request”  $status $body_bytes_sent ‘
‘ “$http_referer”  “$http_user_agent” ‘;

日志格式允许包含的变量注释如下:

$remote_addr, $http_x_forwarded_for 记录客户端IP地址
$remote_user 记录客户端用户名称
$request 记录请求的URL和HTTP协议
$status 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
$bytes_sent 发送给客户端的总字节数。
$connection 连接的序列号。
$connection_requests 当前通过一个连接获得的请求数量。
$msec 日志写入时间。单位为秒,精度是毫秒。
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)。
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$time_iso8601 ISO8601标准格式下的本地时间。
$time_local 通用日志格式下的本地时间。

发送给客户端的响应头拥有“sent_http_”前缀。 比如$sent_http_content_range。

实例如下:

http {
log_format  main  ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘”$status” $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for” ‘
‘”$gzip_ratio” $request_time $bytes_sent $request_length’; log_format srcache_log ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘”$status” $body_bytes_sent $request_time $bytes_sent $request_length ‘
‘[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]’;

open_log_file_cache max=1000 inactive=60s;

server {
server_name ~^(www\.)?(.+)$;
access_log logs/$2-access.log main;
error_log logs/$2-error.log;

location /srcache {
access_log logs/access-srcache.log srcache_log;
}
}
}

  • open_log_file_cache指令

语法: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
默认值: open_log_file_cache off;
配置段: http, server, location

对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用open_log_file_cache来设置日志文件缓存(默认是off),格式如下:

参数注释如下:
max:设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。
inactive:设置存活时间,默认是10s
min_uses:设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次
valid:设置检查频率,默认60s
off:禁用缓存
实例如下:

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

  • log_not_found指令

语法: log_not_found on | off;
默认值: log_not_found on;
配置段: http, server, location
是否在error_log中记录不存在的错误。默认是。

  • log_subrequest指令

语法: log_subrequest on | off;
默认值: log_subrequest off;
配置段: http, server, location
是否在access_log中记录子请求的访问日志。默认不记录。

  • rewrite_log指令

由ngx_http_rewrite_module模块提供的。用来记录重写日志的。对于调试重写规则建议开启。 Nginx重写规则指南
语法: rewrite_log on | off;
默认值: rewrite_log off;
配置段: http, server, location, if
启用时将在error log中记录notice级别的重写日志。

  • error_log指令

语法: error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];
默认值: error_log logs/error.log error;
配置段: main, http, server, location
配置错误日志。