vim normal 命令

替换::%s/^/#/g visual block:ggI# 注释第一行后用.重复执行每一行 我们可以在第三种方法之上用normal命令实现上述需求,步骤:

光标定位到首行,执行:I# jVG选中之后的所有行 :'<,'>normal .这样刚刚选中的行都将执行.代表的最后一次操作。注:只要输入:就能实现:'<,'>,你可以注意VIm的左下角的提示。 第四种方法::%normal I#,%代表这个文件,当然你可以选择具体的范围,如::1,4normal I#

总结::normal命令可以执行任何normal 模式下的命令,更多帮助::help normal。


2017-11-03 Vim , Linux

Vim 中的宏命令

Vim 的设计哲学中有这样一句话:”if you write a thing once, it is okay. However if you’re writing it twice or more times, then you should find a better way to do it”.

Vim 的 Macro 就是用来解决重复的问题。在 Vim 寄存器的文章里面已经对 macro 有所涉及, macro 的操作都是以文本的方式存放在寄存器中。

简单使用

录制 macro,使用 q + [a-z] 26个字母中的一个

q[a-z]

之后的命令都会被记录,然后结束时再按一下 q

执行 macro 的时候,在寄存器前加 @ ,比如记录在寄存器 a 中

10@a

执行 10 遍a寄存器中记录的命令。

@@

再执行一遍上一次的命令。

编辑 macro

假设已经有一个 macro 保存在了 a 中,可以使用

  • :let @a=’
  • 输入Ctrl + r + a 来插入 a 中内容;
  • 编辑内容然后以 ' 结束 Enter 退出

查看 macro

macro 内容保存在 a 中,直接使用 :reg a 来查看内容即可。

举例

经典的注释和尾部添加

注释,或者在每一行的末尾添加特定字符,比如在每行末加上分号”;” ,对于这个操作 Vim 中有太多的方式可以完成,比如说替换 :%s/$/;/g ,比如说 . 命令,再比如这里要使用的 macro :

int a = 1
int b = 2
int c = a+b
print a
print b
print c

如果是用 . 来实现的话,首先在第一行执行A;,然后重复5次执行j.,对于这种简单文件来说很容易使用,但是如果这个文件有 1000 行,那么显然 . 命令是不可行的。使用 macro , 可以先录制一遍,然后在 1000 行上执行便可。

比如可以在normal模式下使用 qaA;<Esc>jq

  • qa 开启录制,存入 a 寄存器
  • A 在行尾进入插入模式
  • ; 插入分号
  • <Esc> 退出插入模式
  • j 下一行
  • q 退出录制

此时 a 寄存器中就保存了当前行的操作,在当前行添加 ; 并将光标移动到下一行。

录制结束后就可以使用 @a

1000@a

执行1000遍 macro ,就能将下面1000行尾部添加 ;

递增数字

可以使用 macro 实现插入 1 到 100 个数字,每一行自增一:

1
2
3
...
100

首先在第一行插入1,然后光标定位了“1”处,进入normal模式

输入一下命令

qayyp<Ctrl>aq
  • yyp 拷贝一行再粘贴在新的一行,
  • <Ctrl>a 数字+1
  • q 结束录制

最后执行

98@a

2017-11-03 vim , Linux

有一个全平台的Markdown编辑器--Typora

很早开始我就使用 haroopad ,同样是一款简洁,跨平台的 markdown 编辑器,而在 Linux 平台除非遇到特殊情况想要仔细预览效果,我也一般都只在 Vim 中直接以纯文本形式编辑 markdown。但是为什么要再来试用这样一个编辑器呢,一是我不止一次得看到别人推荐,二来也是好奇心作祟。

Typora 一如她官网 —- https://typora.io/ 的简洁。没有多余的元素,直接面向文本,好评。下面也不用介绍他的功能多少多少,这种一般直接看他的官方 feature 介绍,看使用帮助就行。下面就介绍几个比较让我开心的功能。

更加快捷的文件管理

在文本编辑器左侧边可以打开目录下所有文件,这一点是 haroopad 所没有的,如果编辑文本需要打开多个文件,那么使用之前的 haroopad 就需要同时打开多个文件,而在 Typora 中则直接在边上选择要切换的文件即可。在 Vim 中其实也用了 Nerd Tree 来实现这样的功能,能够很方便的在文件之间切换。

更加方便的Outline

