FRP与Nginx服务搭建

简介

FRP(Fast Reverse Proxy)是一款高性能的反向代理服务器,可以帮助您轻松地将本地服务发布到公网。Nginx是一款高性能的HTTP服务器,可以用于反向代理、负载均衡、动静分离等场景。
本文将介绍如何在服务器上搭建FRP和Nginx服务,并通过FRP将本地服务发布到公网。

环境准备

  • 一台服务器,建议配置2核4GB内存以上
  • 公网IP地址
  • 域名(可选)

FRP安装

下载FRP

FRP支持Windows、Linux、MacOS等多种操作系统,您可以根据您的操作系统下载对应版本的FRP。
下载地址: https://github.com/fatedier/frp/releases

部署

  1. 解压下载的压缩包。
  2. 将 frpc 复制到内网服务所在的机器上。
  3. 将 frps 复制到拥有公网 IP 地址的机器上,并将它们放在任意目录。

配置FRP

FRP的配置文件为 frps.toml,默认位于 frp 目录下。

  1. 配置frps.toml
    在 frps.toml 文件中添加以下内容,以指定 HTTP 请求的监听端口为 8080:
bindPort = 7000
vhostHTTPPort = 8080

如果需要配置 HTTPS 代理,还需要设置 vhostHTTPSPort。
2. 配置frpc.toml
在 frpc.toml文件中添加以下内容,确保设置了正确的服务器 IP 地址、本地 Web 服务监听端口和自定义域名:

serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "web"
type = "http"
localIP = "127.0.0.1"               
localPort = 8081
customDomains = ["www.yourdomain.com"]  

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

配置说明:

  • bindPort: 服务端与客户端通信端口
  • vhostHTTPSPort: HTTP请求监听端口
  • serverAddr: FRP服务端地址(可以是IP或者是域名)
  • serverPort: 服务端与客户端通信端口
  • name: 服务端名称,保持唯一即可
  • type: 暴露的协议类型
  • localIP: 内网需要暴露服务的IP
  • localPort: 内网需要暴露服务端口
  • customDomains: 暴露服务的自定义域名
  • remotePort: 暴露服务的公网访问IP
    启动FRP服务端:
./frps -c ./frps.toml

启动FRP客户端:

./frpc -c ./frpc.toml

Nginx安装

源码安装

  1. 下载Nginx源码:
wget https://nginx.org/download/nginx-1.23.1.tar.gz
  1. 解压源码:
tar -zxvf nginx-1.23.1.tar.gz
  1. 编译安装:
cd nginx-1.23.1
./configure
make && make install
  1. 配置Nginx:
vim /etc/nginx/nginx.conf

配置文件示例:

server {
  listen 80;
  server_name localhost;

  location / {
    proxy_pass http://127.0.0.1:8081;
  }
}

配置说明:

  • listen 80: 监听80端口
  • server_name localhost: 服务器名称
  • proxy_pass http://127.0.0.1:8081: 反向代理到内网服务
    启动Nginx服务:
systemctl start nginx

在线安装

CentOS/RedHat:

yum install nginx

Debian/Ubuntu:

apt install nginx

配置Nginx:

vim /etc/nginx/nginx.conf

配置文件示例:

server {
  listen 80;
  server_name localhost;

  location / {
    proxy_pass http://127.0.0.1:8081;
  }
}

配置说明:

  • listen 80: 监听80端口
  • server_name localhost: 服务器名称
  • proxy_pass http://127.0.0.1:8081: 反向代理到内网服务
    启动Nginx服务:
systemctl start nginx

访问测试

在浏览器中输入您的域名或公网IP地址,如果能看到您的内网服务页面,则说明搭建成功。

