Nginx配置入门(三):用HTTP核心模块配置静态Web服务器

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

静态Web服务器的主要功能由ngx_http_core_module模块实现,当然,一个完整的静态Web服务器还有许多功能是由其他HTTP模块实现。

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

}

所有的HTTP配置项都必须直属于http块、location块、upstream块或if块等。

1 虚拟主机与请求的分发

在nginx.conf中可以按照server_name并通过server块来定义虚拟主机,每个server块就是一个虚拟主机,它只处理与之对应主机域名请求。这样,一台服务器上的Nginx就能以不同的方式处理访问不同主机域名的HTTP请求了。
(1) 监听端口
语法 :listen address:port [default_server | [backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ipv6only=[on|off] | ssl ]];
默认 :listen 80;
配置块 :server;
listen参数决定Nginx服务器如何监听端口。在ip地址和端口后,还可以添加其他参数,例如:

listen 443 default_server ssl;
listen 127.0.0.1 accept_filter=dataready backlog=1024;
  • default_server:将所在的server块作为整个Web服务的默认server块。当一个请求无法匹配配置文件中的所有主机域名时,就会选择默认的虚拟主机。
  • backlog =num:表示TCP中backlog队列的大小,默认为-1.
  • defered:设置该参数后,若用户发起建立连接请求,并且完成了TCP三次握手,内核也不会为了这次的连接调度worker进程来处理,只有用户真的发送请求数据时,内核才会唤醒worker进程处理这个连接。这个参数适用于大并发的情况,它减轻了worker进程的负担。
  • accept_filter:设置过滤器
  • bind:绑定端口/地址对。
  • ssl:在当前监听的端口上建立的连接必须基于SSL协议。

(2) 主机名称
语法 :server_name name [...];
默认 :server_name "";
配置块 :server;
在开始处理一个HTTP请求时,Nginx会取出header头中的Host,与每个server中的server_name进行匹配,以决定到底由哪一个server块来处理这个请求。有可能一个Host与多个server_name都匹配,这时就会根据匹配优先级来选择实际处理的server块。
优先级如下:

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

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

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

