0%

nginx学习笔记:代理设置

写在前面

这则笔记整理nginx代理相关的知识,主要包括:

  • 正向代理(解决内网服务器上网的问题)

  • 反向代理(解决访问一台内网服务器的问题)

  • 负载均衡(反向代理的升级版,解决访问多台内网服务器的问题)

正向代理

正向代理,解决的是服务器上网的问题。假定我们的有一台服务器A,处于安全原因,这台服务器不允许直接连接外网,但在实际使用过程中,又需要访问网络。此时,利用nginx的正向代理功能就能解决这个问题。

正向代理的原理,相当于一个跳板。假定我们还有一台服务器B,这台机器是可以正常登陆外网的。此时,我们在服务器B上部署正向代理。A的访问请求发送给B,经由B转发,访问网上真正的目标地址。

核心配置如下:

1
2
3
4
5
6
7
8
server {
listen 80 default_server;
resolver 119.29.29.29;
location /
{
proxy_pass http://$host$request_uri;
}
}

说明:

  • resolver:DNS服务器的地址。国内常用的DNS地址119.29.29.29为dnspod公司提供。 国际通用DNS 8.8.8.8或者8.8.4.4为google提供;1.1.1.1由cloudflare提供。

  • default_server:之所以要设置为默认虚拟主机,是因为这样就不用设置server_name了,任何域名解析过来都可以正常访问;

  • proxy_pass:用来设置要代理的目标url;

查询公共DNS服务器:http://dns.lisect.com/

配置正向代理步骤:

第一步:跳板机配置:

在现实环境中,有的网站使用http,监听的是80端口;有的使用https,监听的是443端口,因此,在配置正向代理时,也需要配置两个server节点,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {  
resolver 114.114.114.114; #指定DNS服务器IP地址
listen 80;
location / {
proxy_pass http://$http_host$request_uri; #设定代理服务器的协议和地址
proxy_set_header HOST $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_next_upstream error timeout invalid_header http_502;
}
}
server {
resolver 114.114.114.114; #指定DNS服务器IP地址
listen 443;
location / {
proxy_pass https://$host$request_uri; #设定代理服务器的协议和地址
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_next_upstream error timeout invalid_header http_502;
}
}

第二步:内网服务器配置:

curl代理设置

  • 访问http:
1
curl --proxy proxy_server:80 http://www.163.com/
  • 访问https:
1
curl --proxy proxy_server:443 https://www.baidu.com/

wget代理设置:

1
2
3
4
vim /etc/wgetrc 
//这里的ip为跳板机的内网ip
http_proxy=172.16.155.131:80
http_proxy=172.16.155.131:443

yum代理设置:

1
2
3
4
5
6
vim /etc/yum.conf
//这里的ip为跳板机的内网ip
proxy=http://172.16.155.131:80
proxy=ftp://172.16.155.131:80
#proxy_username=username #####代理的用户名
#proxy_password=password #####代理的密码

全局代理设置:

1
2
3
4
5
6
vim /etc/profile
http_proxy = http://172.16.155.131:80
http_proxy = http://172.16.155.131:443
ftp_proxy = http://172.16.155.131:80/
export http_proxy
export ftp_proxy

反向代理

反向代理,跟正向代理刚好相反。通过正向代理,能够让处在防火墙背后的内网服务器访问外网。而通过反向代理,则可以把来自外网的请求转发给内网服务器。

假设有一台国内云主机A,如果法规限制,域名不备案就不开放80端口,因此可以采取曲线救国的方法,将域名解析到国外的云主机B,在服务器B上部署反向代理,来访问部署在A上的网站。

配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
server 
{
listen 80;
server_name test.com;

location /
{
proxy_pass http://10.1.18.5/;
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://, https://等)、主机名(域名或者IP:PORT)、uri。注意后面要加上/,如:http:////10.1.18.5:8080/

  • proxy_set_header:

语法:proxy_set_header field value;field为要更改的项目,也可以理解为变量的名字,比如host;value为变量的值;如果不设置proxy_set_header,则默认host的值为proxy_pass后面跟的那个域名或者IP(一般写IP)

  • proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

用来设置被代理端接收到的远程客户端IP,如果不设置,则header信息中并不会透传远程真实客户端的IP地址。

配置步骤如下:

代理服务器设置

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name www.test.com;

location /test/
{
proxy_pass http://172.16.155.131:8080/test/;
proxy_set_header host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

被代理服务器设置:

1
2
3
4
5
6
7
8
9
10
11
server{
listen 8080;
server_name www.test.com;
root /data/wwwroot/test.com/;
index index.html;
location /test/ {
echo "$host";
echo $remote_addr;
echo $proxy_add_x_forwarded_for;
}
}

均衡负载

Nginx通过upstream和proxy_pass实现了负载均衡。本质上也是Nginx的反向代理功能,只不过后端的server为多个。

简单轮询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//均衡负载需要使用upstream来定义一个服务器组;
//www 是这个组的名称,可以自定义;
//proxy_pass 会将请求平均分为www组里的服务器
upstream www {
server 172.16.155.131:80;
server 172.16.155.132:80;
}

server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://www/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

带权重轮询+ip_hash算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//weight表示权重,数字雨打,权重越高;这里的意思是150个请求中,有100个发到132服务器,50个发到131服务器。
//max_fails,允许请求失败的次数,默认为1。当失败次数达到该值,就认为该机器down掉了。
//fail_timeount,定义失败的超时时间,也就是说在该时间段内达到max_fails,才算真正的失败。默认是10秒。
//down,表示当前的server不参与负载均衡;
//backup,为预留的机器,当其他的server(非backup)出现故障或者忙的时候,才会请求backup机器;
//ip_hash 作用是根据请求所属的客户端IP计算得到一个数值,这个数值一个识别码。假定这个客户端第一次分给了131,以后的请求都同样分给131

upstream www {
server 172.16.155.131:80 weight=50 max_fails=3 fail_timeout=30s;
server 172.16.155.132:80 weight=100;
server 172.16.155.133:80 down;
server 172.16.155.134:80 backup;
ip_hash;
}
server
{
listen 80;
server_name www.aminglinux.com;
location / {
proxy_next_upstream off;
proxy_pass http://www/;
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_next_upstream [参数]

参数 解释
error 和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误
timeout 和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现超时
invalid_header 后端服务器返回空响应或者非法响应头
http_500 后端服务器返回的响应状态码为500
http_502 后端服务器返回的响应状态码为502
http_503 后端服务器返回的响应状态码为503
http_504 后端服务器返回的响应状态码为504
http_404 后端服务器返回的响应状态码为404
off 停止将请求发送给下一台后端服务器

根据不同的uri配置不同的均衡负载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    upstream aa.com {         
server 172.16.155.131:80;
server 172.16.155.132:80;
}
upstream bb.com {
server 172.16.155.133:80;
server 172.16.155.134:80;
}
server {
listen 80;
server_name www.test.com;
location ~ aa.php
{
proxy_pass http://aa.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ bb.php
{
proxy_pass http://bb.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /
{
proxy_pass http://bb.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

说明:请求aa.php的,会到aa.com组,请求bb.php的会到bb.com,其他请求全部到bb.com。

根据不同的目录负载到不同的后端服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
upstream aaa.com
{
server 192.168.111.6;
}
upstream bbb.com
{
server 192.168.111.20;
}
server {
listen 80;
server_name www.test.com;
location /aaa/
{
proxy_pass http://aaa.com/aaa/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /bbb/
{
proxy_pass http://bbb.com/bbb/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /
{
proxy_pass http://bbb.com/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!