配置 Nginx 和 frps 共存 80/443 端口及泛域名支持教程 – 思有云 – IOIOX

配置 Nginx 和 frps 共存 80/443 端口及泛域名支持教程

  1. 首页
  2. 正文  

前言

常规情况下frps服务器端会占用80和443端口,为内网设备提供穿透,实现用户可以使用域名无端口访问内网设备.而在已经部署nginx的服务器上,由于nginx已经占用80和443端口,frps的HTTP和HTTPS需另外选择端口,可以通过nginx的反向代理配置让frps提供的穿透服务也能够使用80和443端口,实现nginx和frps共存.同时配置支持泛域名反向代理.

此方案适合个人用户搭建frps,国内服务器也可备案自己的域名,配置泛域名的反向代理及证书,可以方便快速的使用任何二级域名来穿透内网的各项服务.

×此方案不适合公开提供服务的frps服务器,由于公开服务,用户使用的是自己的域名,无法为各用户分别配置反向代理.但如果你提供的frps支持subdomain泛域名,已经为用户提供了二级或三级域名使用,也可以使用本方案,但用户就无法使用自己的域名.所以此方案并不推荐用于公共frp服务.

本文为 Stille 原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址.

方案介绍

常规frps提供80和443端口的穿透,当外网访问域名时,frps会将80和443端口穿透到内网设备,由内网设备来处理80和443端口的请求.例如HTTPS的强制跳转,伪静态,证书等请求都由内网设备来处理.一些成熟的服务,例如群晖DSM,Web Station以及各套件都能够很好的提供服务,而另外一些服务,例如某些docker容器,部分路由器管理端,可能仅仅提供了HTTP端口,想要使用HTTPS还得借助另外的反向代理服务,相对会更加麻烦.

!内网设备及服务可无需HTTPS支持,frpc.ini也只需要配置HTTP穿透到服务器.当外网访问域名时,收到请求的Nginx会根据泛域名配置,强制跳转到HTTPS,同时Nginx会提供SSL安全证书支持,然后Nginx会反向代理到frps的HTTP端口,在由frps穿透回内网获取信息返回给外网用户.

i经过一段时间的使用,两种方案各有利弊,还是需要根据实际使用场景来选择.例如群晖NAS官方的DSM,各套件和服务可以使用上文第一种独立frps方案,由群晖来处理Web前端和SSL证书.如果使用一些docker容器服务,本身仅只支持HTTP,那么可以选择nginx和frps共存的方案,让nginx反向代理来支持HTTPS和SSL证书.

方案配置

frps.ini配置

  • 由于nginx占用80/443端口,frps.ini中的 vhost_http_portvhost_https_port 请更换为其他端口.
  • subdomain_host 根据需求可选配置泛域名,或者注释删除此参数使用自定义域名.

frpc.ini配置

如果 frps.ini 配置了 subdomain_host 泛域名,那么 frpc.ini 中域名参数需使用 subdomain = xx 仅填写二级域名主机头即可,不要填写完整域名.

如果 frps.ini 没有配置 subdomain_host泛域名,那么 frpc.ini 中域名参数需使用 custom_domains = xx.xxx.com 需填写完整的域名.

nginx配置

  • proxy_pass http://127.0.0.1:1234; 中的 HTTP ,请勿写成 HTTPS .
  • proxy_pass http://127.0.0.1:1234;1234 端口为 frpsHTTP 端口.
  • proxy_set_header Host $host:80; 注意需加上80端口,否则会无限循环301跳转,导致网页打不开提示重定向次数过多ERR_TOO_MANY_REDIRECTS.
