ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Nginx配置反向代理

2021-12-12 16:02:54  阅读:166  来源: 互联网

标签:http header 代理 server Nginx 反向 proxy 服务器


目录

一.简介

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

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

二.配置

反向代理

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;

标签:http,header,代理,server,Nginx,反向,proxy,服务器
来源: https://www.cnblogs.com/rxysg/p/15679541.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有