上章节介绍了 nginx.conf 配置文件中的 events 模块,以及介绍该模块下面常见配置参数;本章节将介绍 nginx.conf 配置文件中的 http 模块,该模块用来配置 http。
http 模块从外到内有 http模块、server模块、location模块,同时各个模块有各自的属性和元素:
http模块:即一个 http 处理模块,可进行 http 的相关参数配置,内可以包含多个 server 块;
server模块:即是一个虚拟主机,需配置域名和端口,也只处理对应主机域名的 http 请求,内可包含多个 location 块;
location模块:对应具体的路径请求(http请求)
下面是一个常见的 http 模配置项信息:
#user nobody; worker_processes 1; # ... events { # ... } http { include mime.types; default_type application/octet-stream; # 配置日志 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/host.access.log main; keepalive_timeout 65; # 配置负载均衡 upstream myServer{ server 192.168.247.129:8080 max_fails=3 weight=2; server 192.168.247.129:8081 max_fails=3 weight=4; } # 配置一个虚拟主机 server { listen 80; server_name 192.168.247.129; charset koi8-r; access_log logs/host.access.log main; # 配置请求地址 location / { #... } # 配置请求地址 location /report/ { #... } error_page 500 502 503 504 /50x.html; } # 配置虚拟主机 server { listen 80; server_name 192.168.247.130; #... } }
下面将逐一介绍上面 http 模块中的指令。
该命令用来将另一个文件或与指定通配符匹配的文件包含到当前配置中,包含的文件应该由语法正确的指令和块组成。用法示例:
include mime.types; include vhosts/*.conf;
注意,mime.types 文件内定义指定文件头所对应的文件格式,下面为截取的部分文件内容:
types { text/html html htm shtml; text/css css; text/xml xml; image/gif gif; # ... }
如果你需要新增自定义的文件类型,可以在 mime.types 文件内进行定义。
在启动一个 nginx 服务时,可能 nginx 会同时处理多个 server 虚拟主机,为了使多个 server 的配置更加便于管理,一般会在 http 配置块中通过 include 指令引入其他的 server 配置文件,相当于把其他配置文件的内容写入到了当前的配置文件中。用法示例:
(1)将下面配置内容保存到 conf/server_demo.conf 文件中。
server { listen 8888; server_name localhost; location / { root html; index index.html index.htm; } }
(2)在 nginx.conf 配置文件中使用 include 指令引用 conf/server_demo.conf 文件。
http { include mime.types; default_type application/octet-stream; # 引用文件 include server_demo.conf; }
nginx 会根据 mime 类型定义的对应关系来告诉浏览器如何处理服务器传给浏览器的文件,如:打开文件、下载文件。
如果 web 程序没有设置 mime 类型,nginx 也没对应文件的扩展名。此时,使用 nginx.conf 中 default_type 指令定义的默认处理方式。示例:
# nginx默认文件类型 default_type application/octet-stream;
在 nginx 中,mime 类型和文件扩展名的对应关系一般放在 conf/mime.types 文件中,然后用 include 指令来加载
mime.types 文件中用 types 指令定义的 mime 和 文件扩展名对应关系。示例:
# 引入 conf/mime.types 文件内容 include mime.types;
注意:通常情况下,在 nginx.conf 配置文件的 http{} 配置块中配置即可。
nginx 的日志包含了两类:一类是 error.log 日志,另一类是 access.log 日志。log_format 指令用来定义 access.log 指令记录的访问日志格式。用法示例:
log_format main '$upstream_addr $upstream_status $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main;
其中,log_format 指令后面的 main 为日志格式名称,在 access_log 中可以通过该名称引用。
如果需要自定义设置 log_format,可用变量如下:
$remote_addr:客户端地址,例如:211.28.65.253
$remote_user:客户端用户名称,例如:--
$time_local:访问时间和时区,例如:18/Jul/2012:17:00:01 +0800
$request:请求的URI和HTTP协议,例如:"GET /article-10000.html HTTP/1.1"
$http_host:请求地址,即浏览器中你输入的地址(IP或域名),例如:www.wang.com 192.168.100.100
$status:HTTP请求状态,例如:200
$upstream_status:upstream状态,例如:200
$body_bytes_sent:发送给客户端文件内容大小,例如:1547
$http_referer:url跳转来源,例如:https://www.baidu.com/
$http_user_agent:用户终端浏览器等信息,例如:"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$ssl_protocol:SSL协议版本,例如:TLSv1
$ssl_cipher:交换数据中的算法,例如:RC4-SHA
$upstream_addr:后台upstream的地址,即真正提供服务的主机地址,例如:10.10.10.100:80
$request_time:整个请求的总时间,例如:0.205
$upstream_response_time:请求过程中,upstream响应时间,例如:0.002
该指令用来指定 nginx 访问日志文件的路径及使用的何种日志格式记录日志。用法示例:
log_format main '$upstream_addr $upstream_status $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main;
HTTP 是一种无状态协议,客户端向服务器发送一个 TCP 请求,服务端响应完毕后断开连接。
如果客户端向服务器发送多个请求,每个请求都要建立各自独立的连接以传输数据。
HTTP 有一个 KeepAlive 模式,它告诉 web 服务器在处理完一个请求后保持这个 TCP 连接的打开状态。若接收到来自客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。
KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源,占用过多就会影响性能。
Nginx 使用 keepalive_timeout 来指定 KeepAlive 的超时时间(timeout),指定每个 TCP 连接最多可以保持多长时间。Nginx 的默认值是 75 秒,有些浏览器最多只保持 60 秒,所以可以设定为 60 秒。若将它设置为 0,就禁止了 keepalive 连接。
用法示例:
# 可用于 http, server, location 配置块 # 设置 TCP 链接保持 60 秒 keepalive_timeout 60s;
nginx 中,upstream 指令可以定义一组服务器,这些服务器可以监听不同的端口。而且,监听在 TCP 和 UNIX 域套接字的服务器可以混用。用法示例:
upstream myserver { server demo1.hxstrive.com weight=5; server demo2.hxstrive.com max_fails=3 fail_timeout=30s; server unix:/tmp/myserver3; }
默认情况下,nginx 按加权轮转的方式将请求分发到各服务器。在上面的例子中,每7个请求会通过以下方式分发:
5个请求分到 demo1.hxstrive.com,一个请求分到 demo2.hxstrive.com,一个请求分到 unix:/tmp/myserver3。
nginx 与服务器通信的时候,如果出现错误,请求会被传给下一个服务器,直到所有可用的服务器都被尝试过。如果所有服务器都返回失败,客户端将会得到最后通信的那个服务器的(失败)响应结果。
关于 upstream 指令更多用法,后续章节将详细介
nginx 的 server 配置块是配置虚拟主机的重要参数块,每个 https 全局块可以包含多个 server 块,而每个 server 配置块就相当于一台虚拟主机,由此可见虚拟主机是由参数定义,这是为了节约硬件成本的最好最实用的 Nginx Virtual 服务器技术。
关于 server 指令块的用法,后续章节将详细介绍