(2)静态资源服务器、缓存、HTTPS、Openresty+Lua

4.5k 词

1.alias 与 root

访问固定目录的做法

Location / {
alias dlib/;
}

root 的问题:会把url 的路径带到文件目录中来,所以通常使用alias

2.gzip

gzip_min_length 1;表示小于1字节的就不再压缩了。因为有的文件小,一个TCP报文就发出去了。这时候如果还做gzip压缩,消耗CPU。意义不大了。

3.auto_index

应用场景:假定我们把dlib文件下的某个文件分享给用户,让用户决定用哪些文件。

当我们访问反斜线结尾的目录的时候。对应到指定目录,显示目录的结构。

location / {
alias dlib/;
auto_index on:
}

共享静态资源的一种手段。

4.限制访问速度
比如访问大文件的时候,我们限制流出速度。

location / {
alias dlib/;
auto_index on:
set $limit_rate 1k; #限制向浏览器发送的速度。每秒1k字节。
}

$limit_rate 内置变量,限制访问速度。

5.记录access日志

log_format 命名的场景

我们可能会对不同的域名下,做不同的日志记录。
或者做不同用处时(比如:对一些大文件进行反向代理。),我们记录不同的日志。

内置的变量都可以记录到 access_log日志中

6.生产环境不建议使用root

在静态网站访问的时候,出现了403的错误,在nginx.conf文件中添加了 user root; 也就是和当前启动用户一致,然后重新reload,再次访问正常了。

 作者回复
如果是生产环境,不建议使用root用户哦,修改静态资源的权限与user指定的用户权限相匹配更好。

二,反向代理服务

  1. server{…listen 127.0.0.1:8000….}

加上127.0.0.1 只允许本机的进程访问NGINX。

  • 代理服务器配置 upstream 模块
upstream 名字 {
server 服务器地址
}

Location / {
proxy_pass http://你的upstream名
}

3.proxy_set_header 指令

被代理的服务器无法直接拿到用户发送的header。prox_set_header相当于转发。

4.proxy_cache

配置proxy_cache

http {
……
proxy_cache_path /tmp/nginxcache levels=1:2 keys_zone=my_cache:10m max_sie=10g inactive=60m use_temp_path=off;
……
}

文件放在哪个目录下 /tmp/nginxcache
这些文件的命名方式 levels=1:2
文件的关键字要放入共享内存(比如:起名叫my_cache,10m就是10MB)

使用proxy_cache

放在你想要缓存的url下。

locaction / {
……
proxy_cache my_cace;#my_cace 开辟的10MB的共享内存
proxy_cache_key $host$uri$is_args$args;#缓存key
proxy_cache_valid 200 304 302 1d; #哪些响应不返回
……
}

测试缓存两种方法

  • 请求一次,停掉提供服务的机器,再请求看页面是否缓存
  • 看http的header头

5.一个解决问题的思路:二分法,逐渐缩小问题范围

6.选nginx还是openresty

如果不需要使用openresty 提供的独有功能,尽量使用更稳定更轻量的nginx。

7.如果想启用gzip压缩,是应该在反向代理上做,还是web服务器上的nginx上配置?

 作者回复
我猜测你的环境是nginx->nginx,前者是负载均衡的作用,后者是静态资源的作用?如果是这样,建议后者。

8.$host和$http_host区别

用反向代理一些有跳转的页面的时候会出现CSS样式加载不出来 然后我使用’$http_host就可以加载出来

 作者回复
这两个变量的生成方式不同:http_host只会从请求头部中的Host: xxx中取值,而host有三种取值方式:1、先从请求行中取,比如http://xxx/index.htm;2、如果1取不到,再从Host头部取;3、如果2也取不到,从配置里的server_name里取。你应该根据其含义也选择使用

三、日志处理

  1. GoAccess 使用

goaccess /var/log/nginx/access.log -a -o /etc/nginx/log/report.html –log-format=COMBINED

注意点:对nginx很多变量的输出goaccess是不能解析的

使用文档:https://goaccess.io/get-started

2.集中日志到一台服务器,用syslog协议。

3.openresty的一致性hash,不均匀,你怎么看,有没有办法修改算法或者虚拟节点的多少

 作者回复
nginx的第三方模块代码都能修改,而openresty的lua代码改起来成本更小,例如你说的应该是chash.lua这个文件。 问题是,你打算用一套新的算法来改么?原来是openresty的consistent hash算法,与nginx官方的consistent hash算法,都是使用了memcached中的ketama实现思想的,是经过验证的。

4.如果做了每天的日志切割,再使用GoAccess 是不是就意味着只能看到当天的统计结果?

不会的,GoAccess会在内存中缓存运行以来的日志分析结果

  1. 在docker swarm 中,跨主机,多节点的nginx日志收集,聚合,展示,怎么用goaccess进行实现?

 作者回复
两个比较简单的方案:

  • 1、用syslog把日志汇聚在一台服务上,再goaccess。
  • 2、用NFS把多台主机的日志目录映射在一起,用goaccess再分析。

四,安全套接字层

1.SSL

{F8900}

