修复docker的终端命令自动截断

用cli命令进入docker容器后,发现在终端输入长一些的字符串会被截断,有种蛋蛋的忧伤。。。。

原因是容器不知道它所处的终端的大小,所以默认初始终端的尺寸是0 0,迷之尴尬。。。大家可以执行以下命令确认:

 

最后解决方式,在进入容器后执行一条命即可:

 

最后完美解决:

可用的做法:
1. 在/etc/bashrc 加入 reset -w

2. 在Dockerfile挂一个启动脚本 ENTRYPOINT [“/start.sh”] , 里面附带 reset -w

3. 进入容器的时候设置:

 

骑车感悟T.T

34+的休闲骑是不可能骑的,我这辈子也不可能跟你们去34+的休闲骑的,跟风又跟不上,只能掉下来收尾,发完朋友圈就闪现往回跑这样子。队友说很久没骑车了,发车后就开尾灯让我赶紧追,反正我每次一掉就有队友说前面没有坡拐个弯就到了!

【转发】Go 语言机制之栈和指针

简介

我不打算说指针的好话,它确实很难理解。如果应用不当,会产生恼人的 bug,甚至会导致性能问题。当写并发和多线程程序时更是如此。所以许多语言试着用其它方法让编程人员避免指针的使用。但如果你是在用 Go 语言的话,你就不得不使用它们。如果不能很好的理解指针,是很难写出干净、简单并且高效的代码的。

帧边界(Frame Boundaries)

帧边界为每个函数提供了它自己独有的内存空间,函数就是在这个内存空间内执行的。帧边界除了可以让函数在自己的上下文环境中运行外还提供一些流程控制功能。函数可以通过帧边界指针直接访问自己帧边界中的内存,但如果想要访问自己帧边界外的内存,就需要用间接访问来实现了。要实现间接访问,被访问的内存必须和函数共享,要想弄清楚共享是怎么实现的,我们就得先了解一下由这些帧边界建立起来的内存结构以及其中的一些限制。

当一个函数被调用时,会在两个相关的帧边界间进行上下文切换。从调用函数切换到被调用函数,如果函数调用时需要传递参数,那么这些参数值也要传递到被调用函数的帧边界中。Go 语言中帧边界间的数据传递是按值传递的。

按值传递的好处是可读性好,拷贝并被函数接收到的值就是在函数调用时传入的值 。这就是为什么我把按值传递叫做 WYSIWYG(what you see is what you get 的缩写)。如果发生上下文环境转换时参数是按值传递的,我们就可以很清楚的知道这个函数调用会怎样影响程序的执行

让我们看一下下面这个小程序,主程序用按值传递的方式调用了一个函数:

清单 1

程序启动后,语言运行环境会创建 main goroutine 来执行包含在函数 main 内的所有初始化代码。goroutine 是被放置在操作系统线程上的可执行序列,在 Go 语言的1.8版本中,为每一个 goroutine 分配了 2048 byte 的连续内存作为它的栈空间。这个初始化的内存大小几年来一直在变化,而且未来很有可能继续变化。

栈在 Go 语言中是非常重要的,因为它为分配给每个函数的帧边界提供了物理内存空间。main goroutine 在执行表 1 中的代码时,goroutine 的栈看起来像下面这个样子(在一个比较高的语言层次)

图 1

在图 1 中可以看到,一部分栈空间被框了起来,作为函数 main 的可用空间,这块栈区域叫做「栈帧」,正是它界定了函数 main 在栈上的边界。这块栈空间是在函数被调用后,随着一些初始化代码的执行一并被创建的。可以看到变量 count 被放置到了函数 main 的栈帧中地址为 0x10429fa4 的地方。

在图 1 中也可以发现另外一点,就是在活动栈帧之下的栈空间是不可用的,只在活动栈帧以及它之上的栈空间是可用的。这个可用栈空间与不可用栈空间的边界我们需要明确一下。

地址

变量名是为了标识一块内存,使代码更具可读性而存在的。一个好的变量名可以让编程人员清楚的知道它代表了什么。如果你已经有了一个变量,那在内存中就有一个值与它对应;反之,如果在内存中有一个值,就必须有一个与之对应的变量,通过这个变量来访问这个内存值。在第 9 行,主函数调用了内置函数 println 来显示变量 count 的值和地址。

