用 CDN 加速 WordPress

写在前面 如果你觉得这篇文章对你有所帮助,并且想要使用又拍云,可以通过我这个 -> 链接 <- 注册,你我都能得到 不要白不要的 奖励。(注意,又拍云绑定的域名需要是备案过的) 如果你已经有 CDN ,可以跳过 又拍云 部分,直接看插件配置部分。 本篇文章对所有 CDN 都适用,这里以 又拍云 为例子作说明 又拍云更香? 上周在 V 站 发了个帖,安利了我写的一个 Alfred 插件,该插件可以方便地将图片上传到七牛云,顺便向大家安利了七牛。马上有 V 友跳出来说又拍云更香,免费流量比七牛云多 5 G,HTTPs CDN 流量也是算在免费套餐里边的。 趁着周末有点时间,去白嫖下又拍云。 又拍云联盟 没错。小标题 是 又拍云对开发者的白嫖活动的名字。我们加入这个联盟就能获得: 10 GB 免费存储 每个月 15 GB 免费 CDN 流量(HTTP[s] 都可以) 流程很简单。注册账号、在你的网站页脚添加又拍云的链接;填申请表。我是周六申请的,1个小时左右就收到了审核通过的通知。 Update(2022/12/02): 大家要留意一年的到期时间,快到期的时候去 联盟页面 申请续期。否则欠费就不好了,我就迟了几天,欠费 2 分钱 :) 审核通过后,会发放一年份的代金券给你,到期再次申请即可。 CDN 配置 系统设计 不想看我啰嗦的同学,可以跳过系统设计这部分。配置部分以 又拍云 为例子叙述 从上图的设计可以看出,我把文件分为三类: 动态接口/文件:例如 WordPress 中的 php 接口。这类请求是动态的,不适合放到 CDN 缓存中(一直回源,没有意义)。域名使用 foamzou.com ,该域名解析到我的服务器里,执行 WordPress 程序 适合短期缓存的文件:指的是短时间不会发生变化,但仍然有可能变化的文件。例如 WordPress 的系统库文件 域名使用:cdn.foamzou.com,该域名做个 cname 解析到 CDN 服务 当 CDN 未命中资源,则回源到 cdn.foamzou.com ( IP: 回源设置的 IP ) 适合长期缓存的文件:指的是几乎不会发生变化的资源文件。例如图片、第三方 css、js资源 域名配置同 2 给 CDN 配置一个对象存储桶 配置指定的路径从桶里取资源,没取到再回源到服务器 从服务器取到数据,存储到桶里 好处有 2 点 减少回源次数(毕竟对于同一个文件只会回源 1 次),节省服务器带宽 回源速度快(我在又拍云创建了个对象存储桶,CDN 和 存储 在同一个区域,速度当然比跨个公网访问我服务器快) 创建 CDN 服务 到 创建页面 : ...

2021-11-21 · 2 分钟 · 299 字

用七牛云作图床并配置 SSL

