Nginx正向代理实现局域网电脑访问外网的过程详解

 更新时间:2024年03月13日 09:01:41   作者:lucky_fd  
在工作中我遇到了一个类似的情况:在公司网络中,由于管理要求,局域网内的电脑不能直接访问外网,但是,工作上领导吩咐需要让局域网内的电脑能够访问外网上的某个网站,这时候就需要用到正向代理,本文将介绍如何配置 Nginx 实现这一功能,需要的朋友可以参考下

引言

在网络环境中,有时候我们需要让局域网内的电脑访问外网,但是由于网络策略或其他原因,直接访问外网是不可行的。这时候,可以借助 Nginx 来搭建一个正向代理服务器,实现局域网内电脑通过 Nginx 转发访问外网的需求。

在工作中我遇到了一个类似的情况:在公司网络中,由于管理要求,局域网内的电脑不能直接访问外网。但是,工作上领导吩咐需要让局域网内的电脑能够访问外网上的某个网站,这时候就需要用到正向代理。本文将介绍如何配置 Nginx 实现这一功能。

准备工作

首先,我们需要一台可以访问外网的服务器,例如一台服务器、电脑或者虚拟机。确保该服务器已经安装了 Nginx,并且网络配置正确。

我这里是有一台服务器是可以正常访问外网的(IP:192.168.0.10),同时局域网内的其他电脑也可以访问这台服务器。

修改nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
	# 正向代理配置内容
	server {
		 listen 9000;	# 监听端口
		 server_name localhost;
		set $url "proxy_server_doman_or_ip";	# 设置代理的域名或IP变量,这里替换成自己需要代理的网站
		 location / {
		     proxy_pass http://$url:8082;	# 将请求转发到由 $url 变量表示的地址。
		 }
	}
}

重启nginx,打开局域网电脑测试访问:192.168.0.10:9000,网页跳转成功。不就是请求转发嘛,so easy!

问题解决?如果这么简单我就不写这篇文章了😄

果然第二天就出问题了,有同事反馈网站进不去了。我想不可能吧,一测试果然不行。果断查阅了一下资料,找到问题原因:nginx在进行域名转发时会先把域名解析成IP保存在内存中,后面的访问都是通过IP直接访问,如果目标网站的 IP 地址发生变化,我们的代理就会失效。

找到原因就好办了,添加域名解析功能嘛

域名解析

为了解决 IP 地址变化的问题,我们可以使用域名解析来动态获取目标网站的 IP 地址。直接奉上完整配置,修改 Nginx 配置如下:

# 设置Nginx启动一个工作进程,这是Nginx的一个核心设置,它决定了Nginx会使用多少个工作进程来处理客户端请求。
worker_processes  1;		
# 配置定义了Nginx如何处理事件,例如连接请求,数据传输等
events {
    worker_connections  1024;		# 定义了每个工作进程允许的最大并发连接数。
}
# HTTP模块的配置块,包含了HTTP服务器的一般配置
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
	# 正向代理配置内容
	server {
		 listen 9000;	# 监听端口
		 server_name localhost;
		# 设置DNS解析器的地址为8.8.8.8,并且设置了解析器的缓存时间为300秒(这样每隔300s就会重新解析一次)。ipv6=off 是关闭IPv6的解析支持。
		resolver 8.8.8.8 valid=300 ipv6=off; 
		resolver_timeout 3s;	# 设置解析DNS的超时时间为3秒
		proxy_read_timeout 60s;
		proxy_send_timeout 60s;
		proxy_connect_timeout 60s;
		set $url "proxy_server_doman_or_ip";	# 设置代理的域名或IP变量,这里替换成自己需要代理的网站
		 location / {
			proxy_pass http://$url:9000;	# 将请求转发到由 $url 变量表示的地址。9000是目标网站的端口。
			proxy_buffers 256 4K;		# 设置用于缓存后端响应的缓冲区大小为256个,每个大小为4K。
			proxy_max_temp_file_size 0;		# 设置Nginx暂存响应数据的最大临时文件大小为0,即不使用临时文件。
			proxy_cache_valid 200 302 1m; 	# 针对状态码为200和302的响应,设置缓存有效期为1分钟。
			proxy_cache_valid 301 1h;		# 针对状态码为301的响应,设置缓存有效期为1小时。
			proxy_cache_valid any 1m;	# 对于其他任何响应状态码,设置缓存有效期为1分钟。
		 }
	}
}