清单 2

用 & 操作符来获取变量的地址并不新鲜,许多其它语言也同样用这个操作符来获取变量地址。如果你在 32 位机器上运行这段代码(例如 playgournd ),第 9 行的输出应该像下面这样。

清单 3

函数调用

接下来第 12 行,函数 main 调用了函数 increment:

清单 4

函数调用意味着 goroutine 需要在栈空间中创建一个新的栈帧。然而,这里并没有这么简单。要成功的调用一个函数,需要将数据在上下文转换过程中跨栈帧边界传递到新建的栈帧中。特别的,对于 integer 值,在调用过程中需要拷贝并传递过去,在第 18 行对函数 increment 的声明语句中可以看到这一点:

清单 5

如果再看一下第 12 行对函数 increment 的调用,可以看到传递的正是变量 count 的值。这个值经过拷贝、传递并最终放置到了函数 increment 的栈帧中。因为函数 increment 只能直接访问自己栈帧里的内存,所以它用变量 inc 来接收、存储和访问从变量 count 传递过来的值。

在函数 increment 刚刚要开始执行的时候,goroutine 的栈结构看起来像下面这个样子(从一个比较高的语言层次)。

图 2

可以看到,现在在栈里有两个栈帧, 一个是函数 main 的,它下面的是函数 increment 的。在函数 increment 栈帧里,有一个变量 inc,它的值是当函数调用时从外面拷贝并传递过来的 10,它的地址是 0x10429f98,因为栈帧是从上往下使用栈空间的,所以它的地址比上面的小,不过这只是一个实现细节,并不保证所有实现都这样。重要的是 goroutine 把函数 main 的栈帧中的变量 count 的值拷贝并传递给了函数 increment 的栈帧中的变量 inc。

函数 increment 剩下的代码显示了变量 inc 的值和地址:

清单 6

在 playground 平台上,第 22 行的输出看起来像这样:

表 7

当执行完了这些代码以后,栈结构变成下面这个样子

图 3

执行完第 21 行和第 22 行以后,函数 increment 返回,控制权重新回到了函数 main 中,然后函数 main 再一次显示了变量 count 的值和地址:

清单 8

在 playgournd 平台上,程序全部的输出如下:

清单 9

函数返回

当函数返回,控制权回到调用函数后,栈结构发生了什么变化呢?答案是什么也没有。下面就是当函数 increment 返回后,栈结构的样子:

图 4

除了为函数 increment 创建的栈帧现在变为不可用外,其他和图 3 一模一样。这是因为函数 main 的栈帧变成了活动栈帧。对函数 incrment 的栈帧没有做任何处理。

函数调用完成后,没有必要立即清理被调用函数的栈帧空间,这样做只会浪费时间,因为你不知道那块内存之后是否会被再次用到。所以相应内存就原封不动的留在那里。只有当发生了函数调用,这块内存被再次用到时,才会对它进行清理。清理过程是通过拷贝过来的值在这个栈帧中的初始化完成的,因为所有的变量至少会被初始化为相应类型的零值,这就保证了发生函数调用时,栈空间一定会被合理的清理。

值的共享

但是如果我们想在函数 increment 中直接操作存在于函数 main 的栈帧中的变量 count,应该怎么办呢?这时候我们就要用到指针了。指针存在在目的就是为了和一个函数共享变量,从而让这个函数可以对这个共享变量进行读写,即使这个变量没有直接放置在这个函数的栈帧中。

如果当你用指针时,一下子想到的不是「共享」,那就得看看是不是真的有必要使用指针了。当我们学习指针的内容时,有一点很重要,就是要用一个明确的单词而不是操作符或者语法来对待指针。所以请记住,用指针是为了共享,在阅读代码的时候也应该把 & 操作符当做共享来看。

指针类型

对每个已经声明的类型,不管是语言自己定义的还是用户定义的,都有一个与之对应的指针类型,用它来进行数据共享。比如 Go 语言中有一个内置的 int 类型,所以一定有一个与 int 类型对应的叫做 *int 的指针类型。如果你定义了一个叫做 User 的类型,那么语言会自动为你生成一个与它对应的叫做 *User 的指针类型。