背景 一年前我写过《使用 CloudFlare/百度云加速做免费SSL》,里面提到了:因为 Chrome 的最新安全限制, https 站点无法正常加载 http 的图片和其他静态资源,这使得我不得不给我的图床加上 SSL。 前几天发现我的博客里的图片无法被正常加载,观察控制台后发现 图床的 SSL 证书出问题了。到百度云加速控制台看,才发现上次申请的一年 SSL 证书已经到期了,并且需要付费才能继续申请证书。好吧,白嫖的快乐没有了。 那就不用百度云加速了,SSL CDN 也用七牛云的吧。 七牛云 前提:你需要有一个已备案的域名,否则只能使用七牛的临时测试域名,是有有效期的 免费套餐 从 2016 年白嫖七牛云存储至今,本文就当做给七牛打回广告吧。 先说结论: 如果你只用 http 访问文件,每个月不超过 10G 流量的话,那么用七牛云相当于白嫖,一分钱都不用花 如果需要使用 https 则需要花费一些费用(0.28 元/GB),一般博客小站,每个月最多不超过 1 块钱吧。等过段时间,我有了一定数据再回来更新这个数值。 对于个人用户来说,有 10G 的免费存储,每个月 10G 的流量已经非常足够了。具体的资费可以参看 官网价格 。PS. 从价格表会看到 外网流出流量 会被收费,这点不用担心,我专门查了下官方说明: 如果使用了七牛测试域名或者融合 CDN 域名访问资源,是不会计算外网流出流量的 也就是说,你绑定一个域名回源到七牛云的对象存储,每个月不超过 10G 则不收费。 创建一个 bucket 在七牛云对象存储 管理后台,创建一个bucket: 存储区域选国内的都行;访问控制设置为公开,毕竟我们要将其用作图床 绑定域名 创建成功后,会提示你绑定一个域名。该域名将作为 CDN 域名,通过该域名访问你的文件时,会尝试在 CDN 节点找缓存;缓存未命中再回源到你上边创建的 bucket。 我们添加一个域名,该域名必须是经过备案的。 通信协议:如果你不需要 HTTPS,那么选择 HTTP 就足够了 ...

2021-11-14 · 1 分钟 · 152 字

npm包leveldown安装之升级Glibc

背景 今天安装某个npm库,但是安装失败了。日志里看看到是安装leveldown包失败了,于是单独安装leveldown进行测试。 问题排查 [duser@hy-docker02 tmp]$ npm i leveldown > leveldown@5.6.0 install /tmp/node_modules/leveldown > node-gyp-build make: Entering directory `/tmp/node_modules/leveldown/build' CXX(target) Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/builder.o cc1plus: error: unrecognized command line option "-std=gnu++1y" make: *** [Release/obj.target/leveldb/deps/leveldb/leveldb-1.20/db/builder.o] Error 1 make: Leaving directory `/tmp/node_modules/leveldown/build' 从cc1plus: error: unrecognized command line option "-std=gnu++1y"可以看出是调用g++编译时使用了不支持的参数。 因为另外有台机器(机器B)是可以将这个库安装成功的,所以我到那台机器执行 g++ -std=gnu++1y 1.c,但也是报一样的错误。并且这台机器的g++版本和我失败的那台是一致的,甚至操作系统版本也比较低。为什么机器B能够安装成功呢,一时想不出头绪来。 到安装成功的node_module/leveldown/里看了下,有个prebuilds目录引起了我的注意,发现里边放了各主流平台的预编译好的文件。再结合README,里边说了,如果预编译好的文件不存在(应该还做了检查)才会 fallback to a compile step。 这就能够解释为什么同样的g++版本,机器B能够成功安装了。大概就是机器B使用了预编译库,没有触发重新编译。 从github下载源码,打算跟踪下为什么当前机器没有用预编译好的包。下载后发现package.json文件有个test-prebuild命令用于测试预编译包。于是先npm install先安装一些包,然后执行download-prebuilds把编译好的包先下载下来。 [duser@hy-docker02 /tmp/foamzou/leveldown-master]$ npm run test-prebuild > leveldown@5.6.0 test-prebuild /tmp/foamzou/leveldown-master > cross-env PREBUILDS_ONLY=1 npm t > leveldown@5.6.0 test /tmp/foamzou/leveldown-master > standard && (nyc -s tape test/*-test.js | faucet) && nyc report standard: Node 10.12.0 or greater is required. `standard` did not run. module.js:664 return process.dlopen(module, path._makeLong(filename)); ^ Error: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /tmp/foamzou/leveldown-master/prebuilds/linux-x64/node.napi.glibc.node) at Object.Module._extensions..node (module.js:664:18) at Module.load (module.js:554:32) at tryModuleLoad (module.js:497:12) at Function.Module._load (module.js:489:3) at Module.require (module.js:579:17) at require (internal/module.js:11:18) at load (/tmp/foamzou/leveldown-master/node_modules/node-gyp-build/index.js:21:10) at Object.<anonymous> (/tmp/foamzou/leveldown-master/binding.js:2:153) at Module._compile (module.js:635:30) at Module.replacementCompile (/tmp/foamzou/leveldown-master/node_modules/append-transform/index.js:60:13) 然后发现上面这个GLIBC_2.14' not found,原来是glibc的问题。执行 strings /lib64/libc.so.6|grep GLIBC查看本机glibc版本,最高到GLIBC_2.12,而机器B是GLIBC_2.17。所以接下来升级glibc即可。由于是测试机器,并且版本更新不大,不是很担心升级后大量软件挂掉的问题。 ...