(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适应散列表来存储server_name。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会影响散列表的冲突率。

(5) 重定向主机名称的处理
语法 :server_name_in_redirect on | off;
默认 :server_name_in_redirect on ;
配置块 :http、server或者location;
配合server_name使用,打开时,表示在重定向请求时会使用server_name里配置的第一个主机名代替原先请求中的Host头部;关闭时,维持原请求本身的Host头部。

(6) location
语法 :location [=|~|~*|^~|@] /uri/{...}
配置块 :server;
匹配规则:

  • =表示把URI作为字符串,以便与参数中的uri做完全匹配
  • ~表示匹配URI时是字母大小写敏感的
  • ~*表示匹配URI时忽略字母大小写问题
  • ^~表示匹配URI时只需要其前半部分与uri参数匹配即可
  • @表示仅用于Nginx服务内部请求之间的重定向
location  =  / {
    # 只有当用户请求是/ 时,才会使用该location下的配置
}
location  ^~ /images/ {
    # 以/images/开头的请求都会匹配上
}
location  ~*  \.(gif|jpg|jpeg)$ {
    # 匹配以.gif .jpg .jpeg结尾的请求
}
location   / {
    # 可以匹配所有请求
}

2 文件路径的定义

(1) 以root方式设置资源路径
语法 :root path;
默认 :root html;
配置块 :http、server、location、if;

location   /download/ {
    root /opt/web/html/;
}

请求URI是download/index/test.html,web服务器将会返回/opt/web/html/download/index/test.html

(2) 以alias方式设置资源路径
语法 :alias path;
配置块 :location;
与root的不用点在于location后的uri参数。下面两个配置是等价的:

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

(3) 访问首页
语法 :index file ...;
默认 :index index.html;
配置块 :http、server、location;

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

(4) 根据HTTP返回码重定向页面
语法 :error_page code[code...] [=|=answer-code] uri|@named_location;
配置块 :http、server、location、if;

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错误码还是与原来的相同。可以通过“=”来更改返回的错误码,例如:

error_page    404    =200            /empty.gif;
error_page    404    =403            /forbidden.gif;

也可以不指定确切的返回错误码,而是由重定向后实际处理的真实结果来决定,这时,只要把“=”后面的错误码去掉即可,例如:

error_page    404    =   /empty.gif;

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

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;

(6) try_files
语法 :try_files path1 [path2] uri;
配置块 :server、location;
尝试按照顺序访问每一个path,如果可以有效读取,就直接向用户返回这个path对应的文件,结束请求,否则继续向下访问。如果所有的path都找不到有效的文件,就重定向到最后的参数uri上。

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中。如果包体大小超过了client_body_buffer_size 设置的值,包体还是会写入到磁盘文件中。

(3) 存储HTTP头部的内存buffer大小
语法 :client_header_buffer_size size;
默认 :client_header_buffer_size 1k;
配置块 :http、server;
定义了正常情况下Nginx接收用户请求中HTTP header部分时分配的内存buffer大小。有时,请求中的HTTP header部分可能超过这个大小,这时large_client_header_buffers 定义的buffer将会生效。

(4) 存储超大HTTP头部的内存buffer大小
语法 :large_client_header_buffers number size;
默认 :large_client_header_buffers 4 8k;
配置块 :http、server;
定义了Nginx接收一个超大HTTP头部请求的buffer个数和每个buffer的大小。

(5) 存储HTTP包体的内存buffer大小
语法 :client_body_buffer_size size;
默认 :client_body_buffer_size 8k/16k;
配置块 :http、server、location;

(6) HTTP包体的临时存放目录
语法 :client_body_temp_path dir-path[level[level[level]]];
默认 :client_body_temp_path client_body_temp;
配置块 :http、server、location;

(7) connection_pool_size
语法 :connection_pool_size size;
默认 :connection_pool_size 256;
配置块 :http、server;
Nginx对于每个建立成功的TCP连接都会预先分配一个内存池,上面的size配置项将制定这个内存池的初始大小,用于减少内核对于小块内存的分配次数。需慎重设置,因为更大的size会使服务器的内存消耗的更多,而更小的size会引发更多的内存分配次数。

(8) request_pool_size
语法 :connection_pool_size size;
默认 :connection_pool_size 4k;
配置块 :http、server;

4 网络连接的设置

(1) 读取HTTP头部的超时时间
语法 :client_header_timeout time;
默认 :client_header_timeout 60;
配置块 :http、server、location;
客户端与服务器建立连接后将开始接收HTTP头部,在这个过程中,如果超过一定的时间间隔还没有读取到客户端发来的字节,则认为超时,并向客户端返回"Request timed out"响应。

(2) 读取HTTP包体的超时时间
语法 :client_body_timeout time;
默认 :client_body_timeout 60;
配置块 :http、server、location;
与配置client_header_timeout 类似,只不过这个超时时间只在读取HTTP包体时才有效。

(3) 发送响应的超时时间
语法 :send_timeout time;
默认 :send_timeout 60;
配置块 :http、server、location;

(4) reset_timeout_connection
语法 :reset_timeout_connection on | off;
默认 :reset_timeout_connection off;
配置块 :http、server、location;

(5) lingering_close
语法 :lingering_close off | on | always;
默认 :lingering_close on ;
配置块 :http、server、location;

(6) lingering_time
语法 :lingering_time time;
默认 :lingering_time 30s;
配置块 :http、server、location;

(7) lingering_timeout
语法 :lingering_timeout time;
默认 :lingering_timeout 5s;
配置块 :http、server、location;

(8) 对某些浏览器禁用keepalive功能
语法 :keepalive_disable [msie6 | safari | none];
默认 :keepalive_disable msie6 safari ;
配置块 :http、server、location;

(9) keepalive超时时间
语法 :keepalive_timeout time;
默认 :keepalive_timeout 75;
配置块 :http、server、location;

(10) 一个keepalive长连接上允许承载的请求最大数
语法 :keepalive_requests n;
默认 :keepalive_requests 100;
配置块 :http、serve、locationr;

(11) tcp_nodelay
语法 :tcp_nodelay on | off;
默认 :tcp_nodelay on ;
配置块 :http、server、location;

(12) tcp_nopush
语法 :tcp_nopush on | off;
默认 :tcp_nopush off;
配置块 :http、server、location;
打开后,将会在发送响应时把整个响应包头放到一个TCP包中发送。

5 MIME类型的设置

(1) MIME type与文件扩展的映射
语法 :types {...};
配置块 :http、server、location;

(2) 默认MIME type
语法 :default_type MIME_type;
默认 :default_type text/plain;
配置块 :http、server、location;

(3) types_hash_bucket_size
语法 :types_hash_bucket_size size;
默认 :types_hash_bucket_size 32|64|128;
配置块 :http、server、location;

(4) types_hash_max_size
语法 :types_hash_max_size size;
默认 :types_hash_max_size 1024;
配置块 :http、server、location;

6 对客户端请求的限制

(1) 按HTTP方法名限制用户请求
语法 :limit_except method ...{...};
配置块 :location;
Nginx通过limit_except后面指定的方法类型名来限制用户请求。方法名可取值:GET、HEAD、POST、PUT、DELETE、MKCOL、COPY、MOVE、OPTIONS等,例如:

limit_except GET {
    allow 192.168.1.0/32;
    deny  all;
}

(2) HTTP请求包体的最大值
语法 :client_max_body_size size;
默认 :client_max_body_size 1m;
配置块 :http、server、location;
浏览器在发送含有较大HTTP包体的请求时,其头部会有一个Content-Length字段,client_max_body_size 是用来限制Content-Length所示值的大小的。

(3) 对请求的限速
语法 :limit_rate speed;
默认 :limit_rate 0;
配置块 :http、server、location、if;
此配置是对客户端请求限制每秒传输的字节数。默认参数为0,表示不限速。

(4) limit_rate_after
语法 :limit_rate_after time;
默认 :limit_rate_after 1m;
配置块 :http、server、location、if;

7 文件操作的优化

(1) sendfile系统调用
语法 :sendfile on| off;
默认 :sendfile off;
配置块 :http、server、location;

(2) AIO系统调用
语法 :aio on| off;
默认 :laio off;
配置块 :http、server、location;

(3) directio
语法 :directio size | off;
默认 :directio off;
配置块 :http、server、location;

(4) directio_alignment
语法 :directio_alignment size;
默认 :directio_alignment 512;
配置块 :http、server、location;

(5) 打开文件缓存
语法 :open_file_cache max=N[inactive=time] | off;
默认 :open_file_cache off;
配置块 :http、server、location;

(6) 是否缓存打开文件的错误信息
语法 :open_file_cache_errors on | off;
默认 :open_file_cache_errors off;
配置块 :http、server、location;

(7) 不被淘汰的最小访问次数
语法 :open_file_cache_min_uses number;
默认 :open_file_cache_min_uses 1;
配置块 :http、server、location;

(8) 检查缓存中元素有效性的频率
语法 :open_file_cache_valid time;
默认 :open_file_cache_valid 60s;
配置块 :http、server、location;

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

(1) 忽略不合法的HTTP头部
语法 :ignore_invalid_headers on| off;
默认 :ignore_invalid_headers on;
配置块 :http、server;

(2) HTTP头部是否允许下划线
语法 :underscores_in_headers on| off;
默认 :underscores_in_headers off;
配置块 :http、server;
默认关闭,便是HTTP头部的名称中不允许带下划线“_”。

(3) 对if_modified_since头部的处理策略
语法 :if_modified_since [off | exact | before];
默认 :if_modified_since exact ;
配置块 :http、server、location;

(4) 文件未找到时是否记录到error日志
语法 :log_not_found on | off;
默认 :log_not_found on ;
配置块 :http、server、location;

(5) merge_slashes
语法 :merge_slashes on| off;
默认 :merge_slashes on ;
配置块 :http、server、location;
是否合并相邻的“/”,例如,//test///a.txt,在配置为on时,会将其匹配为/test/a.txt

(6) DNS解析地址
语法 :resolver address...;
配置块 :http、server、location;

(7) DNS解析的超时时间
语法 :resolver_timeout time;
默认 :resolver_timeout 30s;
配置块 :http、server、location;

(8) 返回错误页面时是否在server中注明Nginx版本
语法 :server_tokens on| off;
默认 :server_tokens on;
配置块 :http、server、location;

你可能感兴趣的:(Nginx配置入门(三):用HTTP核心模块配置静态Web服务器)