所有的指针类型有两个共同点。一、它们以 * 开头。二、它们占用相同的内存大小(4 个字节或者 8 个字节)并且表示的是一个地址。在 32 位的系统上(比如 playground ),一个指针占用 4 个字节,在 64 位的系统上(比如你自己的电脑)占用 8 个字节。

规范一点说,指针类型被认为是一个字面类型(type literals),也就是说它是通过对已有类型进行组合而成的。

间接内存访问

看下面这段程序,它同样调用 了一个函数,不过这次传递的是变量的地址。这样被调用的函数 increment 就可以和函数 main 共享变量 count 了:

清单 10

同原来的程序比起来,新的程序存在 3 点不同

表 11

在程序的第 12 行,并没有像之前一样传递变量 count 的值,而是传递的变量 count 的地址。现在我们可以说,我将要和函数 increment 共享变量 count 了,这就是 & 操作符想要表达的。

变量仍然是按值传递的,唯一不同的是,这次传递的是一个 integer 的地址。地址同样是一个值;这就是在函数调用时跨越两个帧边界被拷贝和传递的东西。

鉴于有一个值正在被拷贝和传递,在函数 inrement 中我们就需要一个变量来接收并存储这个基于地址的 integer 值,所以我们在程序的第 18 行把参数声明为了 *int 类型。

表 12

如果你传递的是 User 类型的地址值,这里声明的类型就应该换成 *User,尽管所有的指针存储的都是地址值,但是传递和接收的必须是同一个类型才可以,这个是关键。我们之所以要共享一个变量,是因为在函数内我们要对那个变量进行读写操作,而我们只有知道了这个类型的具体信息后才可以这样做。编译器会保证传递的是同一个指针类型的值。

下面是调用了函数 increment 后,栈结构的样子。

图 5

在图 5 中我们可以看到,当把一个地址按值进行传递后,栈结构会变成什么样子。函数 increment 的栈帧中的指针变量 inc 指向了存在于函数 main 的栈帧中的变量 count。

通过这个指针变量,函数就可以以间接方式读写存在于函数 main 的栈帧中的变量 count 了。

清单 13

这个时候,* 被用作一个操作符和指针变量一起使用,把 * 用作操作符,意思是说要得到指针变量所指向的内容,在这里也就是函数 main 中的 count 变量。指针变量允许在使用它的栈帧中间接访问此栈帧之外的内存空间。有时候我们把这种间接访问叫做指针的解引用。在函数 increment 中仍然需要一个可以直接访问的本地指针变量来执行间接访问,在这里就是变量 inc。

当执行了第 21 行后,栈结构的变成下面这个样子。

图 6

下面是程序的全部输出:

表 14

可以看到,变量 inc 的值正是变量 count 的地址,就是这一个联系才使得访问本栈帧外的内存成为可能。一旦函数 increment 通过指针变量执行了写操作,当控制返回到函数 main 后,修改就会反应到对应的共享变量中。

指针型变量并不特别

指针类型和其它类型一样,一点也不特殊。它们有一块分配的内存并存放了一个值,抛开它指向的类型,指针类型总是占用同样的大小并且有相同的表示。唯一可能让我们感到困惑的是字符 *,在函数 increment 内部,它被用作操作符,在函数声明时用来声明指针变量。如果你可以分清指针声明时和指针的解引用操作时的区别,应该就没那么困惑了。

总结

这篇文章讨论了设计指针背后的目的,以及在 Go 语言中栈和指针是怎样工作的。这是理解 Go 语言的语言机制、设计哲学的第一步,也对写出一致的、可读性好的代码有一定的指导作用。

下面来总结一下我们学到了什么:

  1. 帧边界为每个函数提供了独立的内存空间,函数就是在自己的帧边界内执行的
  2. 当调用函数时,上下文环境会在两个帧边界间切换
  3. 按值传递的优点是可读性好
  4. 栈是非常重要的,因为它为分配给每个函数的帧边界提供了可访问的物理内存空间
  5. 在活动栈帧以下的栈空间是不可用的,只有活动栈帧和它之上的栈空间是可用的
  6. 函数调用意味着 goroutine 需要在栈上为函数创建一个新的栈帧
  7. 只有当发生了函数调用 ,栈区块被分配的栈帧占用后,相应栈空间才会被初始化
  8. 使用指针是为了和被调用函数共享变量,使被调用函数可以用间接方式访问自己栈帧之外的变量
  9. 每一个类型,不管是语言内置的还是用户定义的,都有一个与之对应的指针类型
  10. 使用指针变量的函数,可以通过它间接访问函数栈帧之外的内存
  11. 指针变量和其它变量一样,并不特殊,同样是有一块内存,在其中存放值而已

 