2020-12-07 · 1 分钟 · 179 字

使用CloudFlare/百度云加速做免费SSL

2021-11-14更新:百度云加速过期了,CDN 也直接用七牛云的吧。有兴趣的朋友可以看这篇文章《用七牛云作图床并配置 SSL》 2020-11-03更新:已将cdn部署到百度云加速服务。国内使用Cloudflare确实不行,最近看到百度云加速有免费套餐,个人博客来说完全够用了。步骤不复杂,就不详细描述了。步骤大概为: 需要域名备案 在百度云加速实名认证 添加网站时,选择CNAME接入方式。(官方推荐的是NS方式,这样可以全称托管,但我目前只希望托管我的cdn域名) 证书管理-证书申请可以免费申请ssl证书 安全功能-HTTPS,选择半程加密。这样源站可以不支持SSL 以下为原文: 注意一下,由于众所周知的原因,在国内访问CloudFlare会很慢,我只是用于个人博客的部分图片使用,所以容忍度会比较高。有高要求的同学,不建议在国内使用。 对于经常科学上网,尤其是自己搭建科学上网的同学来说,CloudFlare一定再熟悉不过了。经常有同学将它套在国外机子上,用来加速流量。因为CF本身就是一个CDN服务,可以用于加速各种服务。 今天我选择用它做我图床的cdn服务。 背景 起因是这样的,这两天发现我博客的背景图加载不出来了,查看网络请求后发现我的图床域名https://cdn.foamzou.com/legacy被强制使用https发起请求了。这是因为我的html页面是https的,chrome很不喜欢https页面包含了http请求,认为这很不安全。所以它强制在发起请求的时候在http header加了upgrade-insecure-requests: 1。该头部会告知服务端,客户端支持将http升级为https。在接下来的http请求中,浏览器会将其替换为https再发起请求。(但我将upgrade-insecure-requests: 1改为0,还是会替换为https,不确定是不是该头部的原因,也可能是chrome最近自升级加的特性。其它浏览器例如Safari就正常访问) Ok,已经确定是chrome新版本的特性,将混合内容(mixed content)的http改写为https了。在2019年10月份,google就通过博客发布了chrome关于内容安全的更新时间表: - v79 [2019年12月发布到稳定渠道]:将mixed的脚本文件、iframe升级到https - v80 [2020年1月发布到试用渠道]:将mixed的音视频文件升级到https。虽然允许mixed的图片文件加载,但该站点会在地址栏被标记不安全 - v81 [2020年2月发布到试用渠道]:将mixed的图片文件升级到https 按计划是2月份发布到early release渠道,估计也是前段时间才被更新到稳定渠道,然后自更新导致我的图片挂掉 问题来了,我的图床域名并不支持https,导致ssl握手失败,我的图裂开了!如果要支持的话,我需要在七牛支付一定的费用(https流量没有免费额度),而且需要配置一个ssl证书,可以购买(几千块一年,好贵),也可以上传自定义证书(也略麻烦)。 突然想起我可以把CF套在域名上,CF有免费套餐,一般的需求足够了,ssl证书还不用自己配置。 开干 说干就干,打开官网,没有账号的话注册一个。 添加站点 注意,这里只能填写根域,不支持单独加速子域名。但我只想加速某个子域名怎么办?没事,后面步骤可以配置。 添加站点 选择套餐 选择免费的就可以啦 选择套餐 修改代理状态 选择完套餐后,CF会将你域名的解析记录带出来,如下图 dns记录 在代理状态那列点击小图标可以切换状态。现在有两个状态可以切换,已代理和仅限DNS。注意,对于你不希望走CF的域名,请设置为仅限DNS,这样CF只会帮你将域名解析到你的源ip,而代理则解析到CDN节点,再帮你回源。 由于CF在国内的网络情况并没有阿里云这些本地的厂商好,所以博客域名我没有走CF,只是代理了file.zoufeng.net 好,点击继续。 修改域名的DNS服务器 这一步需要到你的域名管理台(在哪买的域名就去哪),将原来的DNS服务器删除,换成CF自己的。完成之后点击蓝色按钮。 设置ssl 点击SSL/TLS按钮,将选项修改为灵活,这样CF节点支持ssl,而源服务器不需要ssl。完全的话,源服务器就需要支持ssl了。我的七牛图床域名不支持ssl,所以选择了灵活。这也是本篇文章的最开始的目的。 等待生效 等吧。修改DNS服务器那一步耗费的时间可能会长一些。你可以通过ping命令检查是否已经解析到CF的ip了。 其它 你可能看到上一张图有很多菜单:缓存、防火墙、worker等。CF挺多功能的,有兴趣的话,注册一个玩玩吧。worker就是serverless那东西,类似AWS CloudFront的lambda@edge

