• 深入理解Nginx~虚拟主机与请求的分发


    1、监听端口

    1. 语法: listen address:port[default(deprecated in 0.8.21)|default_server|[backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|bind|ipv6only=[on|off]|ssl]];
    2. 默认: listen 80;
    3. 配置块: server
    4. 示例
    5. listen 127.0.0.1:8000;
    6. listen 127.0.0.1; #注意:不加端口时,默认监听80端口
    7. listen 8000;
    8. listen *:8000;
    9. listen localhost:8000;
    10. listen 443 default_server ssl;
    11. listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;

    ·default:将所在的server块作为整个Web服务的默认server块。如果没有设置这个参数,
    那么将会以在nginx.conf中找到的第一个server块作为默认server块。

    ·default_server:同上。

    ·backlog=num:表示TCP中backlog队列的大小。默认为–1,表示不予设置。

    ·rcvbuf=size:设置监听句柄的SO_RCVBUF参数。

    ·sndbuf=size:设置监听句柄的SO_SNDBUF参数。

    ·accept_filter:设置accept过滤器,只对FreeBSD操作系统有用。

    ·deferred:在设置该参数后,若用户发起建立连接请求,并且完成了TCP的三次握手,
    内核也不会为了这次的连接调度worker进程来处理,只有用户真的发送请求数据时(内核已
    经在网卡中收到请求数据包),内核才会唤醒worker进程处理这个连接。

    ·bind:绑定当前端口/地址对,如127.0.0.1:8000。只有同时对一个端口监听多个地址时
    才会生效。

    ·ssl:在当前监听的端口上建立的连接必须基于SSL协议。

    2、主机名称

    1. 语法: server_name name[...];
    2. 默认: server_name "";
    3. 配置块: server

    在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的
    server_name进行匹配,以此决定到底由哪一个server块来处理这个请求。

    server_name与Host的匹配优先级如下:

    1)首先选择所有字符串完全匹配的server_name,如www.testweb.com 。
    2)其次选择通配符在前面的server_name,如*.testweb.com。
    3)再次选择通配符在后面的server_name,如www.testweb.* 。
    4)最后选择使用正则表达式才匹配的server_name,如~^\.testweb\.com$。

    如果Host与所有的server_name都不匹配,这时将会按下列顺序选择处理的server块。

    1)优先选择在listen配置项后加入[default|default_server]的server块。
    2)找到匹配listen端口的第一个server块。

    3、server_names_hash_bucket_size

    1. 语法: server_names_hash_bucket_size size;
    2. 默认: server_names_hash_bucket_size 32|64|128;
    3. 配置块: http、server、location

            为了提高快速寻找到相应server name的能力,Nginx使用散列表来存储server name。server_names_hash_bucket_size设置了每个散列桶占用的内存大小。

    4、server_names_hash_max_size

    1. 语法: server_names_hash_max_size size;
    2. 默认: server_names_hash_max_size 512;
    3. 配置块: http、server、location

            server_names_hash_max_size会影响散列表的冲突率。server_names_hash_max_size越大,消耗的内存就越多,但散列key的冲突率则会降低,检索速度也更快。

    5、重定向主机名称的处理

    1. 语法: server_name_in_redirect on|off;
    2. 默认: server_name_in_redirect on;
    3. 配置块: http、server或者location

    该配置需要配合server_name使用。在使用on打开时,表示在重定向请求时会使用server_name里配置的第一个主机名代替原先请求中的Host头部,而使用off关闭时,表示在重定向请求时使用请求本身的Host头部。

    6、location

    1. 语法: location[=|~|~*|^~|@]/uri/{...}
    2. 配置块: server

    location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择location{}块中的配置来处理用户请求。当然,匹配方式是多样的,下面介绍location的匹配规则。

    1)=表示把URI作为字符串,以便与参数中的uri做完全匹配

    2)~表示匹配URI时是字母大小写敏感的。
    3)~*表示匹配URI时忽略字母大小写问题。
    4)^~表示匹配URI时只需要其前半部分与uri参数匹配即可

    5)@表示仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请
    求。

    在uri参数里是可以用正则表达式的

    1. location ~* \.(gif|jpg|jpeg)$ {
    2. # 匹配以.gif、.jpg、.jpeg结尾的请求
    3. }

            注意,location是有顺序的,当一个请求有可能匹配多个location时,实际上这个请求会被第一个location处理。

            在最后一个location中使用/作为参数,它会匹配所有的HTTP请求,这样就可以表示如果不能匹配前面的所有location,则由“/”这个location处理。

    1. location / {
    2. # /可以匹配所有请求
    3. }

  • 相关阅读:
    易基因|疾病研究:DNA甲基化与转录组分析联合揭示吸烟免疫相关疾病的表观遗传机制
    一个依赖搞定Spring Boot 配置文件脱敏
    【BOOST C++ 20 设计模式】(3)库 Boost.MetaStateMachine
    一个Flutter&Cocoapods项目打包问题集锦
    Linux 常用命令
    TikTok与人工智能:数字时代的智能互动
    Eureka:微服务中的服务注册与发现机制
    Redis-01基本数据结构
    开源组件搭建完整的Kubernetes-Devops平台方案
    zsh: command not found: adb问题分析
  • 原文地址:https://blog.csdn.net/gqltt/article/details/125627786