# 基于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`域名做后端的时候,这个链接的失败率还是不低的。