① web服务器访问缓慢,作为运维人员,如何定位故障
遇到服务器故障,问题出现的原因很少可以一下就想到。我们基本上都会从以下步骤入手:
一、尽可能搞清楚问题的前因后果
不要一下子就扎到服务器前面,你需要先搞明白对这台服务器有多少已知的情况,还有故障的具体情况。不然你很可能就是在无的放矢。
必须搞清楚的问题有:
故障的表现是什么?无响应?报错?
故障是什么时候发现的?
故障是否可重现?
有没有出现的规律(比如每小时出现一次)
最后一次对整个平台进行更新的内容是什么(代码、服务器等)?
故障影响的特定用户群是什么样的(已登录的, 退出的, 某个地域的…)?
基础架构(物理的、逻辑的)的文档是否能找到?
是否有监控平台可用? (比如Munin、Zabbix、 Nagios、 New Relic…
什么都可以)
是否有日志可以查看?. (比如Loggly、Airbrake、 Graylog…)
最后两个是最方便的信息来源,不过别抱太大希望,基本上它们都不会有。只能再继续摸索了。
二、有谁在?
代码如下:
$ w
$ last
用这两个命令看看都有谁在线,有哪些用户访问过。这不是什么关键步骤,不过最好别在其他用户正干活的时候来调试系统。有道是一山不容二虎嘛。(ne cook in
the kitchen is enough.)
三、之前发生了什么?
$
history查看一下之前服务器上执行过的命令。看一下总是没错的,加上前面看的谁登录过的信息,应该有点用。另外作为admin要注意,不要利用自己的权限去侵犯别人的隐私哦。
到这里先提醒一下,等会你可能会需要更新 HISTTIMEFORMAT
环境变量来显示这些命令被执行的时间。对要不然光看到一堆不知道啥时候执行的命令,同样会令人抓狂的。
四、现在在运行的进程是啥?
代码如下:
$ pstree -a
$ ps aux
这都是查看现有进程的。 ps aux 的结果比较杂乱, pstree -a 的结果比较简单明了,可以看到正在运行的进程及相关用户。
五、监听的网络服务
代码如下:
$ netstat -ntlp
$ netstat -nulp
$
netstat -nxlp
我一般都分开运行这三个命令,不想一下子看到列出一大堆所有的服务。netstat -nalp倒也可以。不过我绝不会用 numeric 选项
(鄙人一点浅薄的看法:IP 地址看起来更方便)。
找到所有正在运行的服务,检查它们是否应该运行。查看各个监听端口。在netstat显示的服务列表中的PID 和 ps aux 进程列表中的是一样的。
如果服务器上有好几个Java或者Erlang什么的进程在同时运行,能够按PID分别找到每个进程就很重要了。
通常我们建议每台服务器上运行的服务少一点,必要时可以增加服务器。如果你看到一台服务器上有三四十个监听端口开着,那还是做个记录,回头有空的时候清理一下,重新组织一下服务器。
六、CPU 和内存
代码如下:
$ free -m
$ uptime
$ top
$
htop
注意以下问题:
还有空余的内存吗? 服务器是否正在内存和硬盘之间进行swap?
还有剩余的CPU吗? 服务器是几核的? 是否有某些CPU核负载过多了?
服务器最大的负载来自什么地方? 平均负载是多少?
七、硬件
代码如下:
$ lspci
$ dmidecode
$
ethtool
有很多服务器还是裸机状态,可以看一下:
找到RAID 卡 (是否带BBU备用电池?)、 CPU、空余的内存插槽。根据这些情况可以大致了解硬件问题的来源和性能改进的办法。
网卡是否设置好?
是否正运行在半双工状态? 速度是10MBps? 有没有 TX/RX 报错?
八、IO 性能
代码如下:
$ iostat -kx 2
$ vmstat 2 10
$ mpstat
2 10
$ dstat --top-io --top-bio
这些命令对于调试后端性能非常有用。
检查磁盘使用量:服务器硬盘是否已满?
是否开启了swap交换模式 (si/so)?
CPU被谁占用:系统进程? 用户进程? 虚拟机?
dstat 是我的最爱。用它可以看到谁在进行 IO: 是不是Mysql吃掉了所有的系统资源? 还是你的PHP进程?
九、挂载点 和 文件系统
代码如下:
$ mount
$ cat /etc/fstab
$ vgs
$
pvs
$ lvs
$ df -h
$ lsof +D / /* beware not to kill your box
*/
一共挂载了多少文件系统?
有没有某个服务专用的文件系统? (比如MySQL?)
文件系统的挂载选项是什么: noatime?
default? 有没有文件系统被重新挂载为只读模式了?
磁盘空间是否还有剩余?
是否有大文件被删除但没有清空?
如果磁盘空间有问题,你是否还有空间来扩展一个分区?
十、内核、中断和网络
代码如下:
$ sysctl -a | grep ...
$ cat
/proc/interrupts
$ cat /proc/net/ip_conntrack /* may take some time on busy
servers */
$ netstat
$ ss -s
你的中断请求是否是均衡地分配给CPU处理,还是会有某个CPU的核因为大量的网络中断请求或者RAID请求而过载了?
SWAP交换的设置是什么?对于工作站来说swappinness 设为 60 就很好,
不过对于服务器就太糟了:你最好永远不要让服务器做SWAP交换,不然对磁盘的读写会锁死SWAP进程。
conntrack_max 是否设的足够大,能应付你服务器的流量?
在不同状态下(TIME_WAIT, …)TCP连接时间的设置是怎样的?
如果要显示所有存在的连接,netstat 会比较慢, 你可以先用 ss 看一下总体情况。
你还可以看一下 Linux TCP tuning
了解网络性能调优的一些要点。
十一、系统日志和内核消息
代码如下:
$ dmesg
$ less /var/log/messages
$
less /var/log/secure
$ less /var/log/auth
查看错误和警告消息,比如看看是不是很多关于连接数过多导致?
看看是否有硬件错误或文件系统错误?
分析是否能将这些错误事件和前面发现的疑点进行时间上的比对。
十二、定时任务
代码如下:
$ ls /etc/cron* + cat
$ for user in
$(cat /etc/passwd | cut -f1 -d:); do crontab -l -u $user; done
是否有某个定时任务运行过于频繁?
是否有些用户提交了隐藏的定时任务?
在出现故障的时候,是否正好有某个备份任务在执行?
十三、应用系统日志
这里边可分析的东西就多了,
不过恐怕你作为运维人员是没功夫去仔细研究它的。关注那些明显的问题,比如在一个典型的LAMP(Linux+Apache+Mysql+Perl)应用环境里:
Apache & Nginx; 查找访问和错误日志, 直接找 5xx 错误, 再看看是否有 limit_zone 错误。
MySQL;
在mysql.log找错误消息,看看有没有结构损坏的表, 是否有innodb修复进程在运行,是否有disk/index/query 问题.
PHP-FPM; 如果设定了 php-slow 日志, 直接找错误信息 (php, mysql, memcache, …),如果没设定,赶紧设定。
Varnish; 在varnishlog 和 varnishstat 里, 检查 hit/miss比.
看看配置信息里是否遗漏了什么规则,使最终用户可以直接攻击你的后端?
HA-Proxy;
后端的状况如何?健康状况检查是否成功?是前端还是后端的队列大小达到最大值了?
结论
经过这5分钟之后,你应该对如下情况比较清楚了:
在服务器上运行的都是些啥?
这个故障看起来是和 IO/硬件/网络 或者 系统配置 (有问题的代码、系统内核调优, …)相关。
这个故障是否有你熟悉的一些特征?比如对数据库索引使用不当,或者太多的apache后台进程。
你甚至有可能找到真正的故障源头。就算还没有找到,搞清楚了上面这些情况之后,你现在也具备了深挖下去的条件。继续努力吧!
② 我开发 了一个WEB程序,现在需要连接身份证阅读器,读取出身份证跟我数据库里做比对,我不会连接,求帮助
利用$_post接受身份证填如的数据,然后读取数据库,两者做对照
③ web攻击有哪些怎么防护
1、DoS和DDoS攻击(DoS(Denial of Service),即拒绝服务,造成远程服务器拒绝服务的行为被称为DoS攻击。其目的是使计算机或网络无法提供正常的服务。最常见的DoS攻击有计算机网络带宽攻击和连通性攻击)
防范:(1) 反欺骗:对数据包的地址及端口的正确性进行验证,同时进行反向探测。(2) 协议栈行为模式分析:每个数据包类型需要符合RFC规定,这就好像每个数据包都要有完整规范的着装,只要不符合规范,就自动识别并将其过滤掉。(3) 特定应用防护:非法流量总是有一些特定特征的,这就好比即便你混进了顾客群中,但你的行为还是会暴露出你的动机,比如老重复问店员同一个问题,老做同样的动作,这样你仍然还是会被发现的。(4) 带宽控制:真实的访问数据过大时,可以限制其最大输出的流量,以减少下游网络系统的压力。
2、CSRF(Cross Site Request Forgery),即跨站请求伪造,是一种常见的Web攻击,但很多开发者对它很陌生。CSRF也是Web安全中最容易被忽略的一种攻击。
防范:(1) 验证码。应用程序和用户进行交互过程中,特别是账户交易这种核心步骤,强制用户输入验证码,才能完成最终请求。在通常情况下,验证码够很好地遏制CSRF攻击。但增加验证码降低了用户的体验,网站不能给所有的操作都加上验证码。所以只能将验证码作为一种辅助手段,在关键业务点设置验证码。(2) Referer Check。HTTP Referer是header的一部分,当浏览器向web服务器发送请求时,一般会带上Referer信息告诉服务器是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。可以通过检查请求的来源来防御CSRF攻击。正常请求的referer具有一定规律,如在提交表单的referer必定是在该页面发起的请求。所以通过检查http包头referer的值是不是这个页面,来判断是不是CSRF攻击。但在某些情况下如从https跳转到http,浏览器处于安全考虑,不会发送referer,服务器就无法进行check了。若与该网站同域的其他网站有XSS漏洞,那么攻击者可以在其他网站注入恶意脚本,受害者进入了此类同域的网址,也会遭受攻击。出于以上原因,无法完全依赖Referer Check作为防御CSRF的主要手段。但是可以通过Referer Check来监控CSRF攻击的发生。(3) Anti CSRF Token。目前比较完善的解决方案是加入Anti-CSRF-Token,即发送请求时在HTTP 请求中以参数的形式加入一个随机产生的token,并在服务器建立一个拦截器来验证这个token。服务器读取浏览器当前域cookie中这个token值,会进行校验该请求当中的token和cookie当中的token值是否都存在且相等,才认为这是合法的请求。否则认为这次请求是违法的,拒绝该次服务。这种方法相比Referer检查要安全很多,token可以在用户登陆后产生并放于session或cookie中,然后在每次请求时服务器把token从session或cookie中拿出,与本次请求中的token 进行比对。由于token的存在,攻击者无法再构造出一个完整的URL实施CSRF攻击。但在处理多个页面共存问题时,当某个页面消耗掉token后,其他页面的表单保存的还是被消耗掉的那个token,其他页面的表单提交时会出现token错误。
3、XSS(Cross Site Scripting),跨站脚本攻击。为和层叠样式表(Cascading Style Sheets,CSS)区分开,跨站脚本在安全领域叫做“XSS”。
防范:(1) 输入过滤。永远不要相信用户的输入,对用户输入的数据做一定的过滤。如输入的数据是否符合预期的格式,比如日期格式,Email格式,电话号码格式等等。这样可以初步对XSS漏洞进行防御。上面的措施只在web端做了限制,攻击者通抓包工具如Fiddler还是可以绕过前端输入的限制,修改请求注入攻击脚本。因此,后台服务器需要在接收到用户输入的数据后,对特殊危险字符进行过滤或者转义处理,然后再存储到数据库中。(2) 输出编码。服务器端输出到浏览器的数据,可以使用系统的安全函数来进行编码或转义来防范XSS攻击。在PHP中,有htmlentities()和htmlspecialchars()两个函数可以满足安全要求。相应的JavaScript的编码方式可以使用JavascriptEncode。(3) 安全编码。开发需尽量避免Web客户端文档重写、重定向或其他敏感操作,同时要避免使用客户端数据,这些操作需尽量在服务器端使用动态页面来实现。(4) HttpOnly Cookie。预防XSS攻击窃取用户cookie最有效的防御手段。Web应用程序在设置cookie时,将其属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie信息。(5)WAF(Web Application Firewall),Web应用防火墙,主要的功能是防范诸如网页木马、XSS以及CSRF等常见的Web漏洞攻击。由第三方公司开发,在企业环境中深受欢迎。
4、SQL注入(SQL Injection),应用程序在向后台数据库传递SQL(Structured Query Language,结构化查询语言)时,攻击者将SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
防范:(1) 防止系统敏感信息泄露。设置php.ini选项display_errors=off,防止php脚本出错之后,在web页面输出敏感信息错误,让攻击者有机可乘。(2) 数据转义。设置php.ini选项magic_quotes_gpc=on,它会将提交的变量中所有的’(单引号),”(双引号),\(反斜杠),空白字符等都在前面自动加上\。或者采用mysql_real_escape()函数或addslashes()函数进行输入参数的转义。(3) 增加黑名单或者白名单验证。白名单验证一般指,检查用户输入是否是符合预期的类型、长度、数值范围或者其他格式标准。黑名单验证是指,若在用户输入中,包含明显的恶意内容则拒绝该条用户请求。在使用白名单验证时,一般会配合黑名单验证。
5、上传漏洞在DVBBS6.0时代被黑客们利用的最为猖獗,利用上传漏洞可以直接得到WEBSHELL,危害等级超级高,现在的入侵中上传漏洞也是常见的漏洞。该漏洞允许用户上传任意文件可能会让攻击者注入危险内容或恶意代码,并在服务器上运行。
防范: (1)检查服务器是否判断了上传文件类型及后缀。 (2) 定义上传文件类型白名单,即只允许白名单里面类型的文件上传。 (3) 文件上传目录禁止执行脚本解析,避免攻击者进行二次攻击。 Info漏洞 Info漏洞就是CGI把输入的参数原样输出到页面,攻击者通过修改输入参数而达到欺骗用户的目的。
④ 宽带帐户不支持WEB认证怎么办 宽带
在小区宽带或者酒店、学校等环境下,宽带运营商通过WEB认证方式来认证上网用户。也就是电脑连接网络后,打开网页会弹出认证界面,输入用户名密码才能上网。下图为某小区的WEB认证页面:
⑤ JavaWeb 对于数据从前台页面流转到后台,并于mysql数据库中数据比对的整个流程的理解.
oracle的sql脚本可以改成MySQL很简单,自己学习一下 对自己有提高。
⑥ web服务器被攻击,从哪些日志,或者现象可以看出来
如果服务器(网站)被入侵了,一般都是服务器或者网站存在漏洞,被黑客利用并提权入侵的,导致服务器中木马,网站被挂黑链,被篡改,被挂马。解决办法:如果程序不是很大,可以自己比对以前程序的备份文件,然后就是修复,或者换个服务器,最好是独立服务器。也可以通过安全公司来解决,国内也就Sinesafe和绿盟等安全公司 比较专业.
⑦ 防止web页面表单重复提交的方法有哪些
最常用的方法就是利用token。即:
1、在生成页面的时候生成一个token(随机字符串),并把它同时写入表单的某个hidden中,和服务端的session中。
2、客户端提交表单到服务器时,比对表单中的token与session中的token是否一致。若不一致则认为是无效的请求。
3、不管第2步的校验是否通过,token只要使用一次后就立即作废(即:从session中销毁)。同时token也可以关联时间信息,超时后也自动作废。
这样,即便客户端重复提交,也只有第一次的请求能够成功。
⑧ 宽带帐户不支持WEB认证怎么办
故障现象:Web认证环境下,用户在Portal登录页输入正确的用户名和密码,认证不成功,提示认证异常的错误信息。
故障可能原因
1、接入设备的WEB认证配置错误
2、接入设备配置、ePortal和SAM配置信息不一致
3、ePortal服务器启动了系统自带SNMP组件
4、接入设备未做降噪配置
故障处理流程
4、故障处理步骤
步骤1排查接入设备的Web认证配置是否正确
1. 通过Console口登录到接入设备,执行”show run“命令,查看当前设备的配置信息。
2. 若Web认证接入设备为有线交换机,请比对以下典型配置,检查设备的web认证配置是否正确。
² 典型的有线交换机web认证模板(以S26系列设备为例)如下:
Ruijie# configure terminal
/* 配置通信密钥,对ePortal服务器返回的链接加密,实例中通讯密钥是“ruijie” */
Ruijie(config)# web-auth portal key ruijie
/* 未认证用户访问直通地址,用于学习网关arp,通常设置网关(如192.168.33.1)为直通地址 */
Ruijie(config)# http redirect direct-site 192.168.33.1 arp
/* 设置重定向页面的主页,实例中“http://192.168.51.180/eportal/index.jsp”为ePortal重定向地址,其中IP地址可替换ePortal服务IP地址 */
Ruijie(config)# http redirect homepage http://192.168.51.180/eportal/index.jsp
/* 设置直通地址,即ePortal服务器地址,如“192.168.51.180” */
Ruijie(config)# http redirect 192.168.51.180
Ruijie(config)# interface FastEthernet 0/1
/* 端口必须开启web认证受控,否则该端口下接设备web认证不生效 */
Ruijie(config-if-FastEthernet 0/1)# web-auth port-control
/* 启用snmp community配置,其中团体名为public,可根据实际情况修改 */
Ruijie(config)# snmp-server community public rw
/* 配置web认证下线使用的snmp报文参数 ,其中主机地址为eportal服务器IP(192.168.51.180),团体名为public,均可根据实际情况修改*/
Ruijie(config)# snmp-server host 192.168.51.180 informs version 2c public web-auth
Ruijie(config)# snmp-server enable traps web-auth
注意: 本例中snmp-server community 是重要配置,Web认证信息验证通过后,会通知设备打开上网通道,若community key没有配置会配置不正确,都会导致打开上网通道失败,web认证不成功。
3. 若Web认证接入设备为无线交换机,存在两种Web认证配置方法,分别称为一代Portal认证和二代Portal认证,请比对以下典型配置,检查设备的web认证配置是否正确。
²典型的无线一代portal认证模板(以WS57系列设备为例)如下:
Ruijie# configure terminal
/* 配置通信密钥,对ePortal服务器返回的链接加密,实例中通讯密钥是“ruijie” */
Ruijie(config)# web-auth portal key ruijie
/* 设置直通地址,即ePortal服务器地址,如“172.20.1.100” */
Ruijie(config)# http redirect 172.20.1.100
/* 设置重定向页面的主页,实例中“http://172.20.1.100/eportal /index.jsp”为ePortal重定向地址,其中IP地址可替换ePortal服务IP地址 */
Ruijie(config)# http redirect homepage http://172.20.1.100/eportal/index.jsp
/* 启用snmp community配置,其中团体名为web-auth,可根据实际情况修改 */
Ruijie(config)# snmp-server community web-auth rw
Ruijie(config)# snmp-server enable traps web-auth
/* 配置web认证下线使用的snmp报文参数 ,其中主机地址为eportal服务器IP(172.20.1.100),团体名为web-auth,均可根据实际情况修改*/
Ruijie(config)# snmp-server host 172.20.1.100 inform version 2c web-auth web-auth
Ruijie(config)# wlansec 100
/* 必须启用基于WLAN的web认证受控,否则web认证不生效 */
Ruijie(wlansec)# webauth
Ruijie(wlansec)# exit
注意: 本例AC采用一代Portal配置,认证原理与有线交换机基本一致。同样的,snmp-server community是重要配置,Web认证信息验证通过后,会通知设备打开上网通道,若communitykey没有配置会配置不正确,都会导致打开上网通道失败,web认证不成功。
²典型的无线二代portal认证模板(以WS57系列设备为例)如下:
Ruijie# configure terminal
/* 创建全局Portal服务器,服务器名为default、IP地址172.20.1.10(可修改ePortal服务IP)、认证主页http://172.20.1.10/eportal/index.jsp(URL内的IP地址可修改为ePortal服务IP) */
Ruijie(config)# portal-server default ip 172.20.1.10 url http://172.20.1.10/eportal/index.jsp
/* 配置default服务器为全局使用的Portal服务器 */
Ruijie(config)# web-auth portal-type v2 default
/* 启用AAA认证记账功能 */
Ruijie(config)# aaa new-model
/* 配置Radius-server主机地址和通讯口令,host是SAM服务器IP地址,如172.20.1.20(可修改);key为通讯口令,如ruijie(可修改) */
Ruijie(config)# radius-server host 172.20.1.20 key ruijie
/* 配置AAA的Web认证方法列表,使用默认的RADIUS组 */
Ruijie(config)# aaa authentication web-auth default group radius
/* 配置AAA的记账方法列表,使用默认的RADIUS组 */
Ruijie(config)# aaa accounting network default start-stop group radius
/* 开启radius动态扩展授权,支持强制用户下线(DM)等功能 */
Ruijie(config)# radius dynamic-authorization-extension enable
Ruijie(config)# wlansec 100
/* 启用二代portal认证 */
Ruijie(wlansec)# web-auth portal-type v2 default
/* 基于WLAN开启Web认证功能 */
Ruijie(wlansec)# webauth
Ruijie(wlansec)# exit
注意: 本例AC采用二代Portal认证配置,与一代不同的是,AC还承担Radius认证客户端的角色,因此AAA配置是必须要有的,若是缺少AAA配置,web认证就无法正常进行。
检查设备Web认证配置,排除配置错误导致认证失败的问题,若依然认证不成功,则进入下一步骤的排查。
步骤2排查接入设备与ePortal和SAM配置信息是否一致
1. 在认证PC机的浏览器地址栏内输入访问网站的URL地址,如“http://www..com”,提交请求,页面跳转到认证登录页面,(以ePortal1.41认证页面为例,其他版本认证页面大体也是这样的。)
2. 在认证登录页面,输入用户名密码,点击“登录”按钮,页面顶部出现“认证失败!"的提示。
3. 首先登录ePortal系统,查看日志管理下的日志信息。
4. 若页面认证失败且ePortal日志出现类似“用户(xxx)认证失败,原因:设备community配置错误导致设备不通,打开设备(xxx.xxx.xxx.xxx)上网通道失败”的提示,说明接入设备的community key不正确
5. 若页面认证失败且ePortal日志出现类似“用户(xxx)认证失败,Radius服务器没有响应”的提示,说明Web认证过程中,在进行Radius 认证的环节出现了问题。
按以下步骤检查ePortal和SAM配置的Radius Key值是否一致。
1) 若接入设备是有线交换机或一代Portal认证的AC设备,ePortal作为认证客户端发起Radius认证,需要检查ePortal系统配置和SAM系统的设备配置。
首先,查看ePortal系统配置的Radius Key,
其次,查看SAM登记的RG-ePortal的设备Key,
检查ePortal系统配置的Radius Key和SAM登记的RG-ePortal的设备Key的值,若两者的值不一致,则需要修改成相同的值。
2) 若接入设备是一代Portal认证的AC设备,AC设备作为认证客户端发起Radius认证,因此需要检查AC设备和SAM系统的设备配置。
首先,查看AC设备的配置信息,通过Console口登录设备,进入特权模式,执行“show run”命令,找到radius-server信息,查看key值
其次,查看SAM登记的AC设备的Key
检查AC设备的Radius Key和SAM系统登记的AC设备Key的值,若两者的值不一致,则需要修改成相同的值。
5. 检查接入设备配置、ePortal和SAM的相关配置,排除配置错误导致认证失败的问题,若依然认证不成功,则进入下一步骤的排查。
步骤3排查ePortal服务器是否启用系统自带SNMP组件
1. 在认证PC机的浏览器地址栏内输入访问网站的URL地址,如“http://www..com”,提交请求,页面跳转到认证登录页面(以ePortal1.41认证页面为例,其他版本认证页面大体也是这样的。)
2. 在认证登录页面,输入用户名密码,点击“登录”按钮,页面顶部出现“认证失败!"的提示
需要注意的是,虽然页面提示“认证失败”,但实际上已经可以正常连通网络,说明上网通道已经被打开了。
3. 登录ePortal系统,查看日志管理下的日志信息,发现“用户(xxx)上线失败,由于出现异常情况”的提示
4. 登录SAM系统,查看在线用户表,发现该用户已在线
5. 查看当前ePortal服务器的系统服务是否异常,通过“开始”-- “运行”,执行“services.msc“命令
打开服务列表窗口,查找是否存在“SNMP Service”的服务,且已经被启动
若系统的SNMP Service服务被启动,则与ePortal的SNMP服务冲突了,导致SNMP功能失效。
6. 依照以下步骤关闭系统SNMP服务
1) 双击“SNMP Service”
2) 启动类型修改为“手动”
3) 手动停止SNMP Service
4) 点击“确定”,使当前配置生效
7. 关闭系统SNMP服务后,重启ePortal服务。
排除SNMP服务冲突的问题后,若依然认证不成功,则进入下一步骤的排查。
步骤4排查接入设备是否支持降噪配置
在网络环境没有变化的情况下,若认证业务高峰期出现Web认证失败问题,而在平时都可以正常认证,需要检查web认证的接入设备是否支持降噪。
降噪是指接入设备屏蔽非浏览器发起的http请求,需要接入设备更新到特定软件版本才能支持。按照以下步骤确认接入设备是否支持降噪配置:
1. 首先查看接入设备的软件版本信息,通过Console口登录接入设备,查看设备软件版本信息;
2. 若接入设备为交换机设备,进入特权模式,输入“show version”
查看software version信息,若软件版本低于RGOS 10.3版本,则交换机版本不支持web认证降噪,需要升级到最新版本,请联系4008111000索取最新版本信息。
3. 若接入设备为AC设备,进入特权模式,输入“show version”,
查看software version信息,若软件版本低于RGOS 10.4(1T17)版本,则AC交换机版本不支持web认证降噪,需要升级到最新版本,联系4008111000协助处理。
4. 若接入设备为ACE设备,首先识别ACE硬件版本,若是ACEv5.0设备直接输入“show version”,
查看version信息,若软件版本低于3.4.0版本,则AC交换机版本不支持web认证降噪,需要升级到最新版本。ACEv3.0不支持降噪功能,请先升级到ACEv5.0版本。具体ACE升级版本和操作步骤,请联系4008111000协助处理。
检查接入设备版本符合降噪配置的要求,若依然认证不成功,则进入下一步骤的排查。
步骤5收集信息并联系4008111000协助处理
拨打4008111000寻求技术支持,收集如下故障信息,进行故障进一步处理。
1. ePortal和SAM的软件版本号
登录ePortal系统,点击“关于系统”图标,弹出版本信息。
登录SAM系统,点击右下角“关于”图标,弹出版本信息。
2. 接入设备的配置信息
若接入设备为交换机或AC无线设备,登录设备进入特权模式,执行“show run”命令,将输出结果保存成文件。
若接入设备为ACE设备,请将“认证服务器配置”的配置内容截图。
3. ePortal服务器填写的接入设备信息
进入“设备管理”菜单,选择查看设备,弹出设备详细信息。
4. SAM服务器填写的接入设备信息
进入“设备管理”菜单,选择查看设备,弹出设备详细信息。
5. 提供PC端、ePortal服务端、SAM服务端的报文
1) 分别在PC端、ePortal服务端和SAM服务端,打开wireshark工具,并监控网卡,准备开始抓包;
2) 在PC上执行一次完整的web认证操作,输入用户名密码,直至出现认证失败提示;
3) 完成web认证操作后,停止wireshark抓包,将抓取的报文保存成pcap文件;
4) 提交pcap报文时,请附带说明报文文件的来源(PC端、ePortal端、SAM端)以及来源的IP地址。
⑨ web前端diff 算法深入一下
有同学问:能否详细说一下 diff 算法。
详细的说,请阅读这篇文章,有疑问的地方欢迎留言一起讨论。
因为 diff 算法是 vue2.x , vue3.x 以及 react 中关键核心点,理解 diff 算法,更有助于理解各个框架本质。
说到“diff 算法”,不得不说“虚拟 Dom”,因为这两个息息相关。
比如:
等等
我们先来说说虚拟 Dom,就是通过 JS 模拟实现 DOM ,接下来难点就是如何判断旧对象和新对象之间的差异。
Dom 是多叉树结构,如果需要完整的对比两棵树的差异,那么算法的时间复杂度 O(n ^ 3),这个复杂度很难让人接收,尤其在 n 很大的情况下,于是 React 团队优化了算法,实现了 O(n) 的复杂度来对比差异。
实现 O(n) 复杂度的关键就是只对比同层的节点,而不是跨层对比,这也是考虑到在实际业务中很少会去跨层的移动 DOM 元素。
虚拟 DOM 差异算法的步骤分为 2 步:
实际 diff 算法比较中,节点比较主要有 5 种规则的比较
部分源码 https://github.com/vuejs/vue/blob//src/core/vdom/patch.js#L501 如下:
在 reconcileChildren 函数的入参中
diff 的两个主体是:oldFiber(current.child)和 newChildren(nextChildren,新的 ReactElement),它们是两个不一样的数据结构。
部分源码
很多时候手工优化 dom 确实会比 virtual dom 效率高,对于比较简单的 dom 结构用手工优化没有问题,但当页面结构很庞大,结构很复杂时,手工优化会花去大量时间,而且可维护性也不高,不能保证每个人都有手工优化的能力。至此,virtual dom 的解决方案应运而生。
virtual dom 是“解决过多的操作 dom 影响性能”的一种解决方案。
virtual dom 很多时候都不是最优的操作,但它具有普适性,在效率、可维护性之间达到平衡。
virutal dom 的意义:
vue2.x 的 diff 位于 patch.js 文件中,该算法来源于 snabbdom,复杂度为 O(n)。了解 diff 过程可以让我们更高效的使用框架。react 的 diff 其实和 vue 的 diff 大同小异。
最大特点:比较只会在同层级进行, 不会跨层级比较。
对比之前和之后:可能期望将 直接移动到
的后边,这是最优的操作。
但是实际的 diff 操作是:
vue 中也使用 diff 算法,有必要了解一下 Vue 是如何工作的。通过这个问题,我们可以很好的掌握,diff 算法在整个编译过程中,哪个环节,做了哪些操作,然后使用 diff 算法后输出什么?
解释:
mount 函数主要是获取 template,然后进入 compileToFunctions 函数。
compileToFunction 函数主要是将 template 编译成 render 函数。首先读取缓存,没有缓存就调用 compile 方法拿到 render 函数的字符串形式,在通过 new Function 的方式生成 render 函数。
compile 函数将 template 编译成 render 函数的字符串形式。后面我们主要讲解 render
完成 render 方法生成后,会进入到 mount 进行 DOM 更新。该方法核心逻辑如下:
上面提到的 compile 就是将 template 编译成 render 函数的字符串形式。核心代码如下:
compile 这个函数主要有三个步骤组成:
分别输出一个包含
parse 函数:主要功能是 将 template 字符串解析成 AST(抽象语法树) 。前面定义的 ASTElement 的数据结构,parse 函数就是将 template 里的结构(指令,属性,标签) 转换为 AST 形式存进 ASTElement 中,最后解析生成 AST。
optimize 函数(src/compiler/optomizer.js):主要功能是 标记静态节点 。后面 patch 过程中对比新旧 VNode 树形结构做优化。被标记为 static 的节点在后面的 diff 算法中会被直接忽略,不做详细比较。
generate 函数(src/compiler/codegen/index.js):主要功能 根据 AST 结构拼接生成 render 函数的字符串 。
其中 genElement 函数(src/compiler/codgen/index.js)是根据 AST 的属性调用不同的方法生成字符串返回。
总之:
就是 compile 函数中三个核心步骤介绍,
patch 函数 就是新旧 VNode 对比的 diff 函数,主要是为了优化 dom,通过算法使操作 dom 的行为降低到最低, diff 算法来源于 snabbdom,是 VDOM 思想的核心。snabbdom 的算法是为了 DOM 操作跨级增删节点较少的这一目标进行优化, 它只会在同层级进行,不会跨层级比较。
总的来说:
在创建 VNode 就确定类型,以及在 mount/patch 的过程中采用位运算来判断一个 VNode 的类型,在这个优化的基础上再配合 Diff 算法,性能得到提升。
可以看一下 vue3.x 的源码:https://github.com/vuejs/vue/blob//src/core/vdom/patch.js
对 oldFiber 和新的 ReactElement 节点的比对,将会生成新的 fiber 节点,同时标记上 effectTag,这些 fiber 会被连到 workInProgress 树中,作为新的 WIP 节点。树的结构因此被一点点地确定,而新的 workInProgress 节点也基本定型。在 diff 过后,workInProgress 节点的 beginWork 节点就完成了,接下来会进入 completeWork 阶段。
snabbdom 算法:https://github.com/snabbdom/snabbdom
定位:一个专注于简单性、模块化、强大功能和性能的虚拟 DOM 库。
snabbdom 中定义 Vnode 的类型(https://github.com/snabbdom/snabbdom/blob//src/vnode.ts#L12)
init 函数的地址:
https://github.com/snabbdom/snabbdom/blob//src/init.ts#L63
init() 函数接收一个模块数组 moles 和可选的 domApi 对象作为参数,返回一个函数,即 patch() 函数。
domApi 对象的接口包含了很多 DOM 操作的方法。
源码:
https://github.com/snabbdom/snabbdom/blob//src/init.ts#L367
源码:
https://github.com/snabbdom/snabbdom/blob//src/h.ts#L33
h() 函数接收多种参数,其中必须有一个 sel 参数,作用是将节点内容挂载到该容器中,并返回一个新 VNode。
在 vue2.x 不是完全 snabbdom 算法,而是基于 vue 的场景进行了一些修改和优化,主要体现在判断 key 和 diff 部分。
1、在 snabbdom 中 通过 key 和 sel 就判断是否为同一节点,那么在 vue 中,增加了一些判断 在满足 key 相等的同时会判断,tag 名称是否一致,是否为注释节点,是否为异步节点,或者为 input 时候类型是否相同等。
https://github.com/vuejs/vue/blob//src/core/vdom/patch.js#L35
2、diff 差异,patchVnode 是对比模版变化的函数,可能会用到 diff 也可能直接更新。
https://github.com/vuejs/vue/blob//src/core/vdom/patch.js#L404