Typora 有一个独立的 Outline 面板,可以轻松的在长篇文章中进行导航,快速定位。

导出格式支持多样化

haroopad 能够导出的格式只有简单的 HTML 和 PDF,而 Typora 提供了更多的选择,甚至连 Word 格式也都支持,支持的格式包括 pdf, html, docx, OpenOffice, rtf, Epub, LaTex, Media Wiki, reStructuredText, Textile, OPML 等等

缺点

不如 haroopad 一样提供的 Vim 键支持,其实如果对 Markdown 语法熟悉,也不在乎所见即所得的UI显示,完全可以使用 Vim 作为唯一的 MD 编辑,没有那么多漂亮的界面,和快速的操作,只要 Vim 都可以搞定。

这里有一篇 Typora 作者创造 Typora 的一些想法 ,其中提到了取消了独立的预览 Panel,让所有的内容所见即所得,这也是

reference


2017-11-02 Typora , markdown , Linux , Windows

每天学习一个命令:ifconfig

Windows 上有 ipconfig ,Linux 上有一个类似的工具,就是 ifconfig (interfaces config)。ifconfig工具不仅可以被用来简单地获取网络接口配置信息,还可以修改这些配置。

命令格式

ifconfig [网络设备] [参数]

命令功能:

ifconfig 命令用来查看和配置网络设备。当网络环境发生改变时可通过此命令对网络进行相应的配置。

命令参数:

  • up 启动指定网络设备/网卡。
  • down 关闭指定网络设备/网卡。该参数可以有效地阻止通过指定接口的IP信息流,如果想永久地关闭一个接口,我们还需要从核心路由表中将该接口的路由信息全部删除。
  • -promisc 设置是否支持网卡的promiscuous模式,如果选择此参数,网卡将接收网络中发给它所有的数据包
  • -a 显示全部接口信息

使用实例:

显示网络设备信息

命令

ifconfig

输出

eth0  Link encap:Ethernet  HWaddr f2:3c:91:2d:a3:0a  
      inet addr:192.169.31.204 Bcast:192.168.31.255 Mask:255.255.255.0
      inet6 addr: fea0::f13c:91ff:fe2d:a30a/64 Scope:Link
      inet6 addr: 2400:8903::f33c:92ff:ff2d:a31a/64 Scope:Global
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:18740952 errors:0 dropped:0 overruns:0 frame:0
      TX packets:17044866 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:17987424394 (17.9 GB)  TX bytes:18563777089 (18.5 GB)

说明

eth0 表示第一块网卡,如果有其他网卡可能会有 eth1, eth2 等等

lo 是表示主机的回环地址,一般用来测试本地网络程序,只能在此台主机上运行和查看的网络接口。比如把 Nginx 服务器指定到回环地址,在浏览器输入 127.0.0.1 就能看到 Nginx 欢迎页面。

具体每一项的内容包括以下:

  • 连接类型:Ethernet(以太网)HWaddr(硬件mac地址) HWaddr 表示网卡的物理地址 MAC 地址。
  • 网卡的IP地址、子网、掩码 其中 inet addr 用来表示网卡的IP地址,此网卡的 IP地址是 192.168.31.204,广播地址, Bcast:192.168.31.255,掩码地址Mask:255.255.255.0
  • 如果有IPv6 地址会显示 IPv6 地址
  • UP(代表网卡开启状态)RUNNING(代表网卡的网线被接上)MULTICAST(支持组播)MTU:1500(最大传输单元):1500字节
  • 接收、发送数据包情况统计
  • 接收、发送数据字节数统计信息。

启动关闭指定网卡

命令:

ifconfig eth0 up
ifconfig eth0 down

说明:

ifconfig eth0 up 为启动网卡eth0 ;ifconfig eth0 down 为关闭网卡eth0。

为网卡配置和删除IPv6地址

命令:

ifconfig eth0 add 33ffe:3240:800:1005::2/64
ifconfig eth0 del 33ffe:3240:800:1005::2/64

说明:

ifconfig eth0 add 33ffe:3240:800:1005::2/64 为网卡eth0配置IPv6地址;
ifconfig eth0 add 33ffe:3240:800:1005::2/64 为网卡eth0删除IPv6地址;

用ifconfig修改MAC地址

命令:

ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE

配置IP地址

命令:

ifconfig eth0 192.168.120.56 
ifconfig eth0 192.168.120.56 netmask 255.255.255.0 
ifconfig eth0 192.168.120.56 netmask 255.255.255.0 broadcast 192.168.120.255

