Coding, Web, Hydrology and more.

另一种思路实现WordPress在Nginx+Varnish环境下的SSL访问

前言

众所周知,Varnish是一款高性能的开源HTTP加速器,由于其内存级缓存的工作性质,Varnish对网站响应速度的提升是显而易见的。

在众多网站采用SSL连接的今天,Varnish就SSL支持的这一方面就有些捉襟见肘了,按照Varnish官方的文档来看,他们目前为止还没有做适配SSL的打算,作者是这样描述他对Varnish适配SSL这件事的看法:

[kbd]That is not one of the things I dreamt about doing as a kid and if I dream about it now I call it a nightmare.[/kbd]

OK,看样子作者是不太想干这件事了,那么强大的Nginx就能接下这个烂摊子了。

在这篇文章发布之前,网上就有很多对Nginx+Varnish适配SSL的教程了,比如说kn007的这篇:

https://kn007.net/topics/varnish-using-nginx-support-ssl/

上面的文章中介绍的实现方式如上图所示,在这篇文章中我想提出一种新的思路,或者说基于上图提出的优化思路。在上图中的思路中,如果我想要实现http跳https,也就是不管什么访问全部都建立https连接,由于80端口被Varnish占用,也就是说用户在以http方式请求网站时,是不经过Nginx的,Varnish本身不支持ssl,那只好在Varnish中建立规则转发到443端口也就是Nginx监听的SSL端口,之后Nginx再反代Varnish,这样是挺浪费资源的。所以干脆让Varnish监听非80端口比如默认的6801,Nginx监听80端口,做个301跳转到https,这样做和前面的方法相比,少了一步Varnish到Nginx的转发,对性能提升还是有些帮助的。

示意图如下:

OK,既然思路有了,现在就Get It Done:

服务器环境:CentOS 7.2 + Nginx 1.10.3

一、Nginx上SSL的配置(如果之前已经在Nginx上配置过SSL直接跳转第二步)

编辑[kbd]/usr/local/nginx/conf/nginx.conf[/kbd]或者[kbd]/usr/local/nginx/conf/vhost/*.conf[/kbd]一般来说编辑虚拟主机的配置文件就好,第一个文件可以放着。

放出本站的conf给大家参考一下,主要就是修改默认的80端口,添加ssl证书还有密钥以及ssl的配置。

现在用service nginx restart重启Nginx就能看到效果了,你可能会问,那现在80端口不是废了,恩是的,80端口的配置在后面会提及。

二、安装Varnish

CentOS or RedHat:

更多系统安装方式:https://www.varnish-cache.org/releases/index.html

三、配置Nginx以协同Varnish

重新打开第一步中编辑的Nginx学主机配置文件,在443端口的ssl配置后追加:

将其他关于缓存规则,wordpress配置的代码加到一个新的代码块中也就是实现前文示意图中提到的后端端口8080,例如:

最后再配置一下80端口301跳转到https,新建一个server代码块:

设置完成后的conf文件应该有类似于以下的代码结构:

service nginx restart重启nginx,如果没有报错那么到这里Nginx的配置就已经完成了。

三、Varnish配置

编辑[kbd]/etc/varnish/default.vcl[/kbd],将里面的内容完全替换成以下代码:

service varnish restart 重启varnish,如果没报错那么对Varnish的配置也完成了。

PS:如果不想让Varnish监听默认的6081端口的话,可以在nginx配置中把6081修改成自己定义的端口,之后再编辑[kbd]/etc/default/varnish[/kbd],将DAEMON_OPTS=”-a :6081修改成DAEMON_OPTS=”-a :自定义端口,CentOS7.X版本则是修改[kbd]/etc/varnish/varnish.params[/kbd]中的VARNISH_LISTEN_PORT

四、WordPress配置

现在网站已经可以通过https访问了,但是有个问题,就是css,js,图片等等都是按照http方式加载的,按照W3C的标准,这种mixed content是不安全的,所以这时候需要在wordpress中进行配置,启用https。

在wp-config.php中添加

最后添加一款控制Varnish缓存的WordPress插件就OK了,因为这次实现的方式比较特殊,经过测试Purge Varnish这款插件能够正常使用,后台对插件进行设置时,Varnish Control Terminal填写127.0.0.1:6802,Varnish Control Key填写[kbd]/etc/varnish/screct[/kbd]中的密钥。

 

Bonjour!

 

About the author

EDLinus

[stay(d) for d in ('determined','diligent','devoted')]

 
By EDLinus
Coding, Web, Hydrology and more.

Meta