迁移通知
本站内容正在逐步向 https://www.weiran.ink 迁移,更新内容请到新站查找。
基于frp和nginx的dokuwiki反向代理配置
比如买不起比较好的服务器,但由于其他原因(嘿嘿……)有其他方面很垃圾但大流量的公网服务器可以用,就可以在家里搞个服务器,然后用frp转发到公网去。
据测试,即使你家里有公网IP,frp转发的稳定性也明显高于直接让nginx将家里的IP做为upstream来做反向代理,因为家里的IP经常被强制下线换IP,而动态域名的更新无论怎么搞都挺慢的(收费方案的钱不如拿去买好一点的服务器),而frp的重连则是几乎实时的。
frp服务器配置
用于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的软链接。
frp客户端(家里)配置
用于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服务器不是同一个,不过土豪你研究这个方案干嘛?
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域名做后端的时候,这个链接的失败率还是不低的。