利用nginx與frp/ngrok實現內網穿透,將網站架在自己家裡或者公司內部
title: 利用nginx與frp/ngrok實現內網穿透,將網站架在自己家裡或者公司內部
date: 2019-04-17 13:27:43
categories: 架構
author: mrzhou
tags:
- nginx
- web
- frp
- ngrok
利用nginx與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_certificatecert/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_loglogs/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/; } }