Skip to content

Commit 6132471

Browse files
committed
更新 upstream 和 proxysetheader
1 parent 274596e commit 6132471

File tree

1 file changed

+108
-3
lines changed

1 file changed

+108
-3
lines changed

09、负载均衡.md

Lines changed: 108 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,120 @@
5353

5454
配置很简单,核心属性是 ``proxy_pass``,可以直接指向域名
5555

56+
<b>解释:</b>
57+
58+
当访问 c.test.com 时,触发这里的反向代理配置(当然,需要先配置好host,让这个域名指向nginx服务器的IP),然后会重定向到 proxy_pass 配置的IP地址。
59+
60+
即:【访问nginx服务器】--反向代理-->【103.94.185.215:3000】
61+
5662
```
5763
server {
5864
listen 80;
5965
# 监听的域名是 c.test.com,即用户访问 c.test.com 时,触发这个配置
6066
server_name c.test.com;
6167
6268
location / {
63-
# 访问根域名,跳转到 http://www.baidu.com/
64-
proxy_pass http://www.baidu.com/;
69+
# 访问根域名,跳转到 http://103.94.185.215:3000/ 这个IP,这个IP是我自己的网站
70+
proxy_pass http://103.94.185.215:3000/;
6571
}
6672
}
67-
```
73+
```
74+
75+
76+
### 3、反向代理到多个服务器
77+
78+
以上只能反向代理到单个服务器,nginx也支持配置反向代理到多个服务器。
79+
80+
通过借用 upstream 属性,存储一个服务器列表,具体写法如下:
81+
82+
```
83+
# 配置服务器列表
84+
upstream my_server_list{
85+
server 185.186.147.210;
86+
server 103.94.185.215:3000;
87+
}
88+
89+
# 配置 server
90+
server {
91+
listen 80;
92+
# 监听的域名是 c.test.com,即用户访问 c.test.com 时,触发这个配置
93+
server_name c.test.com;
94+
95+
location / {
96+
# 反向代理到 my_server_list 池中
97+
proxy_pass http://my_server_list;
98+
}
99+
}
100+
```
101+
102+
注意:
103+
104+
* upstream 和 server 的配置是同一级的;
105+
* 每一个 server 一行,只写ip即使用默认端口80,也可以写上端口;
106+
* 这里是最基本的配置,将在下面不断增加更复杂的内容;
107+
108+
### 4、属性详解
109+
110+
#### 4.1 proxy_set_header
111+
112+
位置:
113+
114+
```
115+
http, server, location
116+
```
117+
118+
格式:
119+
120+
```
121+
proxy_set_header field value;
122+
123+
# 默认值
124+
proxy_set_header Host $proxy_host;
125+
proxy_set_header Connection close;
126+
```
127+
128+
说明:
129+
130+
1. 这个属性用于配置nginx服务器传给后端服务器的请求的 request 的 header 属性;
131+
2. 具体来说,使用反向代理时,流量的流向形式是:【客户端】->【nginx服务器】->【后端服务器】;
132+
3. 以host属性为例,默认情况下:
133+
1. 当访问 c.test.com 时,【客户端】->【nginx服务器】这一步,request 的 header 为 c.test.com;
134+
2. 而【nginx服务器】->【后端服务器】这一步的header为 ``proxy_pass`` 属性中,``http://``属性后的字符串的值。例如 ``proxy_pass http://127.0.0.1:3000;`` ,则 host 的值为 ``127.0.0.1:3000``;
135+
3. 如果是 ``proxy_pass http://my_server_list;``,那么传给后端服务器的header里 host 字段值为 ``my_server_list``;
136+
4. 如果想让 Host 值等于用户访问的域名,则需要这么设置 ``proxy_set_header Host $host;``
137+
5. 也可以使用 ``$http_host`` 来替代 ``$host``,这个不同之处在于,当访问的不是 80/443 端口时,``$http_host`` 会带上端口值(示例:``c.test.com:81``
138+
1. 几个属性值的区别,可以参考这个链接 <a href="http://schin.space/nginx/NGINX-%E5%85%B3%E4%BA%8Enginx%E4%B8%AD$host-$server_name-$http_host%E7%9A%84%E5%8C%BA%E5%88%AB/">关于nginx中host, server_name, http_host的区别</a>
139+
6. 你也可以通过这个字段,来添加你想自定义的 header 属性对,或者覆写已有的字段值;
140+
7. <b>注意:</b> field 里的大写字母,在后端拿到的header里,大写字母都已经被转为小写字母了。
141+
8. 我们之前在【07、日志】里面,通过 ``http_x_forwarded_for`` 来拿取重定向之前,用户真实的 IP 地址,因此我们通常在做反向代理的时候,应该通过这个属性,将用户真实 IP 地址添加进去。写法如下:``proxy_set_header X-Forwarded-For $remote_addr;``
142+
143+
如果自定义header的话,示例配置如下:
144+
145+
```
146+
server {
147+
listen 80;
148+
# 监听的域名是 c.test.com,即用户访问 c.test.com 时,触发这个配置
149+
server_name c.test.com;
150+
151+
location / {
152+
# 反向代理到 my_server_list 池中
153+
proxy_pass http://my_server_list;
154+
# 在发送到后端服务器的 request 里的 header 里添加属性头 Abc ,值为 abcd
155+
proxy_set_header Abc abcd;
156+
}
157+
}
158+
```
159+
160+
后端服务器打个日志:
161+
162+
```
163+
console.log('header-abc-', req.headers['abc']);
164+
```
165+
166+
输出结果:
167+
168+
```
169+
header-abc- abcd
170+
```
171+
172+
### 4.2

0 commit comments

Comments
 (0)