来源:https://studygolang.com/articles/12443

phabricator 没法发送邮件,人肉找到邮件内容并发送出去。。。。

 

第一次接触这货,然后邮件还一直发送不出去。。。最后好不容易找到方式出大招了,看内容自己发。。。嗯哼。。。。。暂时这么解决吧。。。

mysql中distinct的坑

本事例实验用表task,结构如下

 

 

 

1  Distinct 位置

单独的distinct只能放在开头,否则报错,语法错误

mysql>

 

 

现在把distinct放在开头

mysql>

 

查询成功

与其他函数使用时候,没有位置限制如下

 

 

这种情况下是正确的,可以使用。

2  Distinct用法

a.在count计算不重复的记录的时候能用到
比如

 

就是计算talbebname表中id不同的记录有多少条

b,在需要返回记录不同的id的具体值的时候可以用

比如

 

返回talbebname表中不同的id的具体的值

c.上面的情况2对于需要返回mysql表中2列以上的结果时会有歧义

比如

实际上返回的是player_id与task_id同时不相同的结果,也就是DISTINCT同时作用了两个字段,必须得player_id与task_id都相同的才被排除了,与我们期望的结果不一样,我们期望的是player_id不同被过滤

在这种情况下,distinct同时作用了两个字段,player_id,task_id

d.这时候可以考虑使用group_concat函数来进行排除,不过这个mysql函数是在mysql4.1以上才支持的
e. 其实还有另外一种解决方式,就是使用

 

虽然这样的返回结果多了一列无用的count数据(有时也许就需要这个数据)

f 同时我们还可以利用下面的方式解决b遇到的歧义问题通过group by 分组

distinct 优化

nginx.conf 说明

Nginx的配置文件nginx.conf配置详解如下:

 

 

Nginx用户及组:用户 组。window下不指定

 

 

工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。

 

 

错误日志:存放路径。

 

 

pid(进程标识符):存放路径。

 

 

指定进程可以打开的最大描述符:数目。

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。

现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。

这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。

 

 

 

##设定http服务器,利用它的反向代理功能提供负载均衡支持

http

{

include mime.types;

设定mime类型,类型由mime.type文件定义

 

default_type application/octet-stream;

 

log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘

‘$status $body_bytes_sent “$http_referer” ‘

‘”$http_user_agent” “$http_x_forwarded_for”‘;

log_format log404 ‘$status [$time_local] $remote_addr $host$request_uri $sent_http_location’;

日志格式设置。

$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;

$remote_user:用来记录客户端用户名称;

$time_local: 用来记录访问时间与时区;

$request: 用来记录请求的url与http协议;

$status: 用来记录请求状态;成功是200,

$body_bytes_sent :记录发送给客户端文件主体内容大小;

$http_referer:用来记录从那个页面链接访问过来的;

$http_user_agent:记录客户浏览器的相关信息;

通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

 

access_log  logs/host.access.log  main;

access_log  logs/host.access.404.log  log404;

用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径;

 

server_names_hash_bucket_size 128;

#保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.

 

client_header_buffer_size 4k;

客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。

 

large_client_header_buffers 8 128k;

客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果

header过大,它会使用large_client_header_buffers来读取。

 

open_file_cache max=102400 inactive=20s;

这个指令指定缓存是否启用。
例: open_file_cache max=1000 inactive=20s;

open_file_cache_valid 30s;

open_file_cache_min_uses 2;

open_file_cache_errors on;

 

open_file_cache_errors
语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件是记录cache错误.

open_file_cache_min_uses

语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 使用字段:http, server, location 这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态.
open_file_cache_valid

语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.

 

 

client_max_body_size 300m;

设定通过nginx上传文件的大小

 

sendfile on;

sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。

 

tcp_nopush on;

此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用

 

proxy_connect_timeout 90;
后端服务器连接的超时时间_发起握手等候响应超时时间

 

proxy_read_timeout 180;

连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)

 

