知识要点:
正向代理反向代理基本概念
正向代理的基本指令操作
反向代理的基本操作指令
反向代理实战 ---负载均衡实战
正向代理反向代理简介
正向代理
首先我们来看一张图:
这里就好比外面的的因特网像是一个巨大的资源库 ,那么资源就分布在因特网的各个节点上我们局域网的客户端要访问外面的资源,那么就需要经过 正向代理服务器 才能对各个资源进行访问
这里的局域网内的机器借助了代理服务器访问局域网外部的资源,这主要是为了增强局域网内部的网络安全性,使得外网的威胁因素影响不到内部的网络 这里的代理服务器起到了防火墙的作用 同时也可以对局域网内的访问进行必要 监控和管理 ,正向代理服务器不支持外部对内部网络的访问请求。
反向代理
与正向代理相反
如果我们的局域网向Internet提供资源,让internet上的其他用户可以访问我们局域网内部资源,也可以设置一个代理服务器 ,他提供的服务就叫做反向代理 (Reverse proxy)服务。
归纳起来就是说:
- 正向代理服务器用来让局域网客户机接入外网以访问外网资源
- 反向代理服务器是让外网的用户接入局域网中的站点以访问网点中的资源
在正向代理中我们是客户端 目的是访问外网资源
在反向代理中我们是站点目的是把站点的资源发布出去让其他客户端能够访问。
了解完概念之后我们来实际的了解一下如何配置 他的指令是如何
正向代理的基本操作指令
简介
指令名称 | 用途 |
---|---|
resolver | 指定 DNS ip地址 默认端口53 |
resolver_timeout | 设置解析超时时间 |
proxy_pass | 代理服务器的协议地址 |
首先我们来看一按下Nginx服务器的正向代理服务的相关配置指令和正向代理服务的使用
在工作中使用Nginx代理服务功能的情况相对较少,Nginx代理服务器本身也相对简单
涉及的主要指令不多
- resolver
该指令用于指定DNS服务器的IP地址。DNS服务器的主要工作是对域名的解析工作,将域名转变为对应的ip地址。该指令的语法为
server {
resolver 8.8.8.8 valid =30s;
#解读: 设置DNS服务器的IP;NDS的主要操作是做域名解析,将域名的映射为对应的IP地址
#time 有些情况下 我们的数据包在一定的时间内不能被传递到目的地,
#但是又不能让这个数据包无线的存在,于是我们可以设定一个时间 ,
#当数据包在这段时间内没有到达目的地就会被丢弃 然后发送者会受到一个消息
#并且决定要不要重新发送该数据包
listen 80;
server_name localhost;
}
#一般情况下我们只用设置ip即可
#注意:
#在1.1.7开始 支持使用多个IP 从1.3.1开发版和1.2.2稳定版开始支持ipv6协议
- resolver_timeout 指令
该指令用于设置DNS服务器解析超时时间
server {
resolver 8.8.8.8 valid =30s;
resolver_timeout 100s;
#设置DNS服务器的解析超时时间
listen 80;
server_name localhost;
#charset koi8-r;
- proxy_pass指令
该指令用于代理服务器的协议的地址,他不仅仅nginx的代理服务更用于 nginx的反向代理服务 (在反向代理中会有详细的讲解)
proxy_pass URL ;
URL指的是 设置带代理的服务器协议和地址
在配置中比较固定一般是 :
server {
resolver 8.8.8.8 valid =30s;
resolver_time 100s;
#设置DNS服务器的解析超时时间
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://$http_host$request_uri;
}
其中代理服务器协议设置为Http,request两个变量是Nginx支持的动态获取主机和uri的变量 。设置代理服务器时一般不要改变这个配置
详细的在反向代理中会做详细的讲解
反向代理基本操作指令
重点 :工作中用到的最多的一种方式
nginx服务气得反向代理是我们工作中最常用到的,也是用到最多的功能之一,涉及到的指令也是比较多的,各类的指令以及功能也不尽相同 (讲的时候不要分心去回答问题一次讲完 不然会窜讲)
nginx服务器的反向代理也是比较高效的.
首先我们来学习需要掌握的基本指令
基本指令一共21个 在这里只和大家介绍重点的。
- proxy_pass
设置被代理的服务器地址
upstream appserver{
#如果是一组服务器的话这样配置 建议这样配置以后你加的话 也比较好加
server http:127.0.0.1:8080 weight=1;
server http:127.0.0.1:8081 weight=1;
# 1-2 ip_hash; 服务器 不会太大
# 3-5 session复制; 配置比较麻烦一点
# 5以上 redis共享 直接代码层次
ip_hash;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /server {
# 跳转的地址 被代理的服务器地址
# 如果在服务器内部指明了http://那么这里写这个http是也是可以的
proxy_pass http://yunxiserver;
}
}
#使用还要注意URL中是否包含URI 如果有的话那么处理方式就不一样了
#具体的如下:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /server {
proxy_pass http://yunxiserver;
}
如果由我们的客户端发起请求 127.0.0.1:8080/server那么该请求将会被配置 中显示的location块进行处理,由于Proxy_pass指令中URL不含有uri所以会转向到127.0.0.1/server
下面我们来看看这个:
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /server {
proxy_pass http://yunxiserver/Text.jsp;
#注意后面加'/'和不加'/'的区别很大 加了就代表你配置了uri 千万记住
}
在这个配置中我们配置了uri /Text.jsp 如果客户端任然发起127.0.0.1:8080/server请求 那么nginx服务器会将其跳转到127.0.0.1:8080/Text.jsp
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# 1
proxy_pass http://yunxiserver;
# 2
proxy_pass http://yunxiserver/;
}
在这个案例中我们location使用"/"来作为url变量的值匹配不包含uri的请求URL由于请求中不包含uri那么配置1和2效果是一样的
总结:
如果location匹配有参数的话,我们不想让他改变uri那么我们就不要配置URL的变量中的uri;
- proxy_hide_header指令
该设置用于设置nginx服务器在发送Http响应是隐藏一些头域信息
proxy_hide_header field;
中间 field 为需要发送的头域 该指令可以在 http server location块中进行配置
- Proxy_pass_header指令
默认的情况下 ,nginx服务器发送响应报文时 ,报文头中不包含"Date" "Serer" "X-Accel" 等来自被代理的服务器的头域信息 那么如果我们想要想要设置哪些头域信息被发送语法如下
Proxy_pass_header field;
#field 指的是哪些文件将被发送
- proxy_pass_request_body 指令
该指令用于配置是否将客户端的请求体发送给代理服务器,其语法结构为:
proxy_pass_request_body on|off;
#默认为on 开关可以在 http块 server 或者 location 块中进行配置
- proxy_pass_request_headers指令
该指令用于配置是否将客户端的请求头发送给代理服务器,其语法结构为:
proxy_pass_request_headers on|off;
#默认为on 开关可以在 http块 server 或者 location 块中进行配置
- proxy_set_header指令
该指令可以更改nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发给被代理的服务器,
其语法结构为 :
proxy_set_header field value;
#field 你要更改的信息所在的头域
#value 更该的值,支持文本,变量或者说变量的结合
默认情况下的配置
proxy_set_header host $proxy_host;
实例:
将目前host的值充填成客户端的地址值
proxy_set_header host $http_host;
将location块的server_name的指令充填到Host头域
proxy_set_header host $host;
- proxy_set_body指令
该指令可以更改nginx服务器收到的客户端请求的请求体信息,然后讲新的请求体发送给被代理的服务器
语法结构:
proxy_set_body value;
value是更改的信息,支持文本变量或者变量的组合
- proxy_bind指令
官方解释是说他是强行将代理主机绑定到指定的ip地址
简单点就是: 在配置了多个ip主机的情况下,如果我们希望代理连接由指定的主机处理,那就用它吧!
proxy_bind ip;
#ip 指的是主机ip
只有0.8.22nginx以上支持
- proxy_coonext_timeout指令
该指令配置nginx服务器与后端被代理的服务器尝试建立连接的超时时间,其语法结构为:
proxy_connect_timeout time;
#Time为超时时间默认60s
- proxy_read_timeout指令
该指令表示nginx服务器向后端被代理服务器发出read请求后等待响应超时时间
proxy_read_timeout time;
#Time为超时时间默认60s
- proxy_send_timeout指令
该指令表示nginx服务器向后端发起write请求后等待响应的超时时间
proxy_send_timeout time;
#Time为超时时间默认60s
- proxy_http_version指令
该指令表示设置http协议版本
proxy_http_version 1.0|1.1;
版本自己选择 1.0或者1.1稳定一点
- proxy_method指令
该指令用于设置nginx服务器请求被代理服务器时使用的请求方法,一般为post 或者get
如果设置了该方法那么客户端的请求将会被忽略
proxy_method post|get;
注意自己选择get还是post 不要加 "" 号
注意自己选择get还是post 不要加 "" 号
- proxy_ignore_client_abort指令
该指令用于设置客户端中断网络请求,nginx服务器是否中断被代理的服务器请求
proxy_ignore_client_abort off|on
默认off ; 极少使用 数据交互
- proxy_ignore_headers指令
该指令我们常用于设置一些http的响应头区域 nginx服务器接收到被代理的服务器响应时不会被处理设置的头域
proxy_ignore_headers field ...
field 未设置的http响应头的区域,例如"x-accel-REdirect","x-Accel-Expires"
等
对头域的处理
至此,有关nginx反向代理相关的重要配置已经编写好分享给大家了,后续了解有关更深入的nginx知识点,请关注!