#nginx #nginx配置 #服务器多域名配置
nginx是如何处理一次请求的(How nginx process a request)
先根据nginx的配置文件的规则,这个请求打到相应的端口了,这才叫做“收到请求”
收到请求后,nginx首先决定哪一个server来处理这个请求
这一步,是通过请求的
Host
字段,来配合server_name
命令来决定的如果没有匹配的
server_name
配置,那么会使用default server来处理。这个default server是配置的第一条规则(
listen
该端口的第一条规则) 当然,可以通过显式地使用listen
的default_server
参数,来指定该端口的default_server
规则。 例如:listen 80 default_server;
常用命令(directives)
server_name
命令(directive)
规则命中的优先级
- 精准匹配名字
- 通配符打头,优先级随长度正向变换(长度越长,优先级越高)(
*.testdomain.com
比*.com
更先命中) - 通配符结尾,优先级随长度正向变换(长度越长,优先级越高)(
testdomain.test.*
比test.*
更先命中) - 正则规则(在配置文件中出现地越早,更先命中)
性能优化
上述[[nginx配置文档学习笔记#规则命中的优先级]],针对1-3项,nginx分别存储了3张缓存表(表a、表b、表c)。 表a,缓存了所有精准匹配名字的规则; 表b,缓存了所有通配符打头的规则; 表c,缓存了所有通配符结尾的规则。 当一次收到请求后,nginx先搜一遍表a、再搜一遍表b、最后搜一遍表c;都没有命中后,就会根据正则,以此检验。 所以从性能最优角度,采取如下几个性能优化小技巧。
- 把大部分经常访问的
server_name
显示写出来,再使用通配符规则进行兜底 - 统配规则,能尽量使用通配符打头,而不是通配符结尾
Punycode
有一些IDNs,在nginx配置的时候,server_name
要使用punycode。或者说的更直白一点,中文域名,要使用punycode。
例如,我以前使用过域名连培培.中国
,如果为了给这条规则命名一个server
,我得使用这个域名对应的punycode,也即 xn--2jsa9304b.xn--fiqs8s
punycode转换器