nginx配合实际conf文件配置详解

一、概述

nginx是一个高性能的HTTP和反向代理web服务器,稳定具有丰富的功能集、简单的配置文件和低系统资源消耗。
轻量级的web服务器/反向代理服务器及电子邮件代理服务器
占有内存小,并发能力强
支持热部署,启动简单,可以做到不间断的运行。

二、Nginx的反向代理

1、正向代理:
在本地搭建一个服务器帮助访问目标服务器
2、反向代理
服务器中间的session不共享,使用过渡服务器只登陆一次,客户端不需进行任何配置直接将请求发送给反向代理服务器去选择目标服务器获取数据,再返还给客户端。
此时反向代理服务器和目标服务器就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的地址。

三、Nginx的负载均衡

负载均衡建立再现有的网络结构上,分摊到多个操作单元上上进行执行。
现有的请求使服务器压力太大无法承受,需要搭建一个服务器集群,分担原先一个服务器承担的压力。
三种关于负载均衡的方式:
1、轮询法(默认方法)
每个请求按时间顺序逐一分配到不同的后端服务器上,若服务down,能自动剔除。适合服务器配置相当,无状态且短平快的服务使用。也适用于图片服务器集群和纯静态页面服务器集群。
2、加权轮询
指定轮询的几率,权重和访问比率成正比,用于后端服务器性能不均的的情况。
3、ip_hash
在负载均衡的系统中,假如用户在某台服务器上已经登录,其session也已经保存在该服务器上那么我们采用ip_hash指令解决,每个请求按按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题

四、Nginx的动静分离

nginx的特性:静态处理强于动态处理
因此使用动态分离技术(采用代理的方式),在server{}段中加入带正则匹配的location来指定匹配项针对PHP的动静分离:
静态页面交给Nginx处理,动态页面交给PHP-FPM或Apache处理

五、配置文件-Nginx.conf文件

在修改配置文件之后要进行Nginx重启 Nginx.conf的重新加载

#全局模块
events {
#events模块
}

http
{

#http全局模块

server 
{

    #server全局模块
 
    location [PATTERN]{
       #location模块
    }
}

}
1、全局块
配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块
配置影响nginx服务器或与用户的网络连接。主要包括有
(1)每个进程的最大网络连接
(2)选取哪种事件驱动模型处理连接请求
(3)是否允许同时接受多个网络连接
(4)开启多个网络连接序列化等
3、http块
是Nginx服务器配置中最频繁的部分。
可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
http与server的关系是包含关系
4、server块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的IP配置。
配置虚拟主机的相关参数,一个http中可以有多个server
5、location块
一个server块可以配置多个location块。
主要作用是:基于Nginx服务器接收到的请求字符串(例如server_name、uri-string),对虚拟主机名称(也就是IP别名)之外的字符串进行匹配,对特定的请求进行处理。数据定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
配置请求的路由,以及各种页面的处理情况。

六、Nginx配置web服务器的案例

########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat ‘ r e m o t e a d d r – remote_addr– remoteaddrremote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for’; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。

