使用frpc和nginx用80端口代理不同服务

发表于:2023-07-24 14:38
运维,网络
热度:262
喜欢:1

硬件准备

使用frpc做内网穿透,需要有一台公网ip的服务器

文档地址

frp官网

frpgithub

下载

下载地址

客户端和服务端均在一个压缩包里,由于我客户端是mac,服务端是linux,所以要下载两个包
mac对应 darwin_amd64 linux对应 linux_md64

服务端

解压压缩包放置在有公网ip的服务器上
其中我放置的位置是 /home/nnnnzs/frp/目录下

服务端配置文件

服务端程序为frps,对应的配置文件为frps.ini 使用vim 打开目录下的frps.ini

ini 复制代码
[common]
# 和客户端互联的端口
bind_port = 1234
# 访问服务器8080ip的端口,才访问到内网穿透的应用
vhost_http_port = 8080
# 日志文件地址
log_file = /home/nnnnzs/frp/frp_0.48.0_linux_amd64/frps.log

不要忘了在服务器上开启1234端口

服务端开机自启

参考官网教程 使用systemed 做进程管理

  1. 创建/etc/systemd/system/frps.service文件
  2. 写入配置文件
复制代码
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /home/nnnnzs/frp/frp_0.48.0_linux_amd64/frps -c /home/nnnnzs/frp/frp_0.48.0_linux_amd64/frps.ini

[Install]
WantedBy = multi-user.target
  1. 使用 systemd 命令,管理 frps。
bash 复制代码
# 启动frp
systemctl start frps
# 停止frp
systemctl stop frps
# 重启frp
systemctl restart frps
# 查看frp状态
systemctl status frps
  1. 配置 frps 开机自启。
复制代码
systemctl enable frps

如果出现添加开机自启被拒绝,请检查配置文件是不是复制粘贴的时候少了字符如:[

反向代理

在nginx设置反向代理,这样不需要暴露8080端口,通过域名+80端口 即可访问内网服务,原来frpc根据host头来请求到对应服务

nginx 复制代码
server{
    listen 80;
    listen [::]:80;
    server_name a.nnnnzs.cn b.nnnnzs.cn;
    location / {
            proxy_pass http://localhost:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header REMOTE-HOST $remote_addr;
    }
}

域名解析

将两个域名分别添加解析到服务器所在ip上

客户端A配置

放置在需要穿透的内网电脑A 上

复制代码
[common]
#服务器ip地址
server_addr = 服务端ip地址
# 服务器开放端口
server_port = 1234
# 日志端口
log_file = ./frpc.log

[web]
type = http
# 本地ip
local_ip = 127.0.0.1
# 本地服务端口
local_port = 3001
# 
custom_domains = a.nnnnzs.cn

客户端B配置

复制代码
[common]
#服务器ip地址
server_addr = 服务端ip地址
# 服务器开放端口
server_port = 1234
# 日志端口
log_file = ./frpc.log

[web]
type = http
# 本地ip
local_ip = 127.0.0.1
# 本地服务端口
local_port = 3002
# 
custom_domains = b.nnnnzs.cn

当然 客户端A 和 B 可以是同一台电脑的不同端口

复制代码
[common]
#服务器ip地址
server_addr = 服务端ip地址
# 服务器开放端口
server_port = 1234
# 日志端口
log_file = ./frpc.log

[web]
type = http
# 本地ip
local_ip = 127.0.0.1
# 本地服务端口
local_port = 3003
# 
custom_domains = a.nnnnzs.cn

[web]
type = http
# 本地ip
local_ip = 127.0.0.1
# 本地服务端口
local_port = 3004
# 
custom_domains = b.nnnnzs.cn

客户端脚本

启动脚本

复制代码
#!/bin/bash
nohup frpc -c frpc.ini &

停止脚本

复制代码
#!/bin/bash

# 检查并杀死frp进程
processes=$(ps -ef | grep -E "frp|frpc" | grep -v grep | awk '{print $2}')

if [ -n "$processes" ]; then
    echo "找到以下进程:"
    echo "$processes"
    echo "正在杀死进程..."
    kill -9 $processes
    echo "进程已成功结束。"
else
    echo "没有找到frp或frpc进程。"
fi