通过反向代理实现特定场景下OBS对象存储资源的访问
1 背景:
· 有防火墙的或希望使用固定IP方式访问OBS的客户:
华为云OBS 是基于Restful API对外提供服务。一般情况下终端用户会通过OBS服务默认的域名或者绑定的自定义域名来访问(ex:https://bucket.obs.cn-north-1.myhuaweicloud.com) 。这样就可以进行服务访问了,但是华为云OBS出于安全保护考虑,桶对应的域名通过DNS解析的IP是会发生变化的。所以,您无法获取某个Bucket对应的长期有效IP地址。但是在一些企业公司,也同样出于安全考虑对于可访问的外部地址需要设置黑白名单,而这个时候对于OBS的访问则需要一个固定的IP。
· 客户希望从OBS下载对象按照带宽来使用和计费:
在使用 华为云OBS作为网站 网盘等数据源提供数据下载能力时候,OBS 当前是基于流量进行计费,在经常性下载使用情况下,费用过高。那么这个时候可以使用ECS购买固定带宽的EIP,通过此ECS在内网从OBS下载数据再代理下载至终端用户。
· 客户使用专线条件下,解决内网访问可能出现的地址冲突:
部分专属云客户或者使用专线客户在将线下IDC和线上公有云打通访问OBS时候,可能因为IDC的内网地址规划为100.125.0.0/16,此时会和OBS服务在内网访问地址100.125.0.0/16产生冲突;这个时候访问OBS通过一个代理则可以解决此类问题。
2 基于ECS搭建反向代理访问OBS
2.1 业务原理图
为了有效的解决上述三个问题,我们可以通过搭建一个反向代理服务器/集群来实现。其业务逻辑图如下:
2.2 环境搭建
下面我们使用Nginx+ECS实现一个反向代理来访问OBS:
1. 确定桶所在的Region和桶域名如: obs-training.obs.cn-north-1.myhuaweicloud.com,Region为华北一(cn-north-1);
2. 在同一Region创建ECS,创建ELB(可选,当需要提高访问的可靠性或者需要提高代理访问的处理性能时候可以创建多个ECS并使用ELB);
3. 在ECS上部署Nginx并配置反向代理。
2.2.1 在ECS上安装Nginx
l 前提:
1. 已经完成ECS的创建,操作系统为Linux;本文以CentOS系统举例
2. ECS上有申请EIP。用于从公网下载必要的安装包
l 安装Nginx
yum -y install nginx
默认的安装位置如下:
/usr/sbin/nginx #运行程序位置 /etc/nginx/nginx.conf #主配置文件所在位置 /usr/share/nginx #存放静态文件 /var/log/nginx/ #存放日志,里面有access.log和 error.log
l 配置Nginx
1. 打开Nginx配置文件,处于可编辑状态
vi /etc/nginx/nginx.conf
2. 在配置文件中填写 如下内容:
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; underscores_in_headers on; include /etc/nginx/mime.types; default_type application/octet-stream; client_body_buffer_size 2048k; client_max_body_size 100M; #设定下载上传时候单个http请求的数据量大小,建议在客户端上传下载使用分段,过大会导致Nginx负载过高 fastcgi_buffer_size 1024k; fastcgi_buffers 6 256k; fastcgi_busy_buffers_size 1024k; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; #使用固定地址代理 OBS访问 server { listen 80 default_server; listen 443; listen [::]:80 default_server; server_name 114.115.168.79; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; allow 192.168.160.151; # 可以配置允许访问的主机地址 #deny all; #根据需要打开 location / { proxy_pass http://obs.cn-north-1.myhuaweicloud.com; # OBS 桶所在Region的域名 proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host obs.cn-north-4.myhuaweicloud.com; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } #访问OBS区域域名的配置 server { listen 80; listen 443; server_name obs.cn-north-1.myhuaweicloud.com; location / { proxy_pass http://obs.cn-north-1.myhuaweicloud.com/; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host obs.cn-north-1.myhuaweicloud.com; } } #访问OBS全局域名的配置 server { listen 80; listen 443; server_name obs.myhuaweicloud.com; location / { proxy_pass http://obs.cn-north-1.myhuaweicloud.com/; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host obs.cn-north-1.myhuaweicloud.com; } } #以虚拟主机方式访问OBS全局域名的配置 server { listen 80; listen 443; server_name ~^((?<subdomain>.*).)obs.myhuaweicloud.com$; if ($subdomain = "") { set $subdomain "_"; } location / { proxy_pass http://$subdomain.obs.cn-north-1.myhuaweicloud.com; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $proxy_host; } resolver 100.125.1.250; #具体的值填入 华为云不同区域 内网DNS地址 } #以虚拟主机方式访问OBS区域域名的配置 server { listen 80; listen 443; server_name ~^((?<subdomain>.*).)obs.cn-north-1.myhuaweicloud.com$; access_log /var/log/nginx/th_access.log main; if ($subdomain = "") { set $subdomain "_"; } proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; location / { proxy_pass http://$subdomain.obs.cn-north-1.myhuaweicloud.com; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $proxy_host; } resolver 100.125.1.250; #具体的值填入 华为云不同区域 内网DNS地址 }
l 启动Nginx服务
nginx -t #测试nginx配置文件状态 service nginx start #启动Nginx验证
2.3 业务验证
说明:
针对不同的桶,更换obs-training 为自己的桶名即可
root@charles-single sbin]# curl http://114.115.168.79/obs-training/12323.jpg -v -o /dev/null * About to connect() to 114.115.168.79 port 80 (#0) * Trying 114.115.168.79... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to 114.115.168.79 (114.115.168.79) port 80 (#0) > GET /obs-training/12323.jpg HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 114.115.168.79 > Accept: */* > < HTTP/1.1 200 OK < Server: nginx/1.12.2 < Date: Mon, 13 May 2019 03:11:06 GMT < Content-Type: binary/octet-stream < Content-Length: 114227 < Connection: keep-alive < x-obs-request-id: 0000016AAF2C239C800F8E84F4D13B57 < Accept-Ranges: bytes < ETag: "6bb5309f86b2500c1df09d5fdd6093d3" < Last-Modified: Wed, 17 Apr 2019 07:14:28 GMT < x-obs-id-2: 32AAAQAAEAABAAAQAAEAABAAAQAAEAABCSTJ11baWxLll8cZxT86/Hxc6lp0Ja0S < { [data not shown] 100 111k 100 111k 0 0 2598k 0 --:--:-- --:--:-- --:--:-- 2655k * Connection #0 to host 114.115.168.79 left intact
通过web展示,在浏览器地址栏输入http://114.115.168.79/obs-training/12323.jpg
3 其他说明
1.使用ELB过程就不再详述,可以参考ELB的使用指南:https://support.huaweicloud.cn/productdesc-elb/zh-cn_topic_0015479966.html。
2.https默认为无法进行证书校验的访问,如有需要请导入证书至代理服务器。具体 参考Nginx帮助:https://www.cnblogs.com/jikexianfeng/p/8410166.html。
3.如果使用域名那么可以通过在DNS将域名 解析记录地址 改为代理服务器地址来实现。
- 点赞
- 收藏
- 关注作者
评论(0)