面试之查漏补缺

乍一看,题都不难,但手生了后好多不看 manual 都生写不出来。

没啥可说的,直接上问题。

找出文件中空行的行号

答:用 grep 配合参数 -n 显示行号,具体命令:

1
grep -n "^$" file

把文件中所有的换行替换成空格

sed

答:用 sed 命令来把文件合成一行以后再替换,详见命令:

1
sed -e '1h;2,$H;$!d;g;s/\n/ /g' file

tr

答:用 tr 命令替换 ‘\n’ 为 ‘ ‘,详见命令:

1
tr '\n' ' ' < file | sed 's/ $/\n/'

查看状态是 established 的连接

答:用 ss 命令:

1
ss -t state established

防火墙设置

规则要求:

  • 对所有地址开放本服务器的80端口、10~20端口。
  • 其他机器可以用ping命令来探测本服务器的链接情况
  • 其他没有被准许的端口将禁止访问

答:用 iptables,具体如下:

1
2
3
iptables -A INPUT -p tcp -m multiport --dports 10:20,80 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -j REJECT

Nginx 优化配置点

work processes

worker_processes

Nginx worker 的进程数,缺省为 1;推荐设为 auto,将实现每颗 cpu 核跑一个 worker 进程

worker_connections

每个 worker 进程可以同时处理的最大连接数。

Keepalive Connections

keepalive_requests

客户端可以通过单个 keepalive 连接进行的请求数,可以酌情调大。

keepalive_timeout

酌情调整

keepalive

每个 worker 进程保持与上游服务器 keepalive 的空闲连接数,注意,要启用这个,需要同时配置如下设置:

1
2
proxy_http_version 1.1;
proxy_set_header Connection "";

sendfile

操作系统的 sendfile() 系统调用将数据从一个文件描述符复制到另一个文件描述符,通常实现零复制,这可以加快 TCP 数据传输的速度

caching

启用缓存,您可以大大缩短对客户端的响应时间,同时可以大大减少后端服务器的负载

compression

压缩发送给客户端的响应可以大大减小客户端的大小,因此它们使用较少的网络带宽。需要注意的是:启用压缩会消耗 CPU 资源,如果服务器的 CPU 资源是瓶颈的话慎用。还有,本来已经压缩过的内容(如图片)不要启用

MySQL 的联合索引

联合索引又叫复合索引,是多个字段组成的一条索引。

  • 联合索引的最左前缀匹配是指 where 条件一定要有联合索引的第一个字段
  • 是否走联合索引跟 where 条件的顺序无关
  • 遇到范围查询(>、<、between、like)就会停止匹配

MySQL 的主从复制(同步)

先决条件:

  1. master 上启用 binlog

原理:

  1. master 上 binglog dump 线程将 binlog 的变化内容发给 slave
  2. slave 上的 I/O 线程收到 master 上发过来的 binlog 内容后,写入本地的 relay log
  3. slave 上的 SQL 线程读取 relay log,并根据其内容回放到 slave