Nginx使用手册安装使用下载Nginx解压后可以直接使用Nginx的启动、停止和重新加载启动方式:执行nginx.exeNginx启动后,可以通过执行nginx.exe并带上参数来进行控制,语法如下nginx-ssignalsignal可以是如下之一:stop—快速停止quit—安全停止reload—重新加载配置文件reopen—重新打开日志文件例如,要在等待Worker进程完成当前请求的服务后停止Nginx,可以执行下面的下面的命令:nginx-squit对配置文件的修改不会生效,直到Nginx接收到重新加载配置的命令并完成重启。重新加载配置文件执行:nginx-sreload一旦主进程接收到重新加载配置文件的信号,它会检查新配置的语法并尝试应用配置。如果成功,主进程启动一个新的Worker进程并发送消息给旧的Worker进程,请求他们关闭。否则,主进程回滚变更并继续使用旧的配置工作。旧的Worker进程接收到关闭命令后,停止接受新的连接并继续为当前的请求提供服务直到服务完成。之后旧的Worker进程退出。启动后可以通过访问进行验证。配置文件的结构Nginx的模块组成,通过在配置文件中指定的指令控制。指令包括简单指令和块指令。简单指令由指令名称,一组以空格分隔的参数组成,并以分号结尾(;)。块指令和简单指令的结构大致相同,只是把由分号结尾换成了将指令集由一组花括号包围({...})。如果块指令可以有其他的指令包含在花括号中,这称为上下文(例如:events,http,server,和location)。其它跟在#符号后的内容被当作注释。架设一个简单的代理服务器Nginx的常用用途之一就是被用作代理服务器。代理服务器接收请求,将请求传递给被代理的服务器,从被代理的服务器获取响应,再将响应发送给客户端。我们修改server的配置,来使用代理服务器。在第一个location块,放置proxy_pass指令,协议、被代理的服务器的名称和端口做为参数(例如:)server{location/{proxy_pass}location~\.(gif|jpg|png)${root/data/images;}}在第二个location块,使其规则表达式,来匹配所有以.gif,.jpg,or.png结尾的URI。(规则表达式以~打头)Nginx服务器会过略以.gif,.jpg,or.png结尾的请求,映射到/data/images目录,将其它的请求传递给上面配置的代理服务器。要应用新的配置,使用nginx-sreload命令向ngnix发送重新加载的信号。Http负载均衡器对多个应用实例的负载平衡是一种常用的技术,用于优化资源的利用率,最大限度地提高吞吐量,减少延迟,并确保容错配置。Nginx可以作为高效的HTTP负载均衡器,将请求分发给多个应用服务器,以提高Web应用的性能,可扩展性和可靠性。Nginx支持下面的负载均衡机制:round-robin—轮询,应用程序轮流来响应请求least-connected—最少连接,请求被分配到活动连接最少的服务器上ip-hash—通过一个hash函数决定哪个服务器来响应用户的请求(依据客户端的请求ip).下面是最简单的负载均衡的配置http{upstreammyapp1{serversrv1.example.com;serversrv2.example.com;serversrv3.example.com;}server{listen80;location/{proxy_pass}}}上面这个配置中3个相同的应用程序的服务器srv1-srv3,默认的负载均衡方式是轮询,所用的请求通过反向代理给了myapp1组,nginx通过负载均衡来分发这些请求到三个服务上。在nginx中HTTP,HTTPS,FastCGI,uwsgi,SCGI,andmemcached.的负载均衡都是通过反向代理实现的。要配置https的负载均衡只需要将http协议改https就可以了,其他配置不变。要实现FastCGI,uwsgi,SCGI,ormemcached的负载均衡可以分别使用fastcgi_pass,uwsgi_pass,scgi_pass,andmemcached_pass指令。另一种负载均衡方式是least-connected,在“请求需要更长的时间来完成”的场景下采用least-connected方式可以更公平的将负载分配到多个机器上面。使用least-connected,nginx不会将请求分发到繁忙的机器上面,而且将新的请求分发的较清闲的机器上面。可以在upstream{}模块中配置least_conn;指令来激活least-connected负载模式。upstreammyapp1{least_conn;serversrv1.example.com;serversrv2.example.com;serversrv3.example.com;}轮询和least-connected这两种负载均衡方式会将新的请求分发到不同的机器上,很难保证每个客户端会固定访问某一个服务器。如果需要某个客户端只访问访问固定的一个服务器可以通过ip-hash负载均衡方式实现。使用ip-hash时,客户端的ip作为一个散列的Key来决定服务器组中哪个服务器来响应请求,这种方式可以保证每个客户端每次访问的都是同一个服务器。客户通过ip_hash指令来配置ip_hash负载均衡方式upstreammyapp1{ip_hash;serversrv1.example.com;serversrv2.example.com;serversrv3.example.com;}权重的负载均衡方式,在轮询的基础上为每个服务器配置权重可以保证某个服务器尽可能处理多的请求upstreammyapp1{serversrv1.example.comweight=3;serversrv2.example.com;serversrv3.example.com;}上面的配置中,如果有5个请求,有3个会分配到serv1上,有1个会分配到srv2上,有一个会分配到srv3上。如果不指定weight,默认是平的的。负载均衡包含服务器的健康检查,如果某个请求被分配到了一个服务器上,服务器无法响应,那么nginx会标记它失败了,在短时间内,nginx是不会将之后的请求分配给标记失败的服务器。max_fails指令可以设置最大失败次数,默认是1,需要先设置了fail_timeout才行。fail_timeout指定响应时间超过多少秒就将服务器标记为失败。服务器标记失败后,nginx会使用几个客户端请求优雅地探测服务器,如果探测成功,则服务器标记成功。更多的负载均衡指令:proxy_next_upstream,backup,down,andkeepalive.日志配置日志对于统计排错来说非常有利的。nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义。ngx_http_log_module是用来定义请求日志格式的。1.access_log指令语法:access_logpath[format[buffer=size[flush=time]]];代码如下:access_logpathformatgzip[=level][buffer=size][flush=time];access_logsyslog:server=address[,parameter=value][format];access_logoff;默认值:access_loglogs/access.logcombined;配置段:http,server,location,ifinlocation,limit_exceptgzip压缩等级。buffer设置内存缓存区大小。flush保存在缓存区中的最长时间。不记录日志:access_logoff;使用默认combined格式记录日志:access_loglogs/access.log或access_loglogs/access.logcombined;2.log_format指令语法:log_formatnamestring…;默认值:log_formatcombined“…”;配置段:httpname表示格式名称,string表示等义的格式。log_format有一个默认的无需设置的combined日志格式,相当于apache的combined日志格式,如下所示:代码如下:log_formatcombined'$remote_addr-$remote_user[$time_local]''$request$status$body_bytes_sent''$http_referer$http_user_agent';如果nginx位于负载均衡器,squid,nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址了。$remote_addr获取反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。如下所示:代码如下:log_formatporxy'$http_x_forwarded_for-$remote_user[$time_local]''$request$status$body_bytes_sent''$http_referer$http_user_agent';日志格式允许包含的变量注释如下:代码如下:$remote_addr,$http_x_forwarded_for记录客户端IP地址$remote_user记录客户端用户名称$request记录请求的URL和HTTP协议$status记录请求状态$body_bytes_sent发送给客户端的字节数,不包括响应头的大小;该变量与Apache模块mod_log_config里的“%B”参数兼容。$bytes_sent发送给客户端的总字节数。$connection连接的序列号。$connection_requests当前通过一个连接获得的请求数量。$msec日志写入时间。单位为秒,精度是毫秒。$pipe如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。$http_referer记录从哪个页面链接访问过来的$http_user_agent记录客户端浏览器相关信息$request_length请求的长度(包括请求行,请求头和请求正文)。$request_time请求处理时间,单位为秒,精度毫秒;从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。$time_iso8601ISO8601标准格式下的本地时间。$time_local通用日志格式下的本地时间。发送给客户端的响应头拥有“sent_http_”前缀。比如$sent_http_content_range。实例如下:代码如下:http{log_formatmain'$remote_addr-$remote_user[$time_local]$request''$status$body_bytes_sent$http_referer''$http_user_agent$http_x_forwarded_for''$gzip_ratio$request_time$bytes_sent$request_length';log_formatsrcache_log'$remote_addr-$remote_user[$time_local]$request''$status$bo