展*展*的笔试题
1 你对现在运维工程师的理解以及对其工作的认识?
2 对于一个web服务器来说,应该调整哪些Linux内核参数,并说明它们的含义?
3 写一个脚本(shell,python),实现nginx日志按天分割,并将前一天的日志进行压缩,总共保留10天的备份
4 如何将本地80端口请求转发到8080端口,当前主机IP为10.0.2.2?
5 列出你常用的nginx模块,用来做什么?
6 现在在hadoop集群中的配置文件如下,请问假如集群当中有一个节点宕机,主节点namenode需要多长时间才能感知到?
<property>
<name>df.heartbeat.interval</name>
<value>3</value>
</property>
<property>
<name>heartbeat.recheck.interval</name>
<value>3000</value>
</property>
8试举例说明一个在之前工作中碰到的线上故障的经历和如何排查解决的过程?
answer:
第二题:
net.ipv4.tcp_syncookies = 1
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30
#表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_tw_buckets = 5000
#表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,
#TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。
第三题:
#!/bin/bashnginxpid=`/usr/bin/ps aux|grep nginx|grep nginx|awk '/master/{print$2}'` #找出nginx服务的master进程并取出它的pid
accesslog=`/usr/sbin/lsof -p $nginxpid|awk '/access.log/{print $9}'` #找出pid文件的路径
log_path=`/usr/bin/dirname $accesslog` #取出它的目录
YESTERDAY=$(date -d "yesterday" +%Y%m%d) #找出昨天的日期例如:20190422
new_path=/usr/bin/new
if [ ! -d $new_path ];then
mkdir $new_path
fi
#在每天的0点切割日志
mv ${log_path}/access.log ${new_path}/access_${YESTERDAY}.log #将前一天的日志移到新目录下面
kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'` #发送USR1信号,重新打开日志文件,否则会往mv后的文件写日志
#原因在于:linux系统中,内核是根据文件描述符来找文件的。如果不这样操作导致日志切割失败。
tar -zcf ${new_path}/access_${YESTERDAY}.tar.gz ${new_path}/access_${YESTERDAY}.log #将这个日志压缩
if [ $? != 0 ];then echo "命令执行错误";exit 1;fi #压缩出问题则退出
rm -f ${new_path}/access_${YESTERDAY}.log #没问题则删除原文件
#总共保留10天的压缩文件,那么就要删除11天前的文件,因为当前时间点还没有压缩文件
find ${new_path} -type f -mtime +11 -exec rm -f {} ;
使用python,注意:commands模块在python2中使用,python3改为subprocess模块了
#!/usr/bin/python
import time
import os
import commands
path = ['/var/log/nginx/', 'access.log']
(num,nginxpid_str) = commands.getstatusoutput("/usr/bin/ps aux|grep nginx|grep nginx|awk '/master/{print$2}'")
nginxpid=int(nginxpid_str.split("
")[0]) #这里在命令行执行的时候,直接可以int,但是在脚本里面却多出了
加后面的东西,采用split取出
yesterday = commands.getoutput('date -d "yesterday" +%Y%m%d')
new_path='/var/log/new/'
target="%saccess_%s.log" % (new_path,yesterday)
command_main = "cd %s && /bin/mv %s %s && /bin/kill -USR1 %d " % (path[0],path[1],new_path,nginxpid)
command_tar = "cd %s && /bin/tar czvf %s.tar.gz %s" % (path[0],target,path[1])
(status,outtt)=commands.getstatusoutput(command_main)
print(status,outtt)
if status == 0:
print("successs")
(tar_status,tar_out)=commands.getstatusoutput(command_tar)
if tar_status == 0:
print("tar---ok")
else:
print("failure")
第四题:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT 8080
第五题:
ngx_http_access_module模块 :访问控制的模块
ngx_http_auth_basic_module模块 :使用basic机制进行用户验证
ngx_http_stub_status_module模块 :用来查看http的状态信息
ngx_http_log_module模块 :nginx的日志模块
ngx_http_gzip_module模块 :对传输的数据进行压缩
ngx_http_ssl_module模块 :设置https连接的模块
ngx_http_rewrite_module模块 :对用户的uri请求进行匹配,然后替换成指定的uri
ngx_http_referer_module模块 :做防盗链的模块,
valid_referers none | blocked | server_names | string …;
定义referer首部的合法可用值;
none:请求报文首部没有referer首部;
blocked:请求报文的referer首部没有值;
server_names:参数,其可以有值作为主机名或主机名模式;
arbitrary_string:直接字符串,但可使用*作通配符;
regular expression:被指定的正则表达式模式匹配到的字符串;要使用~打头,例如 ~.*.ice.com;
配置示例:
valid_referers none block server_names *.ice.com ; #3设置有效的referers
if($invalid_referer) {
return 403; ##如果referer是不再我们定义的valid_referers列表中,则返回一个403拒绝访问
}
ngx_http_headers_module模块:向代理服务器相应给客户段的响应报文添加自定义的首部,或修改指定首部的值
1、add_header name value [always];
添加自定义首部;
add_header X-Via $server_addr;
add_header X-Accel $server_name;
2、expires [modified] time;
expires epoch | max | off;
用于定义Expire或Cache-Control首部的值;
第六题:
解答:HDFS集群的datnaode掉线超时时长的计算公式为: timeout = 10 * dfs.heartbeat.interval + 2 * heartbeat.recheck.interval,不过heartbeat.recheck.interval的单位是ms,dfs.heartbeat.interval的单位是s
10*3s+2*3000ms=36秒