upstream mysvr {   
  server 127.0.0.1:7878;
  server 192.168.10.121:3333 backup;  #热备
}
error_page 404 https://www.baidu.com; #错误页    
server {
    keepalive_requests 120; #单连接请求上限次数。
    listen       4545;   #监听端口
    server_name  127.0.0.1;   #监听地址       
    location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
       #root path;  #根目录
       #index vv.txt;  #设置默认页
       proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
       deny 127.0.0.1;  #拒绝的ip
       allow 172.18.5.54; #允许的ip           
    } 
}

}
域名和端口配置
在上述例子中listen 4545;#监听端口是4545
listen [::]:80;表示Nginx会同时监听IPv4和IPv6的80端口
listen :80;,listen :80;这两种写法是一样的。
location中URL匹配
location后面跟着的正则匹配,其实在nginx中,location url匹配是遵循一定优先级的
location = / {
# 完全匹配 =
# 大小写敏感 ~
# 忽略大小写 ~

}
location ^~ /images/ {
# 前半部分匹配 ^~
# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
}
location ~* .(gif|jpg|jpeg)$ {
# ~* 表示执行一个正则匹配,不区分大小写
# ~ 表示执行一个正则匹配,区分大小写
# 匹配所有以 gif,jpg或jpeg 结尾的请求
}
location / {
# 如果以上都未匹配,会进入这里
}
location中的优先级如下
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)
location = / {
#仅仅匹配请求
[ configuration A ]
}
location / {
#匹配所有以 / 开头的请求。但是如果有更长的同类型的表达式,则选择更长的表达式。如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration B ]
}
location /documents/ {

匹配所有以 /documents/ 开头的请求。但是如果有更长的同类型的表达式,则选择更长的表达式。

#如果有正则表达式可以匹配,则优先匹配正则表达式。
[ configuration C ]
}
location ^~ /images/ {

匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找。所以,即便有符合的正则表达式location,也不会被使用

[ configuration D ]
}
location ~* .(gif|jpg|jpeg)$ {

匹配所有以 gif jpg jpeg结尾的请求。但是 以 /images/开头的请求,将使用 Configuration D

[ configuration E ]
}
文件路径定义
在location模块中可以定义文件路径
根目录设置:
location / {
root /home/barret/test/;
}
主页设置:
index /html/index.html /php/index.php;
try_files设置
主要用于检查文件是否存在,使用第一个被找到文件返回。如果没有一个文件找到,那么重定向到最后一个参数指定的URI。如:
location /images/ {
try_files $uri /images/default.gif;
}

location = /images/default.gif {
expires 30s;
}
ps:$uri是不带请求参数的当前URI,下面的全局变量中会介绍,最后一个参数也可以是命名的location。如下:
try_files $uri $uri.html $uri/index.html @other;
location @other {
# 尝试寻找匹配 uri 的文件,失败了就会转到上游处理
proxy_pass http://localhost:9000;
}

location / {
# 尝试寻找匹配 uri 的文件,没找到直接返回 502
try_files $uri KaTeX parse error: Expected 'EOF', got '}' at position 16: uri.html =502; }̲ Rewrite重定向 如果要… /show?user=KaTeX parse error: Expected 'EOF', got '}' at position 10: 1 break; }̲ rewrite功能就是,使用…index来表示正则里的捕获分组
(3)重写类型
last:相当于Apache里的L标记,表示完成rewrite,浏览器地址栏URL地址不变
break:本条规则匹配完成后,终止匹配,不再匹配后面的规则,浏览器地址栏URL地址不变
redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
break与last的区别
last一般写在server和if中而break一般使用在location中
last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
break和last都能组织继续执行后面的rewirte指令
在location里一旦返回break则直接生效并停止后续的匹配location
server {
location / {
rewrite /last/ /q.html last;
rewrite /break/ /q.html break;
}
location = /q.html {
return 400;
}
}
访问/last/时重写到/q.html,然后使用新的uri再匹配,正好匹配到location=、q.html然后返回了400
访问/break时重写到/q.html,由于返回了break,则直接停止了
if表达式
语法: if(表达式) {}
内置的全局变量:
a r g s :这个变量等于请求行中的参数,同 args :这个变量等于请求行中的参数,同 args:这个变量等于请求行中的参数,同query_string
$content_length : 请求头中的Content-length字段。
$content_type : 请求头中的Content-Type字段。
$document_root : 当前请求在root指令中指定的值。
$host : 请求主机头字段,否则为服务器名称。
$http_user_agent : 客户端agent信息
$http_cookie : 客户端cookie信息
$limit_rate : 这个变量可以限制连接速率。
$request_method : 客户端请求的动作,通常为GET或POST。
$remote_addr : 客户端的IP地址。
$remote_port : 客户端的端口。
$remote_user : 已经经过Auth Basic Module验证的用户名。
$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme : HTTP方法(如http,https)。
$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name : 服务器名称。
$server_port : 请求到达服务器的端口号。
$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
u r i :不带请求参数的当前 U R I , uri : 不带请求参数的当前URI, uri:不带请求参数的当前URIuri不包含主机名,如”/foo/bar.html”。
d o c u m e n t u r i :与 document_uri : 与 documenturi:与uri相同。
内置的条件判断:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
配置文件中的 h t t p h o s t 和 http_host和 httphosthost不同之处在于:
h t t p h o s t 和 http_host和 httphosthost都是原始的’HOST’字段
比如请求的时候HOST的值时www.csdn.net那么反代后还是www.csdn.net
如果客户的请求的header中没有’HOST’这个字段时,建议使用 h o s t ,这时候的 host,这时候的 host,这时候的host就等于server_name
if表达式的例子:

