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

试题内容

如果网站配置了多域名,要根据不同的域名分别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

2.在Nginx中,如何使用未定义的服务器名称来阻止处理请求?
只需将请求删除的服务器就可以定义为:

1
2
3
4
5
Server {
listen 80;
server_name " ";
return 444;
}

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

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

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

4.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;
}

6.如果某个网站做了两个域名,分别是https://www.aaa.com和https://www.bbb.com,如果做了www.aaa.com cname到www.bbb.com,那么浏览器打开www.aaa.com会是什么界面?
打开页面会出现“https证书不正确”的风险提示。

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

8.要求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 ~* /.+ {
#已省略余下通用配置内容
}
}

9.为了安全,Web服务器不要求启用所有可用的方法,只允许GETHEADPOST方法,其他的全部过滤掉。实现其功能的代码如下:

1
2
3
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}

10.对/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;
}
}
}

  1. limit_zone:针对每个 IP 定义一个存储 session 状态的容器。本例中定义了一个my_zone的10m大小的容器。
  2. limit_conn my_zone 2:限制在my_zone中记录状态的每个IP只能发起2个并发连接。本例中,客户端访问/download目录时,会限制2个并发连接。
  3. limit_rate 20k:对每个连接限速20k。注意,这里是对连接限速,而不是对IP限速。如果一个IP允许2个并发连接,那么这个IP就是限速为limit_rate*2,在设置的时候要根据自己的需要做设置调整。

11.简单说明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

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

  1. 客户是否刷新过缓存?
    答:如果刷新缓存,有可能会短时间表现命中率下降。特别说明下:CDN的url或者目录刷新是清除CDN缓存的动作(这个比较容易理解偏差)
  2. 带宽是否突增?并且访问的都是新的URL?
    答:带宽突增或者访问的新URL较多,会导致CDN节点回源较多,命中率会表现有下降趋势。
  3. 源站是否有新内容发布?
    答:CDN节点访问新内容,导致CDN节点回源较多,命中率会表现有下降趋势。
  4. 源站是否出现过异常导致5XX和4XX增加,由于5XX和4XX不缓存,会表现命中率下降。
  5. 源站的访问url的header参数,或者在CDN控制管理后台的缓存配置规则是否改变过?
    答:缓存时长的调整,有可能会带来命中率的变化。

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

  1. 显示MISS,说明没有命中CDN缓存,是回源的。
  2. 显示HIT,是命中了CDN缓存。

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

14.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: *
}
}

15.如果想配置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: *
}
}
}

16.将不带www的访问强制加上www怎么做?

1
2
3
4
       # 下面这句就是当识别到 HOST 不是带 www 的全部都 302 带上 www
if ( $host != 'www.your-domain.com' ) {
rewrite ^(.*)$ https://www.your-domain.com$1 permanent;
}

参考资料

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,我会回复你的
-------------本文结束感谢您的阅读-------------