坦白说,我是不愿意给博客启用HTTPS(SSL)访问的。至少,现在不愿意。
为什么这样讲?
博客于2016年11月份正式上线,到今天(2018-01-22)已差不多满15个月了。
在这15个月里,本博客仅仅更新了一篇文章,记录了我当初是如何一步一步在VPS上安装WordPress建站的。
承蒙诸位看得起,时常有留言交流。针对其他博主建站时出现的问题,凡力所能及的我都尽力回答,并筛选后贴在文章内作为补充和更新。
自认为文章还算靠谱,慢慢地从Google和Baidu上来了流量。按 Google Analytics 一月内的统计,流量平均约100IP/天。
是的。每天仅仅只有100个左右的访客。
太少了。不是吗?
也许等博客有了10篇、50篇、100篇甚至更多文章,流量到了1000IP/天、5000IP/天、10000IP/天甚至更多的时候,自己才可以名正言顺地自称为“博主”。
对我来说,当务之急是如何拓展更多的内容、获取更多的流量,其他诸多锦上添花甚至可有可无的事情(比如启用HTTPS)都是微不足道的。
Google不会因为你安装个SSL证书(甚至免费的)、启用个HTTPS就让你的网站出类拔萃,尽管HTTPS也是几百种(博主猜测)影响SEO排名因素的一种。
Content Is King ..
所以,不以生产优质内容为目的的SEO都是耍流氓。
更何况,就本站这么个小博客,有什么高价值的数据需要加密访问呢?银行吗?网店吗?
因此,个人博客启用HTTPS访问的确有用,但至少现阶段不是必需品。
但是,我最终还是给博客启用了HTTPS。
原因主要有以下三点:
我喜欢折腾
对于新兴的事物特别感兴趣,喜欢尝试和体验,并一直乐此不疲。这也是这篇文章产生的主要原因。
HTTPS是趋势
Google明确表示HTTPS对网站排名有帮助,且SSL证书的安装越来越方便。既然以后也要开启,为何不趁着现在流量少时折腾好呢,同时还可以观察并验证开启HTTPS对博客有哪些具体的影响。
他人的建议
多位网友留言交流关于SSL证书安装的问题,并建议博主折腾一下出个教程。
实际上,我非常庆幸自己这几天的折腾,的确收获颇丰。其中最重要的一点就是直观的验证了SSL/HTTPS对关键词排名的提升效果(见下图)。
(每次折腾前,我习惯先做好VPS快照备份,然后截图,留作和折腾后对比。我觉得这是个不错的习惯,也建议你这样做。)
2018-01-16上午09:12时,某关键词排在第三位(启用HTTPS访问前):

2018-01-16中午12:16时,该关键词排在第二位(启用HTTPS访问后):

从图中可以看出,启用SSL之后,仅仅三个小时内Google关键词排名就发生了变化:
从第三升至第二位!
诚然,这也可能属于关键词排名的正常波动,但在我看来,至少印证了一点:
Google倾向于给予HTTPS网址更多的权重。
事实上,Google在很早之前的一份官方博文中也提到过这一点:
For now it’s only a very lightweight signal — affecting fewer than 1% of global queries, and carrying less weight than other signals such as high-quality content — while we give webmasters time to switch to HTTPS. But over time, we may decide to strengthen it, because we’d like to encourage all website owners to switch from HTTP to HTTPS to keep everyone safe on the web.Google Webmasters
所以,如果你打算长期的、正规的建站/写博客的话,我的建议是:请尽量安装SSL证书,以开启HTTPS访问。
接下来,博主就分享一下我是如何在LAMP环境中(LNMP1.3/1.4一键安装)一步步安装Let’s Encrypt免费SSL证书的。
再次提醒:建议在进行以下操作前做好快照备份(SnapShot),以防不测。同时,由于安装Let’s Encrypt免费SSL证书需要验证域名,故务必确保域名解析成功。
#1 LNMP1.3如何升级到LNMP1.4
#2 安装免费的SSL证书(Let’s Encrypt)

