Nginx配置反向代理

2021/12/13 7:22:14

本文主要是介绍Nginx配置反向代理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 一.简介
  • 二.配置
    • 反向代理
    • 反向代理websocket
    • 负载均衡
    • 反向代理https
    • 轮询策略
  • 三.技巧
  • 四.参数

一.简介

场景:
当后端服务器不直接面对客户,就需要代理了。这样的好处是代理可以进行缓存,加速访问,或者对访问进行负载均衡,做各种策略。

原理:
访问时 浏览器--反向代理--后端服务器,返回时 后端服务器--反向代理--浏览器

二.配置

反向代理

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;


这篇关于Nginx配置反向代理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程