hopeless-dream

导航

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编辑  收藏  举报