zoukankan      html  css  js  c++  java
  • 用HTTP核心模块配置一个静态Web服务器

    静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现与core模块类似,可以根据相关模块(如ngx_http_gzip_filter_module、ngx_http_image_filter_module等)的配置项说明,方便地在nginx.conf配置文件中加入新的配置项,从而实现更多的Web服务器功能。

    一个典型的静态Web服务器会包含多个server块和location块,例如:

    http {
        gzip on;
        upstream {
               …
        }
        …
        server {
               listen localhost:80;
               …
               location /webstatic {
                            if …
     {
                                    …
                            }
                            root optwebresource;
                            …
               }
               location ~* .(jpg|jpeg|png|jpe|gif)$ {
                            …           }
        }
        server {
               …
        }
    }

    所有的HTTP配置项都必须直属于http块、server块、location块、upstream块或if块等,同时,在描述每个配置项的功能时,会说明它可以在上述的哪个块中存在,因为有些配置项可以任意地出现在某一个块中,而有些配置项只能出现在特定的块中。

    下面会把这些配置项分为以下8类进行详述:

    1.虚拟主机与请求的分发

    2.文件路径的定义

    3.内存及磁盘资源的分配

    4.网络连接的设置

    5.MIME类型的设置

    6.对客户端请求的限制

    7.文件操作的优化

    8.对客户端请求的特殊处理。

    并在后面列出ngx_http_core_module模块提供的变量和意义

    1. 虚拟主机与请求分发

    1)server_name

    由于ip数量有限,所以经常存在多台主机域名对应同一ip的情况,这时就可以用server_name对应用户请求中的主机域名

    用server块定义虚拟主机,这样nginx就能以不同方式处理不同域名的http请求了

    语法: server_name name[...];
    配置块: server

    默认: server_name "";
    配置块: serverserver_name后可以跟多个主机名称,如server_name www.testweb.com 、download.testweb.com;。
    在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的server_name进行匹配,以此决定到底由哪一个server块来处理这个请求。有可能一个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$。
    5)最后的最后匹配部分匹配的,部分匹配的匹配到之后还要向后查询,后面不匹配才匹配此项,后面匹配就匹配后面的。前面的4项匹配之后直接处理,不会再匹配后面的。

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

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

    如果server_name后跟着空字符串(如server_name"";),那么表示匹配没有Host这个HTTP头部的请求。
    注意:Nginx正是使用server_name配置项针对特定Host域名的请求提供不同的服务,以此实现虚拟主机功能。

    2)location

    location尝试用用户请求的URI来匹配表达式,匹配则就选择location{}块来处理请求

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

    下面介绍下匹配的规则:

    =:精确匹配

    ~:大小写敏感

    ~*:忽略大小写

    ^~:前缀匹配

    @:内部请求之间的重定向

    正则:如

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

    /:匹配所有请求,如

    location  / {
      # /可以匹配所有请求
            …
    }

    2. 文件路径的定义

    1)以root方式设置资源路径

    语法: root path;
    默认: root html;
    配置块: http、server、location、if

    注意:当一个请求匹配多个location时,实际请求会被第一个location处理

    例:

    location /download/ {
            root optwebhtml;
    }

    在上面的配置中,如果有一个请求的URI是/download/index/test.html,那么Web服务器将会返回服务器上optwebhtml/download/index/test.html文件的内容。

    2)以alias方式设置资源路径

    语法: alias path;
    配置块: location

    例:

    location conf {
        alias usr/local/nginx/conf/;    
    }

    在上面的配置中,如果有一个请求的URI是/conf/nginx.conf,那么Web服务器将会返回服务器上usr/local/nginx/conf/nginx.conf

    如果用root设置,如下表示:

    location conf {
        root usr/local/nginx/;         
    }

    alias后面还可以添加正则表达式,例如:

    location ~ ^/test/(w+).(w+)$ {
    alias usrlocal/nginx/$2/$1.$2;
    }

    这样,请求在访问/test/nginx.conf时,Nginx会返回usr/local/nginx/conf/nginx.conf文件中的内容(其中,$1代表正则匹配的第一个参数,$2代表正则匹配的第二个参数)。

    3)访问首页

    语法: index file...;
    默认: index index.html;
    配置块: http、server、location

    例如:

    location  {    
    root path; index index.html htmlindex.php
    /index.php; }

    接收到请求后,Nginx首先会尝试访问path/index.php文件,如果可以访问,就直接返回文件内容结束请求,否则再试图返回path/htmlindex.php文件的内容,依此类推。

  • 相关阅读:
    bzoj 4012: [HNOI2015]开店
    POJ 1054 The Troublesome Frog
    POJ 3171 Cleaning Shifts
    POJ 3411 Paid Roads
    POJ 3045 Cow Acrobats
    POJ 1742 Coins
    POJ 3181 Dollar Dayz
    POJ 3040 Allowance
    POJ 3666 Making the Grade
    洛谷 P3657 [USACO17FEB]Why Did the Cow Cross the Road II P
  • 原文地址:https://www.cnblogs.com/gengsc/p/6875123.html
Copyright © 2011-2022 走看看