Nginx与frp结合实现局域网和公网的双重https服务

背景: 因为局域网内架设了 tiddlywiki、 Nextcloud 等服务,同时也把公司的网站架设在了本地,为了实现局域网直接在局域网内访问,而外部访问通过frps服务器作为反向代理的目的,才有此内容。 实现的效果如下图琐事

不喜欢废话,这里直接贴代码,有需要的更改关键信息的内容即可。

一、VPS的配置

1. vps需要安装nginx和frp

nginx的安装教程比较多,这里不详细介绍, frps 服务的安装通过gofrp.org 自行学习即可,也可参考我之前的几篇文章:

frp透传软件最新toml格式的配置文件的使用_frp toml-CSDN博客

使用frp0.61.0透传局域网的https服务到自有域名_frp 0.61-CSDN博客

2. 命令行操作

2.1 安装nginx
复制代码
apt update
apt install nginx
2.2 安装frps,编写配置内容
复制代码
wget https://download.frp.org/frp0.61.1.tar.gz
tar -zxvf frp0.61.1.tar.gz
cd frp0.61.1/
cp frps /usr/bin/
mkdir -p /etc/frp
cp frps.toml /etc/frp/
vim /etc/frp/frps.toml
## 内容如上图,如下面的文字
bindPort = 6776
vhostHTTPSPort = 35443
vhostHTTPPort = 8080
2.3启用systemd服务管理frps
复制代码
vim /etc/systemd/system/frps.service 
## 内容如下面的文字

[Unit]
Description=Frp Server Service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/usr/bin/frps -c /etc/frp/frps.toml

[Install]
WantedBy=multi-user.target

让frps 服务开机自启动

复制代码
systemctl start frps
systemctl status frps
systemctl enable frps

二、 局域网Server的配置

1.局域网服务器也要安装nginx

2. 假设我们搭建了tiddlywiki服务,并使用34580端口提供服务

相关的安装可参考我的文章:

Debian12中搭建TiddlyWiki服务并进行配置-CSDN博客

相较链接中的内容,我们这次不直接为tiddlywiki 开启ssl,而是通过nginx来通过自有签名来进行加密,提供https服务。

关于自签名证书,可以参考我的文章:

创建包含可导入浏览器信任的SSL自签名证书_浏览器信任证书-CSDN博客

3. tiddlywiki 的 systemd配置文件

复制代码
/etc/systemd/system/wiki.service 
## 内容如下


[Unit]
Description=Start the TiddlyWiki Server
After=network.target
[Service]
Type=simple
Restart=on-failure
RestartSec=10s
ExecStart=/usr/local/bin/tiddlywiki /home/wiki --listen host=0.0.0.0 port=34580  credentials="/etc/wiki/users.csv" "readers=(anon)" "writers=(authenticated)"

LimitNOFILE=1048779
 
[Install]
WantedBy=multi-user.target

4. frpc服务的配置

复制代码
vim /etc/frp/frpc.toml 

##内容如下

serverAddr = "www.frpshost.com"
serverPort = 6776

[[proxies]]
name = "web-wiki"
type = "http"
localPort = 34580
customDomains = ["wiki.frpshost.com"]

三、 Nginx的配置-VPS和局域网Server都需要配置

1. 自签名证书

为了更清晰的体现效果,我们构建来两套自签名证书,webA在VPS中使用,webB在局域网中使用; 位置都在各自的 /home/SSL/ 目录中。

2.VPS中nginx的配置

复制代码
vim /etc/nginx/conf.d/wiki.conf 
## 内容如下面的文字


## 第一个 server 用于将http://wikifrpshost.com重定向到 https://wikifrpshost.com
server {
        listen      80 ;  
        listen      [::]:80 ;
        server_name wiki.frpshost.com;
		        location / {
	        return 301 https://$host$request_uri;

		       	}
    }

