比如买不起比较好的服务器,但由于其他原因(嘿嘿……)有其他方面很垃圾但大流量的公网服务器可以用,就可以在家里搞个服务器,然后用frp转发到公网去。
据测试,即使你家里有公网IP,frp
转发的稳定性也明显高于直接让nginx
将家里的IP做为upstream
来做反向代理,因为家里的IP经常被强制下线换IP,而动态域名的更新无论怎么搞都挺慢的(收费方案的钱不如拿去买好一点的服务器),而frp的重连则是几乎实时的。
省流:下面的方法我其实已经不用了,caddy解千愁
用于frps
的frps.ini
文件:
[common]
bind_port = 随便写个端口,如果是阿里云这种环境的话需要在防火墙对外开放
kcp_bind_port = 可以跟bind_port一样
token = 随便生成个uuid啥的,参见frp文档
dashboard_user = 起个用户名
dashboard_pwd = 随便写个密码
dashboard_port = 随便写个端口号,需要对外开放否则无法登陆管理页面——不过一般也用不着
vhost_http_port = 随便写个端口号,后面用不到
log_file = 某个日志文件位置.log
log_level = warn
log_max_days = 3
将frps
设置成开机自动启动的服务:建立内容如下的文件放置到/etc/systemd/system/frp.service
[Unit]
Description=frps
After=network.target
[Service]
ExecStart=/你的路径/frps -c /你的路径/frps.ini
[Install]
WantedBy=multi-user.target
然后enable
一下:systemctl enable frp
,系统会自动在/etc/systemd/system/multi-user.target.wants
建立一个指向/etc/systemd/system/frp.service
的软链接。
用于frpc
的frpc.ini
文件:
[common]
server_addr = www.srmcad.com(必须写,但好像不必要跟实际域名一样,因为我们不用vhost_http_port)
server_port = 跟上面的服务器配置一样
token = 跟上面的服务器配置一样
tls_enable = true
[Doku]
type = tcp
local_addr = localhost
local_port = 家里服务器上运行着doku的那个端口号
remote_port = 随便写个端口,不需要防火墙对外开放,除非你的frp服务器和nginx服务器不是同一个,不过土豪你研究这个方案干嘛?
这个就是一般的反向代理文件,下面贴的已经用certbot
申请了SSL
证书的,具体怎么申请就不展开了。
server{
listen 443 ssl;
server_name www.tiger2doudou.com;
ssl_certificate /etc/letsencrypt/live/www.tiger2doudou.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.tiger2doudou.com/privkey.pem;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
access_log /var/log/weiran-doku/access.log;
error_log /var/log/weiran-doku/error.log;
# set max upload size
client_max_body_size 512M;
set $upstream_doku http://127.0.0.1:12174;
location / {
# use a veriable $upstream_doku, so nginx will not try to check upstream status at startup
proxy_pass $upstream_doku;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
if ($host = www.tiger2doudou.com) {
return 301 https://$host$request_uri;
}
listen 80;
server_name www.tiger2doudou.com;
return 404; # managed by Certbot
}
关于为何要设置一个名为$upstream_doku
的变量:如果不写成变量,nginx
会在启动时尝试连接后端,如果连接失败则报错不启动。在不使用frp
中转而是直接用家里的公网ddns
域名做后端的时候,这个链接的失败率还是不低的。