
Nginx配置典型问题
1. 知道配置命令,不知道配置什么,为什么要这么配置;
2. 能把功能配置出来,但是逻辑过于啰嗦;
3. 遇到问题,百度不到就不知道如何继续分析;
问题1 案例
web服务器Nginx开启gzip压缩,作为常识,没啥可说的。想说的是容易忽视的细节。
Syntax: gzip_comp_level level;Default: gzip_comp_level 1;Context: http, server, location
gzip_comp_level 压缩等级从1-9,是压缩时间和文件大小之间的平衡,不确定的话,取中间设置为3-5都可以。根据不同场景进行取舍。
Syntax: gzip_min_length length;Default: gzip_min_length 20;Context: http, server, location
启动gzip压缩的最小文件长度,主要考虑tcp报文传输大小。文件太小,压缩节省的空间也没多大,都在一个报文传输完成,没节约传输时间,还花费压缩时间,一般设置为1000就差不多。
Syntax: gzip_types mime-type ...;Default: gzip_types text/html;Context: http, server, location
默认对js、css、json等文件类型不进行压缩。遇到好多web对资源压缩不全的案例。 只需要对自己web资源进行观察,手动配置补全文件类型。文件类型清单参考Nginx的mine.types文件即可。
Syntax: gzip_static on | off | always;Default: gzip_static off;Context: http, server, location
看到很多人配置了gzip_static,但是是否生效呢?
$ openresty -V...--with-http_gunzip_module--with-http_gzip_static_module--with-http_v2_module--with-stream_realip_module--with-openssl-opt=-g--with-stream--with-stream_ssl_module--with-stream_ssl_preread_module--with-http_ssl_module
其实,该功能默认是没有编译进Nginx的,通过 openresty -V 命令确认是否enable了。可以手动增加--with-http_gzip_static_module,自行编译打开。
这样就ok了么?
还没有。
以1.js文件为例:
gzip_static 默认读取请求路径文件名 1.js + .gz 后的文件【1.js.gz】是否存在,如果存在就返回成功。不存在,就走gzip on配置逻辑,读取1.js后,动态压缩为gzip发给客户端。
也就是说gzip_static要生效,必须存在提前压缩好的.gz文件。
webpack 可以使用CompressionPlugin插件自动打包成gzip文件。

① algorithm: 指定压缩算法,gzip只不过是最常用的一种,还有其它的方案,比如br。
② deleteOriginalAssets 参数建议配置为false,同时保留原始资源和压缩资源。
因为客户端可能请求非压缩文件,那.gz文件是不匹配的,Nginx重新压缩发现文件不存在会返回404。
感兴趣的可以使用curl 命令调试看看:
curl -V 'http://localhost/dist/static/1.js' -H 'accept-encoding: gzip' --compressed
-H 'accept-encoding: gzip' 是指定请求头要gzip压缩;
--compressed 是把返回的gzip进行解压。

备注: mac 使用dtruss【基于dtrace】、linux使用strace【基于ptrace】
问题2案例1
相同端口配置多个虚拟主机,允许多域名访问:

效果如下:
$ curl http://a.com:6000/aaa$ curl http://b.com:6000/bbb$ curl http://127.0.0.1:6000/aaa$ curl http://localhost:6000/aaa
Nginx是监听端口,收到请求后再根据请求头,做筛选逻辑判断。
以server_name 为例, Nginx收到请求后,按端口做过滤,选出符合条件的配置,再根据$host 做server_name的匹配筛选,如果找不到,就走第一个server代码块。
问题2案例2
Nginx做反向代理访问不同后端微服务,需要根据host和请求头 FlagHeader 做区分,原有配置就通过重复写2份server解决多host问题,通过 FlagHeader 做反向代理到本地其他端口的server,再做反代后端微服务。

分析发现,其实只有2个变量:请求域名和请求头flag。通过map命令可以简化配置:

问题3案例
当网上找不到答案的时候,熟悉计算机技术基础,直接分析Nginx源码、自行编译,自行调试。
比如前面讲的个gzip_static问题,本身代码量不大,核心代码200+行,Nginx源码的架构设计很简练。