## 第二个 server 用于为来自局域网Server的http服务,添加SSL证书进行加密
server {
    listen 443 ssl;
    listen [::]:443 ssl;
 
    server_name wiki.frpshost.com;

    index index.html;
    
    ssl_certificate /home/SSL/webA.crt;
    ssl_certificate_key /home/SSL/webA.key;
 
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        ## 局域网tiddlywiki用34580端口提供http服务,被frpc转发到了VPS上的vhosthttp端口,frps居中协调这一过程,因此下面的端口号是frps提供vhosthttp服务的端口号8080 !!
        proxy_pass http://127.0.0.1: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 X-Forwarded-Proto $scheme;
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
        client_max_body_size 0;

        access_log /var/log/nginx/wiki.access.log;
        error_log /var/log/nginx/wiki.error.log;
}
}

3.局域网Server中nginx的配置

复制代码
vim /etc/nginx/conf.d/default.conf 
## 内容如下面的文字

server {
    listen 443 ssl;
    listen [::]:443 ssl;
 
    server_name wiki.frpshost.com;

    index index.html;
    
    ssl_certificate /home/SSL/webB.crt;
    ssl_certificate_key /home/SSL/webB.key;
 
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        ## 下面的行自带端口号,同时后面要有 / ,这样就可以只输入域名,不用带端口号了!!
        proxy_pass http://127.0.0.1:34580/;
        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 X-Forwarded-Proto $scheme;

    # 仅允许特定 IP 访问
	        allow 192.168.10.251;
	        allow 192.168.10.252;
	        allow 223.141.169.242; ## 不能忘记VPS服务器,否则公网无法访问!!
	        deny all;              # 拒绝其他 IP

        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; 
        preload";
        client_max_body_size 0;

        access_log /var/log/nginx/wiki.access.log;
        error_log /var/log/nginx/wiki.error.log;
    }
}

# 配置在局域网中,HTTP到HTTPS的重定向
server {
    listen 80;
    server_name wiki.frpshost.com ;

    location / {
        return 301 https://$host$request_uri;
    }
}

四、 局域网PC的配置

要想局域网内的pc直接在局域网内通过域名访问wiki服务,而不用通过公网再绕回来,就需要有局域网DNS服务器将 wiki.frpshost.com指向 192.168.10.250; 或者更直接的办法,修改windows11等操作系统上的host文件,添加一行内容即可。

C:WindowsSystem32driversetchosts

192.168.10.250 wiki.frpshost.com

当然,要先为host文件设定用户权限,然后才可以编辑。 相关教程用搜索引擎搜索即可

五、多个服务的代理和转发

如果局域网Server上有多种服务,则需要在frpc.toml 中,为每一个服务指定转发端口和二级域名; 同时,VPS上也最好为每一个服务单独建一个nginx配置文档,便于管理。

还可以用crtrobt申请正式的SSL证书。

经过这一系列操作,无论是公网访问wiki.frpshost.com还是在局域网内访问,都会自动转换为https,且两种环境下所采用的SSL证书是不同的,可以点击查看证书内容

相关推荐
他们叫我技术总监10 分钟前
Kettle(PDI)连接TDengine数据库实战:一个有趣的小现象
大数据·数据库·tdengine
SilentSamsara16 分钟前
RAG 系统入门:LangChain/LlamaIndex + Chroma 向量数据库的检索增强实战
数据库·人工智能·python·青少年编程·langchain
RoboWizard19 分钟前
一块硬盘上架前要闯多少关?
java·服务器·数据库
oyyanghh20 分钟前
从Cursor到TRAE的三周vibe coding体验对比
数据库·oracle
Bert.Cai26 分钟前
Oracle CONCAT函数详解
数据库·oracle
半夜燃烧的香烟30 分钟前
docker 安装minio nginx,配置nginx根据文根路由minio展示图片
java·nginx·docker
豆豆33 分钟前
2026年如何选择适合自己的网站管理系统?
数据库·cms·wordpress·建站系统·网站管理系统·建站软件·织梦
吴声子夜歌1 小时前
SQL经典实例——检索记录
数据库·sql
黄焖鸡能干四碗1 小时前
软件系统概要设计说明书模版(Word)
大数据·运维·数据库·架构·需求分析
dust_and_stars1 小时前
为什么ubuntu24 snap install code-server 不需要--classic?
网络·数据库