场景:
当后端服务器不直接面对客户,就需要代理了。这样的好处是代理可以进行缓存,加速访问,或者对访问进行负载均衡,做各种策略。
原理:
访问时 浏览器--反向代理--后端服务器,返回时 后端服务器--反向代理--浏览器
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在知识普及版块有说明
在这里,我们看到客户端和服务器能够通过作为代理的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; #池子名 } }
权重轮询
#指定轮询几率,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;