1\a 2\a 3\a 4\a 5\a 6\a 7\a 8\a 9\a 10\a 11\a 12\a 13\a 14\a 15\a 16\a 17\a 18\a 19\a 20\a 21\a 22\a 23\a 24\a 25\a 26\a 27\a 28\a 29\a 30\a 31\a 32\a 33\a 34\a 35\a 36\a 37\a 38\a 39\a 40\a 41\a 42\a 43\a 44\a 45\a 46\a 47\a 48\a 49\a 50\a 51\a 52\a 53\a 54\a 55\a 56\a 57\a 58\a 59\a 60\a 61\a 62\a 63\a 64\a 65\a 66\a 67\a 68\a 69\a 70\a 71\a 72\a 73\a 74\a 75\a 76\a 77\a 78\a 79\a 80\a 81\a 82\a 83\a 84\a 85\a 86\a 87\a 88\a 89\a 90\a 91\a 92\a 93\a 94\a 95\a 96\a 97\a 98\a 99\a 100\a 101\a 102\a 103\a 104\a 105\a 106\a 107\a 108\a 109\a 110\a 111\a 112\a 113\a 114\a 115\a 116\a 117\a 118\a 119\a 120\a 121\a 122\a 123\a 124\a 125\a 126\a 127\a 128\a 129\a 130\a 131\a 132\a 133\a 134\a 135\a 136\a 137\a 138\a 139\a 140\a 141\a 142\a 143\a 144\a 145\a 146\a 147\a 148\a 149\a 150\a 151\a 152\a 153\a 154\a 155\a 156\a 157\a 158\a 159\a 160\a 161\a 162\a 163\a 164\a 165\a 166\a 167\a 168\a 169\a 170\a 171\a 172\a 173\a 174\a 175\a 176\a 177\a 178\a 179\a 180\a 181\a 182\a 183\a 184\a 185\a 186\a 187\a 188\a 189\a 190\a 191\a 192\a 193\a 194\a 195\a 196\a 197\a 198\a 199\a 200\a 201\a 202\a 203\a 204\a 205\a 206\a 207\a 208\a 209\a 210\a 211\a 212\a 213\a 214\a 215\a 216\a 217\a 218\a 219\a 220\a 221\a 222\a 223\a 224\a 225\a 226\a 227\a 228\a 229\a 230\a 231\a 232\a 233\a 234\a 235\a 236\a 237\a 238\a 239\a 240\a 241\a 242\a 243\a 244\a 245\a 246\a 247\a 248\a 249\a 250\a 251\a 252\a 253\a 254\a 255\a 256\a 257\a 258\a 259\a 260\a 261\a 262\a 263\a 264\a 265\a 266\a 267\a 268\a 269\a 270\a 271\a 272\a 273\a 274\a 275\a 276\a 277\a 278\a 279\a 280\a 281\a 282\a 283\a 284\a 285\a 286\a 287\a 288\a 289\a 290\a 291\a 292\a 293\a 294\a 295\a 296\a 297\a 298\a 299\a 300\a 301\a 302\a 303\a 304\a 305\a 306\a 307\a 308\a 309\a 310\a 311\a 312\a 313\a 314\a 315\a 316\a 317\a 318\a 319\a 320\a 321\a 322\a 323\a 324\a 325\a 326\a 327\a 328\a 329\a 330\a 331\a 332\a 333\a 334\a 335\a 336\a 337\a 338\a 339\a 340\a 341\a 342\a 343\a 344\a 345\a 346\a 347\a 348\a 349\a 350\a 351\a 352\a 353\a 354\a 355\a 356\a 357\a 358\a 359\a 360\a 361\a 362\a 363\a 364\a 365\a 366\a 367\a 368\a 369\a 370\a 371\a 372\a 373\a 374\a 375\a 376\a 377\a 378\a 379\a 380\a 381\a 382\a 383\a 384\a 385\a 386\a 387\a 388\a 389\a 390\a 391\a 392\a 393\a 394\a 395\a 396\a 397\a 398\a 399\a 400\a 401\a 402\a 403\a 404\a 405\a 406\a 407\a 408\a 409\a 410\a 411\a 412\a 413\a 414\a 415\a 416\a 417\a 418\a 419\a 420\a 421\a 422\a 423\a 424\a 425\a 426\a 427\a 428\a 429\a 430\a 431\a 432\a 433\a 434\a 435\a 436\a 437\a 438\a 439\a 440\a 441\a 442\a 443\a 444\a 445\a 446\a 447\a 448\a 449\a 450\a 451\a 452\a 453\a 454\a 455\a 456\a 457\a 458\a 459\a 460\a 461\a 462\a 463\a 464\a 465\a 466\a 467\a 468\a 469\a 470\a 471\a 472\a 473\a 474\a 475\a 476\a 477\a 478\a 479\a 480\a 481\a 482\a 483\a 484\a 485\a 486\a 487\a 488\a 489\a 490\a 491\a 492\a 493\a 494\a 495\a 496\a 497\a 498\a 499\a server {
    listen 80;
    server_name *.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name *.yourdomain.com;

    ssl_certificate /usr/local/nginx/conf/ssl/yourdomain.com.crt;
    ssl_certificate_key /usr/local/nginx/conf/ssl/yourdomain.com.key;

    client_max_body_size 50m; 
    client_body_buffer_size 256k;
    client_header_timeout 3m;
    client_body_timeout 3m;
    send_timeout 3m;
    proxy_connect_timeout 300s; 
    proxy_read_timeout 300s; 
    proxy_send_timeout 300s;
    proxy_buffer_size 64k; 
    proxy_buffers 4 32k; 
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k; 
    proxy_ignore_client_abort on; 

    location / {
        proxy_pass http://127.0.0.1:1234;
        proxy_redirect off;
        proxy_set_header Host $host:80;
        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;
    }
}

