背景
由于谷歌宣称「因为使用率低」的原因退出中国市场,导致我们 CEM 相关的翻译服务无法进行翻译。可参考 TechCrunch 原文:
- 谷歌似乎在中国部分地区禁用了谷歌翻译(可能需要科学上网)
解决方案
解决方案其实比较简单,虽然谷歌对国内进行了屏蔽,但是对于其他地域依然提供在线以及 API 形式的翻译服务,比如中国香港、中国澳门、中国台湾以及其他国家等,那么我们其实可以利用云服务器厂商提供的其他地域服务器节点(比如香港节点)来对谷歌翻译 API 服务进行转发,因为香港等云服务器节点是可以对谷歌翻译服务进行访问的。
其实,不仅仅是翻译,无论是个人还是企业,如果需要用到一些大陆已经屏蔽的国外服务,其实都可以通过云服务器代理的方式来简介实现国外服务的访问,前提是你的业务要合法合规。
如上图所示,是一个反向代理的基本架构:
- 我们要有一个可以访问谷歌服务的云服务器
- 在云服务器中使用 Nginx 配置反向代理,使得针对翻译的请求服务都通过 Nginx 转发到对应的「translate.googleapis.com」上去。
关于 Nginx
不推荐 yum 安装 Nginx,所以以下说明都是关于手动编译安装 Nginx 时的相关说明,编译安装 Nginx 比较简单,关闭 selinux,然后 yum 安装好 gcc-c++、pcre-devel、zlib-devel、openssl-devel 依赖。
接下来总共分为三步:
- wget https://nginx.org/download/nginx-x.xx.x.tar.gz
- tar -zxvf ./nginx-x.xx.x.tar.gz
- /configure
- make
- make install
这样默认编译安装下来,会安装在「/usr/local/nginx」目录当中。
Nginx 在安装时配置 https
https 是 Nginx 直接支持的模块,所以如果要是编译安装的时候需要配置 https,直接在『./configure』后面配置「–with-http_ssl_module」即「./configure –with-http_ssl_module」即可。
Nginx 在已经安装后配置 https
如果你已经安装了 Nginx,但是当时并没有配置 https,那也可以进行重新编译,编译的时候记得要执行「./configure –with-http_ssl_module」,但是不需要重新安装,即按照上述步骤直接执行到「make」命令即可,make 命令执行完毕之后,在当前目录会出现『objs』目录,进入到 objs 目录将 nginx 文件覆盖原有的「/usr/local/nginx/sbin」里面原有的 nginx 文件重启 Ngixn 即可。
Nginx 的反向代理配置
Nginx 中的「proxy_pass」代表代理转发,如下面配置的谷歌翻译转发服务:
1 2 3 4 5 |
server { location /translate_a/single { proxy_pass https://translate.googleapis.com; } } |
如上,当我们的服务请求当前服务器(或者域名)的「/translate_a/single」uri 的时候,Nginx 会通过代理转发到『translate.googleapis.com』,这里面只会是域名会被替换,域名后面的 URI 均不会改变,通过这样的方式,因为当前这台服务器是可以请求谷歌翻译服务的,当前的服务器又可以直接提供访问服务,从而间接的我们就实现了谷歌翻译的正常使用。
Nginx 的跨域配置
之前谈到了 Nginx 配置 https,为什么要配置 https 呢?这里除了安全的原因,还有一个就是为了解决 https 不能访问 http 的原因。比如你业务的域名是 https://business.glorze.com,但是如果你不配置 Nginx https,你配置的翻译服务域名可能是 ip 或者是 http://translate.glorze.com,在这种情况下,如果业务中存在翻译请求,那么 https://business.glorze.com 请求 http://translate.glorze.com 是无法请求的,甚至 Chrome 浏览器会强制把「http://translate.glorze.com」变成『https://translate.glorze.com』来进行请求。
浏览器强制使用 https 的行为也不能使用你的翻译服务可用,此时会抛出跨域的问题,对于不用域名之间的访问,总是会出现跨域的问题,这是正常的。
所以,无论如何,首先你的翻译服务应该配置好 https。
其次如何解决跨域问题?也比较简单。
首先在配置文件中的 http 模块中声明跨域域名白名单:
1 2 3 4 5 6 |
http { map $http_origin $corsHost { default 0; "~https://test-business.glorze.com" https://test-business.glorze.com; "~https://pre-business.glorze.com" https://pre-business.glorze.com; } |
接下来在「nginx.conf」配置中的『location /』中配置跨域域名白名单即可。
1 2 3 4 5 6 7 8 9 10 11 |
location / { add_header 'Access-Control-Allow-Origin' $corsHost; add_header 'Access-Control-Allow-Headers' '*'; add_header 'Access-Control-Allow-Methods' '*'; # OPTIONS 直接返回204 if ($request_method = 'OPTIONS') { return 204; } root html; index index.html index.htm; } |
- Access-Control-Allow-Origin:配置为 * 表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求,也可以指定一个确定的URL。
- Access-Control-Allow-Headers:代表允许在请求该地址的时候带上指定的请求头,例如:Content-Type、Authorization,使用逗号(,)拼接起来放在双引号(”)中,可根据实际请求类型添加。
- Access-Control-Allow-Methods:代表允许使用指定的方法请求该地址,常见的方法有:GET、POST、OPTIONS、PUT、PATCH、DELETE、HEAD。
Nginx 的请求头大小配置
如上谷歌翻译 API 所示,一项翻译业务可能一次性翻译很多条数据,即批量翻译,Nginx 默认请求体的大小的是 128K,如果我们遇到了 Ngixn 出现「414 Request-URI Too Large」的情况,可以尝试加大 Nginx 客户端请求头缓冲区,在「nginx.conf」的 http 模块中配置如下:
1 2 3 4 |
http { client_header_buffer_size 512k; large_client_header_buffers 4 512k; } |
禁止云服务器的 IPV6
有的时候我们进行代理转发业务时候,可能由于云服务器支持 IPv6,所以在 Nginx 的 error.log 会看到类似下面这样的报错信息:
716158#0: *13028 connect() to [2404:6800:xxxx:801::2xxa]:443 failed (101: Network is unreachable) while connecting to upstream, client: 100.127.xxx.204, server: localhost, request: “GET /translate_a/single
这是因为 Nginx 有时候会使用 IPv6 协议进行请求,那么对方网站不支持 IPv6 的话,那么代理转发就宕机了,所以解决方案也比较粗暴,可以直接禁用服务器的 IPv6,直接修改「/etc/sysctl.conf」文件,添加或修改为如下:
1 2 3 |
net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.default.disable_ipv6=1 net.ipv6.conf.eth0.disable_ipv6=1 |
相关文章阅读
- 《GitHub 加速教程》
- 《记一次网站迁移全过程,单服务器单 IP 双域名搭建 lnmp 架构实现 WordPress 与 Discuz! 并存》
- 《分享几个实用有趣的酷站,丰富你的网络生活 第五期》
- 《关于图片压缩分享一些我收藏的几个网站 持续更新》
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可以加入本站封闭式交流论坛「DownHub」开启新世界的大门,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。