title: 利用 nginx 与 frp/ngrok 实现内网穿透, 将网站架在自己家里或者公司内部
date: 2019-04-17 13:27:43
categories: 架构
- author: mrzhou
- tags:
- nginx
- web
- frp
- ngrok
这个需求其实在天朝一直都是比较强烈的, 对于一些小企业, 或者是个人, 能够把网站架在企业内部, 或者家里是非常方便的一件事情, 但现在国内, 如果没有备案的域名往往是无法被解析到相应的服务器的, 但使用 https 却不受影响. 基于以上原因, 将服务器架在自己家里或者公司内部, 就不受限制了.
frp 还是 ngrok?
就目前来看这两个工具好像是使用最为广泛的, ngrok 需要自己编译, 也还算比较方便, 但 frp 你可以直接下载编译好的版本, 并且 Linux/win 的版本都已经编译好了, 下载后就可以直接使用. 所以这里直接以 frp 作为样例.
为什么还要 nginx?
内网穿透, 但无论如何还是需要一台有固定 IP 的公网服务器. 如果你购买或者租用了一台公网服务器, 其实不可能只用它来做中转, 应该还是会用它来架一些其他的服务, 如果我们直接在上面架 frp 或者 ngrok 来监控 80 和 443 端口, 感觉还是有点浪费了. 所以我们前端使用 nginx 来管理, 后面可以将请求转到相应的服务端口即可, 当然 frp/ngrok 也就放到 nginx 的后面了, 后面还可以有 tomcat 或者 iis,apache 等.
重点还是在 nginx 的配置
在下面的配置中, 我在公网服务器上同样架了 tomcat, 端口 8080, 但并没有对外开放, 只能使用 127.0.0.1:8080 进行访问, 然后架了 frps, 端口开放为 7000, 同时这个 7000 也是 frpc 连接使用. 将 80 端口的访问转向 443, 然后使用 nginx 反向代理, 将 443 的请求以 http 协议转发到 frps, 然后转到内网的的服务器上. 由于 nginx 已经配置了泛域名证书支持, 所以所有的子站均显示为安全网站 .
- upstream tomcat9 {
- server 127.0.0.1:8080;
- }
- upstream frps {
- server 127.0.0.1:7000;
- }
- server {
- listen 80;
- server_name www.easex.cn;
- location / {
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header Host $host;
- proxy_redirect off;
- proxy_pass http://tomcat9/;
- }
- }
- server {
- listen 80;
- server_name *.easex.cn;
- return 301 https://$http_host$request_uri;
- }
- server {
- listen 443 ssl http2;
- server_name *.easex.cn;
- ssl_certificate cert/easex.cn/fullchina.cer;
- ssl_certificate_key cert/easex.cn/easex.cn.key;
- ssl_session_timeout 5m;
- ssl_protocols TLSV1 TLSv1.1 TLSv1.2;
- ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
- ssl_prefer_server_ciphers on;
- access_log logs/easex.cn_access.log;
- error_log logs/easex.cn_error.log;
- location / {
- proxy_http_version 1.1;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header Host $host;
- proxy_redirect off;
- proxy_pass http://frps/;
- }
- }
来源: http://www.jianshu.com/p/579ef9509fa3