Ubuntu 14.04开启nginx http2支持的方法

再过不到两个月,Ubuntu18.04就要出来了,但是手上还有一些老机器还停留在14.04?:

没有足够的时间和动力来升级这几台老机器,但是一些常用的软件准备顺手升级一下。最基本的自然是升级nginx支持http2. http2的优势可以参见《当我们在谈论HTTP队头阻塞时,我们在谈论什么?》以及《低延迟与用户体验杂谈》

Ubuntu 14.04开启nginx http2支持的前置条件

  1. nginx >=1.9.5
  2. openSSL >= 1.0.2

第一个条件大家一般都不会漏掉。但是第二个条件一般是http2无法成功开启时才发现。这是因为随14.04一起分发的openSSL版本是1.0.1f. 那么要开启http2支持,有两种方式:

  1. 使用他人编译好的ngingx with http2 support package安装;
  2. 升级本地openSSL版本,然后从源码编译安装。

而随Ubuntu 18.04一起分发的openSSL版本为1.1.0g, 因此不存在这个问题。

使用packaege安装(懒人专用)

这里需要注意一下,很多为提供14.04提供nginx安装包的源虽然可以让你安装更高版本的nginx,但是大多是使用openSSL 1.0.1编译的,因此无法支持http2, 比如jessis, nginx mainline为14.04提供的安装包是使用1.0.1编译的,因此不支持http2的。这里我们使用ondrej提供的源。

  • 卸载已经安装的nginx(会保留配置文件,take is easy):

  • 添加ondrej nginx安装源:

如果出现如下错误:

应该是终端编码问题,尝试使用LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/nginx解决。

  • 更新源,并安装:

从源码安装

修改nginx配置开启http2

设置nginx支持http2最关键是在https端口添加http2指令:

一个网站的参考配置模板如下:

小结

nginx开启http2的支持不要忘记了对openSSL最低版本的要求。其实http2已经不再时髦啦,http2+TLS1.3才是未来,可以参见《低延迟与用户体验杂谈》。后面会讲讲docker+nginx开启http2和TLS1.3的方式,这种方式即可以方便的尝试各个nginx版本,同时也不会破坏本地的nginx环境。

基于AWS EC2 & WordPress搭建个人Blog笔记

随着coud computing的发展,越来越多人将自己的平台搬到了云主机上来,尤其是中小、个人站点。对于中小团队以及个人站长而言,对一个云平台的考量,除去价格因素,考虑最多的应该是该云平台的其他配套服务,如海量存储服务、缓存服务、负载均衡服务、邮件服务等。如果只从这两个维度来看,业界的翘楚当推Amazon Web Services (AWS) 「因为总所周知的原因,只能为Google App Engine感到遗憾……」。

两年前就听闻AWS要在天朝建IDC了,可是到现在,也仅仅是上线了中文网站罢了。IDC建在墙内的好处当然是更好快速的访问速度,但是同时也面临着匪夷所思的监管制度。但是这并不影响我们体验AWS提供的优质的服务,从可用性来看,用户过亿的Instagram在墙内使用也是没有什么问题的;从价格上来看,AWS现在注册以后绑定信用卡就可以免费使用一年费使用套餐介绍」,虽然是温水煮青蛙的策略,但是就事情本身来看,还是挺不错的。

下面简单说一下在AWS上使用其EC2建立个人Blog的过程。

1. 建立主机实例

  • 登录管理控制台,进入EC2
  • 选择Launch Instance,我这里选的是亚马逊推荐的Amazon Linux AMI 2013.09.2:

    The Amazon Linux AMI is an EBS-backed, PV-GRUB image. It includes Linux 3.4, AWS tools, and repository access to multiple versions of MySQL, PostgreSQL, Python, Ruby, and Tomcat.

  • 默认是公/私钥认证登录。记得保存好自己下载的私钥。启动主机后,使用默认用户名ec2-user/私钥登录主机:

    ssh -i your_private_key.pem ec2-user@1.1.1.1

    • 亚马逊的控制台自动生成的命令有一个bug,就是他给出的Example连接命令会把你私钥名称中的「空格」直接附上,如果是复制粘贴党,注意自己去除空格。
    • 如果想要通过口令访问主机,可以在通过证书登录后:
      1. 设置ec2-user的密码:sudo passed ect-user
      2. /etc/ssh/sshd_config中将PasswordAuthentication no–>yes
      3. 由于AMI不允许直接使用root登录。如果想允许的话(不推荐这样做,存在安全隐患)可以通过将/root/.ssh/authorized_keys中的如下内容删去:

        command=“echo ‘Please login as the ec2-user user rather than root user.’;echo;sleep 10

      4. 重启ssh服务:service sshd restart

2. 安装apache mysql php

AMI通过yum安装:

yum -y install httpd php mysql mysql-server php-mysql

默认情况下apache和mysql服务不会开机启动。可以通过chkconfig命令设置一下:

chkconfig httpd on
chkconfig mysqld on

3. 设置主机实例的固定IP

最开始使用EC2主机的童鞋可能会觉得亚马逊的“主机每启动一次,主机IP就变化一次”非常坑爹。这个问题可以通过设置Elastic IP与主机实例绑定解决。从细粒度管理角度看,亚马逊这点非但不是缺点,反而提供了良好的带宽接入选择空间和扩展余地。

4. 安装WordPress

WordPress本身的安装非常简单。但是新版的WordPress插件是通过ftp的方式安装的,也就是说你的主机实例需要跑一个ftp server。这里推荐使用vsftp:

yum -y install vsftpd

然后注意设置用户默认ftp目录为WordPress安装目录的顶层目录。编辑/etc/vsftpd/vsftpd.conf,修改local_root=your_path.

WordPress安装插件的时候,如果填写自己的域名无法,那么就填写127.0.0.1。
如果插件下载下来安装失败,那么可能是wp-content/plugins没有写权限,尝试:

chmod -R 777 path_to_your/wp-content/plugins

最后,上线自己的Blog之前别忘了启用gzip压缩提高访问速度,节省带宽。apache可以通过deflate模块实现压缩。向httpd.conf中添加该模块配置信息即可。参考配置:

<IfModule deflate_module>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
</IfModule>

启用gzip压缩后,记得重启apache服务。

可以通过Google的网页在线测试工具对比一下启用压缩前后的变化。怎么样,效果还是挺明显的吧?

 3月1日更新

服务器跑了几天以后,发现服务器每隔一天就崩溃一次。后来发现是因为AWS Linux AMI默认swap大小为0造成的(好奇怪的默认值……)。知道原因以后解决方法就简单了,只需要建立一个swap交换空间即可,大小一般为物理内存两倍。