一.简介
场景:
当后端服务器不直接面对客户,就需要代理了。这样的好处是代理可以进行缓存,加速访问,或者对访问进行负载均衡,做各种策略。
原理:
访问时 浏览器--反向代理--后端服务器,返回时 后端服务器--反向代理--浏览器
二.配置
反向代理
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
proxy_set_header Accept-Encoding "";
# 应用服务器 HTTP 地址
proxy_pass http://192.168.0.112:8080;
}
}
反向代理websocket
关于什么是websocket在知识普及版块有说明
在这里,我们看到客户端和服务器能够通过作为代理的NGINX进行通信,并且消息可以继续来回发送,直到客户端或服务器断开连接。
让NGINX正确处理WebSocket所需要的是正确设置头文件来处理将连接从HTTP升级到WebSocket的升级请求。
upstream websocket {
server 192.168.100.10:8010; #后端WebSocket程序
}
server {
listen 8010; #端口一般是对等的
server_name xx;
location / {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; #升级http协议
proxy_set_header Connection $connection_upgrade;
}
}
负载均衡
当后端服务器不够用时,将使用负载均衡技术,将请求分发
#1.配置负载池子
upstream myapp {
server 192.168.0.111:8080; # 应用服务器 1
server 192.168.0.112:8080 bak; # 应用服务器 2,表示只有其他机器都繁忙或者坏掉,才用这台
server 192.168.0.113:8080 down #表示暂不参与
}
#2.调用池子
server {
listen 80;
server_name xx;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://myapp; #池子名
}
}
反向代理https
轮询策略
权重轮询
#指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream backserver {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
ip_hash
#每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
fair(第三方)
#按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}
url_hash(第三方)
#按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
三.技巧
在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。
假设下面四种情况分别用 http://192.168.1.1/proxy/test.html 进行访问。
第一种:
location /proxy/ {
proxy_pass http://127.0.0.1/;
}
代理到URL:http://127.0.0.1/test.html
第二种(相对于第一种,最后少一个 / )
location /proxy/ {
proxy_pass http://127.0.0.1;
}
代理到URL:http://127.0.0.1/proxy/test.html
第三种:
location /proxy/ {
proxy_pass http://127.0.0.1/aaa/;
}
代理到URL:http://127.0.0.1/aaa/test.html
第四种(相对于第三种,最后少一个 / )
location /proxy/ {
proxy_pass http://127.0.0.1/aaa;
}
代理到URL:http://127.0.0.1/aaatest.html
四.参数
#请求头为空的字段,将不传递给后端服务器。
proxy_set_header Accept-Encoding "";
#将端口,访问ip等传递给后端服务器。否则后端将只能看到nginx的访问。
proxy_set_header Host $host:$server_port;
#只传一层客户端的值,如果前面有代理,相当于2层代理,就只传代理的ip了。
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
#如果前面还有代理,nginx1-nginx2-php程序,那nginx2这层将给php程序nginx1的地址还有客户端的地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#关闭缓存,将加快交互
proxy_buffering off;
#指定哪个网卡链接后端服务器
proxy_bind 127.0.0.2;
#存放http报文头的哈希表容量上限,默认为512个字符
proxy_headers_hash_max_size 1024;
#设置头部哈希表大小 默认为64
proxy_headers_hash_bucket_size 128;
# 应用服务器 HTTP 地址
proxy_pass http://192.168.0.112:8080;
#缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
client_body_buffer_size 512k;
#nginx 跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 5;
#这个指定设置了发送请求给upstream服务器的超时时间。超时设置不是为了整个发送期间,而是在两次write操作期间。如果超时后,upstream没有收到新的数据,nginx会关闭连接
proxy_send_timeout 60;
#该指令设置与代理服务器的读超时时间。它决定了nginx会等待多长时间来获得请求的响应。这个时间不是获得整个response的时间,而是两次reading操作的时间。
proxy_read_timeout 10;
#设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size 16k;
#proxy_buffers 缓冲区,网页平均在 64k 以下的话,这样设置
proxy_buffers 4 64k;
#高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 128k;
#设定缓存文件夹大小,大于这个值,将从 upstream 服务器传递请求,而不缓冲到磁盘
proxy_temp_file_write_size 128k;
#不允许代理端主动关闭连接
proxy_ignore_client_abort on;
#未知
proxy_redirect off;