Nginx二级域名转发到不同端口/服务器

有时候,我们资源有限,那么就会遇到一台主机对应1-N个域名,那么就会出现主机80端口占用完了,其他应用就只能占用其他的端口了,但是如果在域名后面带上端口号(如www.xxxx.com:8080 ),这显然很不优雅,而且像开发微信的时候,配置的域名只能使用80端口。那么有没有更好的处理方式能让我们不在域名后添加端口号呢?答案是肯定是,这里我们可以借助强大的Nginx来帮我们解决这个问题。

Nginx通过二级目录方式

我们知道Nginx location强大的匹配模式,那么我们就可以通过location来匹配请求目录从而在内部转发到不同的端口/服务器。当然也可以使用Nginx+Lua(openresty、tengine)来判断请求参数也可以处理.但是现在我暂时还是才用的Nginx自身的一些API来实现.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
listen 443 ssl;
server_name localhost;

location / {
root html;
index index.html index.htm;


}
location /api/ {
proxy_pass http://xxx.xxx.xxx.xx:8000/api/;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
#proxy_cookie_path
chunked_transfer_encoding off;
}

这时候,我们通过www.xxx.com/api 就可以转发到 http://xxx.xxx.xxx.xx:8000/api ,这里还有可以设置更高端的,比如才用Nginx Rewrite等。

Nginx匹配二级域名进行代理

多个server模块通过server_name匹配代理

server_name 是虚拟服务器的识别路径,不同的域名请求会带上相应的HOST请求头来匹配Nginx的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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
server {
listen 80;
server_name www.cddj.top;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
}

}

server {
listen 80;
server_name www.51offer.wang;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html1;
index index.html index.htm;
}

}
server {
listen 80;
server_name sub.51offer.wang;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html2;
index index.html index.htm;
}

}

www.cddj.top
www.51offer.wang
sub.51offer.wang
我们可以看到访问不同的域名就转到了不同的server模块,这里只是简单是静态显示,我们可以再server模块中做转发,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
listen 80;
server_name sub.51offer.wang;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
proxy_pass http://localhost:8000/;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
#proxy_cookie_path
chunked_transfer_encoding off;
}

}

多个server同端口的匹配规则是:完全匹配->通配符在前(如*.biz)->通配符在后(如52fx.*)->正则匹配(~^.52fx.biz$),如果都没匹配到就找默认server,如果还是匹配不到则去匹配端口的第一个server

一个server模块通过IF指令判断转发到不同端口/服务器

可以借助Nginx if指令判断$host中的域名来转发到不同的端口:

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
if ($host = "www.cddj.top") {
proxy_pass http://localhost:801;
}

if ($host = "www.51offer.wang") {
proxy_pass http://localhost:802;
}
if ($host = "sub.51offer.wang") {
proxy_pass http://localhost:803;
}
}

}

server {
listen 801;
server_name www.cddj.top;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
}

}

server {
listen 802;
server_name www.51offer.wang;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html1;
index index.html index.htm;
}

}
server {
listen 803;
server_name sub.51offer.wang;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html2;
index index.html index.htm;
}

}

结果和上面的图片一样,这里就不追加了。

Nginx+Lua

我们可以借助Nginx+Lua来判断转发,这里也暂时就不说明,有兴趣的 可以自己去查找资料,在使用Lua的时候需要自行下载Nginx源码加Lua模块编译进去,或者使用openresty、tengine这种已经集成好的工具,个人比较喜欢openresty,因为社区相对比较活跃,有很多强大的插件如waf等。

修改配置后记得刷新配置哟

1
2
nginx -t #验证配置文件
nginx -s reload 刷新配置文件

如果有更方便快捷且强大的方式,请加我QQ告知我哟!!!

Nginx二级域名转发到不同端口/服务器

https://blogs.52fx.biz/posts/1940554430.html

作者

eyiadmin

发布于

2019-11-28

更新于

2024-05-31

许可协议

评论