Nginx代理入门

1. nginx代理简单模型

在nginx.conf文件中:

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
36
37
38
39
40
41
42
43
http {
#这里配置的是负载均衡的情况,即请求到了后会自动分配到8182服务上(默认两个服务处理请求数量是1:1),可通过设置权重来实现每个服务处理不同数量的请求
upstream qinyin.com {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}

server{
#监听8900 端口
listen 8900;
#监听地址,即监听域名
server_name localhost;
location / {
proxy_pass http://127.0.0.1:8081;
}

#如果有请求:localhost:8900/qinyin ,则会自动代理到:http://127.0.0.1:8082/qinyin 路径下,有四种情况:
#① 【/qinyin】+【8082】 = http://127.0.0.1:8082/qinyin/
# location /qinyin {
# proxy_pass http://127.0.0.1:8082;
# }

#② 【/qinyin】+【8082/】 = http://127.0.0.1:8082
# location /qinyin {
# proxy_pass http://127.0.0.1:8082/;
# }

#③【/qinyin/】+【8082】= http://127.0.0.1:8082/qinyin/
# location /qinyin/ {
# proxy_pass http://127.0.0.1:8082;
# }

#④ 【/qinyin/】+【8082/】= http://127.0.0.1:8082 。即proxy_pass 路径后有/ ,代理后就不会出现追加;
location /qinyin/ {
proxy_pass http://127.0.0.1:8082/;
}

#请求调整到负载均衡,即会nginx会自动将请求分配给不同的服务来处理
location /test/ {
proxy_pass http://qinyin.com/;
}
}
}

参考文章:window 下实现nginx 反向代理

2. nginx前后端一次代理

2.1 nginx后端代理

后端代理,只需要匹配到关键词,然后代理到指定路径上即可,比如配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
listen 443;
server_name sf.aiidc.com.cn;
ssl on;
ssl_certificate /opt/xa/https/2593723_sf.aiidc.com.cn.pem;
ssl_certificate_key /opt/xa/https/2593723_sf.aiidc.com.cn.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
root /opt/xa/pcWeb;

location /api/wszz/ {
proxy_pass http://127.0.0.1:8083/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 300m;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}

   上面的配置意思为:监听域名sf.aiidc.com.cn的443端口的/api/wszz/路径,即监听http://sf.aiidc.com.cn:443/api/wszz/ 请求,然后将请求代理到http://127.0.0.1:8083/
即本机(127.0.0.1 IP表示本机)的8083端口服务上。即http://sf.aiidc.com.cn:443/api/wszz/file-note/getFileNote(浏览器发起请求) == http://127.0.0.1:8083/file-note/getFileNote(服务器处理请求)

2.2 nginx前端代理

前端代理,既要匹配到关键词,还要部署到相应的目录里面才行,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
listen 443;
server_name sf.aiidc.com.cn;
ssl on;
ssl_certificate /opt/xa/https/2593723_sf.aiidc.com.cn.pem;
ssl_certificate_key /opt/xa/https/2593723_sf.aiidc.com.cn.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
root /opt/xa/pcWeb;

location /api/wainao/ {
proxy_pass http://127.0.0.1:8082/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}

   上面的配置意思为:监听域名http://sf.aiidc.com.cn的443端口的/api/wainao/路径, 即监听http://sf.aiidc.com.cn:443/api/wainao/index.html 请求,然后将请求代理到/opt/xa/pcWeb这个目录下面的index.html文件。
   而前端代理根本不需要ssl_xxxx这些Https配置,同时也不需要location,因为后端已经有了代理,而前端的请求会自动被后端的代理监听并处理,所以前端不需要指定location等配置。

3. nginx前后端两次代理

   场景:153服务器无法通过外网连接,只有局域网内的服务器(比如231)可以连通,那么项目部署就需要通过nginx代理过去。
   实现原理:将项目前后端在153服务器上部署好,并启动成功。然后通过用户请求231服务器,231服务器将请求代理到153上。
153服务器的nginx配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
listen 8600;
root /opt/parse/web/dimension/;

location /dimension/api/ {
proxy_pass http://127.0.0.1:8601/;
proxy_set_header X-Forwarded-Prefix /dimension/api;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}

231服务器上的nginx配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 8600;
root /opt/parse/web/dimension/;

#前端配置,前端请求(http://172.16.16.231:8600/dimension/api/user/login)后代理153服务器的根目录上,在通过153的root定位index.html页面
location / {
proxy_pass http://172.16.16.153:8600/;
}

#后端配置,请求过来后跳转到153的后端监听项(/dimension/api/),定位到153的后端服务
location /dimension/api/ {
proxy_pass http://172.16.16.153:8600/dimension/api/;
proxy_set_header X-Forwarded-Prefix /dimension/api;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}

总结

①只有前端代理才需要考虑目录问题,后端代理不需要考虑目录,即部署的位置问题;
②在代理的时候,listen监听的端口需要开放并没有被其他程序使用,否则此代理文件不会生效。