|
53 | 53 |
|
54 | 54 | 配置很简单,核心属性是 ``proxy_pass``,可以直接指向域名
|
55 | 55 |
|
| 56 | +<b>解释:</b> |
| 57 | + |
| 58 | +当访问 c.test.com 时,触发这里的反向代理配置(当然,需要先配置好host,让这个域名指向nginx服务器的IP),然后会重定向到 proxy_pass 配置的IP地址。 |
| 59 | + |
| 60 | +即:【访问nginx服务器】--反向代理-->【103.94.185.215:3000】 |
| 61 | + |
56 | 62 | ```
|
57 | 63 | server {
|
58 | 64 | listen 80;
|
59 | 65 | # 监听的域名是 c.test.com,即用户访问 c.test.com 时,触发这个配置
|
60 | 66 | server_name c.test.com;
|
61 | 67 |
|
62 | 68 | 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/; |
65 | 71 | }
|
66 | 72 | }
|
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