目的
了解如何在Ubuntu 18.04上安装Apache,如何配置虚拟主机,设置防火墙以及使用ssl证书进行安全连接
要求
- 根权限
困难
介质
约定
介绍
Apache Web服务器不需要大量演示:Apache基金会发布的开源软件是世界上使用最广泛的Web服务器之一。在本教程中,我们将看到如何安装它,如何调整防火墙配置以允许http和https通信以及如何在Ubuntu 18.04上设置虚拟主机。
安装
在Ubuntu 18.04 Bionic Beaver上安装Apache Web服务器是一个非常简单的过程:
$ sudo apt-get update && apt-get install apache2
Ubuntu安装脚本将负责启动和启用apache2
开机时服务。
防火墙设定
要访问由Apache提供的默认内容,请在运行服务器的同一台机器上,我们仅需启动网络浏览器并导航至localhost
在地址栏中。如果所有设置均正确,则应在页面上显示“效果良好”!信息:
如果在系统上启用了防火墙(应该如此),为了使内容可以从计算机外部访问,我们需要允许端口上的传入流量80
。要运行的命令取决于使用的防火墙管理器。例如,当使用ufw
(Ubuntu的默认设置),我们必须运行:
$ sudo ufw allow http
同样,如果使用firewalld
,我们可以运行:
$ sudo firewall-cmd --permanent --add-service=http && firewall-cmd --reload
请注意,以上命令将对默认的防火墙区域生效。如果要操作另一个,则必须使用--zone
选项。
配置虚拟主机
apache Web服务器可以在同一台计算机上运行多个网站。应该提供服务的每个站点(apache术语中的虚拟主机)必须具有自己的配置。虚拟主机可以基于ip或基于名称。
在本教程中,我们将重点介绍第二种类型,因为它更易于设置并且不需要多个ip地址(基于名称的虚拟主机允许许多网站共享同一地址)。
默认虚拟主机
在Ubuntu上,默认虚拟主机已定义为/etc/apache2/sites-available
目录,在000-default.conf
文件。让我们看一下:
<VirtualHost *:80>
[...]
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
[...]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
[...]
</VirtualHost>
的<VirtualHost>
指令1号线用于对apache用于特定虚拟主机的设置进行分组。我们看到其中定义的第一件事是*:80
指令。这表示虚拟主机使用的IP地址和端口。
可以在同一文件中或通过遵循“每个文件一个虚拟主机定义”方案来定义多个虚拟主机。在这两种情况下,如果客户端请求均未匹配其他虚拟主机,则将第一个定义视为默认定义。
的ServerAdmin
指令3号线是可选的,用于指定出现错误消息时Web服务器将显示的联系地址。通常,我们希望提供一个有效的电子邮件地址作为此指令的参数,因为Web服务器将使用mailto:
以便于与管理员联系。
DocumentRoot
上4号线是必需的,对于虚拟主机配置是必不可少的。该指令的参数必须是有效的文件系统路径。提供的目录将被视为虚拟主机的根目录,并且不得包含结尾的’/’。在这种情况下,文档的根目录是/var/www/html
。如果我们看一下它的内容,就会发现它包含index.html
页面用作我们之前看到的服务器欢迎页面。
最后两条说明8-9行在此virtualhost中提供的是ErrorLog
和CustomLog
。通过使用第一个,我们设置服务器将发生的错误记录到的文件。第二个命令用于记录以指定格式发送到服务器的请求(您可以使用这个作为有关日志格式的in-depth知识的参考)。
创建一个新的虚拟主机
我们看到了如何定义默认虚拟主机。现在,假设我们想使用我们的Web服务器为另一个网站提供服务:我们必须定义一个新的虚拟主机才能实现我们的目标。
如上所述,虚拟主机文件必须在/etc/apache2/sites-available
目录(至少在基于debian的发行版中):因此,我们将在此处创建文件。在此之前,我们要创建要用作目录的目录document root
,并创建一个基本页面,以便在我们到达网站时显示:
$ sudo mkdir /var/www/example && echo "Welcome to example!" > /var/www/example/index.html
现在,我们可以继续配置虚拟主机:
<VirtualHost *:80>
DocumentRoot /var/www/example
ServerName www.example.local
</VirtuaHost>
这是运行虚拟主机所需的最低配置。在这里我们可以看到一个新的指令,ServerName
:这就是定义我们的虚拟主机的原因。让我们将此文件另存为example.conf
。要激活我们的虚拟主机,我们使用a2ensite
命令:此命令所做的只是在文件中创建符号链接/etc/apache2/sites-enabled
目录:
$ sudo a2ensite example.conf
之后,我们必须重新加载服务器配置:
$ sudo systemctl reload apache2.service
我们定义了虚拟主机,但是由于这是一项测试,因此我们没有dns entry
与之相关联,要验证配置是否有效,我们必须在/etc/hosts
我们试图从中访问站点的计算机的文件。
$ sudo echo "192.168.122.241 www.example.local" >> /etc/hosts
如果没有此行,(并且没有DNS条目)将无法将服务器的地址与我们的虚拟主机的名称相关联,而直接使用服务器ip,则将”trigger”设置为默认虚拟主机。
从客户端计算机,如果我们现在导航至”www.example.local”,我们应该看到上面设置的最小页面:
设置SSL
SSL,简称Secure Sockets Layer
正是这项技术使我们能够加密客户端与服务器之间的连接所涉及的数据。使用ssl证书时,https
(安全的超文本传输协议)将替换网址中的http。
SSL证书由证书颁发机构颁发,该证书颁发机构作为可信任的第三方,可以确保有人声称自己确实在互联网上。 SSL证书可能非常昂贵,但是有两种主要的获取证书的方法:创建自签名证书或从中获取证书Let's encrypt
。
生成self-signed SSL证书
尽管生成self-signed证书不是一件容易的事,并且在您只想实现加密时很有用,但是在证书本身必须由受信任的第三方签名的情况下,它是不可用的。我们可以使用以下方法生成self-signed证书:openssl
效用:
$ sudo openssl req -x509 \
-days 365 \
-sha256 \
-newkey rsa:2048 \
-nodes \
-keyout example.key \
-out example-cert.pem
让我们看看该命令的作用。我们遇到的第一个选择-x509
修改命令的行为,以便它生成self-signed证书而不是证书请求。
用-days
,我们以天为单位设置证书的有效性。下一个提供的选项是-newkey
:使用它我们创建一个新密钥,在这种情况下rsa
密钥,大小为2048位。对于我们的测试用例,我们不想加密私钥文件,因此我们使用了-nodes
。如果省略此选项,则存储密钥的文件将受到密码的保护,每次重新启动Web服务器时,都会提示我们插入该密码。
用-keyout
和-out
我们指定文件分别写入生成的密钥和证书。启动命令时,将提示我们回答一些问题,然后将生成密钥和证书。
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:IT
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:Milan
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Damage Inc.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.example.local
Email Address []:
下一步是将我们生成的密钥和证书复制到/etc/ssl/private
和/etc/ssl/ssl-certs
目录分别:
$ sudo mv example-cert.pem /etc/ssl/certs
该证书是公开的,因此不需要特殊许可。现在,关键是:
$ sudo mv example.key /etc/ssl/private
调整密钥文件的权限很重要。如果我们检查/etc/ssl/private
文件夹,我们可以看到它属于root
用户和ssl-cert
组,它有710
作为权限,这意味着尽管所有者拥有全部权限,但组所有者只能访问它并列出其内容,而对其他人则不允许任何权限:
$ ls -ld /etc/ssl/private
drwx--x--- 2 root ssl-cert 4096 Mar 16 11:57 /etc/ssl/private
让我们相应地更改密钥文件权限,为所有者提供读写权限,以及该组的只读权限:
$ sudo chown root:ssl-cert /etc/ssl/private/example.key
$ sudo chmod 640 /etc/ssl/private/example.key
要使用我们的证书,我们现在必须启用ssl apache模块。我们通过使用a2enmod
命令:
$ sudo a2enmod ssl
我们就快到了。现在是时候修改我们的虚拟主机并以这种方式设置它了:
<VirtualHost *:443>
DocumentRoot /var/www/example
ServerName www.example.local
# Enable ssl engine
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example-cert.pem
SSLCertificateKeyFile /etc/ssl/private/example.key
</VirtualHost>
港口443
上1号线是用于https的端口(代替用于HTTP的端口80)。我们还添加了SSLEngine on
指示6号线,这很漂亮,self-explanatory。
终于在8-9行我们使用以下命令指定了证书和密钥文件的路径SSLCertificateFile
和SSLCertificateKeyFile
说明。现在,按照说明打开教程开始时使用的防火墙端口,但是这次允许https
服务:
$ sudo ufw allow https
最后,重新加载apache配置:
$ sudo systemctl reload apache2
全部做完。现在,如果从客户端,我们导航到https://www.example.local
地址,我们应该看到Web服务器警告我们所使用的证书不安全(因为它是自信任的)。但是,这是我们设置成功的标志,并且客户端和服务器之间的流量将被加密(您需要添加证书例外才能使用它)。
设置让我们加密
商业证书和self-signed证书的替代方案由“让我们加密”表示。让我们加密是一个免费,自动和开放的证书颁发机构;它的目标是在没有任何人工干预的情况下,自动获得浏览器信任的证书。
这可以通过使用ACME
协议和certificate management agent
在服务器上运行。
要获得证书,我们必须证明我们对要使用证书的域具有控制权。如果我们在服务器上没有 shell 程序访问权限,则应联系我们的服务提供商以让我们代表我们激活加密,但是服务配置面板中可能有专门的部分。
相反,如果我们确实可以通过 shell 访问该服务器,则首先必须安装certbot
ACME客户。在Ubuntu 18.04上安装certbot只需运行即可:
$ sudo apt-get update && apt-get install certbot python-certbot-apache
certbot软件包随附一个systemd timer
该单元每天将运行certbot两次,以使证书保持最新状态。获得证书非常简单:
$ sudo certbot --apache -m <administrator-email> -d <domain>
显然,要使其正常工作,该域必须正确指向我们的公共可访问服务器IP。 Certbot会提示您一些问题来调整配置,如果一切顺利,则证书和密钥应保存到/etc/letsencrypt/live/
目录。只需调整您的虚拟主机文件以指向这些文件,就可以完成!