【转】nginx反代+frp+nginx+https搭建技术总结
 
 
全文共 1628 字

 

本文作者:wizbot,来源应作者要求不予暴露,文章格式有所编辑

经过近半月的高强度科研,参考诸多教程,终于攻克相关难题。现进行技术总结以飨读者。本文主要面向技术水平较低的读者。

服务内容

域名解析至 VPS,VPS(80 端口被其他脚本占据)通过 nginx 反代至 frps。

客户端(树莓派)frpc 连接 vps 端 frps,树莓派通过 nginx 搭建网盘及博客。

技术难点

域名解析、http 通过 frp 进行内网穿透在网络上教程很多,即使通过官方文档也极易习得。不再赘述。

本文主要介绍 https 通过 frp 进行内网穿透。

VPS端

1、域名解析至 vps 后,我使用了 lnmp 一键包搭建 nginx 环境1。通过脚本命令直接添加虚拟主机。期间,通过 Letsencrypt 获得自动续期的免费 SSL 证书(若中间卡住,需升级 acme.sh 脚本)。

2、编辑对应虚拟主机的 conf 文件。

server
{
    listen 80;
    listen 443 ssl http2;
    server_name aaa.aaa.aaa #这里填写你的域名
    charset utf-8;
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }#通过这段将http全部转为https

    ssl_certificate /usr/local/nginx/conf/ssl/aaa/aaa;#这里填写对应cer文件路径,在原有文件中有相关字段
    ssl_certificate_key /usr/local/nginx/conf/ssl/aaa/aaa;#这里填写对应cer文件路径,在原有文件中有相关字段
    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    error_page 497 https://$host$request_uri;

    location / {
        resolver 8.8.8.8;
        proxy_ssl_server_name on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass https://$host:aaaa;
    } #通过这段将相关请求转发至主机的aaaa端口
}

重启lnmp服务

3、下载最新版frp脚本2。解压、设置自动运行不赘述。

删去 frpc 相关内容,只留下 frps 相关。编辑 frps.ini

[common]
bind_addr = vps ip地址
dashboard_addr = vps ip地址
bind_port = 任意非占用端口
kcp_bind_port = 同上端口
token = 任意密码(用于frp连接)
vhost_http_port = eeee(任意非占用端口)
vhost_https_port = aaaa(同2、中的aaaa)
tcp_mux=true
dashboard_port = 任意非占用端口
dashboard_user = 任意用户名
dashboard_pwd = 任意密码(用于登录面板)

载入 frps.ini 文件,启动 frps 服务。可通过访问 vps_ip:<服务端口> 来获知 frps 服务运行状态。

客户端

1、lnmp 一键包搭建 nginx 环境。通过脚本命令直接添加虚拟主机。期间,通过 Letsencrypt 获得自动续期的免费 SSL 证书。

当然,因为域名未解析至此,故证书申请必定失败。

2、将 vps 端的证书复制到相应目录。(因证书到期会失效,此处可通过计划任务使客户端自动从 vps 端获取证书,此处不赘言)

3、编辑对应虚拟主机的conf文件。

server {
    listen cccc ssl http2; #cccc是任意没有被占用的端口
    #listen [::]:443 ssl http2;
    server_name cccc.cccc.cccc; #你的域名
    index.html ;
    root /????/????/????; #虚拟主机路径

    ssl_certificate /usr/local/nginx/conf/ssl/????/????; #从vps复制过来的证书文件,注意权限
    ssl_certificate_key /usr/local/nginx/conf/ssl/????/????; #从vps复制过来的证书文件,注意权限
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_session_cache builtin:1000 shared:SSL:10m;

    include rewrite/none.conf;

    include enable-php-pathinfo.conf;

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires 30d;
    }

    location ~ .*\.(js|css)?$ {
        expires 12h;
    }

    location ~ /.well-known {
        allow all;
    }

    location ~ /\. {
        deny all;
    }

    access_log /home/wwwlogs/????; #log路径,可有可无
}

4、下载最新版 frp 脚本(版本需与 vps 端一致)。解压、设置自动运行不赘述。

删去 frps 相关内容,只留下 frpc 相关。编辑 frpc.ini

[common]
server_addr = vps ip地址
server_port = 任意非占用端口,同vps端的bind_port
log_max_days = 3
token =  任意密码,同VPS端
tcp_mux = true
protocol = tcp

[任意服务名]
type = https
local_ip = 127.0.0.1
local_port = cccc (同客户端conf文件中的)
use_encryption = false
use_compression = true
custom_domains = cccc.cccc.cccc; #你的域名

[其他任意服务名]
type = https
local_ip = 127.0.0.1
local_port = dddd(客户端nginx也可以再增加其他的虚拟主机)
use_encryption = false
use_compression = true
custom_domains = dddd.dddd.ddd

至此,主要技术节点总结完毕。

补遗

1、安装 lnmp 前务必 apt-get update,否则较大几率安装失败

2、在服务无法正常运行时,可通过观察frp面板内的连接状况分析 frp 是否连通,进而排除 frp 故障。

3、通过 systemctl 设置树莓派自动运行 frpc 时出现 network unreachable。可通过

Service下加

Restart=0n-failure
RestartSec=5s

尝试解决。

另外也可以通过选中树莓派桌面中的设置首选项中的网络连通后完成启动选项尝试解决(未验证)。

4、树莓派搭建的 wordpress 使用了腾讯 cos 插件,在从 http 转为 https 后需要将路径全部更新一遍。另外自定义主题与其他插件中的部分相关连接有可能需要手动更新才能正常使用。

5、frp、nginx 修改后注意重启相关服务

特别鸣谢

  • fatedier
  • Raymond Zhou 这位大佬的教程极为详细专业,但不知为何我照此执行下来,会出现502错误,或者资源文件无法载入的问题。

鸣谢

Tags: #转载 · #nginx · #frp · #tls

 

TonyChyi © 2020 GPLv2