说明:

上面几行的命令解释如下:

  • 给eth0网卡配置IP地:192.168.120.56
  • 给eth0网卡配置IP地址:192.168.120.56 ,并加上子掩码:255.255.255.0
  • 给eth0网卡配置IP地址:192.168.120.56,加上子掩码:255.255.255.0,加上个广播地址: 192.168.120.255

启用和关闭ARP协议

ARP 协议就是一个根据 IP地址获取物理地址的一个协议。

命令:

ifconfig eth0 arp
ifconfig eth0 -arp

说明:

ifconfig eth0 arp 开启网卡eth0 的arp协议;

ifconfig eth0 -arp 关闭网卡eth0 的arp协议;

设置最大传输单元

命令:

ifconfig eth0 mtu 1500

说明:

设置能通过的最大数据包大小为 1500 bytes

备注:用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在。要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了。


2017-10-31 linux , command , network , ip , arp

headless chrome puppeteer

Headless 最早的时候在 PhantomJS 听说过这个概念,后来在 GitHub 各种项目中总有人不断提起这个概念,而最新看到的新闻便是 Chrome 开始支持 Headless,也正激起了我了解的欲望。

什么是 Headless Chrome

Headless Chrome 是一个没有前台界面,只在后台运行的浏览器。浏览器正常的所有解析,渲染都可以由其完成。而开发者可以通过 client 和这个浏览器建立连接,通过 Google 提供的 Chrome DevTools Protocol 协议 来进行交互。总的来说 Headless 浏览器提供了可编程化的浏览器工具,一切通过人工在 Chrome 中完成的事情,都可以通过编程来在 Headless Chrome 中实现。

Headless Chrome 和 Chrome 59 一起发布,Headless Chrome 将 Chromium 和 Blink 渲染引擎提供的现代 WEB 平台的特性带到了命令行。

Headless 浏览器能够提供自动化测试环境,服务于不需要 UI 界面的服务端。比如说你想要测试一个网页在真实的浏览器中的显示,并保存成 PDF。

使用

在 Linux 下,我的 Chrome 安装在 /opt/google/chrome/ 目录下,创建一条 alias

alias chrome='/opt/google/chrome/chrome'

打印 DOM 结构

使用 --dump-dom 将文件内容打印到标准输出

chrome --headless --disable-gpu --dump-dom https://www.einverne.info/

将网页保存为 PDF

使用 --print-to-pdf flag 将网页文件保存成 pdf

chrome --headless --disable-gpu --print-to-pdf https://www.einverne.info

保存截图

使用 --screenshot flag 保存截图

chrome --headless --disable-gpu --screenshot https://www.einverne.info

使用 --window-size 来指定窗口大小

chrome --headless --disable-gpu --screenshot --window-size=1280,1920 https://www.einverne.info

使用 --screenshot 会在当前目录下生成一个名为 screenshot.png 的图片文件。

Debugging Chrome without UI

使用 --remote-debugging-port=9222 flag 来启动 Chrome 时,Headless Chrome 会开启 DevTools protocol 。使用该协议可以用来和 Chrome 通信,并使用指令来操作 Headless Chrome。因为没有界面,可以使用另外的浏览器访问 http://localhost:9222 来查看 Headless Chrome 的状态。

reference


2017-10-31 chrome , headless-chrome , linux

Vim 键映射

Vim 本身有很多快捷键,vimrc 也可以配置很多快捷键,当然 Vim 也支持将不同的键映射到不同的键或者命令上。

最常见的键映射就是

  • nmap
  • vmap
  • imap

分别对应着修改普通模式(Normal) ,选择模式(Visual),和插入模式(Insert) 下的键映射。

对于这几种模式,可以参考 Vim 模式

Map 命令

其实对于 map 命令的种类远不止于此

  • noremap 非递归映射
  • nmap
  • vmap
  • imap
  • cmap 在命令模式下生效

递归映射,就是如果当快捷键 a 被映射成 b, b 又被映射成 c ,那么他们是递归的,那么 a 就是被映射成 c

map b a
map c b

效果等同于

map c a

默认的 map 是递归的,除了 noremap

unmap 解除映射

unmap 和 map 类似也可以添加很多前缀,表示影响的模式

mapclear 命令

mapclear 直接清除相关模式下所有的映射,也可以添加很多前缀,表示影响的模式

