在以前接口调用的过程当中出现了没法访问接口的Bug,究其缘由可能出在Nginx进行服务转发代理的问题上,因此但愿结合项目中使用到的Nginx配置表好好对Nginx的配置进行学习。javascript
#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帐号。php
worker_processes 1:设定工做进程数,一般设定为CPU数量或CPU数量的两倍。css
error_log:定义错误日志的存放路径。路径后面的参数为错误日志输出级别,分别有debug
、info
、notice
、warn
、error
、crit
六个级别,其中debug
级别输出的错误日志最详细,crit
级别输出的错误日志最简略html
pid:nginx的进程号,当咱们须要中止nginx时,使用的其中一种方式就能够是经过进程号杀死进程的方式。前端
events {
worker_connections 1024;
}
复制代码
worker_connections:每个进程所容许的最大链接数,理论上每台Nginx服务器的最大链接数为上文提到的worker_processes
*worker_connections
。java
use worktype:use
是个事件模块指令,用于指定事件模型,可是在此项目中未使用到,由于windows下无需指定事件模型(Nginx针对不一样操做系统会使用不一样的事件模型)。Nginx可支持的的worktype
有如下几种select
、poll
、kqueue
、epoll
、rtsig
、/dev/poll
:node
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+。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
是个主模块指令,实现对配置文件所包含的文件设定,减小主配置文件的复杂度。nginx
default_type:http核心模块指令,默认设置为二进制流,也就是当文件类型未在mime.types
中定义时会使用这种方式,本项目中默认类型设置为octet-stream
,表示当文件类型未定义时浏览器认为响应的是普通的文件流,并会提示用户下载文件。如当未定义以.PHP结尾的文件时,当访问PHP文件时就会出现下载窗口。正则表达式
log_format main:log_formate
是Nginx的httplog模块指令,用于指定Ningx的日志输出格式。main
为为此日志设置的名字,在下面的access_log
指令中使用这个名字,就能够按照这个名字定义的格式进行日志输出。windows
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链接最多能够保持多长时间。
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压缩过的资源,不然,若是缓存服务器只缓存了压缩事后的资源,那么返回压缩事后的资源会导师老版本浏览器没法解压,出现乱码。
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
次失败后,暂停访问,并将该节点标记为不可用,并等待下一个周期再访问该节点,若下个周期该节点链接成功,则恢复原来的轮询方式,不然在下一个周期将再重试一次,如此往复。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和其余的访问信息。
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天的缓存失效时间。
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、50三、504等状态码时,服务器自动将请求转发到负载均衡器的另外一台服务器上,实现故障转义。
proxy_max_temp_file_size:设置临时文件的总大小。
proxy_redirect:可修改从代理服务器返回的响应头中的Location
和Refresh
字段(做用域重定向),在项目中未使用,但实际使用场景能够是,当服务器访问的地址又被重定向到了一个新的地址后,咱们能够经过设定proxy_redirect
这个参数,将响应头的重定向信息进行修改,达到隐藏真实服务器地址的目的,
proxy_set_header:用于从新设置发日后端服务器的请求头。
add_header:用于从新设置后端返回的响应头。
proxy_pass:设置反向代理的地址,即转发的目标服