Nginx配置静态Web服务器(使用ngx_http_core_module模块)

前言:

静态Web服务器的主要功能由 ngx_http_core_module 模块(HTTP框架的主要成员)实现。当然一个完整的静态Web服务器还需要许多其他的HTTP模块实现,例如 ngx_http_gzip_filter_module 、 ngx_http_image_filter_module 等,对于实现一个基本功能的静态Web服务器,ngx_http_core_module 的配置项基本就可以满足了。

Nginx为配置一个完整的静态Web服务器,可将主要的配置项分为以下 8 类:

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

【根据HTTP请求中的HOST字段,将请求分发到对应的服务器虚拟主机上,即选择一个匹配的server。】

由于IP地址的数量有限,因此经常存在多个主机域名对应着同一个IP地址的情况,这时在 nginx.conf 中就可以按照 server_name 并通过 server 块来定义虚拟主机了,每个server块就是一个虚拟主机,它只处理与之对应的主机域名请求。

(重点)Tips:一台服务器上,一个IP可以对应多个域名,通过HTTP请求中的HOST去索引主机名,找到对应的主机。

(1) 监听端口:

listen后可接IP地址、主机名、端口号或其组合。
注意:不加端口时,默认监听80端口

listen 192.254.1.16;
listen 192.254.1.16:80;
listen localhost;
listen localhost:80;

配置块:server

(2) server_name接域名、主机名:

server_name localhost;
server_name www.baidu.com;
server_name www.baidu.com, www.sina.com.cn; # 可以同时接多个域名

配置块: server

在开始处理一个HTTP请求时,Nginx会取出HTTP头中的HOST字段,与每个server的每个server_name进行匹配(switch),以此决定由哪一个server块来处理这个请求。
如果HOST与多个server块的server_name都匹配(不会是完全匹配,而是带有通配符的模糊匹配),则根据下面的优先级来选择实际处理的server块:
字符串完全匹配 > 通配符在前 > 通配符在后 > 正则表达式匹配
(例:www.baidu.com > .baidu.com > www.baidu. > ~^.baidu.com$)

(3) 对server_name哈希查找的配置,以使查找更快速

server_names_hash_bucket_size 32;

(4) server_names_hash_max_size:

server_names_hash_max_size 512;

(5) 重定向主机名称的处理,默认打开

server_name_in_redirect on;
server_name_in_redirect off;

配置块:http、server、location

【重定向】就是通过各种方法将各种网络请求重新定个方向转到其他位置。
在使用on打开时,表示在重定向请求时会使用server_name里配置的第一个主机名代替原先请求中的HOST头部,而使用off关闭时,表示在重定向请求时使用请求本身的HOST头部。

(6) location匹配HTTP请求中的URI,表示服务器资源路径

location /;

配置块: server

小结:
关于虚拟主机请求与分发的主要配置项:

http {
	sever {
		listen 9000;
		server_name localhost;

		location / {
			
		}
	}

	server {
		listen 9002;
		server_name www.baidu.com;
	}
}

2. 文件路径的定义:

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

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

uri:     /download/index/text.html;
实际的:   /opt/web/html/download/index/text.html;

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

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

uri:    /conf/nginx.conf
实际的:  /usr/local/nginx/conf/nginx.conf 

(3) 访问首页:

当客户端的HTTP请求中的URI是“/”,这时一般需要返回网站的主页,这与root和alias方式都都不同(root和alias是访问站点的某个具体路径,例如 /download/ 、/conf/ 等,而访问主页是直接访问根目录 “/”)。
此时用 ngx_http_core_module 模块提供的index配置实现。官方的nginx.conf配置文件中的写法如下:

location / {
	root    html;
	index   index.html index.htm;
}

模板写法是:

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

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

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

error_page [code][URI];

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

error_page   404           /404.html;
error_page   502 503 504   /50x.html;
error_page   403           http://example.com/forbidden.html;

所有某些网站当你访问的资源在服务器上不存在时,浏览器显示的页面并不是简单的“404 Not Found”,而是一个花里胡哨的页面或者广告,那就是因为该网站对某些HTTP错误码进行了重定向,当出现错误后会重定向到一个特定的页面,例如下面这样:

在这里插入图片描述

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

recursive_error_pages  on;
recursive_error_pages  off;

(6) try_files:

try_files [path1][path2]uri;

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

用于配置 处理HTTP请求时,内存资源的配置:

server {
	client_body_in_file_only off;     # off/on/clean,默认off; on表示将HTTP请求中的包体存储到磁盘上,要建一个文件存储它,且HTTP请求结束后也不会删除,主要用于调试;clean表示HTTP请求结束从磁盘删除文件;
	client_body_in_single_buffer off;     # off/on, 默认off; 表示HTTP包体一律存放到内存中,超过buffer_size不存磁盘
	client_header_buffer_size 1k;     # Nginx要申请多大的内存去接收HTTP请求的header部分(包括请求行、请求头)
	large_client_header_buffers 48k;     # 接收超大HTTP请求头
	client_body_buffer_size 16k;     # 配置接收HTTP包体的内存缓冲区的大小,HTTP包体会先进入到这块内存,之后才决定是否写入磁盘
	client_body_temp_path [path];      # 如果HTTP包体较大,临时存放路径
	connection_pool_size 256;     # Nginx为每个建立成功的TCP连接预先分配一个内存池
	request_pool_size 4k;     # 为每个HTTP请求分配内存池
}