所以总结一下大概有如下命令:

:map   :noremap   :unmap   :mapclear 
:nmap  :nnoremap  :nunmap  :nmapclear
:vmap  :vnoremap  :vunmap  :vmapclear
:imap  :inoremap  :iunmap  :imapclear
:cmap  :cnoremap  :cunmap  :cmapclear

查看当前 Vim 配置的键绑定

通过在 vimrc 中配置不同的快捷键,影响不同模式下 Vim 的快捷键,那么可以在普通模式下使用 :map 来查看当前 Vim 配置的快捷键。

如何测试 map 生效

Vi stackoverflow 上有一篇文章 讲述的很详细。

解决的具体步骤:

  • 明确 map 的命令
  • 想要定义的快捷键具体做什么
  • 然后使用 :map 来检查定义的 map 是否已经被 Vim 识别
  • 如果还是不行,在那篇文章中检查是否遇到了常见的一些错误
  • 再不行的话就去 vi stackoverflow 等等论坛求助大神吧

2017-10-30 Vim , Linux

Vim 全局命令 g

全局命令 :g 在 Vim 中有着意想不到强大的功能。当想要在整个文件中对于匹配的行或者不匹配行进行一些操作时,应该第一时间想到这个 :g 命令。

:[range]global[!]/{pattern}/{command}

简写可以写成

:[range]g/pattern/command
  • [range] 指定文本范围,默认为整个文档
  • pattern 在范围 range 内的行如果匹配 pattern,则执行 command
  • ! 表示取反,也就是不匹配的行,也可以使用 vglobal
  • command 默认是打印文本

整个命令可以理解成,在 range 范围内匹配 patter 的行执行 Ex command。所有的 Ex command 可以使用 :help ex-cmd 来查看。

常用的 Ex command 可以参考如下例子:

  • d 删除
  • m 移动
  • t 拷贝
  • s 替换

举例

范围匹配

比如在 20 行到 200 行之间,每一行下插入空行

:20,200g/^/pu _

删除匹配的行

最简单的使用

:g/pattern/d

会删除 pattern 批量的行,再比如

:g/^$/d

可以用来删除空白行。

删除不匹配的行

匹配使用 :g ,而不匹配有两种写法:

:g!/pattern/d
:v/pattern/d

:v:in(v)erse 的缩写,如果为了记忆的话,可以记住 inverse。

删除大量匹配行

Vim 在删除操作时,会先把要删除的内容放到寄存器中,假如没有指定寄存器,会默认放到一个未命名的寄存器中,对于要删除大量匹配行的行为,可能导致 Vim 花一些时间处理这些拷贝,避免花费不必要的时间可以指定一个 blackhole 寄存器 _

:g/pattern/d_

移动匹配的行

将所有匹配的行移动到文件的末尾

:g/pattern/m$

复制匹配的行

将所有匹配的行复制到文件末尾

:g/pattern/t$

复制到 register a

Vim 每个字母都是一个寄存器,所以使用全局命令也可以将内容复制到某一个寄存器,比如 a

qaq:g/pattern/y A
  • qaq 清空寄存器 a,qa 开始记录命令到a寄存器,q 停止记录
  • y A 将匹配的行 A (append) 追加到寄存器 a 中

存放到 a 寄存器之后就可以使用 "ap 来粘贴使用或者其他操作了。

反转文件中的每一行

just show the power of :g

:g/^/m0

:g 命令一行行匹配,匹配第一行时将第一行 m0 放到文件顶部,第二行放到文件顶部,当跑完一遍之后整个文件的每一行就反转了。

在匹配行后添加文字

使用 s 命令可以实现,同样使用全局 g 命令也可以实现同样的效果

:g/pattern/s/$/mytext

这里使用到了 s 命令, substitute 命令,可以使用 :help :s 来查看。

reference


2017-10-29 Vim , Regex , Linux

kibana query syntax

Kibana 的查询语法基于 Lucene 的查询语法,他允许 boolean 值,通配符,过滤器等等操作。

字符串查询

通常一个查询会包含一个或者多个单词或者组合。一个简单的查询语句就是用引号包含的一组词,比如 “search demo”.

如果不包含双引号,Kibana 会单独的去匹配每一个词。

正则表达式查询

大部分正则表达式是允许匹配部分字符的,然而在 Lucene 中,正则表达式用来匹配整个字符串,比如 abcde 这个字符串

  • 使用 ab.* 能够匹配
  • 但是使用 abcd 是不能匹配的