如果文件不存在则返回400

if (!-f $request_filename) {
return 400;
}

如果host不是xuexb.com,则301到xuexb.com中

if ( KaTeX parse error: Expected '}', got 'EOF' at end of input: … rewrite ^/(.*) https://xuexb.com/$1 permanent;
}

如果请求类型不是POST则返回405

if ($request_method = POST) {
return 405;
}

如果参数中有 a=1 则301到指定域名

if ($args ~ a=1) {
rewrite ^ http://example.com/ permanent;
}
if通常与location规则搭配使用,如:

访问 /test.html 时

location = /test.html {
# 默认值为xiaowu
set KaTeX parse error: Expected 'EOF', got '#' at position 18: …me xiaowu; #̲ 如果参数中有 name=xx…args ~* name=(\w+?)(&|$)) {
set $name KaTeX parse error: Expected 'EOF', got '}' at position 8: 1; }̲ # 301 …name.html permanent;
}
上面表示:
/test.html => /xiaohu.html
/test.html?name=ok => /ok.html?name=ok

注:$1代表的是前面语句中第一个()中的内容 $2为第二个以此类推

反向代理
实例1:
实现效果:使用Nginx反向代理,访问www.123.com直接跳转到127.0.0.1:8080
注意:此处如果想要从www.123.com跳转到本机指定的ip,需要修改本机的host
server {
listen 80;
server_name 192.168.17.129;

location / {
	root   html;
	index  index.html index.htm;
	proxy_pass  http://127.0.0.1:8080
}

}

如上的配置,Nginx监听80端口,访问域名为www.123.com(不加端口号时默认为80端口),故访问该域名时会跳转到127.0.0.1:8080路径上。
此处的意思为:nginx反向代理服务监听192.168.17.129的80端口,如果有请求过来,则转到proxy_pass配置的对应服务器上。
在location下,同时配置root和proxy_pass选项时,两个选项只会二选一执行此处不能配置https反向代理。
实例2:
实现效果:使用Nginx反向代理,根据访问的路径跳转到不同的端口的服务中,
Nginx监听端口为9001
访问http://192.168.17.129/edu/ 直接跳转到127.0.0.1:8080
访问http://192.168.17.129/vod/ 直接跳转到127.0.0.1:8081
server {
listen 9001;
server_name 192.168.17.129;

location ~ /edu/ {
	proxy_pass  http://127.0.0.1:8080
}

location ~ /vod/ {
	proxy_pass  http://127.0.0.1:8081
}

}

根据上面的配置,当请求到达Nginx反向代理服务器时,会根据请求路径不同进行分发到不同的服务上。

补充:location指令说明
用于匹配URL,语法如下:
location [ =| ~ | ~* | ^~] uri {
}
=:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求
~:用于表示uri包含正则表达,并且区分大小写
~*:用于表示uri包含正则表达式,并且不区分大小写
^~:用于不含正则表达式的uri前,要求nginx服务器找到标识uri和请求。字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
注意:如果uri包含正则表达式,则必须要有或者*标识

