0


配置nginx转发内网请求到外网


#在做这一项工作的时候踩了很多坑,也请教了很多大佬,心情很复杂,记录一下#

一、要干什么事情

因工作需要对接,需要在内网获取外网的接口的数据。但是因为网络管理的需要,内网不能直接暴露到公网环境中,因此采取的方案是:

step1:内网的服务器N上发起了一个请求

step2:请求的地址是服务器Z的内网地址(服务器是一个中转服务器,能连接内网和外网)

step3:服务器Z将请求通过nginx转发到外网

step4:请求外网服务器W上的接口

step5:接口请求成功,获取json数据

二、怎么干

干这个事情,有三方面的人。

一方面:以我为首的,需要调用接口取数,下文简称为“我方”。

二方面:是提供网络安全服务以及中间服务器,下文简称为“中间方”。

三方面:是提供接口服务的厂商,下文简称为“对方”。

任务拆解:

我方:通过xxljob写好定时任务,根据对方提供的接口文档的信息,编写请求接口。

中间方:安装好nginx,并打通和两方的网络环境,对我方开放端口。

对方:暴露接口,供我方调用,并将中间放的服务器ip设置到白名单中。

三、开始干

3.1安装nginx

因为中间方比较懒,nginx是我方请运维同事上去安装的。

nginx能够正常使用,然后就开始修改配置文件,准备重启nginx测试一把了,nginx.conf的配置如下

server {
        listen       80;
        server_name  _;
       

        access_log  logs/www_access.log  main;
        error_log   logs/error.log error;

        location /api {
            root   html;
            index  index.html index.htm;

            location /api {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_pass http://对方的ip地址;
            }
        }

3.2更新nginx配置,设置https请求

nginx很顺利的重启了,但是请求接口是出现了报错,经过排查,发现nginx.conf配置的有问题,对方的接口是在外网,应该用https请求,于是更新了一下nginx.conf的配置

server {
        listen       80;
        server_name  _;

      
        access_log  logs/www_access.log  main;
        error_log   logs/error.log debug;

        location / {
            root   html;
            index  index.html index.htm;

            location /api {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_pass https://完整域名/api;
                proxy_ssl_server_name on;
            }
        }
}

重启nginx报错

报错的信息简单来说就是我安装的nginx没有ssl功能,经过一顿百度得到了答案:

然后发现nginx根本不是通过软件包安装的方式装上来的,是运维同事从其他项目上把安装后的文件夹打包过来的。(给这位头脑灵活的同事点个赞👍🏻)

于是我将现有的nginx备份了一下,开始准备重新安装nginx

3.3重装nginx

安装nginx参照的博客是https://www.cnblogs.com/happyyangyanghappy/p/10860747.html

因为版本的问题,有一部分的包无法正常下载了,因此我将博客中的操作步骤进行了简化以代码包的升级,操作步骤见下图:

安装的过程中很顺利,但是在安装nginx的时候频繁的报错误,安装失败,于是将nginx的版本升级到1.20.0后解决了nginx安装的问题。

ok,现在开始解决nginx不支持ssl的问题,在nginx的解压后的目录下执行下面指令:

./configure --with-http_ssl_module

然后又报错了,报错信息如下:

./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.

然后我就直接升级了openssl的版本,然后重试,终于装好了。

3.4后续的问题

nginx配置了代理https也能够正常的启动了。

然后再次重试发起请求,从access_log logs/www_access.log请求日志中可以看到,nginx相应了内网的请求,但是返回值都是403。

现在还无法判断是内网到nginx出现了问题,还是nginx到外网出现了问题。

于是两路走:

1.nginx上再配置另一个内网的接口,然后发起请求,此时发现请求日志中返回值是200,成功,发起请求的内网服务器的日志中也得到了相应的信息。

2.在nginx的服务器上,直接模拟接口请求,请求外网,结果:403

结论:nginx到外网出现了问题,经过和对方的排查,发现对方没有将nginx的服务器设置到白名单中。

3.5最终结果

在配置白名单后,就能够正常请求到接口的数据了。

四、学到的东西

4.1 nginx怎么开启日志

中间的地址给的是相对路径,也可以设置成绝对路径。

main是nginx配置文件中最上方配置的规则,需要打开注释

error_log后面的error是日志的级别

日志级别:可以指定日志记录的级别,如

debug

info

notice

warn

error

crit

alert

emerg

等,控制不同严重程度的错误信息是否记录到该日志中。

4.2 怎样模拟接口请求

通过咨询ai助手得到了该信息,验证了nginx到外网的通道是否正确。

4.3代码格式

这篇博客中代码都变成一行了,使用markdown语法写博客可以完整展示,于是我又发了一篇一样的,但是代码格式是完整的。

配置nginx转发内网请求到外网-CSDN博客

标签: nginx 服务器 运维

本文转载自: https://blog.csdn.net/qq_35570434/article/details/139148437
版权归原作者 寂寞不谈 所有, 如有侵权,请联系我们删除。

“配置nginx转发内网请求到外网”的评论:

还没有评论