基于frp和nginx的dokuwiki反向代理配置

比如买不起比较好的服务器,但由于其他原因(嘿嘿……)有其他方面很垃圾但大流量的公网服务器可以用,就可以在家里搞个服务器,然后用frp转发到公网去。

据测试,即使你家里有公网IP,frp转发的稳定性也明显高于直接让nginx将家里的IP做为upstream来做反向代理,因为家里的IP经常被强制下线换IP,而动态域名的更新无论怎么搞都挺慢的(收费方案的钱不如拿去买好一点的服务器),而frp的重连则是几乎实时的。

用于frpsfrps.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的软链接。

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

  • 最后更改: 2022/01/13 09:24