` nginx(三) | 听云轩

nginx(三)

关于nginx反向代理

Nginx反向代理服务器是指用代理服务器来接受Internet上的连接要求,然后将请求转发给内部上的服务器;并将从服务器上得到的结果反馈给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到web服务器上的请求发送到代理服务器中。但是,当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理的方式称为反向代理服务器。

AcR1XT.md.png

适用范围

  • 作为内容服务器的替身

如果你的内容服务器具有必须保持安全的敏感信息,可在防火墙外部设置一个代理服务器作为内容服务器的替身。当外部客户机尝试访问内容服务器时,会将其送到代理服务器。实际内容位于内容服务器上,在防火墙内部受到安全保护。代理服务器位于防火墙外部,在客户机看来就是像是内容服务器。

当客户机向站点发出请求的时候,请求将转发到代理服务器。然后,代理服务器通过防火墙中的特定通路,将客户机的请求转发到内容服务器。内容服务器再通过该通道将结果回传给代理服务器,代理服务器将检索到的信息发给客户机。

如果内容服务器返回错误信息,代理服务器会先行截取该信息并更改标头中列出的任何URL,然后再将消息发送给客户机。如此可防止外部客户机获取内部服务器的重定向URL。

AcWsx0.md.png

  • 作为内容服务器的负载均衡器

可以在一个组织内部使用多个代理服务器来平衡各web服务器间的网络负载。在此模型中,可以利用代理服务器的高速缓存特性,创建一个用于负载平衡的服务器池。此时,代理服务器可以位于防火墙的任意一侧。如果web服务器每天都会接收大量的请求,则可以使用代理服务器分担web服务器的负载并提高网络访问效率。

对于客户机发往真正服务器的请求,代理服务器起着中间调停的作用。代理服务器会将所请求的文档存入高速缓存。如果有不止一个代理服务器,DNS可以采用“循环复用法”选择其IP地址,随机为请求选择路由。客户机每次都使用同一个URL,但请求所采取的路由每次都可能经过不同的代理服务器。

可以使用多个代理服务器来处理对一个高用量内容服务器的请求,这样做的好处是内容服务器可以处理更高的负载,并且比其独自工作时更有效率。

Ach4jx.md.png

配置:

不需要增加额外的模块,用自己的proxy_pass转发就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream my_server {                                                         
server 10.0.0.2:8080;
keepalive 2000;
}
server {
listen 80;
server_name 10.0.0.1;
client_max_body_size 1024M;

location / {
proxy_pass http://my_server/;
proxy_set_header Host $host:$server_port;
}
}

通过使用upstream配置服务地址,使用server的location配置代理映射。结果就是,访问nginx地址10.0.0.1:80的请求会被转发到my_server的服务器地址10.0.0.2:8080

重定向报文代理

上面的配置只是简单的配置,当服务返回重定向报文的时候(301或者302),此时会将重定向的目标URL放进http 里面的response报文的header的location字段内。用户收到这个重定向时,会解析出该字段进行跳转,此时新的请求报文会直接发给内容服务器,而不是nginx代理服务器。为了避免这种情况,我们必须修改重定向报文的location信息。

1
2
3
4
5
6
location /my/ {
proxy_pass http://my_server;
proxy_set_header Host $host:$server_port;

proxy_redirect / /my/;
}

题外话!!!
(注:当proxy_pass 后面是 http://my_server 的时候,此时是转发到host:port/my,如果是 http://my_server/ 时,这时是转发到 host:port ,这是因为proxy_pass参数中如果不包含url的路径,则会将location的pattern识别的路径作为绝对路径)

正事!!!
使用proxy_redirect可以修改重定向报文的location字段,比如上面的例子,它会将所有根路径下的url代理到nginx的/my/路径下返回给用户。就是说,如果服务器返回的重定向报文的location原始值是/login,那么经过nginx代理后,用户收到的报文的location字段是/my/login。这时,浏览器将会跳转到nginx的/my/login地址进行访问。

------ 本文结束 ------
您的支持将鼓励我继续创作