标签归档:WordPress

WordPress 免费开启全站 HTTPS

1.前言

记不清楚 Chrome 是从哪个版本开始标记网站是否采用 HTTPS 协议,即在网址前面有一把绿色的锁,旁边有「安全」两字。而一般未采用 HTTPS 协议的网站则是一个黑色的i图标,表示 「不安全」。
虽然使用 HTTP 协议并不影响使用,但这事估计早晚都得做。于是今天就干脆把网站从 HTTP 过渡到 HTTPS,顺便记录一下阿里云服务器上 WordPress 开启全站 HTTPS 的过程。

2.申请证书

由于我用的是阿里云服务器,所以直接在阿里云申请的 CA 安全证书。如果服务器用的不是阿里云,可以在 Let’s Encrypt 申请。
登录阿里云后,点击「产品与服务」-> 「安全(云盾)」栏目下的「CA证书服务(数据安全)」,然后点击「购买证书」,选择「免费型DV SSL」,购买。

免费数字证书,最多保护一个明细子域名,不支持通配符,一个阿云帐户最多签发20张免费证书。

购买成功后,按要求补全相关个人信息,然后等待审核通过即可下载证书。

3.Nginx 配置证书

在 Nginx 安装目录创建 cert 文件夹,把下载的证书上传到此目录。上传后的路径类似这样:

  • /etc/nginx/cert/1127.key
  • /etc/nginx/cert/1127.pem

然后配置 nginx.conf ,配置如下,直接将访问 HTTP 的请求 301 跳转到 HTTPS 上。

server {
    listen       80;
    server_name shelwee.com www.shelwee.com;
    return 301    https://$host$request_uri;
}


server {
    listen 443;
    server_name shelwee.com www.shelwee.com;
    ssl on;
    root /home/www.shelwee.com;
    index index.php index.html index.htm;
    ssl_certificate   cert/1127.pem;
    ssl_certificate_key  cert/1127.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
        location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        try_files $uri $uri/ /index.php?$args;
        fastcgi_connect_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

保存 nginx.conf 并重启 Nginx 。

sudo service nginx reload

这时刷新网站,虽然网址可能已经出现 HTTPS ,但前面的图标应该还不是绿色的安全锁,因为网站的资源还是 HTTP 协议下的,所以下一步要把网站的所有资源链接都替换成 HTTPS。

4.WordPress 修改

function.php

打开主题模板下的 function.php 文件,在文件末尾追加下面的函数:

/* 替换资源链接为 https */
function resources2Https($content){
    if( is_ssl() ){
        $content = str_replace('https://www.shelwee.com/wp-content/uploads', 'https://www.shelwee.com/wp-content/uploads', $content);
    }
    return $content;
}
add_filter('the_content', 'resources2Https');

wp-config.php

最后修改 wp-config.php 文件,文件末尾追加下面语句:

/* 强制后台和登录使用 SSL */
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

现在刷新网站,绿色的安全锁是不是已经出现了?如果没有的话,检查一下网站上是不是存在一些写死的资源路径,找出他们(通常是 http:// 开头的)并修改成 https:// 。

THE END

WordPress在线升级失败后导致页面空白

1

WordPress 4.7 正式版前几天发布了,今天登录后台提示有新版本,点击「现在更新」后,页面加载一段时间后变空白,再次点击「现在更新」后,提示:另一更新正在进行。

这个问题已经不是第一次遇到了,上一个版本升级的时候也遇到了。那时以为是个偶然问题就没多花心思去找原因,直接下载最新版手动升级了。但这次是第二次遇到了,就没法对它视而不见了。

2

打开 Chrome DevTools 对这个升级过程进行多次分析,发现 update-core.php?action=do-core-upgrade 这个请求每次均在加载30秒左右后停止。说明 WordPress 在发起下载安装包请求后,在30秒后仍未下载完成导致请求连接中断。
解决方法也很简单,无非是以下几种:

    1. 加大带宽
    2. 减小更新包体积
    3. 加大请求响应时间

由于前两种方法适用性不是很广,所以下面的解决方案是针对第三种方法:加大请求响应时间

3

去除提示:另一更新正在进行

WordPress 在执行更新的时候数据库会生成一条记录用于防止同一时间重复更新,因此需要先把这条记录删除后下次才能在线更新。

如果用 SSH 登录服务器操作的话,执行以下命令登录 MySQL :

mysql -uroot -p //输入 MySQL root 账户密码

选择数据库,找到那条记录并删除,例如我找到的记录 option_id 是40301,那就执行:

use database;   // database 替换为你的WP数据库
select * from wp_options where option_name like '%lock%';
delete from wp_options where option_id = 40301;

加大请求响应时间

request_terminate_timeout 是 php-fpm.conf 中的一个参数,用于控制单个请求的超时中止时间,默认值30秒。

通过加大 request_terminate_timeout 的值,就可以彻底解决。执行以下命令修改:

sudo vi /etc/php5/fpm/pool.d/www.conf;  //通过 vi 编辑你的 php-fpm 配置文件

在 www.conf 找到 request_terminate_timeout 30s 这一行,值修改为300s

request_terminate_timeout 300s 

重启 php5-fpm 后配置生效

sudo service php5-fpm restart 

最后点击「现在更新」,耗时3分钟左右终于更新完毕,问题至此解决。

THE END