SSH隧道+Nginx:内网资源访问的绿色通道
问题背景
模拟生产环境,使用两层Nginx做反向代理,请求公网IP来访问内网服务器的网站。通过ssh隧道+反向代理来实现,重点分析一下nginx反代的基础配置。
实验环境
1、启动内网服务器的tomcat服务
使用docker,将tomcat容器的8080端口映射到物理机的8010端口,并测试访问。
2、在内网服务器上配置反向代理端口
使用ssh隧道,建立内网服务器8000端口与公网服务器8001端口之间的连接。这个端口只能用于公网服务器内部到内网服务器的访问,如果任意网络请求tomcat网页访问还需要再配置nginx的反代。
ssh -fCNR 8001:localhost:8000 \
-o ServerAliveInterval=60 \
[公网用户]@p[公网ip] -p 22
3、公网服务器的nginx反代配置
用户通过域名或IP访问时,将默认80端口的请求转发到本地8001端口,即内网服务器的8000端口。
server {
listen 80;
server_name www.testtomcat.com;
location / {
proxy_pass http://127.0.0.1:8001;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
4、内网服务器的nginx反代配置
监听8000端口,将请求转发到tomcat容器的8010端口,实现外网访问内网服务器资源。
server {
listen 8000;
server_name 127.0.0.1;
location / {
proxy_pass http://127.0.0.1:8010;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
反代配置的部分指令
1、upstream
定义一组上游服务器集群,便于proxy_pass使用,一般用在负载均衡中。
2、proxy_pass
设置代理服务器的协议和地址。协议可以指定 “http “或 “https”。地址可以指定为域名或IP地址,也可以配置为 upstream 定义的上游服务器。
3、proxy_set_header
在传递给上游服务器的请求头中,可以使用该指令重新定义或添加字段。
Host:使传递给上游服务器的 Host 字段,包含用户访问反代时使用的域名;
X-Real-IP:保留客户端IP;
X-Forwarded-For:多层反代时,保留客户端真实的IP地址信息。
4、proxy_cache
缓存上游服务器的请求,减轻压力。
5、proxy_ssl_session_reuse
配置是否使用基于SSL安全协议的会话连接,默认开启。
nginx配置更新流程
图源/流程:mazhen.tech
更新配置时,向master 进程发送信号并做处理:
1)检查配置文件语法;
2)master加载配置,启动一组新的worker进程。新的 worker 进程马上开始接收新连接和处理网络请求。子进程可以共享使用父进程已经打开的端口;
3)master向旧的worker发送信号,让旧的worker优雅退出;
4)旧的 worker 进程停止接收新连接,完成现有连接的处理后结束进程。