proxy_send_timeout 180;

后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据

 

proxy_buffer_size 256k;

设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小

 

proxy_buffers 4 256k;

设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k

 

proxy_busy_buffers_size 256k;

 

proxy_temp_file_write_size 256k;

设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长

 

proxy_temp_path /data0/proxy_temp_dir;

proxy_temp_path和proxy_cache_path指定的路径必须在同一分区

proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。

keepalive_timeout 120;

keepalive超时时间。

 

tcp_nodelay on;

 

client_body_buffer_size 512k;
如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误

 

proxy_intercept_errors on;

表示使nginx阻止HTTP应答代码为400或者更高的应答。

 

upstream bakend {

server 127.0.0.1:8027;

server 127.0.0.1:8028;

server 127.0.0.1:8029;

hash $request_uri;

}

nginx的upstream目前支持4种方式的分配

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}

2、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

3、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
server server1;
server server2;
fair;
}

4、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

tips:

upstream bakend{#定义负载均衡设备的Ip及设备状态}{
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用负载均衡的server中增加
proxy_pass http://bakend/;

每个设备的状态设置为:
1.down表示单前的server暂时不参与负载
2.weight为weight越大,负载的权重就越大。
3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path设置记录文件的目录 可以设置最多3层目录

location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

 

 

##配置虚拟机

server

{

listen 80;

配置监听端口

 

server_name image.***.com;

配置访问域名

 

location ~* \.(mp3|exe)$ {

对以“mp3或exe”结尾的地址进行负载均衡

 

proxy_pass http://img_relay$request_uri;

设置被代理服务器的端口或套接字,以及URL

 

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

以上三行,目的是将代理服务器收到的用户的信息传到真实服务器上

}

 

location /face {

if ($http_user_agent ~* “xnp”) {

rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

}

proxy_pass http://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

error_page 404 502 = @fetch;

}

location @fetch {

access_log /data/logs/face.log log404;

rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

}

location /image {

if ($http_user_agent ~* “xnp”) {

rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

}

proxy_pass http://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

error_page 404 502 = @fetch;

}

location @fetch {

access_log /data/logs/image.log log404;

rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;

}

}

##其他举例

server

{

listen 80;

server_name *.***.com *.***.cn;

location ~* \.(mp3|exe)$ {

proxy_pass http://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

location / {

if ($http_user_agent ~* “xnp”) {

rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;

}

proxy_pass http://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#error_page 404 http://i1.***img.com/help/noimg.gif;

error_page 404 502 = @fetch;

}

location @fetch {

access_log /data/logs/baijiaqi.log log404;

rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;

}

}

server

{

listen 80;

server_name *.***img.com;

 

location ~* \.(mp3|exe)$ {

proxy_pass http://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

location / {

if ($http_user_agent ~* “xnp”) {

rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif;

}

proxy_pass http://img_relay$request_uri;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#error_page 404 http://i1.***img.com/help/noimg.gif;

error_page 404 = @fetch;

}

#access_log off;

location @fetch {

access_log /data/logs/baijiaqi.log log404;

rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;

}

}

server

{

listen 8080;

server_name ngx-ha.***img.com;

location / {

stub_status on;

access_log off;

}

}

server {

listen 80;

server_name imgsrc1.***.net;

root html;

}

server {

listen 80;

server_name ***.com w.***.com;

# access_log /usr/local/nginx/logs/access_log main;

location / {

rewrite ^(.*)$ http://www.***.com/ ;

}

}

server {

listen 80;

server_name *******.com w.*******.com;

# access_log /usr/local/nginx/logs/access_log main;

location / {

rewrite ^(.*)$ http://www.*******.com/;

}

}

server {

listen 80;

server_name ******.com;

# access_log /usr/local/nginx/logs/access_log main;

location / {

rewrite ^(.*)$ http://www.******.com/;

}

}

location /NginxStatus {
stub_status on;
access_log on;
auth_basic “NginxStatus”;
auth_basic_user_file conf/htpasswd;
}

#设定查看Nginx状态的地址

 

location ~ /\.ht {
deny all;
}

#禁止访问.htxxx文件

}

 

注释:变量

Ngx_http_core_module模块支持内置变量,他们的名字和apache的内置变量是一致的。

首先是说明客户请求title中的行,例如$http_user_agent,$http_cookie等等。

此外还有其它的一些变量

$args此变量与请求行中的参数相等

$content_length等于请求行的“Content_Length”的值。

$content_type等同与请求头部的”Content_Type”的值

$document_root等同于当前请求的root指令指定的值

$document_uri与$uri一样

$host与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样

$limit_rate允许限制的连接速率

$request_method等同于request的method,通常是“GET”或“POST”

$remote_addr客户端ip

$remote_port客户端port

$remote_user等同于用户名,由ngx_http_auth_basic_module认证

$request_filename当前请求的文件的路径名,由root或alias和URI request组合而成

$request_body_file

$request_uri含有参数的完整的初始URI

$query_string与$args一样

$sheeme http模式(http,https)尽在要求是评估例如

Rewrite ^(.+)$ $sheme://example.com$; Redirect;

$server_protocol等同于request的协议,使用“HTTP/或“HTTP/

$server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。

$server_name请求到达的服务器名

$server_port请求到达的服务器的端口号

$uri等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index

docker环境下使用phpstorm进行xdebug调试代码。

docker部署后的lnmp架构图,以及xdebug的链路说明

docker xdebug lnmp

 

注意:
1. 需要php容器需要对外访问一个指定的xdebug接口(在php.ini的xdebug中配置好)

 

2. nginx的对应的配置里面,需要增加一个fastcgi_param  remote_addr

3. phpstrom的设置

 

 

开始调试前,需要把右上角的那个电话一样的按钮点击一下,变成截图的那样,然后在点臭虫按钮开始debug。。。。

 

安利下我已经部署好的docker环境(目前需要自己手动修改宿主ip,后续会优化成自动获取并替换):
https://github.com/mmfei/docker_php_nginx_mysql_redis_memcached

burp suite 使用 xssvalidate 进行自动化xss安全扫描

burp suite 使用 xssvalidate 进行自动化xss安全扫描

下载

https://portswigger.net/burp/releases/download?product=free&version=1.7.27&type=macosx

https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-macosx.zip

启动xss服务(这个必须有)

配置插件xssValidator

image_1bpb9uuess3713ehd5q1ang8d172.png-138.6kB

使用插件

代理功能(目的是抓取真实的http请求报文)

image_1bpb8n60024oueo1csr1c0vm5q2j.png-232kB

配置好浏览器代理地址后发起请求,burp会捕获到请求,点击forward

image_1bpb8q3271gmptv34cj1o151e9930.png-159.3kB

找到对应的请求历史记录,并发送到intruder

image_1bpb8tfd51mcudj71hh0dp41j83d.png-310.8kB

配置payloads为xssValidator

image_1bpb92n2c1ct91jue5iv1jvu1maa3q.png-213.3kB

配置options的grep – match

image_1bpb963drtho9qd4csgunet747.png-122.5kB

对应字符串的出处

image_1bpb8ikrd1coie1e1q87o73egk16.png-242.1kB

修改请求参数,并开始xss扫描

image_1bpb9apf3jm93ti1018ivf7fk51.png-178.9kB

查看单独的结果(有勾选的就是有xss漏洞的)

image_1bpb9epcjvhn1d6f1d0oqjs1mmj5e.png-217.8kB

把对话框出现的url地址copy到浏览器访问,并在显示的地址点击按钮

image_1bpb9ip6s1t7j47u1489ot1fdk5r.png-101.3kB
image_1bpb9lj5c3apc6ek1g18gchd56l.png-37.9kB

最后看到xss漏洞的现象

image_1bpb9k49e1551hcf9im40nfje68.png-133.3kB

win10 安装docker

install:
https://download.docker.com/win/stable/InstallDocker.msi

系统升级:
https://jingyan.baidu.com/article/0aa2237554a9db88cc0d64cf.html

bios开启硬件虚拟(intel的)

下载git:
http://download.csdn.net/detail/fanxiaobin577328725/9656336