使用模拟器调试移动端

使用 weinre 等代理服务器

1.安装需要 Node.js 平台, 先安装好后, 打开 Node.js command prompt, 通过 NPM 来安装 weinre

npm -g install weinre

2.命令启动 weinre

weinre -httpPort 8081 -boundHost -all-

3.脚本附着对象页面

<script src="http://ipsource:8081/target/target-script-min.js#anonymous"></script>

4.点击 weinre Access Points 即可开箱调试

使用 chrome://inspect/#devices 调试

安卓手机(部分华为手机除外)可以通过 USB 连接电脑,开启调试功能,在浏览器中输入 chrome://inspect/#devices 进行调试;

苹果手机则需要调用 macos 的 safari 浏览器进行调试。

使用 vide 调试

待补充。

如何拯救被墙服务器

前提

首先你要确定你的服务器是否被墙了,先排除客观上的问题,诸如欠费、流量用尽、被恶意攻击、被当地运营商挂起等服务器处于异常状态,应先自行或联系客服解决。

然后再逐一排除问题:
1.管理后台显示 vps 运行正常,ssh 登录服务器也正常,但国内无法 ping 通,境外可以,一般该 IP 是被黑名单,测试方法可以参考载入IPIP进行甄别。

2.可以 ping 通,也可以 telnet 过去,但 ssh 无法正常登录,抓包或日志显示应答超时,这个时候一般是 TCP 阻断。

3.域名解析到该 IP 后网站加载一直在打转无法加载,一般是 IP 段已经被 DNS 污染。

4.连接不稳定,经常断线,连接服务器时候经常莫名被断线,敲击命令时候延迟非常大,极小概率为 TCP 干扰。

5.服务器 22/80/443 等常用端口一切正常,可是部分端口被关闭,排除运营商通知,一般是端口被墙。

补救

无论遇到哪种被墙的方式,都证明这台服务器不太安全了,你需要从根本上解决问题就是更换服务器,不过可以采取如下补救措施抢救一下:

1.向当地 idc 提出更换 IP,诸如 vultr 和 azure 都可以随时切换 ip 的。

2.使用跳板机,国内服务器转发。阿里云等厂商的服务器,或不过墙的 IPLC 服务器,大概率与被墙 vps 能直接通信,做个转发便即可正常使用,代价是多买一个国内服务器。顺道说一下,如果国外线路不好,用转发方式也能大幅提升网速,降低被墙概率,具体操作请移步附录。

3.使用 CDN 服务,CDN 的公共 ip 基本不会被封,将域名解析到 CDN,流量经过 CDN 再到被墙服务器,代价是需要一个域名并配置 CDN 服务。

4.换端口。针对端口被墙情形,更换新端口和加密方式,或者使用更高级的重建梯子方法,诸如 trojan/v2+1ray 等。

以上方法不能完全根除被墙的风险,俗称治标不治本,就敏感时期,应该低调、少上外网,需要从根本上解决问题还是更换服务器为妥。

附录

跳板机教程:

既然要通过国内服务器转发流量,首先必须要一台国内服务器。国内服务器的选择有很多,建议使用 NAT VPS,年付几十到一两百,NAT VPS 中转请参考:使用 NAT VPS 中转加速。也可以用阿里云、腾讯云这些大厂商的服务器,质量和服务都比较有保障。由于服务器仅做流量转发用,买最低配置的就可以,1 核 256m 内存足够,看视频的话带宽买大点,也可以选择流量计费模式(不适合视频党)。

本文以 CentOS 7/8 系统为例介绍国内服务器中转配置,分别介绍 firewalld 流量转发和 nginx 流量转发两种方式。

使用 Nginx 流量转发

1.安装 Nginx

2.配置 nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

# 转发配置开始
stream {
server {
listen 端口号; # 1-65535的任意一个数字,无需与境外服务器的端口号相同
proxy_pass 境外ip:境外端口号; # 用境外ip和端口号替换
}
}
# 转发配置结束

http {
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;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
....
}

3.检查错误

nginx -t

如显示

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

则配置正常,如果有问题,请按照提示更改,这里提两个常见问题。

1.查看防火墙有没有放行 nginx 监听的端口firewall-cmd --state输出 running 表示防火墙正在运行,如果显示没有此命令则为防火墙未安装。可以使用以下命令将端口放行。

1
2
firewall-cmd --permanent --add-port=nginx中配置的端口号/tcp
fireawll-cmd --reload

如果服务器厂商上层还有安全组/防火墙,诸如阿里云/腾讯云等购买的 vps,请记得也要到控制台放行相应端口。

Nginx 效率不如 firewalld/iptables,但是配置更灵活,使用上更便利。

使用防火墙(内核)方式流量转发

1.确认是否安装防火墙,检测与安装如下

1
2
3
4
5
firewall-cmd --state

yum install -y firewalld
systemctl enable firewalld
systemctl start firewalld

2.配置转发