Let’s Encrypt 是由 ISRG(Internet Security Research Group,互联网安全研究小组)提供的免费数字证书认证机构,旨在提供免费的SSL/TLS证书。
其参与者目前主要包括电子前哨基金会、Mozilla基金会、Akamai、思科以及Linux基金会等,这些大牌组织的加入保证了这个项目的可信度和可持续性。
所以,如果我们需要免费的SSL证书,Let’s Encrypt则无疑是最佳之选。
#3 防火墙开启443端口
#4 HTTPS替换掉HTTP链接
细心的你可能发现了:网址前面的小锁为啥不是期待中的绿色呢?
这是因为,页面上存在该域名下的非 https 链接。也就是说,文章内有些图片、CSS和JS等文件仍然是以 http 链接样式存在的。
因此,我们要将其全部改成 https 样式。
进入 phpMyAdmin 管理后台,选择目标数据库,在 SQL 里跑一下如下语句(别忘了把 seoimo.com 换成你自己的域名):
UPDATE wp_options SET option_value = replace( option_value, 'http://www.seoimo.com', 'https://www.seoimo.com' );
UPDATE wp_posts SET post_content = replace( post_content, 'http://www.seoimo.com/wp-content', 'https://www.seoimo.com/wp-content' );
如果安装了静态缓存(如 WP-Super-Cache )和 Memcached 插件(比如 MemcacheD Is Your Friend ),建议再清空下缓存。
连接 Memcached :
# telnet 127.0.0.1 11211
清空所有缓存数据:
flush_all
显示 OK 之后,输入 quit 退出即可。
Connected to 127.0.0.1.
Escape character is '^]'.
flush_all
OK
quit
Connection closed by foreign host.
注意:如提示 -bash:telnet:command not found ,需要安装下 telnet 命令:
# yum -y install telnet
最后,建议再重启下 Memcached 扩展:
# /etc/init.d/memcached restart
接下来,刷新网页,期待中的小绿锁终于出现了。

至此,HTTPS才算是真正启用了。
但是,革命仍尚未成功,接下来还有几点重要设置,建议一并修改。
#5 添加 SSLCertificateChainFile 并开启 HSTS
走完了上面的步骤,当我们使用某些网站(如SSLLabs - SSLTest)检测博客 https 网址健康情况时,你可能会发现存在 “Chain issues”,而整体得分往往只有B。
什么意思?
简单点说,就是你的证书有问题,某些浏览器下会提示错误/证书有风险,网站不安全。
所以,LAMP/Apache环境下,还需要添加中间证书/完善证书链,并开启强制HTTPS访问。(LNMP最新版本已修正证书链)
编辑网站的 Apache 配置文件,仍以本站(seoimo.com)为例:
# vi /usr/local/apache/conf/vhost/seoimo.com.conf
在 VirtualHost *:443 内添加 SSLCertificateChainFile 指向以及 HSTS (HTTP Strict Transport Security)命令:
SSLCertificateFile /usr/local/apache/conf/ssl/seoimo.com/seoimo.com.cer
SSLCertificateKeyFile /usr/local/apache/conf/ssl/seoimo.com/seoimo.com.key
SSLCertificateChainFile /usr/local/apache/conf/ssl/seoimo.com/ca.cer
Protocols h2 h2c http/1.1
Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"
保存之后,重启Apache:
# lnmp httpd restart
这时,再去检测HTTPS健康状况,一般就可以得到A或者A+了。
温馨提示:
① 禁用 TLS 1.0 和 TLS 1.1
倘若提示 “This server supports TLS 1.0 and TLS 1.1. Grade will be capped to B from January 2020.”,则可选禁用 TLS 1.0 和 TLS 1.1 即可:
找到 SSLProtocol all -SSLv2 -SSLv3 该行,行末添加 -TLSv1 -TLSv1.1,即 SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 ,然后,重启一下lnnp:
② 配置 HSTS (HTTP Strict Transport Security)(可选)
上文提到的配置 HSTS 部分,考虑到虚拟主机可能没有修改 .conf 的权限,可选择将 Header always set .. 该行添加到网站根目录下的 .htaccess 文件内:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
#6 关闭 SNI(Server Name Indication)(可选)
Server Name Indication(服务器名称指示)是用来改善 SSL(Secure Socket Layer)和 TLS(Transport Layer Security)的一项特性,它允许客户端在服务器端向其发送证书之前请求服务器的域名。
在以前,只有独立 IP 的虚拟主机或 VPS 才能开启 SSL/TLS 连接服务。也就是说,一个 IP 只能对应一个 HTTPS 访问。因此,同一个 IP 下搭建多个 HTTPS 网站是不行的。
但现在可以了。
使用 LNMP 最新版安装包编译的 Apache 2.2 已自带 SNI 拓展,默认是打开的。同 IP 下搭建多个网站时,只要按操作绑定域名并启用 HTTPS 就可以,不需要额外设置。
然而,在启用之后,你可能遇到下面这种情况:没有权限,访问禁止!