正则表达式中,有一些保留字符

. ? + * | { } [ ] ( ) " \

这些字符如果出现在表达式中都需要进行转义,比如 \* ,或者 \\

这些符号的含义和正则表达式一致

  • . 用来表示任意字符
  • ? 用来表示前面的字符重复一次或零次
  • + 表示前面的字符重复一次或多次
  • * 表示前面的字符重复零次或多次
  • {n} 表示重复n次
  • {n,m} 表示重复n到m次
  • () 表示 group, 组合其他使用
  • | 表示 OR 或者,(http|https) http 或者 https 匹配
  • [] 表示括号中的任意一个

更多的关于正则表达式的内容可以参考任意一本关于正则的书。

补充,在 Kibana 中如下字符都需要转义

+ - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /

比如查询 (1+1)=2 需要使用 \(1\+1\)\=2

可选表达式

Lucene 中还能够开启一些扩展操作。

Complement 模式

比如 ab~cd 可以表示字符串以 ab 开始接着跟随一个任意长度非c字符,以d结尾的字符串。

Interval

使用 <> 来匹配数字范围, 比如 foo<1-100> 可以匹配string foo90 却不能匹配 foo101

Intersection

符号 & 用来连接两个 patterns 两个正则表达式都需要匹配

Any string

符号 @ 用来匹配所有,和 Intersection 联合使用可以用来表示,匹配所有除了。

比如 @&~(foo.*) 用来匹配所有字符,除了以 foo 开头的字符

范围查询

范围查询用来查询一定范围的匹配,比如

ResponseTime: [10 TO *]

用来查询请求时间大于等于 10 ms 的,或者使用 ResponseTime: {10 TO *} 来匹配大于 10 ms 的。

方括号可以表示包括,花括号不包括,所以 [10 TO 50} 表示 需要 10<=value<50

也可以简化写成

age:(>=10 AND <50)

这样

Boolean 查询

逻辑运算 AND、OR、NOT 可以用来组合查询语句,这三个运算符必须 大写 ,更多内容可以查看 Lucene 语法。

  • + 搜索结果中必须包含此项
  • - 不能含有此项

字段名称搜索

比如需要查询 statusactive 的内容,可以

status:active

近似搜索

在短语后面加 ~ 可以搜到被隔开或者顺序不同的单词。

比如 “where select”~5, 表示 select 和 where 中间可以相隔5个单词。

reference


2017-10-29

每天学习一个命令: 代码搜索工具 ack-grep

ack 是一个代码搜索工具,作者厌烦了 grep 复杂的语法,所以创造了 ack 来解决痛点。ack 使用Perl语言开发,使用友好,速度快。

安装

sudo apt-get install ack-grep

使用

文本搜索

默认情况下 ack-grep 会搜索当前目录下所有文件内容,只要包含关键字就会输出。

ack-grep keyword
ack-grep -l keyword     # 只显示文件名
ack-grep -i keyword     # 忽略大小写
ack-grep -w keyword     # 强制要求 PATTERN 匹配整个单词

查找文件

可以代替 find 加 grep,其实 ack 的 -f 选项表示的是打印所有将要被搜索的文件,事实上不会执行搜索,如果后面加 PATTERN ,那么就在路径中搜索文件名。-g 选项表示的是搜索当前路径下的符合 PATTERN 的文件。

ack-grep -f filename
ack-grep -g file*

过滤文件

可以使用 --python 选项来指定在 python 文件中搜索

ack-grep --python keyword

reference


2017-10-26 ack , linux , command

Nginx 反向代理 Google 配置

使用编译安装 Nginx,将 ngx_http_substitutions_filter_modulengx_http_google_filter_module 两个模块编译进 Nginx。具体内容可以参考安装篇。

对于 Nginx 基本设置可以参考 配置篇 .

这篇主要演示 Nginx 作为一个反向代理服务器的基本设置。

Nginx 反向代理最重要的一个配置就是 proxy_pass ,该配置接受一个参数, URL ,也就是 Nginx 转发的目的地。Nginx 会自动将请求的 URI 替换为 proxy_pass 配置的 URI。

location /uri {
    proxy_pass http://localhost:8083/newUri;
}

常用配置

反代相关配置

反向代理的常用配置选项