补充参数:
Gzip:压缩提升网站速度
gzip配置的常用参数
gzip on|off; #是否开启gzip
gzip_buffers 32 4K| 16 8K #缓冲(压缩在内存中缓冲几块?每块多大?)
gzip_comp_level[1-9] #推荐6 压缩级别越高,压得越小,越浪费CPU计算资源
gzip_disable #正则匹配UA 什么样的Uri不进行gzip
gzip_min_length 200 #开始压缩的最小长度(最小就不要压缩了,意义不大)
gzip_http_version 1.0|1.1 #开始压缩的http协议版本(目前不可设置,几乎全为1.1协议)
gzip_proxied #设置请求者代理服务器,该如何缓存内容
gzip_types text/plain application/xml #对哪些类型的文件用压缩 如txt,xml,html,css
gzip_vary on|off #是否传输gzip压缩标志
注意:
图片/mp3这样的二进制文件不必压缩,因为压缩率比较小,比如100->80字节,而且压缩也是浪费CPU资源。

include指令
存在多个域名时,如果配置都写在nginx.conf主配置文件中,会显得臃肿,为了方便配置文件的维护,要进行拆分配置。使用include可以将拆分的多个conf配置文件组合到一个conf文件中
主配置文件的位置:
Linux位于nginx根目录/nginx.conf下
window位于nginx根目录/conf/nginx.conf下
例如,可以在nginx.conf中http块中添加以下指令:
worker_processes 1;

events {
worker_connections 1024;
}
http {
include mime.type;
default_type application/octet-sream;

sendfile on;
keepalive_timeout 65;

#添加的指令 更具自己的系统选择
include …/conf.d/.conf; # widow版本
#include .conf.d/
。conf; #linux 版本
}

mime.types与default_type
在nginx.conf配置文件http指令块有如下默认指令
http {
include mime.types;
default_type application/octet-stream;
}
include表示纳入mime.types文件的配置,如果nginx.conf有重复的指令,可以抽取出来使用include来简化配置,避免修改一个相同的配置,要改动好几个地方。
mime-type意为一种规范,当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的mime配置文件中找到对应的mime type,再根据mime type 设置http response的content-type,然后客户端如浏览器根据content-type的值处理文件。
default_type如果Web程序没设置,nginx也未找到对应的文件扩展名的话,就使用默认的Type,就是应用程序文件类型的默认值。
application/octet-stream(HTTP规范中content-type的一种),意为未知的应用程序文件,浏览器一般不会自动执行或询问执行。
conf/mime.type 文件内容如下:

types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;

text/mathml                                      mml;
text/plain                                       txt;
text/vnd.sun.j2me.app-descriptor                 jad;
text/vnd.wap.wml                                 wml;
text/x-component                                 htc;

image/png                                        png;
image/svg+xml                                    svg svgz;
image/tiff                                       tif tiff;
image/vnd.wap.wbmp                               wbmp;
image/webp                                       webp;
image/x-icon                                     ico;
image/x-jng                                      jng;
image/x-ms-bmp                                   bmp;

application/font-woff                            woff;
application/java-archive                         jar war ear;
application/json                                 json;
application/mac-binhex40                         hqx;
...

即服务器上有一个后缀名为png的文件
根据mime.type,这个文件的数据类型应该是image/png
将content-type的值设置为image/png,然后发送给客户端

