WordPress+FRP内网穿透+Nginx反向代理

1年前 φ安徽 3

昨晚手欠,想升级小主机的服务器系统,将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服务。

WordPress FRP Nginx.png
WordPress+FRP内网穿透+Nginx反向代理

其次再说说具体配置,frp的相关配置可以参考我曾经的两篇文章:记录FRP+NGINX内网穿透FRP内网穿透·续,或者参考官网配置文件frps_full.inifrpc_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本身也是一直反向代理嘛!

3 条评论

  1. #1

    这个不错啊,我也准备这么干