重启nginx,问题解决。到这里,正向代理功能就实现了。如果只想实现正向代理功能看到这里就可以了。后面是我在遇到问题时的一些调试经验技巧!

转发代理调试

我在实现代理后,发现正向代理响应的速度非常慢有时候需要一分钟才能响应结果。但有时候又很快。就好奇为啥会这样,为了方便调试和监控,我设置添加了Nginx 的访问日志。

修改 Nginx 配置如下:

# 设置日志记录格式
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"' 'upstreamIP: $upstream_addr' 'upgrade: $http_upgrade';
# 正向代理配置内容
	server {
		 listen 9000;	# 监听端口
		 server_name localhost;
		# 设置DNS解析器的地址为8.8.8.8,并且设置了解析器的缓存时间为300秒(这样每隔300s就会重新解析一次)。ipv6=off 是关闭IPv6的解析支持。
		resolver 8.8.8.8 valid=300 ipv6=off; 
		resolver_timeout 3s;	# 设置解析DNS的超时时间为3秒
		proxy_read_timeout 60s;
		proxy_send_timeout 60s;
		proxy_connect_timeout 60s;
		set $url "proxy_server_doman_or_ip";	# 设置代理的域名或IP变量,这里替换成自己需要代理的网站
		 location / {
			proxy_pass http://$url:9000;	# 将请求转发到由 $url 变量表示的地址。9000是目标网站的端口。
			proxy_buffers 256 4K;		
			proxy_max_temp_file_size 0;		
			proxy_cache_valid 200 302 1m; 
			proxy_cache_valid 301 1h;		
			proxy_cache_valid any 1m;	
			access_log logs/proxy/access.log main;		# 定义了访问日志的路径和格式。
		    error_log logs/proxy/error.log;		# 定义了错误日志的路径
		 }
	}

这样,Nginx 将会在nginx项目下的 logs/proxy/access.log 文件中记录所有代理转发日志。

日志信息:

192.168.0.28 - - [27/Feb/2024:17:02:03 +0800] "GET /prod-api/system/todo/listAll?pageNum=1&pageSize=10&active=true HTTP/1.1" 200 64 "http://192.168.20.2:8082/user-task/todo" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0" "-"upstreamIP: 182.148.159.30:8082
192.168.0.28 - - [27/Feb/2024:17:02:03 +0800] "GET /prod-api/process/business/listAll?pageNum=1&pageSize=10&active=true HTTP/1.1" 200 979 "http://192.168.20.2:8082/user-task/todo" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0" "-"upstreamIP: 182.148.159.30:8082
192.168.0.28 - - [27/Feb/2024:17:02:06 +0800] "GET /prod-api/system/user/select HTTP/1.1" 499 0 "http://192.168.20.2:8082/login?redirect=%2Findex" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0" "-"upstreamIP: 172.16.30.6:8082

通过日志信息可以看到,请求转发后的upstreamIP有两个不同的IP:182.148.159.30和172.16.30.6,说明请求被转发到了两个不同的IP,当请求IP为182.148.159.30时,响应正常;当请求IP为172.16.30.6时,响应失败导致等待。

发现这个情况后,我也是很疑惑为啥会将域名解析出两个IP,第一反应是域名解析错误,为了验证我将DNS解析的服务器换成了离我最近的四川电信服务器:61.139.2.69,测试发现结果也是一样的。虽然感觉解析是没有问题的,保险起见我还是自己在网上通过解析网站测试了一下域名解析的结果:结果显示域名确实绑定了两个IP,一个是正常的一个是不行的。

