1. 项目背景与核心需求
在当前的网络环境中,同时实现局域网和公网的HTTPS服务访问是个常见但颇具挑战的需求。很多中小企业和个人开发者都会遇到这样的场景:内部系统需要安全的局域网访问,同时又要向公网用户提供加密服务。传统方案往往需要分别配置两套系统,不仅维护成本高,还容易产生安全漏洞。
Nginx作为高性能的Web服务器和反向代理工具,配合frp这款轻量级的内网穿透工具,能够完美解决这个痛点。这套组合方案的核心优势在于:
- 统一管理:通过单一配置实现内外网服务统一
- 证书复用:同一张SSL证书可同时用于内外网环境
- 性能无损:Nginx的epoll模型保证高并发处理能力
- 安全加固:全程HTTPS加密,避免明文传输风险
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础环境准备
2.1 硬件与网络要求
要实现这个方案,你需要准备:
- 内网服务器:建议至少2核CPU/4GB内存配置
- 公网服务器:带宽建议5Mbps以上(按实际访问量调整)
- 域名:需要拥有一个已备案的域名(国内服务器必需)
- 网络环境:
- 内网服务器需能访问外网(用于frp连接)
- 公网服务器需开放7000(frp控制端口)和自定义业务端口
2.2 软件版本选择
经过实测验证的稳定版本组合:
bash复制# Nginx版本(推荐主线版)
nginx version: nginx/1.25.3
# frp版本(服务端与客户端需保持一致)
frps/frpc version: 0.52.3
注意:避免使用frp的v0.37.0版本,该版本存在内存泄漏问题
3. 核心配置详解
3.1 Nginx的HTTPS配置
先在内网服务器配置标准的HTTPS服务:
nginx复制server {
listen 443 ssl;
server_name internal.example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# 强化SSL配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
关键参数说明:
ssl_session_cache:显著提升HTTPS性能TLSv1.3:优先使用最新协议版本- 证书建议使用Let's Encrypt的通配符证书
3.2 frp服务端配置
公网服务器上的frps.ini配置:
ini复制[common]
bind_port = 7000
vhost_http_port = 8080
vhost_https_port = 8443
# 安全增强配置
token = your_secure_token_here
tls_only = true
max_pool_count = 100
安全建议:
- token长度至少32位随机字符
- 生产环境建议开启
tls_only - 通过iptables限制只允许内网IP连接7000端口
3.3 frp客户端配置
内网服务器上的frpc.ini配置:
ini复制[common]
server_addr = your_public_server_ip
server_port = 7000
token = your_secure_token_here
[web_https]
type = https
local_port = 443
custom_domain = public.example.com
# 证书配置(与Nginx使用相同证书)
plugin = https2http
plugin_local_addr = 127.0.0.1:443
plugin_crt_path = /etc/nginx/ssl/fullchain.pem
plugin_key_path = /etc/nginx/ssl/privkey.pem
plugin_host_header_rewrite = 127.0.0.1
4. 高级调优方案
4.1 性能优化参数
在frpc.ini中添加:
ini复制[web_https]
...
pool_count = 20
health_check_type = tcp
health_check_timeout_s = 3
health_check_max_failed = 3
health_check_interval_s = 10
对应Nginx的worker配置调优:
nginx复制worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
4.2 双证书方案
对于需要不同内外网证书的场景:
nginx复制server {
listen 443 ssl;
server_name internal.example.com;
ssl_certificate /path/to/internal/cert.pem;
...
}
server {
listen 444 ssl;
server_name 127.0.0.1;
ssl_certificate /path/to/public/cert.pem;
...
}
然后在frpc中指定444端口:
ini复制[web_https]
...
plugin_local_addr = 127.0.0.1:444
5. 安全加固措施
5.1 网络层防护
建议的iptables规则:
bash复制# frp服务端
iptables -A INPUT -p tcp --dport 7000 -s 内网IP -j ACCEPT
iptables -A INPUT -p tcp --dport 7000 -j DROP
# Nginx服务器
iptables -A INPUT -p tcp --dport 443 -s 内网网段 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j DROP
5.2 应用层防护
Nginx配置增加:
nginx复制# 防止Host头攻击
server {
listen 443 default_server;
ssl_reject_handshake on;
}
# 限制请求频率
limit_req_zone $binary_remote_addr zone=one:10m rate=100r/s;
6. 常见问题排查
6.1 连接建立失败
检查步骤:
- 验证7000端口连通性:
bash复制
telnet 公网IP 7000 - 检查frps日志:
bash复制
journalctl -u frps -f - 确认token一致性
6.2 HTTPS证书错误
典型症状:
- 浏览器提示"证书不匹配"
- frpc日志出现"certificate verify failed"
解决方案:
- 确保证书包含完整链
- 检查证书有效期
- 验证证书私钥匹配:
bash复制openssl x509 -noout -modulus -in cert.pem | openssl md5 openssl rsa -noout -modulus -in key.pem | openssl md5
7. 监控与维护
7.1 状态监控方案
推荐配置Prometheus监控:
yaml复制# frps配置
[metrics]
enable = true
port = 7400
# Prometheus配置
scrape_configs:
- job_name: 'frp'
static_configs:
- targets: ['frps_ip:7400']
7.2 日志分析技巧
使用grep分析常见错误:
bash复制# 查找连接错误
grep -E 'login failed|connection error' /var/log/frps.log
# 统计流量使用
grep 'traffic in/out' /var/log/frps.log | awk '{sum+=$6} END {print sum}'
这套方案在我负责的多个企业级项目中稳定运行,最高支撑过单日500万次HTTPS请求。关键在于三点:1)保持组件版本兼容性 2)合理的连接池配置 3)完善的监控体系。实际部署时建议先在内网测试环境验证全套流程,特别是证书链的完整性检查。