2020-09-30 · 1 分钟 · 56 字

nginx proxy_pass后gzip不生效

有一台服务器只能对外开80端口,但该服务器有几个项目同时共用。因此做了一个方案,使用不同的url前缀,proxy_pass到对应项目监听的端口。 如default.conf配置如下 server { listen 80 default_server; location /a/ { rewrite ^/a/(.*)$ /$1 break; # 剥掉 /a 这一层 proxy_pass http://127.0.0.1:8083; } location /b/ { rewrite ^/b/(.*)$ /$1 break; proxy_pass http://127.0.0.1:8084; } location /c/ { rewrite ^/c/(.*)$ /$1 break; proxy_pass http://127.0.0.1:8085; } } a项目配置里开启了gzip server { listen 8083; root /path/to/a; gzip on; gzip_comp_level 3; .... } 但发现gzip未生效。 后面把gzip配置放到default.conf的location部分就正常运行了。 ...

2019-07-26 · 1 分钟 · 82 字

centos6升级python到2.7版本

有些软件需要安装python2.7,但centos6默认安装的是2.6版本。但yum依赖2.6,所以不能覆盖安装。需要保留两者 编译安装python2.7 wget https://www.python.org/ftp/python/2.7.14/Python-2.7.14.tgz tar xvf Python-2.7.14.tgz sudo mkdir /usr/local/python2.7 cd Python-2.7.14 ./configure --prefix=/usr/local/python2.7 --enable-shared make sudo make install 验证 cd /usr/local/python2.7/bin ./python 报错: ./python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory 将python2.7的动态链接库加入到系统会读取的配置中 sudo vim /etc/ld.so.conf # 在该配置文件追加一行:/usr/local/python2.7/lib sudo ldconfig 备份原有的python which python # /usr/bin/python [myhost tmp]$ md5sum /usr/bin/python /usr/bin/python2.6 8505ca7b24f60f8dca8d6d2622ed0563 /usr/bin/python 8505ca7b24f60f8dca8d6d2622ed0563 /usr/bin/python2.6 # 发现已经有python2.6,且与python的md5一致,那就不用备份直接删除了 sudo rm /usr/bin/python 编辑yum的执行程序 sudo vim /usr/bin/yum # 将#!/usr/bin/python 中的python改为python2.6 # 即 #!/usr/bin/python2.6 执行yum验证下,没有报错就ok了 ...

2019-04-09 · 1 分钟 · 143 字

根据pid查找进程所在的执行文件

查看执行进程的文件 sudo ls -l /proc/<pid>/exe 例如,可以看到node这个可执行程序的绝对路径 root@iZ94qht95zsZ ~# ps -ef | grep node root 17078 16750 88 16:47 pts/0 00:00:00 node index.js root@iZ94qht95zsZ ~# sudo ls -l /proc/17078/exe lrwxrwxrwx 1 root root 0 4月 8 16:47 /proc/17078/exe -> /usr/local/node-v10.4.0-linux-x64/bin/node 查看进程的工作目录 上面ps只能看到相对路径的index.js。我们要查看绝对路径可用以下命令 pwdx <pid> 例如,该index.js文件的工作目录为/root/test root@iZ94qht95zsZ ~# pwdx 17078 17078: /root/test

2019-04-08 · 1 分钟 · 50 字

编译安装php7.3

最近在一台CentOS6.2的机器上部署php7.3,系统有点旧,稍微折腾点。 安装需要的依赖 sudo yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libjpeg libpng freetype libjpeg-devel libpng-devel freetype-devel gmp-devel readline-devel libxslt-devel libmemcached libmemcached-devel -y 编译安装 到官网下载最新的稳定版本 注意用户组最好与nginx的保持一致,例如我这里设置与nginx一致的nobody ./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc --enable-fpm --with-fpm-user=nobody --with-fpm-group=nobody --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-soap --with-libxml-dir --with-xmlrpc --with-openssl --with-mhash --with-pcre-regex --with-sqlite3 --with-zlib --enable-bcmath --with-iconv --with-bz2 --enable-calendar --with-curl=/usr/local/include/curl/ --with-cdb --enable-dom --enable-exif --enable-fileinfo --enable-filter --with-pcre-dir --enable-ftp --with-gd --with-openssl-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-freetype-dir --enable-gd-jis-conv --with-gettext --with-gmp --with-mhash --enable-json --enable-mbstring --enable-mbregex --enable-mbregex-backtrack --with-onig --enable-pdo --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-zlib-dir --with-pdo-sqlite --with-readline --enable-session --enable-shmop --enable-simplexml --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-wddx --with-libxml-dir --with-xsl --enable-zip --enable-mysqlnd-compression-support --with-pear --enable-opcache make sudo make install 编译期间遇到的问题汇总 checking for cURL 7.15.5 or greater… configure: error: cURL version 7.15.5 or later is required to compile php with cURL support 实际上我本地已经安装了最新的版本。–with-curl不指定路径的话,会在/usr/include/curl下找头文件。但我本机已有的libcurl貌似没有这些头文件。尝试`yum install curl curl-devel`,报了一个多版本冲突的问题。所以最后还是从curl官网下载了最新的tar包,手动编译安装后,--with-curl指定路径为/usr/local/include/curl/ ...

2019-03-28 · 1 分钟 · 189 字

编译protobuf.so扩展

在官网下载适合php版本的包。pecl官网 解压 tar zxvf protobuf.tar.gz cd到目录并用phpize生成configure文件 cd protobuf-3.7.1/(如果是从github下载的,则cd到protobuf-3.7.1/php/ext/google/protobuf) phpize 编译三板斧 ./configure --with-php-config=/usr/local/bin/php-config make sudo make install 最后会提示你已经装到指定扩展目录了 Installing shared extensions: /usr/local/php7/lib/php/extensions/no-debug-non-zts-20180731/ 其它扩展编译也是一样的方式:参考 /posts/compiled-php-extension-in-linux/

2019-03-28 · 1 分钟 · 23 字

在mac安装nginx模块

今天有需求需要用到nginx的stream模块,但mac已经安装的nginx默认是不带该扩展的。 我选择了重新安装nginx。 brew tap denji/nginx brew install nginx-full --with-stream #如果已经是最新版本,则会提示nginx版本已安装,可选择重新安装 brew reinstall nginx-full --with-stream 若安装nginx时提示,与已有nginx有冲突。需要先断开软链 brew unlink nginx

2019-01-05 · 1 分钟 · 18 字