昨晚手欠,想升级小主机的服务器系统,将exsi里的fedora系统移动到第二个硬盘里,我是先关了系统再移动的,结果还是出现无法转移的情况,导致系统无法转移回去了。无奈只能重装系统了。借此机会,重装最新版本的fedora38和lnmp2.0系统。
好在我留了个心眼,先备份了服务器里所有的网站。备份到群晖里速度还是可以的,全程大概16分钟,8G数据。而恢复到新安装的服务器里,时间有点长,单单从群晖ftp到服务器里的数据就花了1个多小时了。
今天找了款能试用一个月的VPS——京东云,从网上找了相关资料,终于搞定了内网穿透+反向代理+HSTS+HTTP/2+真实IP。
首先思路是这样的:frps(服务端)所在的服务器是公网服务器,frpc(客户端)所在的服务器是本地内网服务器,内网服务器安装lnmp和WordPress博客,公网服务器只需要安装nginx,用来做反向代理。我们通过“https//域名”访问公网服务器默认端口443,其所在nginx反向代理到frps的vhost_http_port非80端口,而frps连接到frpc服务器的http服务。
其次再说说具体配置,frp的相关配置可以参考我曾经的两篇文章:记录FRP+NGINX内网穿透和FRP内网穿透·续,或者参考官网配置文件frps_full.ini和frpc_full.ini,这个比较完整。
然后是nginx反向代理配置:
server {
listen 443 ssl http2;
server_name hjyl.org;
ssl_certificate "vhost/hjyl.org.crt";
ssl_certificate_key "vhost/hjyl.org.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
#开启 HSTS,并设置有效期为“31536000 秒”(一年),包括子域名(根据情况可删掉),预加载到浏览器缓存(根据情况可删掉)
location / {
proxy_pass http://hjyl.org:9527;
# 反向代理到vhost_http_port端口
proxy_redirect default;
# 保证获取到真实IP
proxy_set_header X-Real-IP $remote_addr;
# 真实端口号
proxy_set_header X-Real-Port $remote_port;
# X-Forwarded-For 是一个 HTTP 扩展头部。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 在多级代理的情况下,记录每次代理之前的客户端真实ip
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
# 获取到真实协议
proxy_set_header X-Forwarded-Proto $scheme;
# 真实主机名
proxy_set_header Host $host;
# 设置变量
proxy_set_header X-NginX-Proxy true;
}
}
最后重点来了,上面这样如果内网穿透的链接打开正常,你通过“https://域名”可以打开WordPress博客,但是样式表却丢失了,打开源代码,你可以看到WordPress的网址是“http://域名”,主要是WordPress跟其他网站不同,它后台是绑定网址的,使用的是绝对路径。此时我们需要在wp-config.php里加入以下代码(此代码由ChenJieHua分享):
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
2024.07.18更新:如果上面这段代码不管用,可以直接用下面这个代码:
$_SERVER["HTTPS"] = "on";
(此代码由tlanyan分享)不知道是不是版本升级的原因,之前上述代码是正常的。
这样你再打开网址就正常了。
但是此时你的评论上IP还不是客户的真实IP,虽然我们再nginx里配置了,我们还需要在WordPress里配置一下,同样在wp-config.php加入以下代码(此代码由JUST FOR FUN分享):
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $list[0];
}
或者
if( !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
$get_HTTP_X_FORWARDED_FOR = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = trim($get_HTTP_X_FORWARDED_FOR[0]);
}
到此,效果就出来了!不过我觉得这种还是太复杂了。如果直接frp里设置出nginx反向代理的效果就好了,毕竟frp本身也是一直反向代理嘛!
本文链接: WordPress+FRP内网穿透+Nginx反向代理
这个不错啊,我也准备这么干
1年前 · 嘉兴 · Google Chrome 86 Windows 10
@profan 看我这评论区,有用户所在城市了
1年前 · 合肥 · Wordpress App 22 iPad iOS 16.6