Nginx配置文件最佳实践

  • 所有的 Nginx 配置文件都在 /etc/nginx/ 目录下。
  • 主要的 Nginx 配置文件是 /etc/nginx/nginx.conf
  • 为每个域名创建一个独立的配置文件,便于维护服务器。你可以按照需要定义任意多的 block 文件。
  • Nginx 服务器配置文件被储存在 /etc/nginx/sites-available 目录下。在 /etc/nginx/sites-enabled 目录下的配置文件都将被 Nginx 使用。
  • sites-available 目录用于存储 Nginx 网站的配置文件,这些文件构成了可用的网站列表。若需启用某个网站,可使用符号链接(symlink)将其配置文件从 sites-available 链接到 sites-enabled 目录中。例如,要启用 some.domain.com 网站,可以执行命令 ln -s /etc/nginx/sites-available/some.domain.com /etc/nginx/sites-enabled/。这样,Nginx 便会加载并运行该网站的配置。
  • 最佳推荐是使用标准的命名方式。例如,如果你的域名是 mydomain.com,那么配置文件应该被命名为 /etc/nginx/sites-available/mydomain.com.conf
  • 如果你在域名服务器配置块中有可重用的配置段,把这些配置段摘出来,做成一小段可重用的配置。
  • Nginx 日志文件(access.log 和 error.log)定位在 /var/log/nginx/ 目录下。推荐为每个服务器配置块,配置一个不同的 access 和 error。
  • Nginx配置文件在线生成工具:https://nginxconfig.org/?global.app.lang=zhCN
  • 你可以将你的网站根目录设置在任何你想要的地方。最常用的网站根目录位置包括:
  • /home/<user_name>/<site_name>
  • /var/www/<site_name>
  • /var/www/html/<site_name>
  • /opt/<site_name>

总结

本文介绍了如何在服务器上搭建FRP和Nginx服务,并通过FRP将本地服务发布到公网。您可以根据您的需要进行配置和使用。
注意:

  • 为了保证安全,请您在公网IP地址上配置防火墙,只开放必要的端口。
  • 请您定期更新FRP和Nginx软件版本,以修复已知的安全漏洞。
  • 本文仅介绍了基本的配置方式,但FRP和Nginx都提供了丰富的个性化配置选项,建议进行高级配置。对于更高级的配置,参考FRP官方文档和Nginx在线配置工具
  • 在Nginx和FRP的联合配置中,如果Nginx和FRP在同一台服务器上,建议使用hosts文件将FRP内网服务的自定义域名解析为127.0.0.1,以减少防火墙端口暴露,提高安全性

常见问题

  1. 如何使用FRP将多个内网服务发布到公网?
    您可以通过在frpc配置文件中添加多个 proxies 段来实现。
    示例:
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "web"
type = "http"
localPort = 80
localIP = "172.17.0.1"
customDomains = ["www.yourdomain.com"]

[[proxies]]
name = "web2"
type = "http"
localPort = 8080
localIP = "127.0.0.1"
customDomains = ["www.yourdomain2.com"]
  1. 如何使用Nginx进行负载均衡?
    您可以通过在Nginx配置文件中添加多个 server 段来实现。
    示例:
server {
  listen 80;
  server_name localhost;

  location / {
    proxy_pass http://127.0.0.1:8080;
  }
}

server {
  listen 80;
  server_name localhost;

  location / {
    proxy_pass http://127.0.0.1:8081;
  }
}
  1. 如何使用Nginx进行动静分离?
    您可以通过在Nginx配置文件中设置 location 来实现。
    示例:
server {
  listen 80;
  server_name localhost;

  location /static {
    root /usr/share/nginx/html/static;
  }

  location / {
    proxy_pass http://127.0.0.1:8080;
  }
}
  1. 如何使用FRP进行HTTPS反向代理?
    您可以通过在FRP服务端配置文件中填写vhostHTTPSPort = 443 客户端填写以下配置
    示例:
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "test_htts2http"
type = "https"
customDomains = ["test.yourdomain.com"]

[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:80"  #本地服务地址

# HTTPS 证书相关的配置
crtPath = "./server.crt"
keyPath = "./server.key"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"
  1. 如何使用Nginx进行HTTPS反向代理?
    您可以通过在Nginx配置文件中设置 ssl 字段来实现。
    示例:
server {
  listen 80;
  server_name localhost;

  location / {
    proxy_pass http://127.0.0.1:8080;
  }
}

server {
  listen 443 ssl;
  server_name localhost;

  ssl_certificate /path/to/fullchain.pem;
  ssl_certificate_key /path/to/privkey.pem;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDHE-RSA-AES128-GCM-SHA256:kEDHE-ECDSA-AES128-GCM-SHA256:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!ECDHE-RSA-DES-CBC3-SHA:!ECDHE-ECDSA-DES-CBC3-SHA:!DHE-RSA-DES-CBC3-SHA:!DHE-DSS-DES-CBC3-SHA:!SEED:!IDEA;

  ssl_session_cache builtin:10000;
  ssl_session_timeout 10m;

  location / {
    proxy_set_header Host  $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    proxy_ssl_server_name on;
    proxy_pass http://127.0.0.1:8080;
  }
}

参考资料