nginx泛域名转发+https配置+内网穿透
内网穿透加nginx转发实现本地服务远程访问
前言
这个系列主要是我在manjaro(linux)系统下安装部署java向研发环境的过程 其实更准确讲是使用docker安装部署一些常用工具!顺便记录分享给大家
想要尝试使用manjaro(linux)系统研发的朋友可以参考我另一篇安装以及基本配置博客:
manjaro i3wm安装配置全记录
经过几天晚上的努力,终于把本地研发环境搭建过程整理完毕,以下是系列目录:
docker安装配置及常用命令(dokcer系列一)
docker安装配置mysql8.0.16(dokcer系列二)
docker安装redis并配置远程访问和密码(dokcer系列三)
docker安装gitlab并调优性能(docker系列四)
docker安装jenkins(docker系列五)
docker安装nacos并配置mysql数据库(docker系列六)
大致需要使用到的环境和工具已经安装部署完成,最后这篇记录如何通过内网透传搭配nginx转发实现本地环境资源远程访问的过程。
一.关于内网穿透
介绍
内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。下面就相互通信的主机在网络中与 NAT 设备的相对位置介绍内网穿透方法。
UDP 内网穿透的实质是利用路由器上的NAT 系统。NAT 是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。NAT可以完成重用地址,并且对于内部的网络结构可以实现对外隐
内网穿透常用工具
常用工具:别人家的介绍~
为什么我要使用内网穿透呢?
0.云服务器到期了!
1.更方便的远程访问本地资源,实现远程协作开发
2.给有本地服务器,但是没有公网IP的公司使用
3.暂时没想好
我这里选型有考虑三种:ngrok,花生壳,其他
ngrok如果自己搭建服务器就很折腾,而且我没有云服务器 ,虽然也有商业版
花生壳个人不是太喜欢用,给不起钱
所以最终我选择使用natapp
项目主页:https://natapp.cn/
项目介绍:基于ngrok的国内收费内网穿透工具,类似花生壳,有免费版本,比花生壳好。免费版本:提供http,https,tcp全隧道穿透,随机域名/TCP端口,不定时强制更换域名/端口,自定义本地端口
使用原因:支持泛域名解析,支持TPC,UDP以及http/https,支持阿里云域名解析,操作简单不用折腾,比花生壳便宜!
二.安装nginx(docker方式)
拉取镜像并启动
因为前面几篇博客都是安装各种docker镜像,所以安装过程我尽量简单,只记录几个重要点
拉镜像
docker pull nginx
跑起来(挂载文件及参数后面再加)
docker run -d --name nginx -p 80:80 nginx
如果80端口有用,也可以用其他端口
命令解释如下(还是加上吧,毕竟我是完美的):
| 命令 | 功能 |
|---|---|
| docker run | 创建并启动容器 |
| –name | 指定一个容器名称 |
| -d | 后台运行容器,并返回容器ID |
| -p | 指定端口 |
| nginx | 需要启动的镜像 |
| : | 符号左边为宿主机,右边为容器空间 |
| 测试效果 | |
| 查看启动情况:docker ps | |
| 访问:localhost:80 | |
| 看到下图这样的页面基本就搞定了~ | |
![]() |
创建文件挂载目录(老规矩了)
个人比较习惯将容器内重要文件挂载到宿主机方便查看修改
进入
cd /opt/
创建mysql挂载目录
sudo mkdir nginx_docker
进入创建的目录
cd nginx_docker/
创建挂载文件夹
sudo mkdir conf
sudo mkdir html
sudo mkdir logs
拷贝nginx文件到宿主机
docker cp nginx:/etc/nginx/nginx.conf ./
docker cp nginx:/etc/nginx/conf.d/default.conf ./conf/
然后ls一下查看拷贝是否成功
干掉nginx容器
干点它的目的是为了我们编辑配置文件后重新创建容器并启动,因为一开始是直接跑的没有配置参数这些东西~
好吧我其实只是想要它的配置文件,真渣~
docker stop nginx
docker rm nginx
重新创建并启动nginx容器
docker run -d --name nginx -m 512M --memory-swap=1024M --restart always -p 80:80 -v $PWD/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/var/log/nginx -v $PWD/html:/usr/share/nginx/html -v $PWD/conf:/etc/nginx/conf.d --privileged=true nginx
命令解释如下:
| 命令 | 功能 |
|---|---|
| docker run | 创建并启动容器 |
| –name | 指定一个容器名称 |
| -m | 指定容器内存大小 |
| –memory-swap | 指定虚拟内存大小 |
| -v | 将容器内部文件挂载到宿主机目录 |
| $PWD | 输出当前所在目录名称,等同于/opt/nginx_docker |
| -d | 后台运行容器,并返回容器ID |
| -p | 指定端口 |
| –privileged | 容器内部对挂载的目录拥有读写等特权 |
| –restart always | 随docker启动 |
| nginx | 需要启动的镜像(名称+版本) |
| : | 符号左边为宿主机,右边为容器空间 |
关于privileged:
使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器
写个页面
到了这一步,你就可以通过:localhost:80访问到一个403页面了,因为的/opt/nginx_docker/html目录下还没有html页面,自己随便写个丢进去看看效果吧:
sudo vim /opt/nginx_docker/html/index.html
输入:hello nginx
保存退出:wq
docker restart nginx
nginx安装参考地址,感谢大佬!
三.折腾natpp
准备工作
1.首先你得有个通道(natapp对内网穿透服务的称呼)
通道大概就是这样,可以使用免费的!但是带宽低,域名和端口随即,并且不支持绑定域名(还想要求啥呢 )!如果需要绑定自主域名配合nginx实现内网多个服务远程访问,9块钱买一个试试?


