Ubuntu Server下Apache配置文件之折腾

上个周末为了在服务器上装上HTTPS,也是蛮拼的啊,一方面由于本人愚笨,另一方面还是Apache上有些设计不是很人性化,星期天几乎是从下午折腾到半夜。

因为也不知道自己是怎么想的,把所有文件从DropBox上撤了下来,准备自己私建一个网盘。虽然我的东西里面没有那种可能会被NSA盯上的绝密资料,但依然觉得把私人文件托管到公有云上有一种长期被人偷窥的感觉(可能是我多虑了吧~~)。于是乎,就开始四处搜寻私有云方案。

OwnCloud似乎是一个很不错的平台,开源,而且还是来自KDE社区。所以吧,看我博客反正没什么访问量,流量费着也是费着,也就让这个私人网盘和我的博客一起挤一挤呗~~因为是私人网盘,安全性自然是第一位考虑的,HTTPS总不能没有。也正好,StartSSL可以免费搞到认证的证书,避免了用自签名导致那不爽的浏览器报警~~

我的博客服务器操作系统是Ubuntu Server,网页服务器是Apache。通常安装一个OpenSSL模块再启用HTTPS应是件挺简单的事。但是,那么,问题来了~~在把SSL配置好后Apache竟然不能正常工作!于是,接下来的五个小时便陷入了折腾的暴走状态。。。。。。

首先来说一下,一开始觉得问题应该是出在配置文件上,在启用SSL后,80和443端口的网页都无响应(我的博客是80端口下的普通HTTP),但是关闭SSL后80端口的服务恢复正常。如果依然启用SSL,但把443端口的VirtualHost注释掉,80端口也能恢复正常。而在Apache不能工作的状态下如果运行 service apache2 restart 会提醒Apache不能bind 80 端口和0.0.0.0:80地址,而运行 service apache2 stop 会提醒无法终止服务。对,这玩意儿就是这么诡异,开启HTTPS后居然把80端口给冲突了,而且还停不了服务。

那么来看看Ubuntu Server下Apache的配置文件吧,貌似在RHEL下就一个 /etc/httpd/httpd.conf 但是在Ubuntu下除了主配置文件 /etc/apache2/apache2.conf 外还有一大堆文件,目录大致如下:

/etc/apache2/
– apache2.conf
– ports.conf
– envvars
– mods-avaliable/

– mods-enabled/

– conf-avaliable/

– conf-enabled/

– sites-avaliable/

– sites-enabled/

如果仔细看一下apache2.conf的话就会发现其实真正被Apache读取的配置文件就它一个,而其他的文件都是被引用进apache2.conf的,比如这些:

解释一下,在 /etc/apache2/ 目录下,ports.conf 是用来配置监听的端口的:

envvars是Apache的环境变量,比如Apache Deamon的启动脚本地址,用户和组,语言等等。

mods-avaliable目录下的内容并不会被apache2.conf引用,它里面放的是所有已安装的Apache功能模块的配置文件。

而mods-enabled目录是会被引用的,它里面都是指向mods-avaliable里面的部分文件的链接,出现在里面的链接就相当于相应的功能模块被启用了。

conf-avaliable和conf-enabled的关系和前者一样,里面是Apache的一些更细分的配置,比如 conf-avaliabled/security.conf 就是详细配置Apache的安全信息和html目录权限的。

最后的sites-avaliable和sites-enabled是VirtualHost配置文件目录,两个文件夹的关系也和前面两对一样。通过VirtualHost可以在一台Apache上面部署多个HostName不同的网站。服务器在相应HTTP请求的时候会读取客户端的header,获取其中的HostName一项,来匹配VirtualHost。如果在相应客户端请求的时候无法找到与header里面的HostName相同的项,那么Apache将默认将配置文件里面第一个VirtualHost匹配过去,格式:

在开启OpenSSL这个环节,可以自己从mods-avaliable里面把ssl.conf和ssl.load链接到mods-eabled里面,但Apache提供了一个更方便的工具:

同样的,启用443端口的VirtualHost配置文件可以自己从sites-avaliable把default_ssl.conf链到sites-enabled里面,也可以用

当时问题的焦点就在sites-avaliable目录,在配置完HTTPS后这个目录下会有两个链接:000-default.conf和default-ssl.conf,分别分管80端口和443端口VirtualHost,而关闭后者,服务器正常,开启则不能工作。在Google了大量别人的博客后也没发现这类问题,甚至以为自己碰到了Bug。于是脑袋再一抽~~把数据库一备份,毅然重装系统~~~~(因为托管到AWS上,重装系统还是挺快)。然后恢复了所有数据库和配置文件之后用自签名证书一测试,嘿!好了~~Function well~~似乎真是碰到Bug了。当再把StartSSL的第三方证书装上去,原来的问题又出现了。。。

这时才意识到是证书出了问题,再去StartSSL官网一看,原来从StartSSL直接拿到的密钥对的私钥本身是加密过的,要在服务器上使用,要先解密一次,如果直接部署到Apache上Apache会在启动的时候要求输入私钥的密码,但是因为Apache的启动脚本是由系统自己在后台运行的,所以在用户的前台BASH上看不到Apache的密码输入提示,所以。。。。。。

一切都是折腾

Leave a Reply

Your email address will not be published. Required fields are marked *