Directive Explanation
proxy_connect_timeout 向上游服务器请求超时时间
proxy_cookie_domain 将请求头中 Set-Cookie 头内容替换成新域名
proxy_cookie_path 替换 Set-Cookie 中路径
proxy_headers_hash_bucket_size 请求头名最大size
proxy_headers_hash_max_size 从上游服务器接收到的所有 headers 总量
proxy_hide_header 一组不会被传给 client 的 headers
proxy_http_version 和上游服务器通信使用的 HTTP 协议版本
proxy_ignore_client_abort 如果设置为 on, Nginx 在client 停止请求时不会停止向上游服务器请求
proxy_ignore_headers 处理上游服务器返回时设置一组不处理 headers
proxy_intercept_errors 设置开启, Nginx 将显示 error_page 配置的错误而不会向上游服务器请求
proxy_max_temp_file_size The maximum size of the overflow file, written when the response doesn’t fit into memory buffers.
proxy_pass 上游服务器 URL
proxy_pass_header 覆盖被 proxy_hide_header 配置禁用的 headers,允许他们发送给客户端
proxy_pass_request_body off 时阻止向上游服务器发送请求body
proxy_pass_request_headers off 时阻止向上游服务器发送 headers
proxy_read_timeout 连接关闭前,向上游服务器两次读成功耗时
proxy_redirect Rewrites the Location and Refresh headers received from the upstream servers; useful for working around assumptions made by an application framework.
proxy_send_timeout 连接关闭前,向上游服务器两次写成功耗时
proxy_set_body 修改请求body
proxy_set_header 修改请求 headers
proxy_temp_file_write_size 限制单个请求的临时文件大小, Nginx 不会在一个请求上被 block
proxy_temp_path 临时文件地址

upstream 选项中的配置

Directive Explanation
ip_hash 使得客户端的请求能够均匀的分布
keepalive 每一个 worker process 向上游服务器请求缓存的连接数,proxy_http_version 需要设置为 1.1 并且 proxy_set_header 设置为空
least_conn 负载均衡算法,根据 active 连接数来选择下一个连接
server 设置地址,域名或者 IP,或者 Unix-domain socket 一些选项 weight: 设置 server 的权重,max_fails: 重试最大次数,fail_timeout: 服务器超过该时间会被标记为 Down ,backup: 只有其他机器都 Down 情况下才会使用该服务器,down: 标记为 down 不会处理请求

示例

keep alive

以如下配置示例

upstream apache {
	server 127.0.0.1:8080;
	keepalive 32;
}
location / {
	proxy_http_version 1.1;
	proxy_set_header Connection "";
	proxy_pass http://apache;
}

假设定义了 apache upstream ,使用 Nginx 转发到本地 8080 端口, 设置了 keepalive 为 32。每一个 Nginx worker 只会在最初始化时TCP握手建立32个连接,Nginx 会保存连接,不会发送 close

如果需要超过 32 个连接, Nginx 会再新建连接满足需求,如果需求降低, Nginx 会自动将超过 32 个连接的请求,按照最近使用的连接关闭,直到将连接数降到 32 。

负载均衡算法

upstream 模块会使用三种算法来选择向哪一台上游服务器建立连接—- round-robin, IP hash, 或者是 least connections.

round-robin 算法是默认值,算法根据上一次选择的服务器决定下一次选择哪一条连接,算法公平的根据 turn by turn 的方式来保持平衡。

IP hash 算法,需要通过 ip_hash 指令开启 Nginx 使用 IPv4 地址的前三个字节或者是整个 IPv6 地址作为 hashing key 。因此一组IP地址永远被map到特定的上游服务器。因此这个机制不是设计为均匀分发请求,而是被设计成将客户端和上游服务器映射到一起。

第三种负载均衡算法叫做 least connections , 通过 least_conn 开启。该算法设计成将负载均匀的打到上游服务器中,通过选择活跃连接数最小的服务器。如果上游服务器不是具有相同的处理能力,可以通过指定 weight 来人为处理。算法会将不同 weight 的服务器纳入计算活跃连接数的考虑范畴。

创建 Google 的反向代理

创建一个 Ngixn 虚拟主机,我使用 https://g.einverne.info 来演示:

# 配置 google ip 地址,使用 nslookup google.com 来获取 Google 服务器地址,避免 Google 机器人检测
upstream www.google.com {
    server XXX.XXX.XXX.XXX:443 weight=1; #把XXX替换成可用 IP
    server XXX.XXX.XXX.XXX:443 weight=1;
    server XXX.XXX.XXX.XXX:443 weight=1;
    server XXX.XXX.XXX.XXX:443 weight=1;
    server XXX.XXX.XXX.XXX:443 weight=1;
    server XXX.XXX.XXX.XXX:443 weight=1;
    server 216.58.216.163:443 weight=1; #hk
}

server {
    listen 80;
    listen [::]:80;
    server_name g.einverne.info;

    listen 443 ssl;
	ssl_certificate path_to_ssl_crt; # 证书
	ssl_certificate_key path_key; # key

	# 自动 http 转 https
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    }

    if ($http_user_agent ~* (baiduspider|360spider|haosouspider|googlebot|soso|bing|sogou|yahoo|sohu-search|yodao|YoudaoBot|robozilla|msnbot|MJ12bot|NHN|Twiceler)) {
        return  403;
    }

	# 编译时加入 ngx_http_google_filter_module 模块,location 如下设置
    location / {
        google on;
    }

    access_log /var/log/nginx/g.einverne.info.access.log;
	error_log /var/log/nginx/g.einverne.info.error.log;
}

如果编译时没有加入 ngx_http_google_filter_module 模块,则需要设置 location

location / {
	proxy_redirect off;
	proxy_cookie_domain google.com <domain.name>; 
	proxy_pass https://www.google.com;
	proxy_connect_timeout 60s;
	proxy_read_timeout 5400s;
	proxy_send_timeout 5400s;

	proxy_set_header Host "www.google.com";
	proxy_set_header User-Agent $http_user_agent;
	proxy_set_header Referer https://www.google.com;
	proxy_set_header Accept-Encoding "";
	proxy_set_header X-Real-IP $remote_addr; 
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
	proxy_set_header X-Forwarded-Proto https;
	proxy_set_header Accept-Language "zh-CN";
	proxy_set_header Cookie "PREF=ID=047808f19f6de346:U=0f62f33dd8549d11:FF=2:LD=en-US:NW=1:TM=1325338577:LM=1332142444:GM=1:SG=2:S=rE0SyJh2W1IQ-Maw";

	subs_filter https://www.google.com.hk <domain.name>;
	subs_filter https://www.google.com <domain.name>;
	#subs_filter_types text/css text/xml text/javascript;

	sub_filter_once off; 
}
  • proxy_redirect 设置为 off ,不需要重写 Location 的 header
  • proxy-cookie-domain google <domain.name>; 将cookie作用域替换成自己的域名
  • proxy_pass https://www.google.com; 反向代理到 upstream www.google.com
  • proxy_set_header Accept-Encoding ""; 防止谷歌返回压缩的内容,否则内容无法替换
  • proxy_set_header Cookie 这一行 禁止即时搜索,设置为新窗口打开网站
  • subs_filter https://www.google.com <domain.name>; 把Google域名替换,需要编译时加上 --with-http_sub_module 参数

reference


2017-10-25 linux , nginx , web , proxy , google

电子书

Google+

最近文章

  • 又一个网页文件管理:filebrowser 之前一直使用的是 h5ai,平时也够用,不过 h5ai 是不能上传文件编写文件的,这算是一个问题吧,今天正好看到了 filebrowser,以前叫做 file manager。
  • Linux 下超好用字典 GoldenDict 最近在使用 Linux 版有道的时候发现非常卡,影响正常使用,所以就发现了这个 GoldenDict。以前在 Win 下用过 lingoes 但是无奈只有 Win 版本。
  • Linux 网络配置 昨天升级 Ubuntu ,不知为何将网卡配置覆盖了,导致一时间无法上网,然后看了一些网络配置的文章,感觉自己需要补习一下相关知识,所以有了这篇文章。
  • AES 加密算法 高级加密标准 (AES,Advanced Encryption Standard) 为最常见的对称加密算法。对称加密算法也就是加密和解密用相同的密钥。
  • 使用 alembic 迁移数据库结构 Alembic 是一个处理数据库更改的工具,它利用 SQLAlchemy 来实现形成迁移。 因为 SQLAlchemy 只会在我们使用时根据 metadata create_all 方法来创建缺少的表 ,它不会根据我们对代码的修改而更新数据库表中的列。它也不会自动帮助我们删除表。 Alembic 提供了一种更新 / 删除表,更改列名和添加新约束的方法。因为 Alembic 使用 SQLAlchemy 执行迁移,它们可用于各种后端数据库。