编辑
2020-08-31
编程
00

目录

1. 前言
2. 8类配置项
2.1 虚拟主机与请求的分发
(1)监听端口
(2)主机名称
(3)servernameshashbucketsize
(4)servernameshashmaxsize
(6)location
2.2 文件路径的定义
(1)以root方式设置资源路径
(2)以alias方式设置资源路径
(3)访问首页
(4)根据HTTP返回码重定向页面
(5)是否允许递归使用error_page
(6)try_files
2.3 内存及磁盘资源的分配
(1)HTTP包体只存储到磁盘文件中
(2)HTTP包体尽量写入到一个内存buffer中
(3)存储HTTP头部的内存buffer大小
(4)存储超大HTTP头部的内存buffer大小
(5)存储HTTP包体的内存buffer大小
(6)HTTP包体的临时存放目录
2.4 网络连接的设置
2.5 MIME类型的设置
2.6 对客户端请求的限制
2.7 文件操作的优化
2.8 对客户端请求的特殊处理

1. 前言

静态Web服务器的主要功能由ngx_http_core_module模块(HTTP框架的主要成员)实现

除了基本配置项外,一个典型的静态Web服务器还会包含多个server块和location块

nginx
http { gzip on; upstream { ... } ... server { listen localhost:80; location /webstatic { if ...{ ... } root /opt/webresource; ... } } }

Nginx为配置一个完整的静态Web服务器提供了非常多的功能,大致分为一下8类

  • 虚拟主机与请求的分发
  • 文件路径的定义
  • 内存及磁盘资源的分配
  • 网络连接的设置
  • MIME类型的设置
  • 对客户端请求的限制
  • 文件操作的优化
  • 对客户端请求的特殊处理

2. 8类配置项

2.1 虚拟主机与请求的分发

经常存在多个主机域名对应着同一个IP地址的情况,nginx.conf中 可以按照 server_name 来定义虚拟主机,处理不同域名的请求

(1)监听端口

语法:listen address

default(deprecated in 0.8.21)|default_server|[backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|bind|ipv6only=[on|off]|ssl]
;

默认:listen 80;

配置块:server

  • listen 参数决定 nginx 服务如何监听端口。
  • listen 后可以只家 IP 地址,端口或主机名。
nginx
listen 127.0.0.1:8000; listen 127.0.0.1; # 不加端口时,默认监听80端口 listen 8000; listen *:8000; listen localhost:8000;
  • 使用 IPv6 地址,可以这样使用:
nginx
listen [::]:8000; listen [fe80::1]; listen [LLLa8c9:1234]:80
  • 在地址和端口后,还可以加上其他参数,例如:
nginx
listen 443 default_server ssl; listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;
  • listen 参数的含义:
    • default:将所在的server块作为整个Web服务的默认server块。
      • 如果没有设置这个参数,那么将会以在nginx.conf中找到的第一个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进程才会开始处理这个连接
    • bind:绑定当前端口/地址对,如:127.0.0.1:8080
      • 只有同时对一个端口监听多个地址时才会生效。
    • ssl : 在当前监听的端口上建立的连接必须基于SSL协议。

(2)主机名称

语法:server_name name[...];

默认:server_name"";

配置块:server

  • server_name后可以跟多个主机名称
nginx
server_name www.baidu.com www.taobao.com
  • nginx 处理一个 http 请求时,会从 header 头中取出 host,然后与每个 server 中的 server_name 进行匹配

  • 有可能一个 host 与多个 server 块钟的 server_name 都匹配,优先级如下:

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

    (这个优先级是带通配符散列表的实现依据)

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

    • 优先选择在listen配置项后加入[default|default_server]的server块
    • 找到匹配listen端口的第一个server块
  • server_name后跟着空字符串(如server_name"";),那么表示匹配没有Host这个HTTP头部的请求。

注意:Nginx正是使用server_name配置项针对特定Host域名的请求提供不同的服务,以此实现虚拟主机功能。


(3)server_names_hash_bucket_size

语法:server_names_hash_bucket_size size;

