Nginx——HTTP核心模块
HTTP核心模块——ngx_http_core_module
HTTP配置项都必须直属于http块、 server块、 location块、 upstream块或 if块等。一个server块就是一台虚机主机,她只处理与之相对应的域名的请求。
域名通过server块中的server_name指定。
http { gzip on; upstream { ... } server { listen 80 default_server; server_name _; root /usr/share/nginx/html; location / { root websource; if ... { ... } } location ~* .(jpg|jpeg|png|jpe|gif)$ { ... } } }
vhost与请求的分发
监听端口
语法: listen address:port [default_server|[bind|ssl]];
默认: listen 80;
配置块: server
IPv4地址,在listen后可以只加IP地址、 端口或主机名,例如:
listen 80; listen 127.0.0.1; ## 不指定端口时,默认监听80端口 listen *:8000; listen localhost:8080;
listen 443 default_server ssl;
IPv6地址绑定
listen [::]:8000; listen [::1];
UNIX句柄绑定socket文件
listen unix:/var/run/nginx.sock;
带参数的listen
listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;
listen中参数的意义
default_server(同default):如果指定了此参数,那么此server为默认server。如果没有指定,那么nginx.conf中的第一个server块中的server为默认server。当一个请求没有匹配任何配置文件中的域名时,将使用default_server处理请求。 backlog=num: 表示TCP中backlog队列的大小。 默认为–1, 表示不予设置。 在TCP建立三次握手过程中, 进程还没有开始处理监听句柄,这时backlog队列将会放置这些新连接。可如果backlog队列已满,还有新的客户端试图通过三次握手建立TCP连接,这时客户端将会建立连接失败。 rcvbuf=size: 设置监听句柄的SO_RCVBUF参数。
sndbuf=size: 设置监听句柄的SO_SNDBUF参数。
accept_filter: 设置accept过滤器, 只对FreeBSD操作系统有用。
deferred: 在设置该参数后, 若用户发起建立连接请求,并且完成了TCP的三次握手,内核也不会为了这次的连接调度worker进程来处理,只有用户真的发送请求数据时(内核已经在网卡中收到请求数据包),内核才会唤醒worker进程处理这个连接。
这个参数适用于大并发的情况下,它减轻了worker进程的负担。当请求数据来临时, worker进程才会开始处理这个连接。只有确认上面所说的应用场景符合自己的业务需求时,才可以使用deferred配置。
bind: 绑定当前端口/地址对, 如127.0.0.1:8000。 只有同时对一个端口监听多个地址时才会生效。
ssl: 在当前监听的端口上建立的连接必须基于SSL协议
主机名
语法: server_name name [...];
默认: server_name "";
配置块: server
当有HTTP请求时,Nginx会取出header头中的Host,与每个server中的server_name匹配,匹配到的处理这个请求。有两种情况:
(1)有可能header中的Host与多个server_name匹配,这时需要根据优先级选择处理的server。优先级如下:
1) 首先选择所有字符串完全匹配的server_name, 如www.testweb.com 。
2) 其次选择通配符在前面的server_name, 如*.testweb.com。
3) 再次选择通配符在后面的server_name, 如www.testweb.* 。
4) 最后选择使用正则表达式才匹配的server_name, 如~^\.testweb\.com$。
(2)当Host与server_name都不匹配,根据如下规则进行选择server
1) 优先选择在listen配置项后加入[default|default_server]的server块。
2) 找到匹配listen端口的第一个server块。
3) 如果server_name后跟着空字符串(如server_name "";),那么表示匹配没有Host这个HTTP头部的请求。
server_name在官方文档中对命名分组的使用
server { server_name ~^(www\.)?(?<domain>.+)$; location / { root /sites/$domain; } } server { server_name _; location / { root /sites/default; } }
location
语法: location [=|~|~*|^~|@] /uri/{...} 配置块: server
根据用户请求中的URI来匹配上面的/uri部分,如果可以匹配,就选择该location块中的配置处理请求。location的匹配规则如下:
1) =表示把URI作为字符串, 以便与参数中的uri做完全匹配 2) ~表示匹配URI时是字母大小写敏感的。 3) ~*表示匹配URI时忽略字母大小写问题 4) ^~表示匹配URI时只需要其前半部分与uri参数匹配即可
uri参数里可以使用正则表达式。
location ~* \.(gif|jpg|jpeg)$ { ... }
注意:location是有顺序的,当一个请求有可能匹配多个location时,这个请求会被第一个location处理
一般情况下,会在最后一个location中使用 / 作为参数,它可以匹配所有请求,这样,即使前面的所有location都不匹配,也会由这个"/"进行处理。
posted on 2020-05-18 11:51 hopeless-dream 阅读(276) 评论(0) 编辑 收藏 举报