Linux运维工程师笔试题第十七套

试题内容

  1. 如果网站配置了多域名,要根据不同的域名分别https访问,应该怎么配置?
    在rewrite的时候使用$host,如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    server
    {
    listen 80;
    server_name www.test.com www.test.com.cn;
    index index.html index.htm index.php;
    root /home/wwwroot;

    location / {
    rewrite ^/(.*)$ https://$host/$1 permanent;
    }
    }

如果是要笨一点的方法就是:

1
2
3
4
5
6
7
8
9
10
11
12
13
server  
{
listen 80;
server_name www.test.com www.test.com.cn;
index index.html index.htm index.php;
root /home/wwwroot;

if ($host = 'www.test.com.cn' ) {
rewrite ^/(.*)$ https://www.test.com.cn/$1 permanent;
}
if ($host = 'www.test.com' ) {
rewrite ^/(.*)$ https://www.test.com/$1 permanent;
}

ps.阿里云的SLB绑定多个HTTPS证书的文档:https://help.aliyun.com/document_detail/87023.html?spm=a2c4g.11186623.6.741.7e11301bVLBAJz

  1. 在Nginx中,如何使用未定义的服务器名称来阻止处理请求?
    只需将请求删除的服务器就可以定义为:
    1
    2
    3
    4
    5
    Server {
    listen 80;
    server_name " ";
    return 444;
    }

这里,服务器名被保留为一个空字符串,它将在没有“主机”头字段的情况下匹配请求,而一个特殊的Nginx的非标准代码444被返回,从而终止连接。

  1. ajax是同步还是异步,怎么样实现同步?
    ajax里async属性默认的设置值为true,这种情况为异步方式。即网页里有两个函数func(x)和func(y),在打开网页的时候,后台会先去执行func(x),然后等待server返回结果,同时还有一个线程会去执行func(y)。

当把async设为false时,这时ajax的请求是同步的,也就是说,这个时候ajax块发出请求后,他会等待在func(x)这个地方,不会去执行func(y),直到func(x)部分执行完毕。

  1. nginx如何实现http跳转https?
    需要用到地址重写代码,用以下代码能让http强制跳转到https:

    1
    2
    3
    4
    5
    6
    server {
    listen 80;
    listen [::]:80; #支持ipv6
    server_name www.test.com;
    return 301 https://$server_name$request_uri;
    }
  2. 如果某个网站做了两个域名,分别是https://www.aaa.com和https://www.bbb.com,如果做了www.aaa.com cname到www.bbb.com,那么浏览器打开www.aaa.com会是什么界面?
    打开页面会出现“https证书不正确”的风险提示。

  3. 接着上面问题,在nginx里做了rewrite或者配置了显性URL,此时取消掉www.aaa.com本身的ip(即www.aaa.com没有ip,但是www.bbb.com有ip),浏览器里打开www.aaa.com会是什么界面?
    会显示“无法找到www.aaa.com的IP地址”(第一步就失败了...)。

  4. 要求a.comwww.a.com都跳到www.b.com,而www.a.com/123不跳,如何配置?
    配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    server {
    listen 80;
    server_name www.a.com a.com;

    #根目录跳转
    location / {
    rewrite .+ http://www.b.com/ permanent;
    }

    #非根目录本地执行
    location ~* /.+ {
    #已省略余下通用配置内容
    }
    }
  5. 为了安全,Web服务器不要求启用所有可用的方法,只允许GETHEADPOST方法,其他的全部过滤掉。实现其功能的代码如下:

    1
    2
    3
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
    return 444;
    }
  6. 对/download/目录做“最大下载速度20K,同时最多2个并发链接的限制”

    1
    2
    3
    4
    5
    6
    7
    8
    9
    http {
    limit_zone my_zone $binary_remote_addr 10m; #在 http 段配置定义一个limit_zone
    server {
    location /download/ {
    limit_conn my_zone 2; #limit_conn和 limit_rate参数进行限速设置
    limit_rate 20k;
    }
    }
    }
  7. limit_zone:针对每个 IP 定义一个存储 session 状态的容器。本例中定义了一个my_zone的10m大小的容器。

  8. limit_conn my_zone 2:限制在my_zone中记录状态的每个IP只能发起2个并发连接。本例中,客户端访问/download目录时,会限制2个并发连接。

  9. limit_rate 20k:对每个连接限速20k。注意,这里是对连接限速,而不是对IP限速。如果一个IP允许2个并发连接,那么这个IP就是限速为limit_rate*2,在设置的时候要根据自己的需要做设置调整。

  10. 简单说明nginx配置文件里面alias和root的区别
    Nginx配置文件server中指定两个location执行,分别为root和alias指令:

    1
    2
    3
    location /test/ {
    alias /www/test/;
    }

