最近感觉网站还是把Google字体库加上去比较好,非常不想就某堵墙的错Google服务访问不通畅的原因导致网站的英文字体全部变丑。突然觉得前段时间将google字体去掉完全是一种妥协,非常的不符合我的性格
很多人推荐使用国内的镜像,但是国内的镜像普遍存在两个问题。
1.部分不支持HTTPS
2.大部分在国外加载缓慢
将自己网页的打开速度寄托在别人服务器上,显然这又是一件不符合我的性格的事情,所以这个绝对不能被采用。
考虑到我的网站用的是Linode,在国内的访问速度少说也有100K/s吧,哪怕是偏远地区,于是最后我还是决定自己反代一个。

虽然每次不想强调这个悲伤的事实,但是还是得说:本文所述内容不适合大陆VPS,并且只适合带宽充足,速度较快的国外VPS,如Linode Tokyo/Fremont


分割线上方为废话。下面开始正题。
完成这个伟大的目标,你需要:
1.VPS,专用于此的独立IP。如果你不想让windows xp用户正常使用HTTPS,或者根本不用HTTPS,或者你有wildcard证书,那么独立的IP可以不需要。我就是不想让XP用户用HTTPS访问我的网站,因为需要HTTPS的只有我一个。
2.nginx-extras。Apache2做反代没有尝试过,不在本文的讨论范围内。
3.域名以及SSL证书。如果不需要HTTPS访问可以不要SSL证书。

STEP.1 安装nginx并建立nginx配置文件
首先你需要一个正常工作(包括处理SSL)的nginx
作为一个小白用户,我曾经不懂得Ubuntu直接apt-get install nginx安装的nginx是不支持SSL的,nginx也不给我报个错,这让我烦恼了很久。
正确安装姿势(Ubuntu):

add-apt-repository ppa:nginx/stable  
apt-get update
apt-get install nginx-extras
rm /usr/share/nginx/html/index.html #这一步视情况而定,不要随意执行。。

正常情况下nginx会在配置文件中include /etc/nginx/sites-enabled/*include /etc/nginx/conf.d/*.conf,于是我们就在/etc/nginx/conf.d/中新建一个google.conf文件。
文件中需要改动的部分已经用中文注释标明。由于这部分内容较长,建议复制到文本编辑器中查看/编辑。

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

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

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

    server_name fonts.ligstd.com;#改为自己的字体库域名,fonts.xxxxxx.com
    valid_referers server_name *.ligstd.com ligstd.com *.hjc.im hjc.im; # 限制引用的域名。改成自己需要用到字体库的网站域名的即可。如果你想要做公益服务,可以将此行和下方的#if ($invalid_referer) {...}去掉。
    if ($invalid_referer) {
        return 404;
    }

    location /css {
        sub_filter 'fonts.gstatic.com' 'fonts.ligstd.com';#将fonts.ligstd.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://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://gstatic;
    }
}
#下方为HTTPS设置,如果只需要HTTP访问,从这里开始往下的内容就不需要看了。
server {
    listen 106.186.18.133:443 ssl spdy; #将这一行改为"自己的IP地址:443"
    listen [2400:8900::f03c:91ff:fe73:bc8f]:443 ssl spdy;#将这一行改为"[自己的IPv6地址]:443",没有IPv6可以不填。
    ssl on;
    ssl_certificate /root/fonts.ligstd.com/ssl.crt; #改为自己的SSL证书位置
    ssl_certificate_key /root/fonts.ligstd.com/ssl.key; #改为自己的SSL私钥位置
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:!ADH:!AECDH:!MD5;
    #上面几行视情况而定,可以去掉ssl_ciphers和ssl_prefer_server_ciphers两行。
    server_name fonts.ligstd.com;#改为自己的字体库域名

    valid_referers server_name *.ligstd.com ligstd.com *.hjc.im hjc.im;#同样,改为自己需要使用字体库的网站域名。公益服务去掉这几行。
    if ($invalid_referer) {
        return 404;
    }

    location /css {
        sub_filter 'http://fonts.gstatic.com' 'https://fonts.ligstd.com'; #将fonts.ligstd.com改为字体库域名,但是https千万别改。
        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://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://gstatic;
    }
}

建立这样一个配置文件后直接nginx -s reload,不出任何错误的话,你的字体库域名就可以直接用来替换fonts.googleapis.com了。

其实如果你不想专门用一个域名/IP地址,又想给XP用户访问HTTPS,或者你安装了apache,nginx不能监听80端口,完全可以将80端口换成其他端口,只是sub_filter需要在后面加上端口,并且替换fonts.googleapis.com的时候也需要加上。当然,这样就显得没有那么优雅了。