在之前接口调用的过程中出现了无法访问接口的Bug,究其原因可能出在Nginx进行服务转发代理的问题上,所以希望结合项目中使用到的Nginx配置表好好对Nginx的配置进行学习。
1. main(全局设置)
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
user nobody:主模块指令,指定nginx worker进程运行用户及用户组,Windows下不用指定,默认为nobody账号。
worker_processes 1:设定工作进程数,通常设定为CPU数量或CPU数量的两倍。
error_log:定义错误日志的存放路径。路径后面的参数为错误日志输出级别,分别有debug
、info
、notice
、warn
、error
、crit
六个级别,其中debug
级别输出的错误日志最详细,crit
级别输出的错误日志最简略
pid:nginx的进程号,当我们需要停止nginx时,使用的其中一种方式就可以是通过进程号杀死进程的方式。
2. events(Nginx工作模式)
events {
worker_connections 1024;
}
worker_connections:每一个进程所允许的最大连接数,理论上每台Nginx服务器的最大连接数为上文提到的worker_processes
*worker_connections
。
use worktype:use
是个事件模块指令,用于指定事件模型,但是在此项目中未使用到,因为windows下无需指定事件模型(Nginx针对不同操作系统会使用不同的事件模型)。Nginx可支持的的worktype
有以下几种select
、poll
、kqueue
、epoll
、rtsig
、/dev/poll
:
select
、poll
:标准事件模型,默认不指定的情况下就会使用这两个事件模型。kqueue
:高效事件模型。使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。epoll
:使用于Linux内核2.6版本及以后的系统。/dev/poll
:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
3. http(http协议级别设置)
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/access.log main;
access_log on;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
include mime.types:include
是个主模块指令,实现对配置文件所包含的文件设定,减少主配置文件的复杂度。
default_type:http核心模块指令,默认设置为二进制流,也就是当文件类型未在mime.types
中定义时会使用这种方式,本项目中默认类型设置为octet-stream
,表示当文件类型未定义时浏览器认为响应的是普通的文件流,并会提示用户下载文件。如当未定义以.PHP结尾的文件时,当访问PHP文件时就会出现下载窗口。
log_format main:log_formate
是Nginx的httplog模块指令,用于指定Ningx的日志输出格式。main
为为此日志设置的名字,在下面的access_log
指令中使用这个名字,就可以按照这个名字定义的格式进行日志输出。
access_log:设置日志路径,根据路径后跟的名字设置日志格式。但本项目中默认将这个功能关闭了。
sendfile:用于开启高效文件传输模式,对于普通应用必须设置为on。如果用来进行下载等应用磁盘IO的重负载引用,可以设置为off,平衡磁盘与网络IO的处理速度,降低系统uptime(负载)。
tcp_nopush:此选项仅在使用sendfile时使用。它的作用是,防止网络拥塞,那么怎么防止呢?当tcp_nopush
设置为on时,当有数据需要发送时,先不着急立刻发送,而是确保数据包已经装满数据才进行发送,减少网络报文段的数量,避免网络拥塞。
tcp_nodelay:此选项仅在使用sendfile时使用。它的作用同上一个选项tcp_nopush
刚好相反,当有数据要发送时,立即发送,确保数据尽快发送,提高数据传输效率,适用每次只发送很少字节的业务场景。
keepalive_timeout:在HTTP请求中,当一个请求完成后会保持这个TCP连接的打开状态,若接收到来自客户端的其他请求,服务端就会利用这个未被关闭的连接,而不需要再建立一个新的连接,这就是keep-alive模式,但是保持打开状态的TCP连接同样会占用资源,当资源占用过多就会影响性能,所以这个选项就是指定每个TCP连接最多可以保持多长时间。
4. gzip(gzip压缩设置)
gzip on;
gzip_min_length 5k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 9;
gzip_types application/javascript text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;
gzip:开启实时gzip压缩输出数据流,减少网络传输。
gzip_min_length:gzip压缩起点大小,在本项目中,文件大于5k才进行压缩。
gzip_buffers:设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表申请4个单位为16k的内存作为压缩结果缓存。
gzip_http_version:设置gzip压缩针对的HTTP协议版本。
gzip_comp_level:gzip压缩级别,数字越大压缩效果越好,但CPU处理时间越长。
gzip_types:指定何种类型的文件会被进行压缩。
gzip_vary:为响应头添加Vary: Accept-Encoding
标头,该标头可以告诉前端的缓存服务器同时缓存通过gzip压缩过的资源和未压缩过的资源,这么做的目的是,当客户端使用的是不支持gizp的低版本浏览器时,缓存也可以向其返回未经gzip压缩过的资源,否则,如果缓存服务器只缓存了压缩过后的资源,那么返回压缩过后的资源会导师老版本浏览器无法解压,出现乱码。
5. upstream(负载均衡设置)
upstream boss {
server 127.0.0.1:9090;
}
upstream localserver {
server 127.0.0.1:8081;
}
本项目中暂时未使用到负载均衡,所以这里就简单的列举出各个upstream模块的一些配置字段和概念含义。
upstream servername:指定一个负载均衡器的名称为servername
,在本项目中,创建了两个负载均衡器,分别指定名称为boss
、localserver
。在之后如果需要使用到负载均衡器,则需要将server节点下的location节点中的proxy_pass
设置为http://upstream名称。例如,若后续使用boss
这个负载均衡器则在某个需要实现负载均衡的location节点下设置proxy_pass
为http://boss
server:指定后端服务器的IP地址和端口,同时在负载均衡器中还可以为这些服务器添加不同的属性字段达到不同的负载均衡效果,可添加的参数有 down
、weight
、max_fails
、fail_timeout
、backup
,下面将会对这些参数代表的含义一一介绍:
down
:表示当前的server暂时不参与负载均衡weight
:通过设置权重完成负载均衡的一种策略,该值设置的越大,那么该server负载的权重就越大,当对某个通过权重方式实现负载均衡的网站进行高并发访问时,权重越高的服务器将会得到更多的访问请求。max_fails
:允许请求访问失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块中定义的错误。fail_timeout
:默认为10s,在单位周期为fail_timeout
设置的时间中经历max_fails
次失败后,暂停访问,并将该节点标记为不可用,并等待下一个周期再访问该节点,若下个周期该节点连接成功,则恢复原来的轮询方式,否则在下一个周期将再重试一次,如此往复。
6.server(服务器级别设置)
server {
listen 8089;
server_name localhost;
ssi on;
#charset koi8-r;
access_log logs/host.access.log main;
listen:指定服务器监听的端口。
server_name:指定IP地址或域名。
ssi:设置为on即使用SSI模块。SSI模块可以在代码中使用注释的方式去引入HTML页面或者包含一些文件。
charset koi8-r:设定网页默认编码格式
access_log:记录了哪些用户,那些页面以及用户浏览器、ip和其他的访问信息。
7.location(请求级别设置)
location ~* \.(js|css|flash|media|jpg|png|gif|dll|cab|CAB|ico|woff|woff2|ttf)$ {
root D:/工作/o2o;
index index.html index.htm;
expires 30d;
}
location ~* \.(html|htm)$ {
root D:/工作/o2o;
index index.html index.htm;
expires 1s;
}
location /test{
root D:/工作/o2o;
index index.html index.htm;
expires 1s;
}
在这部分主要介绍一下,location模块的大致作用,对于proxy反向代理模块放在下一部分来讲。那么location模块的作用是什么呢?在项目中我最直观的理解就是,通过正则匹配到URL,当浏览器访问了这个URL后,可以通过location指令实现nginx对动静态网页的各种处理,包括过滤、转发等等。
location :该指令支持正则表达式和条件判断匹配,比如location ~ *\ .(gif|jpg|jpeg|bmp|png|ico|txt|js|css)则会把所有以html或htm为后缀的文件都交给nginx处理。
root:指定虚拟主机的根目录,可以是相对路径也可以是绝对路径。
index:设定访问的默认首页地址。
expires:缓存失效时间,在本项目中,对所有静态资源都设置了30天的缓存失效时间。
8. proxy(反向代理设置)
location /uop{
proxy_connect_timeout 60s;
proxy_send_timeout 90;
proxy_read_timeout 120;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
#proxy_buffering off;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Cache-Control max-age=1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header location_gray 'location_rest_v1';
proxy_pass http://boss;
}
proxy_connect_timeout:配置与服务器的连接超时时间。
proxy_send_timeout:规定的后端服务器数据的最长回传时间,超过时间未完成回传则超时。
proxy_read_timeout:连接成功后,等到后端服务器的响应时间,也可以说是后端服务器处理请求的时间。
proxy_buffers:缓冲区的数量和大小,当nginx接收到后端response的数据后,会将其存放到缓冲区,当缓冲区的数据满了以后再一次性发送到客户端,使用buffer的好处在于相较于及时输出可以节约部分带宽,如果不设置缓冲区大小,则为即时传输。
proxy_buffer_size:该字段规定了响应头Response header
的最大长度,如果响应头超过这个长度,这回返回客户端502;默认与proxy_buffers
大小相同,无论 proxy_buffering 是否开启,proxy_buffer_size 都会起作用。
proxy_busy_buffers_size:专门向客户端传送数据的缓冲区,如果要传送的数据大于busy_buffer
的大小,则装满busy_buffer后,马上传给客户端,如果传送数据小于busy_buffer
大小,则数据传输完成后,立刻传给客户端,不需要等待busy缓冲区填满;官方建议大小为单个proxy_buffers
的两倍。
proxy_temp_file_write_size:指定同时写入临时文件的数据量的总大小。
proxy_next_upstream:定义故障转义策略,在本项目中,当后端服务器返回超时或非法的响应头或500、503、504等状态码时,服务器自动将请求转发到负载均衡器的另一台服务器上,实现故障转义。
proxy_max_temp_file_size:设置临时文件的总大小。
proxy_redirect:可修改从代理服务器返回的响应头中的Location
和Refresh
字段(作用域重定向),在项目中未使用,但实际使用场景可以是,当服务器访问的地址又被重定向到了一个新的地址后,我们可以通过设定proxy_redirect
这个参数,将响应头的重定向信息进行修改,达到隐藏真实服务器地址的目的,
proxy_set_header:用于重新设置发往后端服务器的请求头。
add_header:用于重新设置后端返回的响应头。
proxy_pass:设置反向代理的地址,即转发的目标服