• 用HTTP核心模块配置一个静态Web服务器


    1.预备知识

    静态 Web 服务器的主要功能由 ngx_http_core_module 模块( HTTP 框架的主要成员)实现,
    当然,一个完整的静态 Web 服务器还有许多功能是由其他的 HTTP 模块实现的。
    所有的 HTTP 配置项都必须直属于 http 块、 server 块、 location 块、 upstream 块或 if 块等
    HTTP 配置项自然必须全部在 http{} 块之内,这里的 直属于 是指配置项直接所属的大括号
    对应的配置块),同时,在描述每个配置项的功能时,会说明它可以在上述的哪个块中存
    在,因为有些配置项可以任意地出现在某一个块中,而有些配置项只能出现在特定的块中。
    Nginx 为配置一个完整的静态 Web 服务器提供了非常多的功能,下面会把这些配置项分为
    以下 8 类进行详述:
    虚拟主机与请求的分发
    文件路径的定义
    内存及磁盘资源的分配
    网络连接的设置
    MIME类型的设置
    对客户端请求的限制
    文件操作的优化
    对客户端请求
    这种划分只是为了帮助大家从功能上理解这些配置项

    2虚拟主机与请求的分发

    由于 IP 地址的数量有限,因此经常存在多个主机域名对应着同一个 IP 地址的情况,这时
    nginx.conf 中就可以按照 server_name (对应用户请求中的主机域名)并通过 server 块来定义
    虚拟主机,每个 server 块就是一个虚拟主机,它只处理与之相对应的主机域名请求。这样,
    一台服务器上的 Nginx 就能以不同的方式处理访问不同主机域名的 HTTP 请求了

    (1)监听端口

    1. listen address:port[default(deprecated in 0.8.21)|default_server|
    2. [backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|
    3. bind|ipv6only=[on|off]|ssl]]

    解释

    1.address:port  :

    listen 127.0.0.1:8000;
    listen 127.0.0.1; # 注意:不加端口时,默认监听
    80 端口
    2.使用ipv6
    listen [::]:8000;
    listen [fe80::1];
    listen [:::a8c9:1234]:80;
    3 default  default_server
    将所在的server块作为整个Web服务的默认server块。如果没有设置这个参数,
    那么将会以在nginx.conf中找到的第一个server块作为默认server块。为什么需要默认虚拟主机
    呢?当一个请求无法匹配配置文件中的所有主机域名时,就会选用默认的虚拟主机
    4  backlog=num
    表示TCP中backlog队列的大小。默认为–1表示不予设置。在TCP建 立三次握手过程中,进程还没有开始处理监听句柄,这时backlog队列将会放置这些新连接。 可如果backlog队列已满,还有新的客户端试图通过三次握手建立TCP连接,这时客户端将会 建立连接失败
    5.
    rcvbuf=size:设置监听句柄的SO_RCVBUF参数。
    ·
    sndbuf=size:设置监听句柄的SO_SNDBUF参数。
    ·
    accept_filter:设置accept过滤器,只对FreeBSD操作系统有用。

    deferred

    在设置该参数后,若用户发起建立连接请求,并且完成了TCP的三次握手, 内核也不会为了这次的连接调度worker进程来处理,只有用户真的发送请求数据时(内核已 经在网卡中收到请求数据包),内核才会唤醒worker进程处理这个连接。这个参数适用于大 并发的情况下,它减轻了worker进程的负担。当请求数据来临时,worker进程才会开始处理 这个连接。只有确认上面所说的应用场景符合自己的业务需求时,才可以使用deferred配 置

    7 bind

    绑定当前端口/地址对,如127.0.0.1:8000。只有同时对一个端口监听多个地址时
    才会生效
    8.ssl
    在当前监听的端口上建立的连接必须基于SSL协议。
    ssl:

    SL协议的三个特性

    ① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密;

    ② 鉴别:可选的客户端认证,和强制的服务器端认证;

    ③ 完整性:传送的消息包括消息完整性检查(使用MAC)。

    (2) server_name 

    1. 语法: server_name name[...];
    2. 默认: server_name"";
    3. 配置块 server
    server_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$
    如果 Host 与所有的 server_name 都不匹配,这时将会按下列顺序选 择处理的server 块。
    1. 1)优先选择在listen配置项后加入[default|default_server]的server块。
    2. 2)找到匹配listen端口的第一个server块
    3) server_names_hash_bucket_size  server_names_hash_max_size
    1. 语法: server_names_hash_bucket_size size;
    2. 默认: server_names_hash_bucket_size 32|64|128;
    3. 配置块: http、server、location
    4. 语法: server_names_hash_max_size size;
    5. 默认: server_names_hash_max_size 512;
    6. 配置块: http、server、location
    为了提高快速寻找到相应 server name 的能力, Nginx 使用散列表来存储 server_name
    server_names_hash_bucket_size 设置了每个散列桶占用的内存大小。  
    erver_names_hash_max_size 会影响散列表的冲突率。 server_names_hash_max_size 越大,
    消耗的内存就越多,但散列 key 的冲突率则会降低,检索速度也更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 不直接处理用户请
    注意
    1.location 是有顺序的,当一个请求有可能匹配多个 location 时,实际上这个请求会
    被第一个 location 处理
    2.在以上各种匹配方式中,都只能表达为 如果匹配 ... ...” 。如果需要表达 如果不匹配 ...
    ...” ,就很难直接做到。有一种解决方法是在最后一个 location中使用/ 作为参数,它会匹配
    所有的 HTTP 请求,这样就可以表示如果不能匹配前面的所有 location ,则由 “/” 这个 location
    理。例如
    1. location / {
    2. # /可以匹配所有请求
    3. }

    文件路径的定义

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

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

    例子:

    1. location /download/ {
    2. root optwebhtml;
    3. }
    在上面的配置中,如果有一个请求的 URI /download/index/test.html ,那么 Web 服务器将
    会返回服务器上 opt web html download/index/test.html 文件的内容。

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

    1. 语法: alias path;
    2. 配置块: location
    alias 也是用来设置文件资源路径的,它与 root 的不同点主要在于如何解读紧跟 location
    面的 uri 参数,这将会致使 alias root 以不同的方式将用户请求映射到真正的磁盘文件上。例
    如,如果有一个请求的 URI /conf/nginx.conf ,而用户实际想访问的文件:
    1. location conf {
    2. alias usr/local/nginx/conf/;
    3. }
    如果用 root 设置,那么语句如下所示:
    1. location conf {
    2. root usr/local/nginx/;
    3. }
    使用 alias 时,在 URI 向实际文件路径的映射过程中,已经把 location后配置的/conf这部分
    字符串丢弃掉,因此, /conf/nginx.conf 请求将根据 alias path 映射为 path/nginx.conf root 则不
    然,它会根据完整的 URI 请求来映射,因此, /conf/nginx.conf 请求会根据 root path 映射为
    path/conf/nginx.conf 。这也是 root 可以放置到 http server location if 块中,而 alias 只能放置
    location 块中的原因

    (3)访问首页

    1. 语法: index file...;
    2. 默认: index index.html;
    3. 配置块: http、server、location
    有时,访问站点时的 URI / ,这时一般是返回网站的首页,而这与 root alias 都不同。
    这里用 ngx_http_index_module 模块提供的 index 配置实现。 index 后可以跟多个文件参数, Nginx
    将会按照顺序来访问这些文件,例如:
    1. location {
    2. root path;
    3. index index.html htmlindex.php /index.php;
    4. }
    接收到请求后, Nginx 首先会尝试访问 path/index.php 文件,如果可以访问,就直接返回文
    件内容结束请求,否则再试图返回 path html index.php 文件的内容,依此类推。

    (4)根据HTTP返回码重定向页面

    1. 语法: error_page code[code...][=|=answer-code]uri|@named_location
    2. 配置块: http、server、location、if
    解释:
    1.
    当对于某个请求返回错误码时,如果匹配上了 error_page 中设置的 code ,则重定向到新
    URI 中。例如:
    1. error_page 404 404.html;
    2. error_page 502 503 504 50x.html;
    3. error_page 403 http://example.com/forbidden.html
    4. ;
    5. error_page 404 = @fetch;

    2.虽然重定向了URI,但返回的HTTP错误码还是与原来的相同。用户可以通 过“=”来更改返回的错误码,例如

    1. error_page 404 =200 empty.gif;
    2. error_page 404 =403 forbidden.gif;

    3. 如果不想修改URI,只是想让这样的请求重定向到另一个location中进行处理,那么可以 这样设

    1. location / (
    2. error_page 404 @fallback;
    3. )
    4. location @fallback (
    5. proxy_pass http://backend
    6. ;
    7. )

    (5)是否允许递归使用error_page

    1. 语法: recursive_error_pages[on|off];
    2. 默认: recursive_error_pages off;
    3. 配置块: http、server、location
    (6) try_files
    1. 语法: try_files path1[path2]uri;
    2. 配置块: server、location
    try_files 后要跟若干路径,如 path1 path2... ,而且最后必须要有 uri 参数,意义如下:尝试
    按照顺序访问每一个 path ,如果可以有效地读取,就直接向用户返回这个 path 对应的文件结
    束请求,否则继续向下访问。如果所有的 path 都找不到有效的文件,就重定向到最后的参数
    uri 上。因此,最后这个参数 uri 必须存在,而且它应该是可以有效重定向的
    1. try_files systemmaintenance.html $uri $uri/index.html $uri.html @other;
    2. location @other {
    3. proxy_pass http://backend
    4. ;
    5. }
    上面这段代码表示如果前面的路径,如 system maintenance.html 等,都找不到,就会反向
    代理到 http://backend 服务上。还可以用指定错误码的方式与 error_page 配合使用,例如
    1. location {
    2. try_files $uri $uri /error.phpc=404 =404;
    3. }

  • 相关阅读:
    GPT-3被超越?解读低能耗、高性能的GlaM模型
    C语言实现用弦截法求 f(x)=x^3-5*x^2+16*x-80=0 的根
    安全性归约(安全性定义 - 2)
    SpringBoot如何优雅的实现参数验证
    十、JVM常用启动参数
    python、pyqt5实现人脸检测、性别和年龄预测
    汽车之家车型_车系_配置参数数据抓取
    Mac brew 安装与使用
    计算机专业课笔记集中整理贴(持续更新中。。。)
    解决table表格td中文字过长自动换行问题
  • 原文地址:https://blog.csdn.net/qq_62309585/article/details/128105653