有时候,我们资源有限,那么就会遇到一台主机对应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; }
}
|
我们可以看到访问不同的域名就转到了不同的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告知我哟!!!