按照上述配置,则访问/test/目录里面的文件时,nginx会去/www/test/目录找文件:

1
2
3
location /test/ {
root /www/test;
}

按照这种配置,则访问/test/目录下的文件时,nginx会去/www/test/test/目录下找文件。

另一个区别是alias后面必须要用/结束,否则会找不到文件,而root则对/可有可无。

注意!location后面的/test/如果是/test的话(没有用/收尾),而同时alias的文件夹是有/收尾的话,就会出现“目录穿越”漏洞,即外来人可以访问你/www/test../即www文件夹的内容。详情可见 https://www.leavesongs.com/PENETRATION/nginx-insecure-configuration.html

  1. CDN缓存命中率下降的因素有哪些?

  2. 客户是否刷新过缓存?
    答:如果刷新缓存,有可能会短时间表现命中率下降。特别说明下:CDN的url或者目录刷新是清除CDN缓存的动作(这个比较容易理解偏差)

  3. 带宽是否突增?并且访问的都是新的URL?
    答:带宽突增或者访问的新URL较多,会导致CDN节点回源较多,命中率会表现有下降趋势。

  4. 源站是否有新内容发布?
    答:CDN节点访问新内容,导致CDN节点回源较多,命中率会表现有下降趋势。

  5. 源站是否出现过异常导致5XX和4XX增加,由于5XX和4XX不缓存,会表现命中率下降。

  6. 源站的访问url的header参数,或者在CDN控制管理后台的缓存配置规则是否改变过?
    答:缓存时长的调整,有可能会带来命中率的变化。

  7. 如果判断url是否命中CDN缓存?
    查看响应头信息中的X-Cache字段。

  8. 显示MISS,说明没有命中CDN缓存,是回源的。

  9. 显示HIT,是命中了CDN缓存。

除了X-Cache还有如下几个参数与CDN有关:
X-Swift-SaveTime:内容开始在CDN上缓存的时间。由于系统时间是GMT时间,所以需要折算成北京时间。
X-Swift-CacheTime:CDN的默认缓存时间,以秒为单位。
Age:该内容在CDN上已经缓存了的时间。

  1. AJAX从b.com请求另一个域a.com的地址会有跨域的问题,如何配置?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    server {
    listen 80;
    server_name b.com;
    location /{
    add_header 'Access-Control-Allow-Origin' 'http://a.com';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET';
    }
    }

第一条add_header:授权从a.com的请求
第二条add_header:当该标志为真时,响应于该请求是否可以被暴露
第三条add_header:指定请求的方法,可以是GET,POST,PUT,DELETE,HEAD
如果想允许来自任何域的请求,可以这样:

1
2
3
4
5
6
7
server {
listen 80;
server_name b.com;
location /{
Access-Control-Allow-Origin: *
}
}

  1. 如果想配置2-3个域设置为信任,其他的域名被排除,应该如何配置?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    server {
    listen 80;
    server_name b.com;
    location /{
    if ( $http_referer ~* (a.com|b.com|c.com) ) {
    Access-Control-Allow-Origin: *
    }
    }
    }
  2. 将不带www的访问强制加上www怎么做?

    1
    2
    3
    4
           # 下面这句就是当识别到 HOST 不是带 www 的全部都 302 带上 www
    if ( $host != 'www.your-domain.com' ) {
    rewrite ^(.*)$ https://www.your-domain.com$1 permanent;
    }
  3. 一个日志文件a.log有1000万行,结构如下:
    a1,190,c1
    a2,301,c2
    a3,90,c3
    a4,190,c4
    a5,170,c5

    使用Linux命令查找并输出第二例字段最大的三个值?

答案:cat a.log | awk -F',' '{print $2}' | sort -k1nr | head -n 3

  1. 在mysql InnoDB引擎中,一个update事务:update users set status = 'delete' where id = 100;正在执行,在commit之前;另一个查询请求select * from users where id = 100;会被阻塞住么?如果不会,会查到什么数据?
    答:不阻塞,其可以查询出100(因为读的时候不涉及锁,且事务未提交,所以可以查询出)

参考资料

https://my.oschina.net/mrpei123/blog/1794001
http://note.qidong.name/2017/09/nginx-https-hsts/
https://www.ssllabs.com/ssltest/index.html(测试ssl安全的网站)

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------