1
2
3
4
5
6
7
8
9
10
11
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
firewall-cmd --permanent --add-masquerade
# 9090可以改成其他端口
firewall-cmd --permanent --add-port=9090/tcp
# 一般TCP即可以下也是
firewall-cmd --permanent --add-port=9090/udp
# 9090和上面保持一致,国外ip改成你国外vps的ip,443改成国外服务器端口
firewall-cmd --permanent --add-forward-port=port=9090:proto=tcp:toaddr=国外ip:toport=443
firewall-cmd --permanent --add-forward-port=port=9090:proto=udp:toaddr=国外ip:toport=443
firewall-cmd --reload

以上就配置结束了。

如果中转 trojan 流量,需要在客户端配置文件中的两个 verify 选项设置为 false

springfox-swagger-ui Nginx 404问题

前言

本文解决 springfox-swagger-ui 在二级目录下的使用问题。如同一个域名的 /user 和 /post 用 Nginx 分别反向代理指向不同的应用,我们希望在每个应用中都可以正常使用 Swagger。

下面,我们假设要配置 /user 指向 user 应用。

很多人爱折腾,会打起修改源码的主意,希望本文能帮你节省点时间。

注意:本文使用的 springfox-swagger2 版本是 2.9.2

解决方法 - 1

修改全局 context path

Spring Boot 环境中只要配置以下环境变量即可:

server.contextPath=/user

那么你的所有的接口,默认就都是在 /user 下面了,自然 swagger-ui 也就能正常使用了,访问 /user/swagger-ui.html 即可。

这是最最简单的方法,不过在有些特定的环境中会有问题,比如我司:

由于设置了 contextPath,那么健康检测接口 /health 也会被自动换为 /user/health,而我们的发布系统一根筋地要找 /health 接口,也就导致我们的应用会发布不了。

只有在碰到这种方法解决不了的时候,我们才要考虑使用下面介绍的方法。

解决方法 - 2

使用 Controller 做 forward

首先,将 /user/swagger-ui.html forward 到 /swagger-ui.html。

1
2
3
4
@GetMapping("/swagger-ui.html")
public String index() {
return "forward:/swagger-ui.html";
}

剩下的其实很简单,大家打开 your-domain/user/swagger-ui.html 页面,发现可以看到 swagger-ui 页面,但是接口列表没出来。

然后打开浏览器控制台,就会发现,它有很多发向 /user/webjars/… 和 /user/swagger… 的请求都是 404,我们只要一一把这些请求搞定就 OK 了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@Controller
// 看这里
@RequestMapping("user")
public class SwaggerController extends BaseController {

@GetMapping("/swagger-ui.html")
public String index() {
return "forward:/swagger-ui.html";
}

@GetMapping("/webjars/springfox-swagger-ui/css/{s:.+}")
public String css(@PathVariable String s) {
return "forward:/webjars/springfox-swagger-ui/css/" + s;
}

@GetMapping("/webjars/springfox-swagger-ui/{s:.+}")
public String baseJs(@PathVariable String s) {
return "forward:/webjars/springfox-swagger-ui/" + s;
}

@GetMapping("/webjars/springfox-swagger-ui/lib/{s:.+}")
public String js(@PathVariable String s) {
return "forward:/webjars/springfox-swagger-ui/lib/" + s;
}

@GetMapping("/webjars/springfox-swagger-ui/images/{s:.+}")
public String images(@PathVariable String s) {
return "forward:/webjars/springfox-swagger-ui/images/" + s;
}

@GetMapping("/swagger-resources/configuration/ui")
public String ui() {
return "forward:/swagger-resources/configuration/ui";
}

@GetMapping("/swagger-resources")
public String resources() {
return "forward:/swagger-resources";
}

@GetMapping("/v2/api-docs")
public String docs() {
return "forward:/v2/api-docs";
}

@GetMapping("/swagger-resources/configuration/security")
public String security() {
return "forward:/swagger-resources/configuration/security";
}
}

解决方法 - 3

使用 ViewControllerRegistry

参考百度其他人的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/user/**").addResourceLocations("classpath:/META-INF/resources/");
}

@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/user/v2/api-docs", "/v2/api-docs").setKeepQueryParams(true);
registry.addRedirectViewController("/user/swagger-resources/configuration/ui","/swagger-resources/configuration/ui");
registry.addRedirectViewController("/user/swagger-resources/configuration/security","/swagger-resources/configuration/security");
registry.addRedirectViewController("/user/swagger-resources", "/swagger-resources");
}
}

这种写法,访问静态资源的时候是完全没有问题的,但是 swagger-ui.html 页面在使用 ajax 调用接口的时候,这种配置做的是跳转,如 “/user/v2/api-docs” 自动跳转到 “/v2/api-docs” 其实是不满足我们需求的,因为 /v2/api-docs 这个路径根本就不会跳到我们的 user 应用。

解决方法 - 4

NGINX 端处理

将项目打成 war,项目名不用 ROOT,用二级路径名也是可行的,注意 nginx 端 conf 配置不要 expires 以下静态资源  location ~* .(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ { … }