1.用telnet查询学生的信息
是TCP/IP协议族中的一员,属于应用层协议,是Internet远程登录服务器的标准协议和主要方式。在与远程服务器连接的过程本质还是TCP的连接。用telnet可以模拟http的Post和Get请求。
- 安装telnet(不同操作系统安装方式不一样)
- 建立连接:telnet 192.168.2.235 8080
- 书写http请求头两次回车‘\r\n’,注意中文在http请求头中是经过URL编码后进行发送的,这个在chrome 浏览器中f12后中的network可以看到(如下为telnet请求命令,标红的位置就是“张三”经过url编码后的结果)
使用Wireshark进行抓包分析
telnet登录远程计算机B连接的过程其实就是TCP 三次握手的过程
然后发送http报文首部,服务器处理请求以后返回结果
最后关闭TCP连接,四次挥手
2.nginx+tomcat 集群环境下tomcat 层获取真实用户信息
学习nginx,可以通过官方文档:https://nginx.org/en/docs/
配置.conf location 添加如下属性
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
配置tomcat的server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="tomcat_access_log." suffix=".txt" pattern="%a %r %t %{X-Real_IP}i %{X-Real-PORT}i" resolveHosts="false"/>
启动nginx和tomcat,A请求B,通过tomcat日志查看真实ip及端口
3.假设AB两台机器的配置不一样,A机器配置更高,希望AB两台机器流量 7:3分配
nginx中设置反向代理的时候,能够指定反向代理中每一个后端服务器所占的比重, 起到负载均衡的作用。nginx 是通过加权轮询算法来实现请求按照比例让每台机器接收的频次更为平均,不会出现例如三台机器a,b,c,按照权重5:3:1分流,结果为[a,a,a,a,a,b,b,b,c]
加权轮询算法参考:https://blog.youkuaiyun.com/harleylau/article/details/80150375 轮询代码如下
/* 根据后端服务器的权重来选择一台后端服务器处理请求 */
static ngx_http_upstream_rr_peer_t *
ngx_http_upstream_get_peer(ngx_http_upstream_rr_peer_data_t *rrp)
{
....
best = NULL;
total = 0;
/* 遍历后端服务器列表 */
for (i = 0; i < rrp->peers->number; i++) {
........
/* 若当前后端服务器可能被选中,则计算其权重 */
/*
* 在上面初始化过程中 current_weight = 0,effective_weight = weight;
* 此时,设置当前后端服务器的权重 current_weight 的值为原始值加上 effective_weight;
* 设置总的权重为原始值加上 effective_weight;
*/
peer->current_weight += peer->effective_weight;
total += peer->effective_weight;
/* 服务器正常,调整 effective_weight 的值 */
if (peer->effective_weight < peer->weight) {
peer->effective_weight++;
}
/* 若当前后端服务器的权重 current_weight 大于目前 best 服务器的权重,则当前后端服务器被选中 */
if (best == NULL || peer->current_weight > best->current_weight) {
best = peer;
}
}
if (best == NULL) {
return NULL;
}
........
/* 更新被选中后端服务器的权重 */
best->current_weight -= total;
if (now - best->checked > best->fail_timeout) {
best->checked = now;
}
/* 返回被选中的后端服务器 */
return best;
}
本次实验配置内容如下:
upstream www.kk.com{
server 127.0.0.1:8080 weight=7;
server 192.168.2.235:8080 weight=3;
}
4.其中一台tomcat宕机,让外界感知很小或无感知
nginx自带健康检查机制,ngx_http_proxy_module 模块和ngx_http_upstream_module模块
proxy 模块配置以下参数,并宕掉tomcatA,测试实际效果
proxy_connect_timeout 1; #单位为秒
proxy_send_timeout 1;
proxy_read_timeout 1;
proxy_connect_timeout:nginx与upstream server的连接超时时间
proxy_send_timeout:发送数据至客户端超时, 默认60s, 如果连续的60s内客户端没有收到1个字节, 连接关闭
proxy_read_timeout:nginx接收upstream server数据超时, 默认60s, 如果连续的60s内没有收到1个字节, 连接关闭
思考:关于时间的大小设置,个人觉得时间的设置不具备普适性,如果时间设置过小有可能导致由于网络I/O的延迟(网络性能很烂的情况请求就在1s以上)而误判节点假死,进而出现A,B两台机器进入到死循环的情况,所以时间参数的设置应该结合具体的实际情况多维度去考虑,包括访问的是静态或动态资源?nginx所存在的硬件性能等,毕竟软处理只能优化一部分性能。
未配置前:
配置后:
upstream 模块可设置max_fails,fail_timeout,使用自带模块会出现一个问题,就是后端挂掉的节点,它依然会先请求在作判断,更为专业的可参靠某宝的tengine http://tengine.taobao.org/,它的健康机制规避了请求会转发到非健康节点上。