请注意:
下面并不是完美的解决方案, 更多的是对试验的记录, 而且最终得出的方案只适用于 Safari 浏览器, 并不适用于 Chrome
缘起
因为搞编程, 所以经常需要登录 StackOverflow 网站, 但是访问速度比较慢.
上网搜索解决方案, 大家提到速度慢的原因是 StackOverflow 使用 Google CDN 的 jQuery 文件, 而由于众所周知的原因, Google 的网站在国内是无法正常访问的, 所以网友给出的解决方法是将 Google CDN 的地址指向其它服务器, 甚至可以指向本地服务器!
查看 StackOverflow 的网络请求, 发现 jQuery 的请求和响应内容并没有问题(见文章开头的配图), 囧, 而且查看网络数据, 请求到返回 jQuery 文件总共只花费 12.45 毫秒, 看来 Google CDN 还蛮 OK.
但是觉得网友给出的方法很有意思, 所以决定尝试实现用本地服务器替代 Google CDN _;
之前觉得 jQuery 的请求和响应内容并没有问题是因为自己开着 VPN, 实际上清除缓存, 关闭 VPN 后, jQuery 的响应一直是 stalled!
思路
参考网友的方案, 我的初始方案是:
- 在本地服务器上配置 nginx 虚拟主机, 将域名指向 StackOverflow 请求的地址 --
ajax.googleapis.com/ajax
; - 将本地的
jquery.min.js
文件放在和 StackOverflow 请求(https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
)对应的虚拟主机路径中 --<localhost>/ajax/libs/jquery/1.12.4/jquery.min.js
, 而且将jquery.min.js
的内容修改为'Hello, Google;'
, 方便最后确认是否成功请求了本地 jquery 文件; - 修改本地的 host 文件, 将
ajax.googleapis.com/ajax
指向本地服务器 IP;
尝试
第 1 次尝试
配置 nginx 虚拟主机:
server {
listen 80;
server_name ajax.googleapis.com;
root /vagrant/app/google/;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
检测 nginx 配置, 并重启:
sudo nginx -t
sudo systemctl reload nginx # systemctl 命令适用于 CentOS 7.*
将内容为 'Hello, Google';
的 jquery.min.js
放在 <myLocalHost>/ajax/libs/jquery/1.12.4/
路径下.
配置本地 host 文件:
192.168.33.1 ajax.googleapis.com #192.168.33.1 是配置的本地服务器 IP
测试:
在浏览器访问 ajax.googleapis.com
. 看到了 nginx 的响应页面;
访问 ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
. 看到了 'Hello, Google'
, 确认请求成功;
但是, 删除缓存后, 打开 http://stackoverflow.com/
, 发现网络请求返回的仍然是正常的 jquery 文件, 而不是本地的 'Hello, Google'
!
检查请求地址, 注意到请求地址是 https:
Request URL:https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
考虑到刚才访问 ajax.googleapis.com
连接上了本地服务器, 想到本地服务器之前没有配置过 https, 那么可以初步假定是由于本地服务器没有配置 https 导致失败;
第 2 次尝试
参考文章 一个加速访问 StackOverflow 的方法 来配置 https:
生成自签名证书:
mkdir -p /usr/local/etc/nginx/ssl
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /usr/local/etc/nginx/ssl/nginx.key -out /usr/local/etc/nginx/ssl/nginx.crt
修改 nginx 虚拟主机配置:
server {
listen 80;
server_name ajax.googleapis.com;
root /vagrant/app/google/;
index index.php index.html;
listen 443 ssl;
ssl_certificate /usr/local/etc/nginx/ssl/nginx.crt;
ssl_certificate_key /usr/local/etc/nginx/ssl/nginx.key;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
访问 https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
, 报错:
![](https://img.haomeiwen.com/i4686061/896081586ed2be6f.jpg)
上网搜索解决方案, 未果;
尝试用 firefox 访问, 报错, 提醒 "自签名不被信任":
![](https://img.haomeiwen.com/i4686061/e3527209e533d3e1.jpg)
第 3 次尝试
上网搜索"自签名不被信任"的解决方案, 找到一篇 -- 解决Mac Chrome打开HTTPS证书错误问题, 按照其步骤在 Mac 的 "钥匙串访问" 设置我的自签名证书为 "总是信任".
再次访问 https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
, 仍然没有访问本地文件.
想起刚才搜索"自签名不被信任"的解决方案时, 有人提到 Firefox 使用的签名认证不是基于操作系统而是基于 Firefox 浏览器自身的认证系统.
如果 Chrome 和 Firefox 都没有使用 Mac 的认证系统, 那么我在 Mac "钥匙串访问"上允许我的自签名证书的确无法通过浏览器的认证.
那么是否可以尝试一下 Mac 系统自带的 Safari 浏览器? 估计 Safari 会使用操作系统自带的认证流程.
第 4 次尝试
用 Safari 访问 https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
, 返回 'Hello, Google'
.
访问 http://stackoverflow.com
, 查看网络请求, 也返回 'Hello, Google'
:
![](https://img.haomeiwen.com/i4686061/2282e246e58b9dd6.jpg)
Bingo!!!
之后, 搜索如何让 Chrome 通过自签名证书, 没有找到方案, 看来 Chrome 的确更加安全. 囧
结束
回顾自己的尝试, 大体完成了"用本地服务器替换 Google CDN" 的试验, 收队.
参考文章
文章历史
- 2017/03/06 (第一次发布);
- 2017/04/30 头部增加"声明", 避免大家误以为这篇博客有完美的解决方案. 删除语气有些轻佻的结束语; 更新"缘起";
如果你觉得我的文章对你有用, 请打个"喜欢", 或者给些改进的建议 _
网友评论