作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
https://github.com/sunshinelyz/mykit-delay
写在前面
最近在服务器上搭建了一套FastDFS集群,节点为6个。统一对外提供文件的上传和访问服务。在实际开发过程中,前端童鞋需要访问其他服务器来转发对FastDFS服务的访问,此时,前端访问FastDFS服务时多加了一个前缀,导致FastDFS服务返回400状态码。那么,我们该如何解决呢?
文章已收录到:https://gitee.com/binghe001/technology-binghe 和 https://github.com/sunshinelyz/technology-binghe 小伙伴们别忘记给我 Star 呦!!
问题重现
在服务器上搭建集群时,统一对外访问的接口为http://192.168.175.110,前端童鞋访问时,是通过http://192.168.175.101访问的,并且前端加了一个前缀file,也就是通过http://192.168.175.101/file来访问的。第一时间我想到的是直接将前端的请求通过Nginx转发到192.168.175.110服务器。在192.168.175.101服务器上简化后的Nginx配置如下所示。
- upstream file {
- server 192.168.175.110:80 max_fails=3;
- }
- server {
- listen 80;
- server_name 192.168.175.101;
- location / {
- root html;
- index index.html index.htm;
- #允许cros跨域访问
- add_header 'Access-Control-Allow-Origin' '*';
- #proxy_redirect default;
- #跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒,当一台服务器当掉时,过10秒转发到另外一台服务器。
- proxy_connect_timeout 10;
- }
- location ~/file {
- add_header 'Access-Control-Allow-Origin' '*';
- add_header 'Access-Control-Allow-Credentials' 'true';
- proxy_pass http://file;
- proxy_set_header Host $host:$server_port;
- }
- }
我在192.168.175.110服务器上配置的Ngin如下所示。
- server {
- listen 80;
- server_name 192.168.175.110;
- #charset koi8-r;
- #access_log logs/host.access.log main;
- location / {
- root html;
- index index.html index.htm;
- #允许cros跨域访问
- add_header 'Access-Control-Allow-Origin' '*';
- #proxy_redirect default;
- #跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒,当一台服务器当掉时,过10秒转发到另外一台服务器。
- proxy_connect_timeout 10;
- }
- location ~/group([0-9]){
- root /data/fastdfs/storage/data;
- ngx_fastdfs_module;
- }
- }
此时,就存在一个问题:通过file前缀将请求转发到192.168.175.110服务器时,会返回400状态码。
其实,问题的定位也比较简单,就是前端访问时多加了一个file前缀。那么,我们该如何解决这个问题呢?
问题解决
一般情况下,Nginx的反向代理,只会替换域名或者IP部分,其他部分会按照原样进行转发。也就是说,前端访问http://192.168.175.101/file时,会被转发到http://192.168.175.110/file上,从而无法正常访问文件服务接口。
既然定位到问题了,那我们下一步就是要解决这个问题。思路也比较简单,就是在192.168.175.101服务器上接收到请求时将file前缀去掉。那如何去掉呢?
其实也很简单,只需要在192.168.175.101服务器上的Nginx上添加如下配置。
- location ^~/file/ {
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-NginX-Proxy true;
- proxy_pass http://file/;
- }
此时,192.168.175.101服务器上的Nginx配置如下所示。
- upstream file {
- server 192.168.175.110:80 max_fails=3;
- }
- server {
- listen 80;
- server_name 192.168.175.101;
- location / {
- root html;
- index index.html index.htm;
- #允许cros跨域访问
- add_header 'Access-Control-Allow-Origin' '*';
- #proxy_redirect default;
- #跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒,当一台服务器当掉时,过10秒转发到另外一台服务器。
- proxy_connect_timeout 10;
- }
- location ^~/file/ {
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-NginX-Proxy true;
- proxy_pass http://file/;
- }
- }
此时,再次访问http://192.168.175.101/file时,就被转发到http://192.168.175.110上,能够正确访问文件服务接口。
知识扩展
nginx反向代理配置如何去除前缀?
使用Nginx做反向代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。设置proxy_pass请求只会替换域名,如果要根据不同的url后缀来访问不同的服务,则需要通过如下方法:
方法一:加"/"
- upstream pay {
- server localhost:8089 weight=5;
- }
- upstream order {
- server localhost:8090 weight=5;
- }
- server {
- listen 80;
- server_name binghe.com;
- location ^~/pay/ {
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-NginX-Proxy true;
- proxy_pass http://pay/;
- }
- location ^~/order/ {
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-NginX-Proxy true;
- proxy_pass http://order/;
- }
- }
^~/pay/表示匹配前缀是pay的请求,proxy_pass的结尾有/, 则会把/pay/*后面的路径直接拼接到后面,即移除pay。
方法二:rewrite
- upstream pay {
- server localhost:8089 weight=5;
- }
- upstream order {
- server localhost:8090 weight=5;
- }
- server {
- listen 80;
- server_name binghe.com;
- location ^~/pay/ {
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-NginX-Proxy true;
- rewrite ^/user/(.*)$ /$1 break;
- proxy_pass http://pay;
- }
- location ^~/order/ {
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-NginX-Proxy true;
- rewrite ^/order/(.*)$ /$1 break;
- proxy_pass http://order;
- }
- }
本文转载自微信公众号「冰河技术」,可以通过以下二维码关注。转载本文请联系冰河技术公众号。