自言自语

I'm Wang Xianyuan, writing for myself, more studying, more experience…

用 Nginx 反向代理 Google Fonts

By

应对GFW对Google的封锁导致Google Fonts源无法正常使用,本文介绍的是通过海外的服务器来给Fonts源做反向代理的方法。

upstream fonts_google {
    server fonts.googleapis.com:80;
}

upstream fonts_gstatic {
    server fonts.gstatic.com:80;
}

server {
    listen 80;
    listen [::]:80;

    server_name fonts.nxez.com;
    access_log /var/log/nginx/fonts_access_log main;

    valid_referers server_name *.nxez.com nxez.com;
    if ($invalid_referer) {
        return 403;
    }

    location /css {
        sub_filter 'fonts.gstatic.com' 'fonts.nxez.com';
        sub_filter_once off;
        sub_filter_types text/css;
        proxy_pass_header Server;
        proxy_set_header Host fonts.googleapis.com;
        proxy_set_header Accept-Encoding '';
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://fonts_google;
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host fonts.gstatic.com;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://fonts_gstatic;
    }
}

解释一下上面的一些东西:

sub_filter ‘fonts.gstatic.com’ ‘fonts.miskcoo.com’; 这一行是把返回的所有东西里边的 fonts.gstatic.com 替换成我们自己的域名,要不然你得到了 css 文件,字体内容还是在 google 上面

然后 sub_filter_once off; 是表示全部替换,proxy_set_header Accept-Encoding ”; 这要求 google 返回不压缩的内容,因为压缩了就没有办法进行替换了

接着第二个 location / 的配置主要是字体文件的地址,你看看第一个配置返回的 css 就会知道该怎么写了

然后关于 valid_referers server_name *.miskcoo.com miskcoo.com; 是限制只有从这些域名访问才可以(如果你觉得你的流量啥的很多或者想做慈善事业当然就不用了)

然后下面是 HTTPS 的配置方法,你可以直接把端口改成 443,然后加上下面这些东西

ssl on;
ssl_certificate  your_crt.crt;
ssl_certificate_key  your_key.key;

至于证书…… 如果你有当然好、但是没有的话就自己签发一个(要安装 openssl),运行下面这段就好了

要注意的是,在中间会叫你填一大堆东西,唯一一个重要的是 Common Name,这个写上你的域名,要不然有的浏览器会不认

openssl genrsa -des3 -out server.key 2048
openssl rsa -in server.key -out server.key  # 这是生成没有密码的证书,你刚开始要输入一个四位以上的密码
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

之后你把 server.crt 复制到本机,然后导入到浏览器就好了

Nginx 报 unknown directive “sub_filter” 的问题解决
这个问题是没有安装 HttpSubModule 模块导致的,安装模块之后解决。

1.下载需要的文件

# 下载第三方模块
# cd ~
# git clone git://github.com/yaoweibin/ngx_http_substitutions_filter_module.git

2.查看之前Nginx编译configure

# nginx -V
nginx version: nginx/1.2.7
built by gcc 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6

因为Nginx编译安装第三方模块的时候需要添加上之前编译的configure参数,然后重新设置configure编译(但是不覆盖安装,只make不install):

./configure --prefix=/你的安装目录  --add-module=/第三方模块目录

3.重新编译Nginx

# 打开Nginx编译目录,版本号可能不同
# cd ~/lnmp1.0-full/nginx-1.2.7
# 重新configure
# ./configure --prefix= --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6  --with-http_sub_module  --add-module=/root/ngx_http_substitutions_filter_module
# make

备注:重新编译的时候,记得一定要把以前编译过的模块一同加到configure参数里面.

4.覆盖原Ngixn文件

# /etc/init.d/nginx stop
# cd cd objs/
# 覆盖原文件
# cp nginx /usr/local/nginx/sbin/
# /etc/init.d/nginx start

引用参考:
http://ju.outofmemory.cn/entry/71031
http://blog.miskcoo.com/2014/08/nginx-reverse-proxy-google-fonts
http://jybb.me/nginx-proxy-pass-and-substitutions4nginx
http://jybb.me/nginx-proxy-pass-and-cache
http://nginx.org/en/docs/http/ngx_http_sub_module.html
https://code.google.com/p/substitutions4nginx/
http://wiki.nginx.org/3rdPartyModules