对于/index.php/abc这种url,Apache和Lighttpd会按”index.php?abc”来解释,而nginx会认为是请求名
字是“index.php”的目录下的abc文件的内容。所以CI在nginx下不配置rewrite是无法运行的,而在Apache
和Lighttpd则正常。
Nginx里rewrite ^/(.*)$ /index.php?$1 last;来rewrite请求时,对于:/abc.abc这类请求,会
rewrite成“index.php/abc_abc”,即会把“点”变成“下划线”,不清楚是为什么。
Nginx配置文件里的rewrite规则不是只执行一次就完事的,是“执行一遍,假如没有碰到break,就按
rewrite后的新路径再执行一遍,直到不再变化或者遇到break或者执行满10次报500错误退出”,所以单纯
的用小知识二里的重写规则是不行的,需要在后面加上一句break,这样重写一遍后就不再执行了。
location /firefoxbug/
{
index index.php;
if (!-e $request_filename) {
rewrite ^/(.*)$ /firefoxbug/index.php?$1 last;
break;
}
}
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 为"GET"前两个字母"GE"
0x4854 为"HTTP"前两个字母"HT"
说明: 通常情况下:一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手
里面的几个概念:
- SYN: (同步序列编号,Synchronize Sequence Numbers)
- ACK: (确认编号,Acknowledgement Number)
- FIN: (结束标志,FINish)
- 客户端尝试链接服务端,通过open方法。也就是TCP三次握手中的第1步之后,注意是客户端状态
- sysctl -w net.ipv4.tcp_syn_retries = 2 ,做为客户端可以设置SYN包的重试次数,默认5次(大约180s)引用校长的话:仅仅重试2次,现代网络够了
- 服务接受创建请求的SYN后,也就是TCP三次握手中的第2步,发送ACK数据包之前
- 注意是服务端状态,一般15个左右正常,如果很大,怀疑遭受SYN_FLOOD攻击
- sysctl -w net.ipv4.tcp_max_syn_backlog=4096 , 设置该状态的等待队列数,默认1024,调大后可适当防止syn-flood,可参见man 7 tcp
- sysctl -w net.ipv4.tcp_syncookies=1 , 打开syncookie,在syn backlog队列不足的时候,提供一种机制临时将syn链接换出
- sysctl -w net.ipv4.tcp_synack_retries = 2 ,做为服务端返回ACK包的重试次数,默认5次(大约180s)引用校长的话:仅仅重试2次,现代网络够了
- 客户端接受到服务端的ACK包后的状态,服务端在发出ACK在一定时间后即为ESTABLISHED
- sysctl -w net.ipv4.tcp_keepalive_time = 1200 ,默认为7200秒(2小时),系统针对空闲链接会进行心跳检查,如果超过net.ipv4.tcp_keepalive_probes * net.ipv4.tcp_keepalive_intvl = 默认11分,终止对应的tcp链接,可适当调整心跳检查频率
- 目前线上的监控 waring:600 , critial : 800
- 主动关闭的一方,在发出FIN请求之后,也就是在TCP四次握手的第1步
- 被动关闭的一方,在接受到客户端的FIN后,也就是在TCP四次握手的第2步
- 主动关闭的一方,在接受到被动关闭一方的ACK后,也就是TCP四次握手的第2步
- sysctl -w net.ipv4.tcp_fin_timeout=30, 可以设定被动关闭方返回FIN后的超时时间,有效回收链接,避免syn-flood.
- 被动关闭的一方,在发送ACK后一段时间后(确保客户端已收到),再发起一个FIN请求。也就是TCP四次握手的第3步
- 主动关闭的一方,在收到被动关闭的FIN包后,发送ACK。也就是TCP四次握手的第4步
- sysctl -w net.ipv4.tcp_tw_recycle = 1 , 打开快速回收TIME_WAIT,Enabling this option is not recommended since this causes problems when working with NAT (Network Address Translation)
Windows socket IO完成端口开发驾照理论考试系统实例
这一节我们讲解如何利用套接字完成端口开发驾照理论考试系统。
该系统由服务器和客户端两部分组成。
服务器负责对题库和学生信息的管理,主要包括以下功能:
1:试卷管理:从题库读取试卷和向客户端发送试卷。
2:客户端管理(CClientManager类)。从数据库读取学生信息,验证学生信息。
3:监视考生考试状态。
4:评分。保存学生考试状态和成绩。
客户端负责生成试卷,主要包括以下功能:
1:登录服务器。
2:生成试卷。
3:考试计时。考试时间结束考生停止答题。
主要步骤如下:
客户端成功连接服务器后,向服务器发送学号。服务器在收到学号后,会验证该学号是否存在于数据库中。如果存在且未登录过,则向客户端发送该学生姓名和试卷。否则,项客户端发送查无此人信息。
客户端在收到试卷后,向考生显示准备完成,是否开始答题。考生点击开始答题后,客户端向服务器发送开始答卷消息。考生开始答卷,客户端进行计时。考试结束后,客户端向服务器发送答题结果。服务器在收到答题结果后,对该考生的试卷进行评分,并将结果保存在数据库。
数据包设计:
为了保证客户端与服务器之间数据的正确发送与接收,在发送数据时,先发送包头后发送包体。包头指明包体的类型和长度。包头定义如下:
typedef struct _header { u_short type;//包类型。 u_short len;//包体长度。 }HEADER;
客户端发送的数据包类型包括考生状态和心跳包两种。在考试期间为了监控考生状态,客户端定期向服务器发送心跳包,服务器根据此心跳包判断客户端状态。如果由于意外导致连接断开,服务器在一段时间内没有收到心跳包则断定客户端断线。
客户端在发送包头后,发送考生状态,它包括以下几种:
登录:此时考生状态为考生学号。LOGIN
答卷:此时考生状态没有数据。DOING
交卷:此时考生状态为答题结果。DONE
断线:在服务器一段时间没有收到心跳包后,设置客户端为断线状态。DISCONN