Nginx即:“engine x”,是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。
正向代理:到达WEB服务器之前所加的代理,比如使用代理软件访问谷歌。对于正向代理来说,用户可以感知使用了代理,但服务器无法感知是否使用了代理,我们称之为正向代理服务器。如图所示:
反向代理:到达WEB服务器之后所加的代理,比如访问百度。中间有个负载代理服务器,用于指向实际的服务器。对于反向代理来说,用户无法感知使用了代理,但服务器可以感知使用了代理,我们称之为反向代理服务器。如图所示:
1)基本HTTP服务
可以作为http代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤,支持SSL,具体包括:
1>处理静态文件,如HTML网页以及请求;
2>打开并自行管理文件描述符缓存;
3>提供反向代理服务,并且可用缓存加速反向代理;
4>提供远程FastCGI(通用网关接口)
服务的缓存机制;
5>模块化提供过滤器功能,gzip压缩 ranges支持 chunked响应 XSLT SSI 图像缩放
针对包含多个SSI的页面,经由反向代理SSI过滤器可并行处理;
6>支持安全套接协议SSL;
2)高级HTTP服务
可以进行自定义配置,支持虚拟主机,支持URL重定向,支持网络监控,支持流媒体传输等,具体包括:
1>支持基于名字和IP的虚拟主机设置;
2>支持HTTP/1.0 中的keep-alive模式和管线模型(PipelLined)连接;
3>支持重新升级时,无需中断正在处理的请求;
4>自定义访问日志格式、带缓存的日志写操作以及快速日志轮转;
5>提供3xx 5xx错误代码重定向功能;
6>支持重写模块扩展;
7>支持HTTP DAV模块,从而为HTTP DAV模块提供PUT DELETE MKCOL COPY MOVE
方法;
8>支持FLV
流和MP4
流传输;
9>支持网络监控,访问控制、速度限制或请求限制等;
10>支持嵌入perl
语言;
3)邮件代理服务
邮件代理服务器,支持IMAP/POP3代理服务功能,支持内部SMTP代理服务功能,具体包括:
1>支持使用外部HTTP认证服务器重定向用户到IMAP/POP3后端,并支持IMAP
认证方式和POP3
认证方式;
2>支持使用外部HTTP认证服务器器认证用户后重定向连接到内部SMTP后端,并支持SMTP认证方式;
3>支持邮件代理服务下的安全套接层安全协议SSL;
4>支持纯文本通信协议的扩展协议STARTTLS
;
4)常用功能
1>HTTP代理和反向代理,优势:请求稳定,后端转发与业务配合分离,配置灵活,支持判断表达式。
2>负载均衡,优势:
1》将单一的重负载分担到多个网络节点上做并行处理,每个节点处理结束后将结果汇总给用户提高网络系统的处理能力;
2》
将大量的前端并发访问或者数据流量分担到多个后端网络节点上分别处理;
nginx的负载均衡策略:
1》内置策略
:轮询、
加权轮询、IP hash
2》
扩展策略
主要通过第三方模块实现,常见有url hash
3>WEB缓存,主要由Proxy_Cache(
提供代理服务时,对后端服务器返回内容进行URL缓存)和FastCGI_Cache(
对FastCGI程序缓存)指令集构成。
1)检查:nginx -t
2)启动:nginx 加参数-c指定nginx.conf
3)停止:nginx -s stop
4)重启:nginx -s reload
nginx.conf主要由以下三块组成:
1)全局块
配置一些影响整体运行的指令,通常有:服务器用户组、允许生成的worker、process、nginx.pid存放路径、日志存放路径、类型和配置文件引入,全局块配置项有:
配置项 | 说明 | 其它可配置的地方 |
---|---|---|
user | 配置用户和组,默认为nobody nobody,表示所有用户有启停权限。 |
|
daemon | 设置是否以守护进程模式运行,默认on。该选项仅用于开发测试。 | |
debug_points | 断点调试。 | |
master_process | 设置是否启用主进程,默认on。 | |
worker_processes |
设置为数字,表示启动后就具有几个worker process, 设置为auto则表示自动检测。 |
|
worker_rlimit_nofile | worker进程能打开的文件描述符个数 | |
worker_rlimit_sigpending | 设置每个用户能够发往worker进程的信号数量(信号队列的大小) | |
worker_cpu_affinity | 为worker进程绑定若干个CPU,OS为linux才能使用此参数。 | |
worker_priority | 设置worker进程的优先级 | |
error_log | 指定nginx的运行日志存放路径,必须包含文件名称。 | 全局块、http块、server块和location块 |
pid | 指定nginx的pid存放路径,必须包含文件名称。 |
|
SSL_engine |
指定所使用的ssl硬件加速设备。 | |
timer_resolution | 设置多长时间获取一次系统时间并更新nginx的缓存时钟。 | |
include | 引入的其他配置文件路径。 | 任意位置 |
2)events块
影响nginx服务器与用户的网络连接,这一块的设置对服务的性能影响较大。通常有:是否开启对WP下的网络进行序列化、是否允许同时接受多个网络连接、事件驱动模型、每个WP可以同时支持处理的最大连接数,events块配置项有:
配置项 | 说明 | 其他可配置的地方 |
---|---|---|
use | 设置事件驱动模动模型,建议让nginx自行选择。可以设置为: select、poll、kqueue、epoll、rtsig /dev/poll、eventport。 |
|
debug_connection | 设置指定的IP产生debug日志。 | |
accept_mutex | 是否开启负载均衡锁,即:当只有一个请求进来时,是否只唤醒一个进程(控制“惊群效应”),否则轮流接受请求。 | |
lock_file | 设置负载均衡锁文件路径 | |
multi_accept | 设置一个进程是否可以同时接受多个请求。 | |
accept_mutex_delay | 设置获得负载均衡锁的重试时间间隔。 | |
worker_connections | 允许每一个worker process同时开启的最大连接数,此值不能大于操作系统支持的打开的最大文件句柄数,默认512。 |
3)http块
nginx.conf最重要的组成部分,包括:MIME-TYPE定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限、代理、缓存和第三方模块的配置。http块中包含http全局块和多个server块。http全局块配置项有:
配置项 | 说明 | 其他可配置的地方 |
---|---|---|
allow | 配置允许访问服务的ip | server块、location块 |
deny | 配置不允许访问服务的ip | server块、location块 |
default_type | 默认为text/plain。 |
server块、location块 |
log_format [name] [string] |
string整体需要用' 括起来,变量名称使用双引号括起来。 |
|
access_log [path] [format_name [buffer=size]] | 应答前端请求的服务日志,关闭日志使用off。 | server块、location块 |
sendfile | 是否允许sendfile方式传输文件,默认on。 | |
sendfile_max_chunk | 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。 | |
client_body_in_file_only | 指定是否将用户请求体存储到一个文件里。 | server块、location块 |
client_body_in_single_buffer |
设置是否将完整的请求主体存储在单个缓冲区中。 | |
client_body_buffer_size | 指定用户请求体所使用的buffer的最大值。 | server块、location块 |
client_body_temp_path | 设置存储用户请求体的文件的目录路径 | server块、location块 |
client_body_timeout | 设置用户请求体的超时时间。 | server块、location块 |
client_header_buffer_size | 设置用户请求头所使用的buffer大小 | server块 |
large_client_header_buffers |
设置用于读取大型客户端请求头的缓冲区的最大数量和大小 | |
client_header_timeout | 设置用户请求头的超时时间。 | server块、location块 |
client_max_body_size | 设置所能接收的最大请求体的大小,默认1M。 | server块、location块 |
send_timeout | 指定响应客户端的超时时间,单位:秒,默认60 | |
keepalive_timeout | 设置用户会话连接的保持时间。 | server块、location块 |
tcp_nopush | 设置TCP链接是否不推送,默认on。 | |
tcp_nodelay | 设置TCP链接是否延迟,默认on。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。 | |
autoindex | 如果没有首页文件是否列出目录中的所有文件,即是否开启目录浏览功能。 | server块、location块 |
autoindex_format | 设置目录浏览功能展示风格,可选:html、xml、json、jsonp | server块、location块 |
autoindex_exact_size | 设置文件大小是否以字节数显示,autoindex_format为html时有效。 | server块、location块 |
autoindex_localtime | 是否以服务器的文件时间作为显示的时间,autoindex_format为html时有效。 | server块、location块 |
set_real_ip_from | 设置符合条件的网段,结合real_ip_header,设置新的$remote_addr | server块、location块 |
real_ip_header | 结合set_real_ip_from,设置新的$remote_addr,如果设置X-Forwarded-For则为真实的ip | server块、location块 |
gzip | 是否开启gzip压缩。 | |
gzip_min_length | 设置允许压缩的页面最小字节数,默认0。 | |
gzip_buffers | 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 | |
gzip_http_version | 识别http的协议版本。 | |
gzip_comp_level | gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)。 | |
gzip_types | 匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。 | |
gzip_vary | 和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩。 | |
gzip_disable | 指定版本浏览器不压缩。 | |
upstream | 指定负载均衡的后端服务器,例如:server www.xx.com:8080;其后的选项有: weight:负载均衡策略权重, 默认为1; max_fails:在一定时间内(这个时间在fail_timeout参数中设置) 检查这个服务器是否可用时产生的最多失败请求数; fail_timeout:在fail_timeout时间内经历了max_fails次失败后, 暂停服务的时间。 max_fails可以和fail_timeout一起使用, 进行对后端服务器的健康状态检查; backup:当所有后端服务器都宕机时, 可以指定代理服务器自身作为备份, 对外提供维护提示页面; down:永久不可用。 |
|
proxy_cache_path | 定义一个完整的缓存空间,指定缓存数据的磁盘路径、索引存放的内存空间以及一些其他参数。常用选项有: levels:配置在该目录下再分两层目录,一层1个随机字符作为名称,二层2个随机字符作为名称,levels最多三层,每层最多两个字符,这是为了加快访问文件的速度;最后使用代理url的哈希值作为关键字与文件名; keys_zone:用来为这个缓存区起名,并设置大小; max_size:指定最大缓存数据磁盘空间的大小; inactive:在inactive指定的时间内,未被访问的缓存数据将从缓存中删除。 |
|
proxy_cache | 用来proxy_cache_path中keys_zone定义的缓存空间, 打开缓存功能,off表示关闭缓存。 |
|
proxy_cache_key | 设置缓存唯一key | |
proxy_cache_valid |
设置不同响应代码的缓存时间,比如200 304 12h; |
每个server块中包含server全局块和多个location块,采用就近原则生效。server全局块配置项有:
配置项 | 说明 | 其他可配置的地方 |
---|---|---|
keepalive_requests | 单连接请求上限次数。 |
location块 |
listen | 设置监听地址和端口,可加如下参数: address:ip地址,如果是ipv6需要使用[fe13:..]格式; port:端口号,如果只有ip则默认80; path:socket文件路径; default_server:标识符,将ip:port设置为默认的虚拟主机; backlog:设置监听函数listen()最多允许多少网络连接同时处于挂起的状态,默认511(FreeBSD 为-1) rcvbuf:设置监听socket接受缓存区大小; sendbuf:设置监听socket发送缓存区大小; deferred:标识符,将accept()设置为Deferred模式; bind: 标识符,使用独立的bind()处理此adress:port,一般情况下端口相同而IP地址不同,只使用一个 ssl:标识符,设置会话使用ssl模式(https); accept_filter:设置监听端口的请求过滤,被过滤的内容不能被接受和处理(只在FreeBSD NetBSD中有用); setfib:为监听socket关联路由表,只对FreeBSD起作用; |
|
server_name | 设置虚拟主机名称,支持多个。可以使用正则,~作为正则开始的标记,并支持捕获。 匹配的优先级为: 1. 精确匹配,如:www.li.com 2. 通配符在开始 ,如:*.li.com 3. 通配符在结尾 ,如:www.* 4. 正则表达式匹配 ,以波浪线开头(~^*.li.com$) 如果都不匹配 1.优先选择listen配置项后有default或default_server的 2.找到匹配listen端口的第一个server块 |
|
server_name_hash_bucket_size | 为实现快速主机查找,nginx使用hash表保存主机名,该参数用来设置hash表大小。 | |
root | 设置服务器收到请求后查找资源的根目录路径,最终路径拼接为:root路径+location路径。通常$document_root、$realpath_root 只在location 块中使用。 |
location块 |
alias | 设置服务器收到请求后查找资源的根目录路径,最终路径替换为:alias路径+文件名。alias无法在正则的location中使用。 |
location匹配有四种:按优先顺序分别为:
①=:用于普通uri之前,表示严格匹配;
②~:uri包含正则表达式,并且区分大小写;
③~* :表示包含正则表达式,并且不区分大小写;
④!~:与②相反,不匹配区分大小写的正则;
⑤!~*:与③相反,不匹配不区分大小写的正则;
⑥^~ :如果找到与uri匹配度最高的location,立即处理请求,会对uri进行反编码;
location块可以使用if条件,配置项有:
配置项 | 说明 | 其他可配置的地方 |
---|---|---|
add_header [key] [value] |
设置response响应报文的header | |
auth_basic | 是否开启认证功能,并设置提示信息,off关闭。 | |
auth_basic_user_file | 指定包含用户名信息的文件路径。 |
|
rewrite | 重写跳转地址,支持正则。重写规则后需指定控制标识,控制标识有: last:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮(从第一个开始)重写检查,在循环中则提前重启新一轮循环; break:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;在循环中则结束循环,建议在location中使用; redirect:临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;不能以http://或https://开头,使用相对路径,状态码:302; permanent:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,状态码:301。 |
server块 |
rewrite_log | 是否把重写过程记录到错误日志中,默认为off,级别默认notice。 | |
try_files | 后面可以跟多个文件名,表示逐个匹配文件,如果没有则继续往后一个文件匹配 | |
return [code] [url] | 用于结束rewrite规则,并且为客户端返回状态码204,400,402-400,500-504等。格式可以为return code、return url或者return code url | |
index | 设置网站的默认首页。 | |
error_page [code] [path] | 设置网站的错误页面。 | http块、server块 |
proxy_pass |
指定反向代理的服务器池,如:192.168.10.10 或使用upstream |
|
proxy_set_header |
设置发往后端请求头,参数有: Host:指定反向代理到哪个主机名; X-REMOTE-IP:上一跳的ip; X-Forwarded-For:设置客户端ip; http_user_agent:设置客户端OS; 默认情况下,只有两个请求头会被重新定义: proxy_set_header Host $proxy_host; proxy_set_header Connection close; |
|
proxy_body_buffer_size |
设置客户端请求主体缓冲区大小,可以理解为先保存到本地在传给用户。 |
|
proxy_connect_timeout |
设置后端服务器连接的超时时间,即发起握手等候响应的超时时间。 |
|
proxy_send_timeout |
设置后端服务器的数据回传时间,即在规定的时间内后端服务器必须传完所有的数据,否则nginx将断开这个连接。 |
|
proxy_read_timeout |
设置从后端服务器获取信息的时间,表示连接建立成功之后,nginx等待后端服务器的响应时间,其实nginx已经进入后端的排队之中等候处理。 |
|
proxy_buffer_size |
设置缓冲区大小。 |
|
proxy_buffers |
设置缓冲区的数量和大小。 |
|
proxy_busy_buffers_size |
设置系统忙碌时可以使用的proxy_buffers大小,官方推荐为proxy_buffers*2 |
|
proxy_tmep_file_write_size |
指定proxy缓存临时文件的大小 |
|
proxy_next_upstream |
请求出错后,转向下一个节点 |
|
fastcgi_pass | 指定fastcgi进程监听的IP地址和端口,例如127.0.0.1:9000或者unix:/tmp/fastcgi.socket。也可以使用upstream指定,例如: upstream backend { server 127.0.0.1:9000; } fastcgi_pass backend; |
http块、server块 |
fastcgi_pass_header |
设置请求fastcgi的请求头。 | http块、server块 |
fastcgi_read_timeout | fastcgi服务器的响应超时时间。 | http块、server块 |
fastcgi_send_timeout | 为上游服务器设置等待一个FastCGI进程的传送数据时间。 |
http块、server块 |
fastcgi_split_path_info | 0.7.31以上版本使用,是否允许设置SCRIPT_FILENAME (SCRIPT_NAME)和PATH_INFO变量,分别对应:$fastcgi_script_name和$fastcgi_path_info。 | http块、server块 |
fastcgi_store | 设置存储前端文件的路径,on指定将使用root和alias指令相同的路径,off禁止存储,此外还可以指定具体的路径。 | http块、server块 |
fastcgi_store_access | 指定创建文件或目录的权限,比如: user:rw group:rw all:r |
http块、server块 |
fastcgi_temp_path | 指定存储从别的服务器传送来的数据临时文件路径 | http块、server块 |
fastcgi_index | 如果请求fastcgi的URI以/结束,该指令设置的文件会被附加到URI的后面并保存在变量$fastcgi_script_name中 | http块、server块 |
fastcgi_param | 指定参数传递给fastcgi | http块、server块 |
fastcgi_redirect_errors | 已重命名为:fastcgi_intercept_errors。指定是否传递4xx和5xx错误信息到客户端,或者是否允许nginx使用error_page处理错误信息。 | http块、server块 |
expires | 指定浏览器缓存失效时长,比如:30s | http块、server块 |
if_modified_since | 指定是否启用if_modified_since请求头 | http块、server块 |
变量名 | 说明 |
---|---|
$uri | 当前请求的URI,不带参数 |
$document_uri | 当前请求的URI,不带参数 |
$request_uri | 请求的uri,带完整参数 |
$is_args | 表示请求中的 URI 是否带参数,如果带参数,$is_args 值为 ?,如果不带参数,则是空字符串 |
$args | http请求的完整参数 |
$arg_[param] | http请求中某个参数的值 |
$query_string | http请求的完整参数,只读不可改变 |
$host | http请求报文中的host首部,如果请求中没有host首部,则以处理此请求的虚拟主机的主机名代替 |
$hostname | nginx服务运行在的主机的主机名。 |
$proxy_host | nginx对于upstream默认使用的是基于IP的转发,所以表示请求到对应的upstream配置的域名的ip |
$remote_addr | 客户端的ip地址,如果客户端有代理,则为最新的代理服务器的ip |
$http_x_real_ip | 客户端的ip地址,如果客户端有代理,则为已设置的最新的代理服务器的ip |
$http_x_forwarded_for | 客户端的ip地址,默认是空。使用proxy_set_header设置后,多个ip按顺序用逗号隔开 |
$proxy_add_x_forwarded_for | $http_x_forwarded_for和$remote_addr,中间用逗号隔开 |
$binary_remote_addr | 二进制格式的客户端地址 |
$remote_port | 客户端端口 |
$remote_user | 启用用户认证时,客户端输入的用户名 |
$request_method | 请求方法 |
$request_filename | 用户请求中的uri经过本地root或alias转换后映射的本地文件路径 |
$request_body | 表示http请求中的body体,该参数只在proxy_pass或fastcgi_pass中有意义 |
$request_body_file | 表示http请求中的body体存储的临时文件名 |
$request_completion | 当请求已经全部完成时,其值为 “ok” 。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用http range访问的并不是文件的最后一块,那么其值也是空字符串。 |
$server_addr | 服务器地址 |
$server_name | 服务器域名 |
$server_port | 服务器端口 |
$server_protocol | 服务器向客户端发送响应时的协议,如http/1.1 |
$scheme | 在请求中使用scheme,如https://www.magedu.com/中的scheme |
$http_[header] | 匹配请求报文中指定的HEADER,例如:$http_host匹配请求报文中的host首部 |
$sent_http_[header] | 匹配响应报文中指定的HEADER,例如:$sent_http_content_type匹配响应报文中content-type首部 |
$document_root | 当前请求映射到的root配置项 |
$time_local | 访问时间与时区 |
$request | 请求的url与http协议 |
$status | 请求状态,成功是200 |
$body_bytes_sent | 发送给客户端文件主体内容大小 |
$http_referer | 记录从那个页面链接访问过来的 |
$http_user_agent | 记录客户端浏览器的相关信息 |
$content_length | 请求头部中的Content-Length字段 |
$content_type | 请求头部中的Content-Type字段 |
$cookie_COOKIE | 请求头部中的cookie字段 |
$limit_rate | 表示当前连接的限速是多少,0表示无限速 |
$nginx_version | 表示当前Nginx的版本号 |