这是因为,某些奇葩的浏览器不支持 SNI 技术,比如上图所示的 IE 8 以及在 WinXP 系统下所有的 IE 浏览器。
尽管 XP 系统已经退出历史舞台了,但在国内还是有一定的市场。
倘若你选择无视之,下面这步可以略过了;但如果你不打算失去这部分访客,还是得照顾一下他们。
方法比较简单:关闭 SSLStrictSNIVHostCheck :
# vi /usr/local/apache/conf/extra/httpd-ssl.conf
将默认的 SSLStrictSNIVHostCheck on 改成 off ,如下所示:
SSLStrictSNIVHostCheck off
保存,退出。然后重启 Apache 即可:
# lnmp httpd restart
再次访问就不会出现上图中的问题了。
但是,如果你是同一个 IP 下搭建了多个网站,即便关闭了 SSLStrictSNIVHostCheck ,XP 系统下访问HTTPS可能还会出问题。比如:

出现这种情况有两个解决办法:①换用除 IE 以外的浏览器,比如谷歌Chrome和360极速浏览器;②换个系统吧兄弟,XP 真的太古老了。
#7 定时更新SSL证书
使用 LNMP 安装 Let's Encrypt - SSL 证书,会自动添加定时更新证书的指令。
查看指令:
# crontab -l
正常情况下,显示如下信息(LNMP1.6):
或者(LNMP1.5):
通常,保持默认即可。
但是,免费证书有效期90天,每天都检测升级一次,博主感觉有点太频繁。可以改为15天甚至一个月检测一次:
# crontab -e
更改为以下设置:
保存,重启 crond :
# service crond restart
然后,设置开机启动:
# chkconfig crond on
这样,每15天的凌晨,程序会自动检测证书是否需要更新;如果不需要,则直接跳过。
当然,你也可以随时强制性手动更新(注意:限制每周5次)。
强制更新Let's Encrypt证书:
# "/usr/local/acme.sh"/acme.sh --force --cron --home "/usr/local/acme.sh" > /dev/null
出现 Congratulations, all renewals succeeded. 字样时,表示证书更新完成。
#8 HTTP全部301重定向到HTTPS
编辑网站根目录下的 .htaccess 文件,在顶部添加如下代码:
# BEGIN Rewrite
RewriteEngine On
RewriteCond %{HTTP_HOST} ^seoimo.com [NC]
RewriteRule ^(.*)$ https://www.seoimo.com/$1 [R=301,L]
# END Rewrite
保存之后,上传覆盖即可。
倘若访问提示“重定向次数过多”,也可设置仅跳转端口试试:
# BEGIN Rewrite
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.seoimo.com/$1 [R=301,L]
# END Rewrite
#9 HTTPS对网站打开速度的影响
通常认为,启用HTTPS访问会额外增加网页打开时间,同时也会占用VPS资源。
但是,具体影响有多大呢?
经过博主测试(Pingdom & PageSpeed Insights),启用HTTPS访问对网页打开时间的影响几乎可以忽略不记(详见下图)。
(测试地点选择洛杉矶,尽量靠近博客主机所在机房,以减少线路问题造成的干扰。)
开启HTTPS访问前后,Google PageSpeed Insights 测试结果:


