本文仅是个人思路和理解,如果适合你则使用.
因为个人会随时访问图片,视频.office文档等, 本来想到的思路是购买一个阿里云的国内服务器,挂载阿里的OSS对象存储, 这其实是最稳定也是最优的方案, 前提是不需要担心高额的OSS费用支出, 再加上个人备案有些麻烦, 所以就放弃了.
先在自己的openwrt路由上安装好网站, 买几个大容量的硬盘柜, 这其实已经满足了个人网盘的需求, 但是毕竟带端口访问, 如果顺便搭建下其他的网站,比如个人博客,就不太方便了, 直到最近突然想起自己有个搬瓦工的GIA CN2的机器平时就是用于学习科学的, 然后有了思路, 在搬瓦工的机器上安装Nginx反代自己的路由地址就OK啦, 再把静态的资源图片,视频等文件rewrite一下, 国内能直连不用绕一圈访问. 看起来挺简单的,但是其中还是有些曲折, 所以记录一下.
前期准备
安装好openwrt,
绑定域名到路由
安装宝塔,搭建好网站
提示: 绑定域名到网站的时候可以使用CNAME解析到路由地址即可.
在宝塔软件商店搜索KODBOX即可自动完成安装,这时候你应该可以通过自定义端口和域名浏览自己的网盘, 没有特别的需求, 以下步骤可以跳过了.
但是如果你不想通过自定义端口访问,或者有搭建自己博客的需求, 则可以选择继续折腾.
步骤
- 为了区分, 我们假定把国外的服务器命名为A且网站域名为a.com,负责反代, 路由器命名为B且网站域名为b.com, 负责web服务. 路由B远程访问的域名为c.com
- 在A里搭建一个空白网站, 域名为a.com. 且a.com解析到A
- 在B里搭建好真实的网站, 域名为a.com(是的,域名和a.com一样)
- 在B里添加一个另外的网站a1.com目录绑定至a.com (做伪静态用)
- 在A里, 设置a.com反代规则
- 由于B是动态IP地址, 而nginx的反代只解析一次就会把DNS地址保存,以后不会再解析, 所以为了避免因为网络变化而导致不能访问,需要nginx的upstream服务, 参考文章, 配置
ngx_http_upstream_dynamic_module
(改下模块名字即可) - 复制下面代码插入到nginx的conf配置里
#插入到server前
upstream cloudproxy {
dynamic_resolve fallback=stale fail_timeout=30s;
server b.com:端口号;
#如果你没有多服务器做负载均衡,以下2行可忽略
#server f.com:端口号;
#check interval=3000 rise=2 fall=5 timeout=1000 type=http;
}
#插入到server里
#设置伪静态 国内直连
location ~ .*\.(gif|jpg|jpeg|png|mp3|mp4|zip|7z|css|js|woff|woff2|ttf)$ {
expires 30d;
rewrite "^/(.*)$" https://a1.com:端口号/$1;
}
反代
#PROXY-START/
location ~* \.(php|jsp|cgi|asp|aspx)$
{
set $cloudproxy cloudproxy;
proxy_pass https://$cloudproxy;
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 REMOTE-HOST $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /
{
set $cloudproxy cloudproxy;
proxy_pass https://$cloudproxy;
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 REMOTE-HOST $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
#防跨域配置
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
}
add_header X-Cache $upstream_cache_status;
#Set Nginx Cache
add_header Cache-Control no-cache;
expires 12h;
}
#PROXY-END/