{F8902}

2.ssl第一次握手还是明文传输,也不安全,现在提了一个hsts,老师可以讲一下这个吗?

 作者回复
ssl第一次握手是明文传输,但它只是传输安全套件以及公钥,之后数据是用新生成的对称密钥加密过的,所以SSL是安全的。hsts主要应用在浏览器端,它是强制浏览器使用https方式,对nginx来说,只需要在返回的http头部上添加Strict-Transport-Security,告诉浏览器这个站点只能通过https访问即可。

3.CA

{F8904}

4.证书类型

{F8906}

5.浏览器跟服务器间通讯怎样确认对方是我信赖的人

归根结底验证给这个站点办法的根证书它的发行者是否是有效的。

6.CA是不是只提供签名过的证书,也提供秘钥吗?秘钥不是自己生成的吗?如果提供的话是什么的秘钥呢?

 作者回复
这要根据你所使用的服务商决定哦。比如你在阿里云上购买的证书,都是由阿里云生成好公私钥对的,你需要下载公私钥证书再部署在自己的nginx上。

7.为了可用性我们可以通过nginx 查询OCSP获知证书是否有效。也是为了提升可用性(因为CA机构不对网站的可用性负责)。

{F8908}

8.打开session cache 可以复用密钥

9.性能与优化点

当以小文件为主,主要考验nginx的非对称加密性能。以大文件为主,考验对称加密性能。

当我们处理小文件比较多时,主要优化椭圆曲线算法的一些密码强度。

处理大文件多时,aes算法是否可以替换更有效的算法,或者调整密码强度。

10,非对称加密技术保证:双方生成的新密钥是一致的,这个结论是怎么得出来的呢? 能验证下吗?

 作者回复
你可以看下椭圆曲线加密的数学证明过程,或者看下RSA的原理验证,网上有很多,不过理解前者需要非常好的数学基础,后者比较简单,可以用来入门。

11.老师的tls流程是最复杂的吧,一般客户端不需要自己的证书密钥,除非银行客户端之类
一般网站类,浏览器只是拿服务端公钥加密随机数发给服务端这样吧~

 作者回复
不是的,我这里的例子是当前最主流的TLS安全套件交互流程,你用firefox、chrome等访问大多数ssl站点,交互流程都是这样的。这些复杂性,其实都被浏览器、nginx悄悄地完成了,所以我们感知不到

12.SSL耗时主要由握手和对称加密构成。

13.CA是怎么知道指定的域名是在当前的nginx下呢?或者有没有推荐的资料或者链接可以参考下呢?

因为域名配置的地址指向nginx所在机器,所以该nginx所在机器拥有域名所有权。中文资料目前《https权威指南》可以参考

14.免费的跟付费的证书有什么差异?

付费的https也分DV证书、OV证书和EV证书。从安全传输这个角度来说,这三种证书效果一样。从浏览器对证书的认可上来,DV证书最差。如果你买的是付费的DV证书,跟这里的例子都一样,因为主流的浏览器都认Lets encrypt。

五,lua 简单服务

1.openresty/bundles目录

ngx_前缀是c模块,lua_打头的是lua模块。主要编译是c模块

2.使用openresty连接 数据库 或 redis ,性能和稳定性怎么样?(身边几乎没有人使用它去连接数据库和缓存,不敢随便使用它!)

 作者回复
性能高,稳定性好,值得一试.

3.请问:你们经常会使用openresty直连redis或mysql?在什么场景下使用呢?

有些接口流量很大,所以不想对上游的应用开发服务器造成影响,就会直连redis,mysql。

4.请问:你们会不会经常使用openresty合并http接口请求?

微服务架构、前后端分离技术的应用,对RESTful接口的依赖越来越多。繁多的接口,流水线式的请求,使耗费的时间越来越长。
解决这种效率的问题常见的方法:

  • 1、增加前端的请求数的请求数,这种方法最大的障碍就是浏览器最大并发连接数,如果请求过多会影响整体页面的加载。
    • 2、后端代码聚合接口,将多个接口的数据聚合到一起返回给前端,这样做最大缺点是代码的耦合很高。
      既要做到对请求的合并又要不影响各子系统的划分,更好的方案:
      使用OpenResty的ngx.location.capture_multi函数来聚合多个请求,ngx.location.capture_multi对多个内部请求是非阻塞的并行执行的,相对于流水线式的请求大大提交了效率。

 作者回复
我很少这么做。你可以试试http2协议(第4部分有介绍),对大量小请求的性能提升很有效果。

5.openresty做API接口,api网关优势,例如:降低请求/往返次数,请问:为什么会降低请求/往返次数?(网上说是因为:API网关能够确保客户端在单次往返中就从多项服务中检索出数据。)

 作者回复
我对这句话的理解是有这么个场景:
正常的请求是nginx->应用服务->mysql,用openresty后,有些简单的业务只需要查询数据库,那么可以变为nginx->mysql,这样就降低了请求次数及往返次数。

6.ngx.say

ngx.say 会生成响应。是在http中的body中的。
放在body中的文本,可以通过ngx.say添加进去。