开启HTTPS访问前后,Pingdom 测试结果(整体数据):


开启HTTPS访问前后,Pingdom 测试结果(请求耗时):


从上图可以看出,本站启用HTTPS访问后,SSL耗时只有几十毫秒。页面打开耗时虽有所增加,但增加的非常有限,甚至可以忽略不计。
当然,本次测试仅仅只是验证SSL对本站访问速度造成的影响,并不意味着你开启HTTPS访问后网站打开速度和上图一样。
网站打开速度更多是由VPS性能(比如 CPU 、带宽和 I/O读写)、线路、域名DNS解析、站内优化以及本地网速等多种原因造成的,有些因素可以通过优化调整改善,有些我们却很难左右。
博主的建议是:在做好站内优化的同时,尽可能选择性能更好的VPS/服务器/虚拟主机。比如本站目前用的 Hostwinds(月付$4.99,1GB内存,美西机房)。
建议安装LNMP1.5版本吧,至少不会出现如下Python依赖的问题!
在一个手痒痒的下午,折腾了一番VPS之后,博主决定把 Let's Encrypt 证书更新一下,尽管离到期还有一个多月时间。
于是,手动更新之:
# /bin/certbot renew --renew-by-default --disable-hook-validation --renew-hook "/etc/init.d/httpd restart"
结果,却出现如下错误:
yum is /usr/bin/yum
To use Certbot, packages from the EPEL repository need to be installed.
Enabling the EPEL repository in 1 second....
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
* base: centos.s.uw.edu
* elrepo-kernel: repos.lax-noc.com
* extras: mirror.hmc.edu
* updates: mirror.chpc.utah.edu
Package epel-release-6-8.noarch already installed and latest version
Nothing to do
No supported Python package available to install. Aborting bootstrap!
看样子是需要升级到 Python3 。
但是,我在VULTR的CentOS7系统下(Python2.7)是可以正常更新的,所以,或许没必要一定升级到 Python3 , Python2.7 也是可以的。
那就试试看吧!(稳妥点,建议先做好 SnapShot 备份。)
更新系统并安装相关依赖:
# yum -y update
# yum -y install epel-release
# yum -y install openssl openssl-devel zlib-devel gcc sqlite-devel
完成后,开始安装 Python2.7 :(博主选择是 Python2.7.12 版本)
# cd ~
# wget https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz
# tar -zxf Python-2.7.12.tgz && cd Python-2.7.12
# ./configure
# make && make install
之后备份当前的 Python2.6 ,并设置 Python2.7 软链接:
# mv -f /usr/bin/python /usr/bin/python2.6
# ln -s /usr/local/bin/python2.7 /usr/bin/python
安装 pip ,并设置 Python2.7 为默认启动版本:
# wget https://bootstrap.pypa.io/get-pip.py
# python get-pip.py
# ln -s /usr/local/bin/pip2.7 /usr/bin/pip
如提示 ln: creating symbolic link `/usr/bin/pip': File exists ,则需要删除原 pip ,或者做成备份:
# mv -f /usr/bin/pip /usr/bin/pip.old
之后,查看 Python 版本信息:
# python --version
显示 Python 2.7.12 ,表示安装成功。
接下来,还需要做如下修改,以确保 yum 功能正常使用:
# vi /usr/bin/yum
将第一行的 #!/usr/bin/python 修改成 #!/usr/bin/python2.6 即可。
之后,可以删除之前下载的 Python-2.7.12 压缩包,以节省空间:
# cd ~ && rm -rf Python-2.7.12.tgz
至此,在搬瓦工CentOS6.9系统上安装 Python2.7.12 算是成功了。
接下来,继续手动更新证书:
# /bin/certbot renew --renew-by-default --disable-hook-validation --renew-hook "/etc/init.d/httpd restart"
悲催,又显示错误:
Traceback (most recent call last):
File "/usr/bin/virtualenv", line 7, in *module*
from virtualenv import main
ImportError: No module named virtualenv
继续安装 virtualenv :
# pip install virtualenv
再次更新证书:
# /bin/certbot renew --renew-by-default --disable-hook-validation --renew-hook "/etc/init.d/httpd restart"
终于成功了:
/etc/letsencrypt/live/seoimo.com/fullchain.pem (success)






您好,您在文中写到这一步:
HTTP全部301重定向到HTTPS
编辑网站根目录下的 .htaccess 文件
请问用什么软件可以编辑网站根目录下的 .htaccess 文件
保存之后,上传覆盖呢?
新手不太懂,请大佬解答一下。
VPS上直接操作,可以用 vi 命令。
对命令不太熟悉的话,可以用FTP下载到电脑,用记事本编辑。
不过要注意保存的编码,一般都是UTF-8。
请问根目录地址是??我一路教程过来刚回去看了看,发现不知道是哪。
就是域名的文件夹,即 /home/wwwroot/xxx.com
博主你好,虽然我的站点已经成功开启HSTS,但它依然显示连接不完全安全,这是为什么呢?
检测下是哪一环节出了错:https://www.ssllabs.com/ssltest/
测完后是A+,唯一不一样的是下面中间那条提示语
https://i.loli.net/2019/03/13/5c890f240410a.png
提示是说Apache2.4.37有个bug,导致某一测试不可进行。
估计不是什么大的问题,可以不必理会。
那为什么我的链接还是不够安全呢,怎样才能在网址前有一把小锁?
方便的话,把网址发我下,我看看。
直接回复这个邮箱就行。
检查了你的网站,有以下两点问题:
①网址http没有自动跳转到https:https://www.seoimo.com/lamp-ssl/#http-301-https
②网站内容有非https链接:https://www.seoimo.com/lamp-ssl/#http-to-https
这些文中都有介绍,搭建的时候留意下就好了。
另外,打算认真建站的话,还是注册个.com域名吧。
大佬我的网址可以ping通也指向了我的服务器地址,可是用域名访问提示网页终止了连接,用ip访问提示
403
Forbidden
You don't have permission to access / on this server.
这是啥原因啊
能ping通说明DNS解析没问题。
域名访问出错,大概是域名绑定时候出了问题,仔细排查下域名设置:
IP访问403错误是正常的,因为本教程柄部建议开启IP访问网站。
最多是IP访问一个默认的页面,非要不显示403的话,你可以试试这样:
啊啊啊啊,不好意思,刚发表评论又忘记问了一个问题,话说访问自己域名的时候,虽然安装了SSL但是如果域名不带https://访问,Chrome显示的就是不安全。加上https://之后就OK了。请问下,这种情况怎样设置输入域名直接就是带https的呢?
多谢多谢?
是不是忘了设置http重定向到https?
多谢大大回复。
4 + HTTPS替换掉HTTP链接 ---->这个数据库我已经检查了,没有问题。
8 + HTTP全部301重定向到HTTPS --->这个我也做了。
还差哪一步,还是我做的不对?
我扶墙后显示你网站的重定向没问题了,不过网站打开太慢了,中途还卡死了一次。不扶墙打不开。
打开首页时你看下VPS负载,如果cpu或者i/o或者负载太高,说明程序有问题。
可能插件也可能主题,需要排查解决。
我现在好想知道国内为啥访问我的网站访问不了。。。纠结死我了。
刚才国内朋友帮我用telnet 访问80跟443端口都不行,国内还有墙端口一说?
扶墙时偶尔会遇到,换端口即可。
但建站换80和443端口不推荐,还是换IP吧!
最近刚建的站,弄了一个自己的摄影博客,在Vultr买的主机。之前悲剧,服务器选在了悉尼,结果IP被墙,折腾到了日本服务器。结果奇怪到是,ping IP跟域名都能ping通,但是国内到朋友就是打不开网页。我原来以为是wp主题引用了Google字体什么到,后来安装了插件屏蔽掉了还是不好用。 最近整的这个有些崩溃。希望大大能指点下。
还有个问题是,关于iptables服务,因为vultr提供了防火墙服务,iptables在设置主机服务的时候是不是可以不用设置啊?
VULTR和搬瓦工这两家性价比比较高,机场太多了,貌似是大墙重点照顾对象。
建议建站和梯子要分开,别都放在一个VPS上。
Ping下全国各地的情况,如果大部分都打不开,说明线路不好,甚至IP被墙。
可以考虑换个IP,VULTR尽量避开日本、新加坡和悉尼,这些线路都不怎么样。
建议试试美国线路,虽然美西也可能好不到哪去。多开几个IP试试线路。
至于VULTR自带的防火墙,感觉不太会用的话还是别管它了。
至少我一直都没用过它的防火墙,VPS系统里自定义设置iptables就很好。
全国Ping地址:https://www.ipip.net/ping.php
全球Ping地址:http://ping.pe/
感谢博主!按照博主教程弄了个搬瓦工建了个博客,准备以后就把日志发这上面
再也不用用辣鸡新浪 csdn啦 ~
不客气。
已经很多年不用这些免费博客了,可玩性不高,并且数据不在你手里,不安全。
SEOIMO你好,按照你的教程顺利搭建好了wordpress,但是科学上网却用不了了,80端口和443端口都被nginx占用,其他能用的端口也都有程序占用,有什么解决方法吗
小飞机换端口即可。建议大端口,比如20000-60000之间。
博主你好,我的SSL证书自动续期失败了,SSL日志是
2019-01-24 00:10:03,186:DEBUG:certbot.main:certbot version: 0.30.0
2019-01-24 00:10:03,186:DEBUG:certbot.main:Arguments: ['--disable-hook-validation', '--renew-hook', '/etc/init.d/httpd restart']
2019-01-24 00:10:03,186:DEBUG:certbot.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#apache,PluginEntryPoint#manual,PluginEntryPoint#nginx,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot)
2019-01-24 00:10:03,206:DEBUG:certbot.log:Root logging level set at 20
2019-01-24 00:10:03,206:INFO:certbot.log:Saving debug log to /var/log/letsencrypt/letsencrypt.log
2019-01-24 00:10:03,251:DEBUG:certbot.plugins.selection:Requested authenticator and installer
2019-01-24 00:10:03,252:DEBUG:certbot.cli:Var renew_hook=/etc/init.d/httpd restart (set by user).
2019-01-24 00:10:03,316:INFO:certbot.renewal:Cert not yet due for renewal
2019-01-24 00:10:03,317:DEBUG:certbot.plugins.selection:Requested authenticator webroot and installer None
#请问这里是需要重新安装“authenticator webroot” ?
2019-01-24 00:10:03,317:DEBUG:certbot.renewal:no renewal failures
请问有什么解决的办法吗?
是lnmp1.4版本吗?如果是的话,建议升级到1.5吧。
1.4的SSL证书依赖太多,稍有不对就会出错。1.5的要简单的多。
你好,seoimo。
我进行到7#的时候为了获取日志记录,删除了当前域名,而后重新添加了同样的域名开启了日志记录,进行到 开启SSL/HTTPS 时 ,上面提示如下错误。
new-authz error: {"type":"urn:acme:error:serverInternal","detail":"Failed to get registration by key","status": 500}
[Thu Jan 17 19:00:15 CST 2019] Please check log file for more details: /usr/local/acme.sh/acme.sh.log
Let's Encrypt SSL Certificate create failed!
真心请求帮助
表示LE服务器返回出错了。删除下之前的域名,试着再重新绑定:
# lnmp vhost add
另外,开启日志不需要删除域名再绑定。
直接编辑域名文件 xxx.com.conf 将日志access-log那行前面的 # 删除,然后重启apache或者lnmp即可。
# vi xxx.com.conf
# lnmp restart
谢谢,已解决
我的博客打不开了,Error establishing a database connection,之前博客用的好好的,phpmyadmin里面的数据库自己消失了,重建一个数据库后可以打开,但是一会数据库又没了。
还有这种操作。。是不是VPS被黑了?