2.再次你需要有个备案域名(没备案可以用香港通道,哈哈 )
配置natapp及自主域名
第一步
购买通道后进入后台配置自主域名

第二步
进入我的隧道配置:域名,本ip以及端口!如果需要配置开机自启动请关闭web管理界面优化性能

第三步
进入阿里云域名管理解析域名,我这里使用泛域名解析

启动natapp实现内网穿透
下载客户端测试效果
首先你需要下载一个客户端,我这里是manjaro(linux)所以下载linux版本

我把natapp放在了/opt目录下

在Linux/Mac 下 需要先给执行权限
sudo chmod a+x natapp
然后再运行
./natapp -authtoken=xxxxx
xxxxx代表你的authtoken,在我的隧道查看

运行成功得到如下效果,现在可以直接通过你的自主域名访问到我们的80端口了,也就是前面写的hello nginx页面
后台启动
现在的效果如果关闭终端窗口就会断开连接
想要后台启动需要执行如下命令:
nohup ./natapp -authtoken=xxxx -log=stdout &
启动成功后可以通过如下命令查看:
ps -ef|grep natapp

开机自启
开机自启natapp有linux下的方案,不过需要在github下载文件,然后经过一系列复杂的配置!我觉得太麻烦 ,所以选择自己把后台启动的命令写入到系统配置文件~~
我使用的是i3wm桌面,直接在i3配置文件加入以下配置
sudo vim ~/.i3/config
加入一行:
exec --no-startup-id nohup /opt/natapp -authtoken=xxxx -log=stdout &
到这里natapp内网透传就完成了,可以通过域名直接访问本地80断开,也就是nginx
使用nginx监听转发泛域名到对应服务
首先编辑nginx配置文件
cd /opt/nginx_docker
sudo vim nginx.conf
我的配置如下
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
// 监听80端口的web二级域名到我们写的hello nginx页面
server {
listen 80;
server_name web.XXX.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
// 监听80端口的gitlab二级域名到我们部署的gitlab服务
server {
listen 80;
server_name gitlab.XXX.com;
client_max_body_size 1024M;
location / {
proxy_pass http://192.168.101.3:8888;
proxy_set_header Host $host:$server_port;
}
}
}
// 监听80端口的jenkins二级域名到我们部署的jenkins服务
server {
listen 80;
server_name jenkins.XXX.com;
client_max_body_size 1024M;
location / {
proxy_pass http://192.168.101.3:8080;
proxy_set_header Host $host:$server_port;
}
}
// 监听80端口的nacos二级域名到我们部署的nacos服务
server {
listen 80;
server_name nacos.XXX.com;
client_max_body_size 1024M;
location /{
proxy_pass http://192.168.101.3:8848;
proxy_set_header Host $host:$server_port;
}
}
}
如果要配置https的ssl证书:
容器启动需要映射443端口:
docker run -d --name nginx -m 512M --memory-swap=1024M --restart always -p 80:80 -p 443:443 -v $PWD/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/var/log/nginx -v $PWD/html:/usr/share/nginx/html -v $PWD/conf:/etc/nginx/conf.d --privileged=true nginx
nginx配置做如下修改:
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main ...;
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
# 全局 SSL 设置(可选)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name web.XXX.com gitlab.XXX.com jenkins.XXX.com nacos.XXX.com;
return 301 https://$host$request_uri;
}
# HTTPS 配置 - web 服务
server {
listen 443 ssl;
server_name web.XXX.com;
ssl_certificate /etc/nginx/ssl/xxx.com.crt; # 共用证书
ssl_certificate_key /etc/nginx/ssl/xxx.com.key; # 共用私钥
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
# HTTPS 配置 - gitlab
server {
listen 443 ssl;
server_name gitlab.XXX.com;
ssl_certificate /etc/nginx/ssl/xxx.com.crt;
ssl_certificate_key /etc/nginx/ssl/xxx.com.key;
client_max_body_size 1024M;
location / {
proxy_pass http://192.168.101.3:8888;
proxy_set_header Host $host:$server_port;
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;
}
}
# HTTPS 配置 - jenkins
server {
listen 443 ssl;
server_name jenkins.XXX.com;
ssl_certificate /etc/nginx/ssl/xxx.com.crt;
ssl_certificate_key /etc/nginx/ssl/xxx.com.key;
client_max_body_size 1024M;
location / {
proxy_pass http://192.168.101.3:8080;
proxy_set_header Host $host:$server_port;
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;
}
}
# HTTPS 配置 - nacos
server {
listen 443 ssl;
server_name nacos.XXX.com;
ssl_certificate /etc/nginx/ssl/xxx.com.crt;
ssl_certificate_key /etc/nginx/ssl/xxx.com.key;
client_max_body_size 1024M;
location / {
proxy_pass http://192.168.101.3:8848;
proxy_set_header Host $host:$server_port;
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;
}
}
}
注意
你的nginx默认配置文件中有一行:include /etc/nginx/conf.d/*.conf; 这是代表引入这个文件中的配置到nginx.conf主配置,include /etc/nginx/conf.d/*.conf;文件的宿主机映射地址在/opt/nginx_docker/conf.d目录下,我这里是注释掉这一行直接在主配置文件nginx.conf配置的,如果你有不同环境需求,不注释掉这一行,修改这个文件夹下的配置文件效果一样**
**修改配置文件后docker restart nginx 重启容器就可以通过域名访问你对应的服务了,如果你还有TPC访问需求(如SSH,mysql等)需要在natapp购买TCP通道(如果已经通过web通道绑定域名,那只需要配置好TPC访问通道启动后,可以直接通过xxx.xxx.com:端口的方式访问)
更多推荐




所有评论(0)