默认:server_names_hash_bucket_size 32|64|128;

配置块:http、server、location

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

(4)server_names_hash_max_size

语法:server_names_hash_max_size size;

默认:server_names_hash_max_size 512;

配置块:http、server、location

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

(5)重定向主机名称的处理

语法:server_name_in_redirect on|off;

默认:server_name_in_redirect on;

配置块:http、server或者location

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

(6)location

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

配置块:server

  • location 会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择location{}块中的配置来处理用户请求

  • 匹配规则:

    • = 表示把URI作为字符串,以便与参数中的uri做完全匹配,如
    nginx
    location = / { # 只有用户请求是 / 时,才会使用该 location 下的配置 }
    • ~ 表示匹配URI时是字母大小写敏感的
    • ~* 表示匹配URI时忽略字母大小写问题
    • ^~ 表示匹配URI时只需要其前半部分与uri参数匹配即可,如:
    nginx
    location ^~ /images/ { # 以 /images/ 开始的请求都会匹配上 }
    • @表示仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求。
    nginx
    location /index/ { error_page 404 @index_error; } location @index_error { ..... } #以 /index/ 开头的请求,如果链接的状态为 404。则会匹配到 @index_error 这条规则上。
    • uri 参数钟是可以使用正则表达式的,如:
    nginx
    location ~* \.(gif|jpg|jpeg)$ { # 匹配以 .gif .jpg .jpeg 结尾的请求 }
    • location是有顺序的,当一个请求有可能匹配多个location时,实际上这个请求会被第一个location处理
    • 最后一个location中使用/作为参数,它会匹配所有的HTTP请求,这样就可以表示如果不能匹配前面的所有location,则由“/”这个location处理

2.2 文件路径的定义

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

语法:root path;

默认:root html;

配置块:http、server、location、if

  • 定义资源文件相对于HTTP请求的根目录
nginx
location /download/ { root /opt/web/html/; } # 如果有一个请求的URI是/download/index/test.html,那么Web服务器将会返回服务器上 /opt/web/html/download/index/test.html 文件

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

语法:alias path;

配置块:location

  • alias 也是用来设置文件资源路径的

  • 与root的不同点主要在于如何解读紧跟location后面的uri参数

    • alias 在映射路径时,会把 location 后面配置的字符串丢弃掉,root 则不会
    nginx
    location /conf { alias /usr/local/nginx/conf/; }
    nginx
    location /conf { root /usr/local/nginx/; }
    • 以上示例请求为 /conf/nginx.conf 时,都是请求到 /usr/local/nginx/conf/nginx.conf
  • alias 还可以添加正则表达式

    nginx
    location ~ ^/test/(\w+)\.(w+)$ { alias /usr/local/nginx/$2/$1.$2; # 这样,请求在访问/test/nginx.conf时,Nginx会返回/usr/local/nginx/conf/nginx.conf文件中的内容 }

(3)访问首页

语法:index file...;

默认:index index.html;

配置块:http、server、location

  • 这里用ngx_http_index_module模块提供的index配置实现

  • index后可以跟多个文件参数,Nginx将会按照顺序来访问这些文件

    nginx
    location / { root path; index /index.html /html/index.php /index.php; # Nginx首先会尝试访问 path/index.php 文件 # 如果不能访问试图返回 path/html/index.php 文件的内容,依此类推 }

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

语法:error_page code[code...][=|=answer-code]uri|@named_location

配置块:http、server、location、if

  • 对于某个请求返回错误码时,如果匹配上了error_page中设置的code,则重定向到新的URI中。

    nginx
    error_page 404 /404.html; error_page 502 503 504 /50x.html; error_page 403 http://example.com/forbidden.html; error_page 404 = @fetch;
  • 虽然重定向了URI,但是 HTTP 错误码还是与原来的相同。

  • 可以通过 “=” 修改错误码。

    nginx
    error_page 404 =200 /emty.gif; error_page 404 =403 /forbidden.gif;
  • 还可以不指定确切的返回错误码,而是由重定向后实际处理的真实结果来决定(只写 “=”)

    nginx
    error_page 404 = /empty.gif;
  • 不想修改uri,可以把请求重定向到另一个 location 中

    nginx
    location / { error_page 404 @fallback; } location @fallback { proxy_pass http://backend; }

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

语法:recursive_error_pages[on|off];

默认:recursive_error_pages off;

配置块:http、server、location

  • 确定是否允许递归地定义error_page

(6)try_files

语法:try_files path1[path2]uri;

配置块:server、location

  • try_files 后面跟至少一个路径,而且必须有 uri 参数

  • 尝试按照顺序访问每一个 path,如果可以读取,返回对应文件,否则继续向下读取。如果所有的 path 都找不到有效文件,则重定向到最后的参数 uri 上

    nginx
    try_files /system/maintenance.html $uri $uri/index.html $uri.html @other; location @other { proxy_pass http://backend; } # 上面这段代码表示如果前面的路径,如/system/maintenance.html等,都找不到,就会反向代理到http://backend服务上
  • 可以使用指定错误码的方式与 error_page 配合使用

    nginx
    location / { try_files $uri $uri/ /error.phpc=404 =404; }

2.3 内存及磁盘资源的分配

(1)HTTP包体只存储到磁盘文件中

语法:client_body_in_file_only on|clean|off;

默认:client_body_in_file_only off;

配置块:http、server、location

  • 非 off 时, 用户请求中的 HTTP 包体都会被存储到磁盘文件钟,直到请求结束
  • 为 on 时,则文件不会呗删除(一般用于调试、定位问题)
  • 为 clean 时,则会在请求结束时删除该文件

(2)HTTP包体尽量写入到一个内存buffer中

语法:client_body_in_single_buffer on|off;

默认:client_body_in_single_buffer off;

配置块:http、server、location

  • 用户请求中的HTTP包体一律存储到内存buffer中。
  • 如果 HTTP 包体的大小超过了下面client_body_buffer_size设置的值,包体还是会写入到磁盘文件中

(3)存储HTTP头部的内存buffer大小

语法:client_header_buffer_size size;

默认:client_header_buffer_size 1k;

配置块:http、server

  • 正常情况下Nginx接收用户请求中HTTP header部分(包括HTTP行和HTTP头部)时分配的内存buffer大小
  • 当请求中的 HTTP header 部分超过这个大小时 large_client_header_buffers 定义的 buffer 将会生效。

(4)存储超大HTTP头部的内存buffer大小

语法:large_client_header_buffers number size;

默认:large_client_header_buffers 48k;

配置块:http、server

  • large_client_header_buffers 定义了Nginx接收一个超大 HTTP 头部请求的 buffer 个数和每个buffer的大小。
  • 如果HTTP请求行(如GET/index HTTP/1.1)的大小超过上面的单个buffer,则返回"Request URI too large"(414)。
  • 请求中一般会有许多header,每一个header的大小也不能超过单个buffer的大小,否则会返回"Badrequest"(400)。
  • 请求行和请求头部的总和也不可以超过buffer个数*buffer大小

(5)存储HTTP包体的内存buffer大小

语法:client_body_buffer_size size;

默认:client_body_buffer_size 8k/16k;

配置块:http、server、location

  • 定义了Nginx接收HTTP包体的内存缓冲区大小。
  • HTTP包体会先接收到指定的这块缓存中,之后才决定是否写入磁盘。
  • 注意:如果用户请求中含有HTTP头部Content-Length,并且其标识的长度小于定义的buffer大小,那么Nginx会自动降低本次请求所使用的内存buffer,以降低内存消耗。

(6)HTTP包体的临时存放目录

语法:client_body_temp_path dir-path[level1[level2[level3]]]

默认:client_body_temp_path client_body_temp;

配置块:http、server、location

2.4 网络连接的设置

2.5 MIME类型的设置

2.6 对客户端请求的限制

2.7 文件操作的优化

2.8 对客户端请求的特殊处理

本文作者:Yui_HTT

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!