client_max_body_size client_body_buffer_size配置
client_max_body_size默认1M表示客户端请求服务器最大允许的大小
在Content-Length请求头中指定。如果请求的正文数据大于client_max_body_size,HTTP协议会报错413,也就是意味着请求的正文大于client_max_body_size,一定是失败的。如果需要上传大文件,一定要修改该值。
client_body_buffer_size:nginx分配给请求数据的Buffer大小,如果请求的数据小于client_body_buffer_size直接将数据先在内存中存储。如果请求的值大于client_body_buffer_szie小于client_max_body_size,就先将数据存储到临时文件中
一般该临时文件为默认路径下的/tmp/.
所以配置的client_body_temp地址,一定要让执行的Nginx的用户组有读写权限。否则,当传输的数据大于client_body_buffer_size,写进临时文件失败会报错。
20648 open() “/usr/local/openresty-1.9.7.5/nginx/client_body_temp/0000000019” failed (13: Permission denied)

sendfile

语法:sendfile on | off
默认值为 off
指定是否使用sendfile系统调用来传输文件。
sendfile系统调用在两个文件描述符之间直接传递(完全在内核中操作),避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。
而在传统的文件传输方式(read、write/send方式),具体流程细节
调用read函数,将文件数据拷贝到内核缓冲区
read函数返回,数据从内核缓冲区拷贝到用户缓冲区
调用write/send函数,将数据从用户缓冲区拷贝到内核socket缓冲区
数据从内核socket缓冲区拷贝到协议引擎中
整个过程进行了四次拷贝的操作:
硬盘->内核缓冲区->用户缓冲区->内核socket缓冲区->协议引擎
但是使用sendfile
系统调用提供了一种减少拷贝次数,提升文件传输性能的方法。
1、sendfile系统调用利用DMA引擎将文件数据拷贝到内核缓冲区,之后数据被拷贝到内核socket缓冲区中
2、DMA引擎将数据从内核socket缓冲区拷贝到协议引擎中
这里不存在用户态和内核态之间的切换,也没有内核缓冲区和用户缓冲区之间的拷贝,大大提高了传输性能。整个过程的数据经历的拷贝如下:
硬盘->内核缓冲区->内核socket缓冲区->协议引擎

Proxy buffer参数总结

proxy_buffering
语法:proxy_buffering on|off
默认值是 on
作用:该指令开启从后端被代理服务器的响应body缓冲,假定的代理服务器会最快速度相应并且把内容保存在由指令proxy_buffer_size和proxy_buffers指定的缓冲区里。

proxy_buffers
语法:proxy_buffers 数量 size
默认值:proxy_buffers 256 8k
作用:设置存储被代理服务器响应的body所占用的buffer个数和每个buffer大小
开辟256个长度为8k大小的read_buf用来存储body,最多申请256个buf

proxy_buffer_size
语法:proxy_buffer_size size
默认值:proxy_buffer_size 4k/8k
作用:Nginx使用该大小申请read_buf,即大小指定了upstream header最大长度,如果响应头超过这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502

proxy_busy_buffers_size
语法:proxy_busy_buffers_size size
作用:proxy_busy_buffers_size不是独立的空间,是proxy_buffers和proxy_buffer_size的一部分。是用于设置处于busy状态的buffer有多大。
nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer状态的buffer来专门向客户端传送数据(建议为proxy_buffer中单个缓冲区的2倍),然后他继续从后端取数据。
1)如果完整数据大小小于busy_buffer大小,当数据传输完成后,马上传给客户端;
2)如果完整数据大小不小于busy_buffer大小,则装满busy_buffer后,马上传给客户端;

proxy_temp_path
语法:proxy_temp_path path [level1 level2 level3]
默认值:proxy_temp_path proxy_temp
作用:定义proxy的临时文件存在目录以及目录的层级

proxy_max_temp_file_size
语法:proxy_max_temp_file_size size;
默认值:proxy_max_temp_size 1024m;
作用:设置临时文件的总大小

proxy_temp_file_wirte_size
作用:设置同时写入临时文件的数据量的总大小。通常设置为8k或者16k。

