前段时间发现网站服务器成本有点高,而且备份文件也越来越大,正好家里有台NAS,就在考虑服务器本地化的可能性,在这个过程中,遇到了一些问题,在此一一标注出来,并附上解决办法。
本地环境
由于用的是群晖NAS,在本地环境的选择上采用的是直接在Docker中安装可持久化的宝塔面板,只需将wwwroot以及backup文件夹装载到硬盘上即可。
端口映射
由于我的家宽有动态Ipv4地址,所以我最先考虑的是DDNS+端口映射的方式来实现,但是操作一通下来,发现所有端口都无法映射,当即表示特么的,运营商居然把所有端口都关了。
Frp穿透
家宽端口全部挂了,那Ipv4形同虚设,只能走Frp道路了,这方面比较简单,但是需要一个服务器,刚好我的网站都是面向外贸客户的,大多处于欧美地区,就买了个美国服务器来作为服务端。
仍然采用的宝塔面板,在宝塔第三方插件中导入Frps管理插件,离线安装Frps服务端,然后设置好即可。
以上是服务端Frps的设置,接下来还需要在客户端Frpc进行设置,也就是群晖中设置。
在Docker中安装Frpc客户端,只需将Frpc.ini装载到硬盘上即可,这样直接下载上传Frpc.ini即可管理客户端了。
反向代理
Frp穿透搭建好了,会发现浏览网站时,网址后面会出现 :xxx的端口号,这时候就需要在美国服务器中对网站进行反向代理了。
在所有网站开启反向代理后,发现会出现310错误,开始检查,然后发现是网站在本地服务器上使用了SSL导致,关闭本地服务器所有网站的SSL即可。
但紧接着又出现了502错误,这又是怎么回事呢,在查阅在大量资料后,需要在config.php文件中添加代码才能解决。
非Wordpress网站在config.php文件的末尾添加下面这条代码:
if (isset($_SERVER[‘HTTP_X_FORWARDED_PROTO’]) && $_SERVER[‘HTTP_X_FORWARDED_PROTO’] === ‘https’) {$_SERVER[‘HTTPS’] = ‘on’;
}
WordPress网站除了要在config.php文件的末尾添加上面这条代码,还需要下面的代码之前添加另外的代码。
在这条代码前:
/** Absolute path to the WordPress directory. */if ( ! defined( ‘ABSPATH’ ) ) {
define( ‘ABSPATH’, __DIR__ . ‘/’ );
添加:
$_SERVER[‘HTTPS’] = ‘on’;define(‘FORCE_SSL_LOGIN’, true);
define(‘FORCE_SSL_ADMIN’, true);
这时候发现网站不报错了,但是只加载html部分,css和js都加载失败,就该考虑是宝塔反代的配置文件有问题了,只需把宝塔反代的整个配置文件改成下面的即可:
#PROXY-START/location /
{
#缓存媒体文件
location ~* .jpg|.png|.gif|.jpeg|.ttf|.webp|.woff|.woff2|.ico$
{
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_pass http://127.0.0.1:xxx; //此处修改为Frps的http端口
proxy_cache cache_one;
proxy_cache_valid 30d;
proxy_ignore_headers Cache-Control;
add_header X-Cache “$upstream_cache_status from $server_addr”;
}
#缓存css、js、html
location ~* .css|.js|.html$
{
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_pass http://127.0.0.1:xxx; //此处修改为Frps的http端口
proxy_cache cache_one;
proxy_cache_valid 3d;
proxy_ignore_headers Cache-Control;
add_header X-Cache “$upstream_cache_status from $server_addr”;
}
proxy_pass http://127.0.0.1:xxx; //此处修改为Frps的http端口
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_set_header X-Forwarded-Proto $scheme;
#持久化连接相关配置
#proxy_connect_timeout 30s;
#proxy_read_timeout 86400s;
#proxy_send_timeout 30s;
#proxy_http_version 1.1;
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection “upgrade”;
#add_header X-Cache $upstream_cache_status;
#expires 12h;
}
#PROXY-END/
或者
#PROXY-START/location ^~ /
{
#缓存媒体文件
location ~* .jpg|.png|.gif|.jpeg|.ttf|.webp|.woff|.woff2|.ico$
{
resolver 8.8.8.8;
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_pass http://$host:20080;
proxy_cache cache_one;
proxy_cache_valid 30d;
proxy_ignore_headers Cache-Control;
add_header X-Cache “$upstream_cache_status from $server_addr”;
}
#缓存css、js、html
location ~* .css|.js|.html$
{
resolver 8.8.8.8;
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_pass http://$host:20080;
proxy_cache cache_one;
proxy_cache_valid 3d;
proxy_ignore_headers Cache-Control;
add_header X-Cache “$upstream_cache_status from $server_addr”;
}
resolver 8.8.8.8;
proxy_pass http://$host:20080;
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_set_header X-Forwarded-Proto $scheme;
#持久化连接相关配置
#proxy_connect_timeout 30s;
#proxy_read_timeout 86400s;
#proxy_send_timeout 30s;
#proxy_http_version 1.1;
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection “upgrade”;
#add_header X-Cache $upstream_cache_status;
#expires 12h;
}
#PROXY-END/
至此,网站全部正常。
教程
感谢大家观看,若是大家需要某一环节的具体教程,可在下方留言,我将另出一篇留言需要的完整教程。