4. 网络连接的设置:

用于各种连接超时的设置:

server {
	client_header_timeout 60;
	client_body_timeout 60;
	send_timeout 60;
	reset_timeout_connection off | on;
	lingering_close on | off | always;
	lingering_time 30s;
	lingering_timeout 5s;
	keepalive_timeout 75;
	tcp_nodelay on | off; #确定对keepalive连接是否使用TCP_NODELAY选项
	tcp_nopush off | on;
}

5. MIME类型的选择:

先来看 MIME 是什么:

wireshark抓包时,会看到HTTP报文中有这样的字段:

Accept:       text/html
Content-Type: text/html

这里的 “text/html” 就是一种MIME类型,MIME = Multipurpose Internet Mail Extentions,译为“媒体类型”,是一种协议标准,用于表示字节流的格式,例如文本、图片、音频、视频等。

通用结构:

 type/subtype

独立类型:

text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/*
application/json
application/javascript
application/ecmascript
application/octet-stream
…

使用方法:

(1) 第一种使用方法: include mime.types;

http {
	include mime.types;
	default_type application/otcet-stream;

	server {

	}
}

(2) 第二种使用方法: types { }

http {
	types {
		text/html		html;
		text/html		conf;
		image/gif		gif;
		image/jpeg		jpg;
	}

	server {

	}
}

第二种方式中用 types{ } 自定义了一组文件后缀名与MIME类型的映射关系,这两种方式是不能同时使用的,因为include mime.types已经定义了这些类型,二者相当于重复定义。

“default_type”表示在没有找到匹配的MIME类型时,按照这种类型方式进行处理。

过程:当Web服务器收到客户端的HTTP请求后,会根据URI的文件扩展名(后缀名)与MIME中映射的类型进行匹配,然后在返回的HTTP响应报文的Content-Type字段用此MIME类型填充,这样当客户端浏览器收到HTTP响应后就知道该用何种方式去解析字节流。

Tips:

1. Accept和Content-Type的区别:

Q:

从上面的wireshark抓包中看到HTTP报文中“Accept”和“Content-Type”这两个字段的值都是“text/html”(即都是用来表示MIME类型),他们的区别是什么?

A:

(1)Accept属于【请求头】,Content-Type属于【实体头】。
	Http报头分为通用报头,请求报头,响应报头 和 实体报头。 
	请求方的http报头结构:通用报头|请求报头|实体报头 
	响应方的http报头结构:通用报头|响应报头|实体报头

(2)Accept代表发送端(客户端)希望接受的数据类型,
	Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。
	
	比如:
	Accept:text/xml(application/json);           代表客户端希望接受的数据类型是xml(json )类型 ,
	Content-Type:text/html(application/json);    代表发送端发送的数据格式是html(json)。 
	
	二者合起来,Accept:text/xml; Content-Type:text/html;
	即代表希望接受的数据类型是xml格式,本次请求发送的数据的数据格式是html。
	如果accept指定的类型和response返回的类型不一致,会出现 "406 Not Acceptable" 错误。

6. 对客户端请求的限制:

(1) 按客户端的HTTP请求中的METHOD进行限制:

limit_except GET {
	allow 192.168.1.0/32;
	deny all;
}     # 对客户端的HTTP请求中的METHOD进行限制


client_max_body_size 1m;   #客户端的HTTP请求的包体的最大值
	这个字段有什么用:
		假如客户端向服务器发送的一个HTTP包体有 1G,在这个HTTP请求中的 Content-Length 字段会写明 1G,那么服务器不用等HTTP包体全部收完,只要判断 Content-Type 比 client_max_body_size 大,就可以直接返回 “413 Request Entity Too Large” 给客户端。
		所以这个字段就是用来限制客户端一次给服务器发送的HTTP包体的最大值,超限则413错误。


limit_rate 0;   #对请求的限速。默认0,不限速。


limit_rate_after 1m;
limit_rate 100k;    
	# 表示服务器向客户端发送超过 1m 的数据后就开始限速,限速为100k。

7. 文件操作的优化:

sendfile off | on;
aio off | on;
directio off | size;
directio_alignment 512;
open_file_cache off;
open_file_cache_errors off | on;
open_file_cache_min_uses 1;
open_file_cache_valid 60s;

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

ignore_invalid_headers on | off;
underscores_in_headers off | on; # 是否允许HTTP头部中带下划线
if_modied_since exact;
log_not_found on | off;
merge_slashes on | off;
resolver 127.0.0.1 192.0.2.1; #设置DNS域名解析服务器的地址
resolver_timeout 30s; #DNS解析的超时时间
server_tokens on | off; #返回错误页面时是否在Server中注明Nginx版本

参考内容:

《深入理解Nginx - - 模块开发要架构解析》
MIME类型

猜你喜欢

转载自blog.csdn.net/ArtAndLife/article/details/110250256