zoukankan      html  css  js  c++  java
  • 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都不匹配,也会由这个"/"进行处理。

  • 相关阅读:
    FZU2150 Fire Game
    POJ3414 Pots
    POJ3087 Shuffle'm Up
    POJ3126 Prime Path
    POJ1426 Find The Multiple
    POJ3279 Fliptile
    甘特图实用技巧——项目进度一目了然!
    连设计图都不会画,你还想做“系统架构师”?
    java中list和map的底层实现原理
    redis四种部署方式
  • 原文地址:https://www.cnblogs.com/zh-dream/p/12909699.html
Copyright © 2011-2022 走看看