记一次内网环境正向代理极光推送

  • 时间:
  • 来源:互联网

背景

公司正式服务器都是局域网环境,通过一台有外网的服务器作跳板机,使用nginx反向代理来访问服务。
这样一来,局域网内的服务就无法访问外网,导致下图报错。报错截图

解决问题

当时从csdn上找到了解决方案,由于第一次写博客,就照原文搬了很多。 关于内网使用Nginx正向代理发送极光推送
附上官方的说明:关于网络限制的相关说明

如果你的服务器要调用 JPush REST API,那么使用 V3 接口要开通端口 443 端口(https 服务默认走 443 端口)、使用 V2 接口(HTTP)(该接口已不维护,不建议使用)要开通 80 端口。

API 是有很多服务器的,IP 是域名动态分配的,所以每次调用的 IP 地址不同,所有 API 都只支持 https 访问,也就是说只支持以域名方式访问。

我们有几个 IP 基本固定,可以考虑对这几个 IP 开通 防火墙白名单或者 host 绑定 :
113.31.138.48
113.31.138.47
183.232.57.12
除此之外,自行 ping 解析到的 IP 地址也可以加上。
注:IP 会尽可能保持不变,但,IP 不保证不变,IP 也不保证一定固定;如果 host 绑定了 IP,如果 IP 变更或者增加,非极光 VIP 合作客户,我们不会另行知会,请知悉。

遇到超时、无法访问极光服务器时,排查问题,可以采用以下方法,并提供你的错误 log 、你请求推送的服务端 IP 地址与下述操作结果给官方人员:
域名为你请求有异常的极光的域名,推送的域名是 api.jpush.cn;文档说明点我

直接 curl 推送的结果
nsloookup 域名
ping 域名
mtr 域名
tracepath 或者 traceroute 域名
telnet 域名 端口

从以上两篇文档得知,极光都是通过域名 https://api.jpush.cn/v3/push 将消息发送出去,因此在这里可以使用 nginx 正向代理,使内网服务(极光)访问外网数据。
这里就要解决两个问题:

  1. 在极光的服务上,将proxy 配置为请求能访问外网的服务器IP
  2. 配置nginx,使用正向代理,将指定规则的路径转发到极光

配置极光

假设能访问外网的服务器(即正向代理 nginx服务器)ip 为1.1.1.1
使用 HttpProxy 代理,并初始化JPushClient,

		HttpProxy httpProxy = new HttpProxy("1.1.1.1", 443);
        ClientConfig clientConfig = ClientConfig.getInstance();
        clientConfig.setPushHostName("http://1.1.1.1");
        jPushClient = new JPushClient(secret, appkey, httpProxy, clientConfig);

配置nginx.conf

server {
	#极光默认端口,需要开放
        listen       443;
        		
		underscores_in_headers on;
		proxy_redirect off;
	#	proxy_set_header Host $http_host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		
        location /v3 {
            proxy_pass https://api.jpush.cn;
	    }
    }

当时配置的时候从网上复制了一堆配置,给自己挖了一个坑,因为 proxy_set_header Host $http_host; 这段代码,导致极光请求时,总是返回403,当然这也要写一篇文章记一下。

本文链接http://element-ui.cn/news/show-58241.aspx