proxy_pass
其主要作用是代理转发
语法格式:proxy_pass URL;
案例描述:假设服务器域名为:www.xxx.com
后端服务器为:192.168.1.10
当请求http://www.xxx.com/aming/a.html的时候,以上示例分别访问的结果是
1、不以(“/”)结尾
访问: http://www.xxx.com/aming/a.html
location /aming/
{
proxy_pass http://192.168.1.10;
}
被代理的完整地址为:http://192.168.1.10/aming/a.html
总结:如果没有/,则会把匹配的路径部分(location后面/aming/)也给代理走
2、以(“/”)结尾
访问:http://www.xxx.com/aming/a.html
location /aming/
{
proxy_pass http://192.168.1.10/;
}
被代理的完整地址为:http://192.168.1.10/a.html
总结:当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走。
3、以(“xxx/”)结尾
访问:http://www.xxx.com/aming/a.html
location /aming/
{
proxy_pass http://192.168.1.10/linux/;
}
被代理的完整地址为:http://192.168.1.10/linux/a.html
总结:当在后面的url加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分带走。
4、以(“xxx”)结尾
访问:http://www.xxx.com/aming/a.html
location /aming/
{
proxy_pass http://192.168.1.10/linux;
}
被代理的完整地址为:http://192.168.1.10/linuxa.html
总结:建议所有的proxy_pass 后的url都以“/”结尾

upstream
利用proxy_pass可以将请求代理到后端服务器,但仅限于指向同一台服务器。
若需指向多台服务器就需要使用ngx_http_upstream_module。它为反向代理提供了负载均衡及故障转移等重要功能。
代理多台服务器:
upstream test_servers {
server 127.0.0.1:81 max_fails=5 fail_timeout=10s weight=10;
server 127.0.0.1:82 max_fails=5 fail_timeout=10s weight=5;
server test.123.com backup;
server 127.0.0.1:82 down;
}
server {
listen 80;
location / {

通过代理将请求发送给upstream命名的http服务

proxy_pass http://test_servers;
}
}
其中参数的含义:
weight(请求分发到后端服务器的权重,即每台后端服务器能够响应的请求数量的比例,其为正比)
max_fails(请求最大的失败次数,默认是1,设置为0代表禁用这个设置)
fail_timeout(在指定时间内请求失败的次数,超过这个次数则认为服务器不可用)
down 标记服务不可用
backup 当upstream中所有的后端服务器都被设置为不可用时(如全都超过了请求最大失败次数),upstream会对backup的服务器进行分流。

proxy_hide_header和proxy_pass_header
1)proxy_hide_header
语法:proxy_hide_header field;
默认不会将“date”、“Server”、“X-Pad”和“X-Accel-…”响应头发送给客户端。
proxy_hide_header指令则可以设置额外的响应头,这些响应头也不会发送给客户端。相反的,如果希望允许传递某些响应头给客户端,可以使用
2)proxy_pass_header指令。其功能与proxy_hide_header 相反
3)proxy_set_header
语法:proxy_set_header field value;
允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面级别继承配置。默认情况下,只有两个请求头会被重新定义:
不想改变请求头“host”的值,可以这样来设置:
proxy_set_header Host h t t p h o s t ; 如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,更好的方式是使用 http_host; 如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,更好的方式是使用 httphost;如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。这种情况下,更好的方式是使用host 变量——它的值在请求包含“Host”请求头是为"host"字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名:
proxy_set_header Host $host;
此外,服务器名可以和后端服务器的端口一起传送:
proxy_set_header Host h o s t : host: host:proxy_port;
如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:
proxy_set_header Accept-Encoding “”;

X-Real-IP和X-Forwarded-For请求头
一个请求是可以分为请求头和请求体的,在客户端中IP地址信息一般都是存储在请求头里的。如果使用Nginx做负载均衡,需要在location里面配置X-Real-IP和X-Forwarded-For请求头:
location ^~ /your-service/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For KaTeX parse error: Double subscript at position 12: proxy_add_x_̲forwarded_for; …remote_addr变量拿到的将是反向代理服务器的ip地址。因此若想获取用户端的真实IP地址则需要使用X-Real-IP

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值