结语

更多FRP内网穿透相关技巧,教程及信息,请持续关注本站FRP内网穿透专栏:

本文为 Stille 原创文章.经实践,测试,整理发布.如需转载请联系作者获得授权,并注明转载地址.

本文链接 https://www.ioiox.com/archives/78.html


最后修改:2020 年 02 月 20 日 10 : 05 PM

© 允许规范转载

如果喜欢我的文章,觉得对你有帮助,请随意赞赏!

25 条评论



  1. Davy

    May 7th, 2020 at 03:57 pm

    这里nginx的配置是指的frps端的nginx的配置吧

    回复



    1. Stille博主

      May 7th, 2020 at 05:06 pm

      @Davy

      frps服务器上的nginx

      回复



  2. 三年梦

    April 18th, 2020 at 01:57 pm

    老大,问下你我按照你的办法设置好nginx配置后,默认一直是301到https的,所以不管是使用自定义域名还是二级域名,开启的ssl都等于是无效的,默认都会跳转到https上去,导致用http不能访问,也就是会出现加载错误,请问这个怎么解决呀

    回复



    1. 三年梦

      April 18th, 2020 at 02:03 pm

      @三年梦

      采用的是宝塔nginx+frps的共存,去掉301重定向的话就不能访问,不去掉就会默认跳转https,所以也是研究很久都不能解决,我搭建了一个Typecho博客,前端301跳转https访问没有问题,后端也就是后台死活登录不上,F12查看发现是加载js跟css依然是http,所以报错了,试了很多方法都无法解决

      回复



      1. 三年梦

        April 18th, 2020 at 04:25 pm

        @三年梦

        终于弄好了,还是穿透的问题,宝塔的配置不能按你的那个写,具体操作如下:

        在宝塔的nginx配置下找到这句代码: access_log off;

        在下面添加如下代码

        [code]server {listen 80;server_name *.yourdomain.com; #穿透的泛解析域名

        location / {proxy_pass http://127.0.0.1:8080; #frps的非80端口proxy_redirect http://$host/ http://$http_host/;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $host;}}

        server {listen 443 ssl http2;server_name *.yourdomain.com; #穿透的泛解析域名

        ssl_certificate /www/server/panel/vhost/cert/yourdomain.com/fullchain.pem; #证书文件地址ssl_certificate_key /www/server/panel/vhost/cert/yourdomain.com/privkey.pem; #证书key地址

        client_max_body_size 50m; client_body_buffer_size 256k;client_header_timeout 3m;client_body_timeout 3m;send_timeout 3m;proxy_connect_timeout 300s; proxy_read_timeout 300s; proxy_send_timeout 300s;proxy_buffer_size 64k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k; proxy_ignore_client_abort on;

        location / {proxy_pass http://127.0.0.1:8080;proxy_redirect https://$host/ https://$http_host/;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_ssl_server_name on;proxy_set_header Host $host;}}[/code]

        回复



      2. Stille博主

        April 18th, 2020 at 02:18 pm

        @三年梦

        对于宝塔我没测试过,暂时也没计划去测试.所以不能保证在宝塔上可用..如果前段能访问,后台登陆不上,建议以https的方式重装typecho在来恢复数据库.博客内有一些非http的内容是有可能导致一些错误

        回复



    2. Stille博主

      April 18th, 2020 at 02:02 pm

      @三年梦

      开启的ssl都等于是无效的,默认都会跳转到https上去,导致用http不能访问

      这句没看明白.举个例子吧

      回复



      1. 三年梦

        April 18th, 2020 at 02:04 pm

        @Stille

        就是内网主机上设置ssl,不管你是开启还是关闭ssl都会默认跳转https

        回复



        1. Stille博主

          April 18th, 2020 at 02:11 pm

          @三年梦

          说实话,还是没理解清楚你实际的环境

          回复



          1. 三年梦

            April 18th, 2020 at 02:11 pm

            @Stille

            该评论仅登录用户及评论双方可见

            回复



  3. Chengyung

    March 25th, 2020 at 04:55 pm

    博主,我有个腾讯云的主机,装了宝塔,想问问能否出个宝塔和FRPS共存的教程,现在国内用宝塔的挺多的。你这篇文章我看了但是不知道将配置怎么在宝塔面板里面设置。谢谢哈

    回复



    1. Stille博主

      March 25th, 2020 at 05:24 pm

      @Chengyung

      等有空研究下在看发个教程吧.

      回复



      1. Chengyung

        March 25th, 2020 at 05:28 pm

        @Stille

        嗯,主要是不大清楚,在nginx配置里面的*.yourdomain.com,是改成FRPS的域名是吗?比如你的free.frp.ioiox.com,证书目录也是改成域名文件夹名,将证书上传在这个目录?

        回复



        1. Chengyung

          March 25th, 2020 at 06:30 pm

          @Chengyung

          弄好,能http了,就是还差https再研究研究。希望能出个教程哈。

          回复



          1. glaz

            April 23rd, 2020 at 12:20 am

            @Chengyung

            https很简单,选择重定向http,然后重定向那里点配置文件,再把proxy_set_header Host $host;加上80端口就可以了。注意,然后群晖要关闭强制跳转https,因为实际链接的是http

            回复



  4. Xander

    March 17th, 2020 at 11:49 pm

    膜拜大佬,,,,,,找了好久都不行,万幸看到了大佬的帖子搞定了

    回复



    1. Stille博主

      March 18th, 2020 at 12:12 am

      @Xander

      解决了就好…

      回复



  5. 老腊肉

    March 15th, 2020 at 07:37 pm

    牛X,困扰我数日的问题终于被这篇教程给解决了,终于Nginx和frp共存了,成功的那一刻实在是感觉太酸爽了,也不得不佩服博主,给您N次方个赞。

    我的服务器上装了宝塔面板(使用的是Nginx),想和frp共存,并做了反向代理,http的反代就正常,https的反代总是502网关错误,而https加端口(即,frp服务端非默认端口)访问就正常。在网上找了很多方法,都不得其解。都是一堆水货或纯粹就是复制粘贴引流的,要么就是对于https部分不是轻描淡写,就是只字不提。弄了很多,也尝试了很多,最终也是搞得实在是身心疲惫和心灰意冷。

    直到看到这篇教程才恍然大悟。真如网上某些人说的,反向代理是内部调用,根本不需要https,http就行了,而这篇教程也是在反向代理避开了内部调用https,还特别强调只用http。以及反向代理时,之前也有人说需要向服务器传递域名信息,即,加入proxy_ssl_server_name on;代码,也看到博主把那条代码加进去了。

    还有就是加入重定向return 301 https://$host$request_uri;的代码,让http直接跳转https。这样也是直接避开内部调用https。与此同时也是我万万没想到的,因为之前我做反向代理时,并没有做301,而是直接输入https开头的127.0.0.1:端口(非443,frp服务端设置的其他端口),也就是反代时直接内部调用了https

    更令我没有想到的是,做反向代理时,$host的后面还要加:80,因为宝塔面板设置反向代理时,如果在$host后面加端口,就会提示错误,不能加端口(想想也是,host就是本地的,端口自然是80,是很难会想到再去加:80的),只能从配置文件里手动修改添加。

    看来是被宝塔面板的‘反向代理’这一个功能设置给带坑里去了。以及,很多Nginx反向代理的知识都不太懂,基础薄弱。还有,某度也是个坑货,博主这篇这么好的教程,居然不显示,很多关键字都用上了,全给那些水货给霸占了。哎,看到这篇教程真切的感到是相见恨晚。

    讲真,要不是无意中在某个论坛看到有人分享frp公共服务器(博主发的帖子),并跳转到了这个博客,以及想多了解这个博客都有些什么内容(也带有当时对博主分享frp公共服务器的感谢之意,想着就送一个IP访问给博主的网站,以表示感谢的心态),才无意中看到了这篇教程。是的,也要感谢老天爷,让我有了这样的运气。不然的话,估计我那个被困扰的问题可能一直会持续很久很久都不能被解决!

    最好,就是非常感谢博主!!

    回复



    1. Stille博主

      March 15th, 2020 at 07:51 pm

      @老腊肉

      同时欢迎加我的TG群,大家可以一起交流.

      回复



    2. Stille博主

      March 15th, 2020 at 07:49 pm

      @老腊肉

      有史以来最长的一篇留言…能够帮到你就算是我没有白费力气写文章..正是因为在折腾的过程中,网上搜到的教程都不尽完美,所以才会根据实践重新来写..至于百度就算了吧…Google上还是能够找到的我博客…

      回复



      1. 老腊肉

        March 15th, 2020 at 08:08 pm

        @Stille

        确实,网上搜到的,但在实际尝试的时候,也正如您所说不尽完美,所以总是各种碰壁,屡试屡错。

        百度也是越来越辣鸡,明显的感到近段时间唰的一下,好多东西都找不到了,不知道是不是百度那边做了什么调整或整治,能找到的信息量远不如以前。至于您说谷歌,我恨360,360这玩意儿简直就是“梯子”杀手。但电脑的安全防范也离不开360,其他免费杀软确实没有360做得专业。开VM虚拟机用“梯子”,但配置又吃紧。没错,我也能感觉谷歌的内容确实丰富过百度,百度这dog 太阳的,真的是屏蔽了不少好网站。

        对了,您说的TG群,我该怎么加入呢?群号是多少?特殊是您分析frp公共服务器方面,没看到您留群号(按理说,应该是有群号),有时候想问点什么都不怎么方便。

        回复



        1. Stille博主

          March 15th, 2020 at 08:14 pm

          @老腊肉

          左侧导航有TG群链接…要搭梯子!

          回复

  1. 1
  2. 2

发表评论

评论 *

表情

私密评论


名称 *

邮箱 *

地址

未经允许不得转载:球盖网 » 配置 Nginx 和 frps 共存 80/443 端口及泛域名支持教程 – 思有云 – IOIOX

赞 (0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