然后我就联系我们这个域名对应网站的负责人,得出的结果就是他们确实绑定了两个IP,有一个IP是绑定的内网IP,所以才导致外网请求时失效。

失败的原因:nginx获取解析后的IP是通过轮询往IP转发请求,如果轮询到内网IP就会导致请求失败。

解决办法:

  • 手动选择IP地址:在Nginx配置中,你可以手动指定代理的目标IP地址,而不是使用解析出的IP地址。这样可以避免将请求发送到内网IP。

  • 使用域名解析出的IP地址进行请求:你可以通过解析域名获取到的IP地址列表,然后使用一些方法(比如按照某种规则选择IP地址)来保证请求不会发送到内网IP地址。

  • 使用nginx的upstream模块进行负载均衡:通过upstream模块,你可以指定多个代理服务器,然后使用一定的负载均衡策略,比如轮询、权重等,来分配请求到不同的服务器。在这里,你可以手动配置upstream模块,指定外网IP,而不包括内网IP。

  • 修改DNS设置:联系网站负责人,修改域名解析,只将外网IP绑定到域名上,而不包括内网IP。

你们猜我最后咋解决的???

必须是第四条啊!!!

到此这篇关于利用Nginx正向代理实现局域网电脑访问外网的文章就介绍到这了,更多相关Nginx局域网电脑访问外网内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nginx禁止访问php文件的方法总结

    Nginx禁止访问php文件的方法总结

    当涉及到禁止访问 PHP 文件时,有多种方法可以考虑,以下是十多种方法的详细说明,以及如何在 Nginx 中应用它们,需要的朋友可以参考下
    2023-09-09
  • Nginx Mirror模块的具体使用

    Nginx Mirror模块的具体使用

    本文主要介绍了Nginx Mirror模块的具体使用,Nginx mirror 模块主要用于镜像客户请求到一组后端服务器,下面就来具体介绍一下,感兴趣的可以了解一下
    2024-05-05
  • 详解Nginx配置文件

    详解Nginx配置文件

    Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的,Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。这篇文章主要介绍了Nginx配置文件,需要的朋友参考下
    2017-01-01
  • 详解Nginx服务器的配置中开启文件Gzip压缩的方法

    详解Nginx服务器的配置中开启文件Gzip压缩的方法

    这篇文章主要介绍了Nginx服务器的配置中开启文件Gzip压缩的方法,可以对CSS和JavaScript以及各种图片等web传输的文件进行压缩,需要的朋友可以参考下
    2016-01-01
  • 使用Nginx做静态文件服务器,如何进行权限验证

    使用Nginx做静态文件服务器,如何进行权限验证

    这篇文章主要介绍了使用Nginx做静态文件服务器,如何进行权限验证问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 使用nginx方式实现http转换为https的示例代码

    使用nginx方式实现http转换为https的示例代码

    这篇文章主要介绍了使用nginx方式实现http转换为https的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 简介使用Nginx Plus的在线活动监控功能的方法

    简介使用Nginx Plus的在线活动监控功能的方法

    这篇文章主要介绍了简介使用Nginx Plus的在线活动监控功能的方法,注意其目前暂时为收费项目,需要的朋友可以参考下
    2015-06-06
  • 使用Nginx代理MySQL连接并限制可访问IP配置

    使用Nginx代理MySQL连接并限制可访问IP配置

    这篇文章主要为大家介绍了如何使用Nginx代理MySQL连接并限制可访问IP配置示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 基于nginx的静态网页部署的实现

    基于nginx的静态网页部署的实现

    这篇文章主要介绍了基于nginx的静态网页部署的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 详解Nginx 13: Permission denied 解决方案

    详解Nginx 13: Permission denied 解决方案

    这篇文章主要介绍了详解Nginx 13: Permission denied 解决方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07

最新评论