nginx配置文档学习笔记

Last Updated:

2021-09-25

#nginx #nginx配置 #服务器多域名配置

nginx是如何处理一次请求的(How nginx process a request)

先根据nginx的配置文件的规则,这个请求打到相应的端口了,这才叫做“收到请求”

收到请求后,nginx首先决定哪一个server来处理这个请求

这一步,是通过请求的Host字段,来配合server_name命令来决定的

如果没有匹配的server_name配置,那么会使用default server来处理。

这个default server是配置的第一条规则(listen该端口的第一条规则) 当然,可以通过显式地使用listendefault_server参数,来指定该端口的default_server规则。 例如: listen 80 default_server;

常用命令(directives)

server_name 命令(directive)

server_name文档

规则命中的优先级

  1. 精准匹配名字
  2. 通配符打头,优先级随长度正向变换(长度越长,优先级越高)(*.testdomain.com*.com更先命中)
  3. 通配符结尾,优先级随长度正向变换(长度越长,优先级越高)(testdomain.test.*test.*更先命中)
  4. 正则规则(在配置文件中出现地越早,更先命中)

性能优化

上述[[nginx配置文档学习笔记#规则命中的优先级]],针对1-3项,nginx分别存储了3张缓存表(表a、表b、表c)。 表a,缓存了所有精准匹配名字的规则; 表b,缓存了所有通配符打头的规则; 表c,缓存了所有通配符结尾的规则。 当一次收到请求后,nginx先搜一遍表a、再搜一遍表b、最后搜一遍表c;都没有命中后,就会根据正则,以此检验。 所以从性能最优角度,采取如下几个性能优化小技巧。

  1. 把大部分经常访问的server_name显示写出来,再使用通配符规则进行兜底
  2. 统配规则,能尽量使用通配符打头,而不是通配符结尾

Punycode

有一些IDNs,在nginx配置的时候,server_name要使用punycode。或者说的更直白一点,中文域名,要使用punycode。 例如,我以前使用过域名连培培.中国,如果为了给这条规则命名一个server,我得使用这个域名对应的punycode,也即 xn--2jsa9304b.xn--fiqs8s punycode转换器