Webmin-管理秘籍-全-

Webmin 管理秘籍(全)

原文:annas-archive.org/md5/84cf2e9ed80568ee621e169b740dc335

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

欢迎阅读 Webmin 管理员食谱。本书提供了超过一百个实用的解决方案,帮助你通过便捷的 Webmin 工具解决现实世界中的系统管理任务。

过去,运行一台联网的私人服务器通常是昂贵的,并且主要面向那些雇佣了专业系统管理员或外包了管理工作的较大公司。得益于虚拟化软件的广泛采用,高效的私人服务器现在已经能够为任何具备相应技能的人所用。无论你是开发人员,想要优化你的 Web 应用程序性能,还是初创公司,计划为你的系统实施新的软件架构,你都很可能需要配置和运行自己的服务器。

没有什么比拥有合适的工具更有价值,而 Webmin 是你工具箱中的一项出色补充。它可以帮助你快速启动和运行服务器,监控服务器状态,并在服务器需要你关注时通过电子邮件通知你。Webmin 通过抽象系统命令和配置文件语法的复杂性,取而代之的是一个友好的图形化 Web 界面,从而简化了许多系统管理任务。

Webmin 作为一款图形化应用程序,其轻量级特性得益于它不需要在系统上运行桌面环境。你也不需要复杂的桌面共享解决方案来使用它。由于它是一个 Web 应用程序,你只需要一个浏览器就可以充分利用 Webmin。其 Web 特性还使得 Webmin 对缓慢或不稳定的互联网连接具有更好的适应性。总体来说,它是一个非常适合远程管理服务器的工具。

以下是 Webmin 可以做的一些功能:

  • 在你的系统上安装软件

  • 管理用户

  • 配置防火墙

  • 执行命令并设置定时执行命令

  • 监控和分析系统日志并发送警报

  • 管理文件、文件夹和权限

  • 配置网络磁盘共享

  • 执行自动备份

  • 配置 Apache 的虚拟网站服务器

  • 使用 MySQL 或 PostgreSQL 管理数据库

  • 设置 Web 应用程序

  • 配置电子邮件服务器

在本书中,我们将讨论前面列表中的所有主题。我们将介绍从全新安装到完整的 Web 应用服务器的服务器设置过程,涵盖 Apache、数据库管理系统和电子邮件软件的运行。我们将讲解如何设置使用多种脚本语言编写的 Web 应用程序。还会介绍如何设置 Webmin 来监控你的系统并提醒你潜在的系统问题。

本书内容概览

第一章, 设置您的系统,涵盖了让 Webmin 启动并运行的第一步。在本章中,我们将讨论如何设置 Webmin 本身,如何监控其操作以及如何撤消通过 Webmin 进行的更改。本章还涵盖了在系统上安装其他软件的过程,选择哪些软件在启动时启动以及如何检查安装软件包在系统上的作用。

第二章, 用户管理,涵盖了与您系统用户相关的主题。本章讨论了添加和编辑系统用户或组,允许这些用户访问 Webmin。我们还将演示如何使用 Webmin 从一个服务器导出所有用户列表,并将其帐户导入另一系统。本章最后介绍了 Usermin,Webmin 的用户界面伴侣。

第三章, 保护您的系统,涉及基本的系统安全,包括使用防火墙锁定系统以及通过加密隧道连接系统服务。在将服务器放入互联网之前,我们将逐一检查您应该采取的安全预防措施。

第四章, 控制您的系统,展示了如何使用 Webmin 通过 Web 浏览器远程执行系统上的命令。在本章中,我们还将讨论如何设置 cron 作业以定期执行命令,延迟命令执行至选择的时间,并设置一个 Web 面板,便于偶尔需要运行的任务访问。

第五章, 监控您的系统,讨论了如何使用 Webmin 监视您的系统甚至其他服务器。我们将演示如何设置 Webmin 以处理当您的计算机上的服务崩溃时的情况 —— 它可以向您发送电子邮件提醒或尝试自动重启服务。在本章中,我们还将讨论如何通过日志文件分析系统状态以及配置日志轮换例程。

第六章, 管理您系统上的文件,涵盖了通过 Webmin 进行远程文件管理的相关主题。在本章中,我们还将讨论如何将您的系统设置为文件共享服务器(CIFS、NFS、SFTP 和 FTP),并演示如何使用 Webmin 将您的系统连接到远程文件共享(CIFS 和 NFS)。

第七章, 备份您的系统,涉及对重要文件和数据库进行备份以供安全保管。我们将演示如何使用 Webmin 自动化此过程,并按计划运行,并进行异地备份。

第八章,运行 Apache Web 服务器,介绍了与管理 Web 服务器相关的主题。我们将设置和配置 Apache;创建虚拟服务器、受密码保护的网站、HTTPS 网站;并检查传入的流量和错误日志。

第九章,运行 MySQL 数据库服务器,以及 第十章,运行 PostgreSQL 数据库服务器,涵盖了设置和运行数据库服务器相关的任务。我们将演示如何使用 Webmin 创建和编辑数据库、备份它们并管理数据库用户。我们还将展示如何通过加密隧道安全地连接到数据库,以及如何安装基于 Web 的数据库管理工具。

第十一章,运行 Web 应用程序,展示了如何将所有组件组合在一起以运行 Web 应用程序。我们将演示如何设置系统来运行用任何脚本语言编写的 Web 应用程序,但我们将主要关注 PHP 和 Python。我们将提供安装流行应用程序(如 WordPress、Drupal 和 Django)的方法。

第十二章,设置电子邮件服务器,涵盖了与电子邮件相关的主题。我们将演示如何将系统设置为电子邮件服务器,用于处理收发邮件。我们还将讨论如何处理垃圾邮件。

本书所需的内容

本书中将涉及系统管理,意味着你需要一个系统来进行管理。如果你租用一个虚拟专用服务器VPS)并使用全新安装的 Linux(最好是 Debian 或 CentOS)进行设置,你将从本书中获得最大收益。如今 VPS 服务器非常便宜,价格从每月 5 美元起。如果你更喜欢在本地进行实验,可以在免费的 VirtualBox 平台中设置虚拟机。你还应该配置一个终端仿真器或 SSH 客户端,通过它可以访问服务器来执行命令和编辑文件。

本书中提供的所有指令都适用于 Linux,因此,如果你使用的是 Linux 操作系统,你将能够从本书中获得最大收益。建议使用基于 Debian 或 RedHat 的发行版,但 Webmin 支持的其他 Linux 版本也应该可以使用。许多这些方法同样适用于其他类 Unix 系统(如基于 BSD 的 FreeBSD 或 OS X),但 Webmin 对这些平台的支持在某些方面可能有限。Webmin 支持的操作系统完整列表可以在线查阅:

www.webmin.com/support.html

提示

具有管理员权限的超级用户

为了执行本书中描述的大多数任务,你需要在系统上具有管理员权限。

在类 Unix 操作系统(如 Linux)上,主要的系统管理员通常被称为root。在某些系统上,你可以以超级用户身份登录。如果可以这样做,你可以在系统上做任何事情,这使得潜在的错误变得更加危险。其他一些系统(如 Ubuntu)不允许以 root 身份登录,因此你需要以具有超级用户(sudo)权限的普通用户身份登录。

具有超级用户权限的用户和组定义在/etc/sudoers文件中。在本书中,我们将通过在命令前加上sudo命令来标记需要管理员权限的命令,例如:

$ sudo apt-get install webmin

请注意,如果你已经以 root 身份登录,就不需要使用这个额外的命令,但保持以普通用户身份登录是一种良好的做法。

如果你无法在系统上找到/etc/sudoers文件,你需要以 root 身份登录并安装sudo包。

请记住,Webmin 在你的系统上以 root 身份运行,这意味着它有可能会破坏系统。书中的解决方案已进行测试,但每个系统都有不同,无法保证它们总是按预期工作。在将这些解决方案应用到生产系统之前,应该先在备用机器上进行测试。在更改生产系统配置之前,请确保你了解自己正在做什么。

本书适合人群

本书适合那些决定管理 Linux 系统,并希望学习 Webmin 如何帮助简化管理任务的人。假设你已经有一定的 Linux 使用经验,但不必完全了解其中的细节。如果你是初学者,本书是一个很好的入门指南;如果你是专业人员,本书将重点介绍 Webmin 如何简化你的工作。

在使用 Webmin 时,你可能会遇到一些与操作系统特定版本不兼容的情况。你应当通过 GitHub 向 Webmin 的作者报告此类问题。确保提供 Webmin 的确切版本号、操作系统及其他软件的版本号,并附上重现问题的详细步骤。Webmin 的 GitHub 问题跟踪器可以在以下网址找到:github.com/webmin/webmin/issues

约定

本书中,你将会看到几种不同的文本样式,用于区分不同类型的信息。以下是这些样式的示例,并解释它们的含义。

文本中的代码词、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚拟 URL 以及用户输入都将按如下方式显示:“上述账户和权限将允许dbuser连接到并完全控制testdb数据库。”

代码块设置如下:

create:groupname:passwd:gid:member,member,...

当我们希望引起你注意某个代码块的特定部分时,相关行或项目会以粗体显示:

create:username:passwd:uid:gid:realname:homedir:shell:min:max:warn:inactive:expire
modify:oldusername:newusername:passwd:uid:gid:realname:homedir:shell:min:max:warn:inactive:expire
delete:username

任何命令行输入或输出将按如下方式书写:

$ perl -le'@chars=(a..z,A..Z,0..9,_);$p.=$chars[rand(@chars)] while($i++<22);print $p'

新术语重要词汇以粗体显示。您在屏幕上看到的文字,例如菜单或对话框中的内容,出现在文本中如下:“点击创建按钮以创建账户”。

注意

警告或重要说明以框的形式出现。

提示

提示和技巧会以这样的方式出现。

读者反馈

我们始终欢迎读者的反馈。告诉我们您对本书的看法——您喜欢的部分或可能不喜欢的部分。读者反馈对我们开发让您真正受益的书籍至关重要。

若要向我们提供一般反馈,请发送电子邮件至<feedback@packtpub.com>,并通过邮件主题提及书名。

如果您在某个领域有专业知识,并且有兴趣撰写或参与书籍创作,请查看我们在www.packtpub.com/authors上的作者指南。

客户支持

现在,既然您已经成为 Packt 书籍的骄傲拥有者,我们提供了许多帮助您充分利用购买的内容。

勘误表

虽然我们已经尽最大努力确保内容的准确性,但错误难免发生。如果您在我们的书籍中发现错误——可能是文本或代码错误——我们将非常感激您向我们报告。通过这样做,您可以避免其他读者的困扰,并帮助我们改进后续版本。如果您发现任何勘误表,请通过访问www.packtpub.com/submit-errata,选择您的书籍,点击勘误表 提交 表单链接,并输入勘误的详细信息。一旦您的勘误被验证,您的提交将被接受,勘误将上传至我们的网站,或添加到该书勘误表的现有列表中。任何现有的勘误表可以通过选择您的书名从www.packtpub.com/support查看。

盗版

互联网上的版权侵权问题在所有媒体中一直存在。我们在 Packt 非常重视版权和许可的保护。如果您在互联网上发现我们作品的任何非法复制品,请立即提供该位置地址或网站名称,以便我们采取措施。

请通过<copyright@packtpub.com>与我们联系,并提供涉嫌盗版材料的链接。

我们感谢您帮助我们保护作者的权益,以及让我们能够为您提供有价值的内容。

问题

如果您在书籍的任何方面遇到问题,可以通过<questions@packtpub.com>与我们联系,我们将尽力解决。

第一章:设置系统

本章我们将涵盖以下主题:

  • 在基于 Debian 的系统上安装 Webmin

  • 在基于 RPM 的系统上安装 Webmin

  • 在另一系统上安装 Webmin

  • 连接到 Webmin

  • 安装额外的 Webmin 模块

  • 监控 Webmin 的操作

  • 控制系统启动时哪些服务被启动

  • 检查已安装的软件包

  • 安装软件包

  • 将已安装的包更新到最新版本

  • 启用 Webmin 发送电子邮件

  • 获取新版本软件包发布时的电子邮件通知

  • 阅读已安装软件的文档

介绍

Webmin 是一个开源的基于 Web 的系统配置工具,主要使用 Perl 编写。由于其基于 Web 的特性,Webmin 可以让你从任何运行浏览器的计算机上远程控制你的系统。它允许你控制系统配置的多个方面,例如管理用户、安装额外软件、配置服务、控制访问权限和监控系统活动。

本章将专注于安装 Webmin,并展示如何使用它来执行与安装、升级和运行系统上其他软件相关的任务。

在基于 Debian 的系统上安装 Webmin

在基于 Debian 的系统上安装 Webmin(如 Ubuntu 或 Linux Mint)非常简单,因为我们可以依赖出色的包管理系统 高级包管理工具 (APT) 。APT 会自动解析并安装依赖关系,同时确保在进行系统更新时,Webmin 会自动更新。

如何操作...

要安装 Webmin,执行以下步骤:

  1. Webmin 并不是标准的 Debian 软件包仓库的一部分,因此你的第一步是将 Webmin 仓库的 URL 添加到你的包源文件中。用文本编辑器打开 /etc/apt/sources.list 文件,并添加以下内容:

    deb http://download.webmin.com/download/repository sarge contrib
    deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib
    

    提示

    在大多数系统中,vi 文本编辑器是默认安装的,但如果你之前没有使用过它,可能会有些困难。如果你想使用一个更易上手的编辑器,可以尝试 nano。你可以通过以下命令安装它:

    $ sudo apt-get install nano
    
    

    安装完成后,你可以使用 nano 编辑 sources.list 文件,方法是执行以下命令:

    $ sudo nano /etc/apt/sources.list
    
    
  2. 我们还需要将 Webmin 仓库的 GPG 密钥添加到 APT 用来验证软件包的密钥列表中。这可以通过执行以下命令来完成:

    $  wget -qO - http://www.webmin.com/jcameron-key.asc | sudo apt-key add -
    
    
  3. 你现在可以刷新 APT 缓存,使其包括 Webmin 仓库的内容。可以通过以下命令来实现:

    $ sudo apt-get update
    
    
  4. 在处理完这些前提条件后,你可以通过以下命令安装 Webmin:

    $ sudo apt-get install webmin
    
    

它是如何工作的...

Webmin 提供了一个在线软件源,包含与 Debian 系统兼容的 DEB 安装包。我们需要将该软件源的地址提供给系统,以便它能够利用该资源。可用的软件源列表保存在 /etc/apt/sources.list 文件以及存储在 /etc/apt/source.list.d/ 目录下的其他 *.list 文件中。

每个软件包都有加密签名,以确保即使有人入侵了软件源并上传伪装成 Webmin 的软件包,我们也不会意外地安装它。我们通过 wget 下载了验证此签名所需的公钥,并使用 apt-key add 命令将其添加到受信任的密钥列表中。

GNU 隐私保护GPG)是一个开源的替代 Pretty Good PrivacyPGP),它是一个提供加密和身份验证功能的加密软件套件。每个 Webmin 软件包都包含 GPG 加密签名,该签名只能使用 Webmin 作者 Jamie Cameron 保密的私钥生成。一个对应的公钥是公开的,可以用来验证该签名是否是使用该私钥生成的。如果软件包代码在签名后被修改,即便是一个位的变化,签名也将不再匹配。这确保了在 Webmin 从作者传输到你的系统的过程中没有人篡改它。APT 会自动检查签名,我们只需要提供 Webmin 的公钥。

提示

如果你想更加小心,可以检查你导入的公钥是否确实属于 Jamie Cameron。运行以下命令并验证其输出中是否包含相同的密钥指纹:

$ sudo apt-key fingerprint
/etc/apt/trusted.gpg
--------------------
pub   1024D/11F63C51 2002-02-28
 Key fingerprint = 1719 003A CE3E 5A41 E2DE  70DF D97A 3AE9 11F6 3C51
uid                  Jamie Cameron <jcameron@webmin.com>

通过更新 APT 缓存,我们确保系统能够识别新软件源中的软件包。然后,我们可以安装 Webmin。APT 不仅会解决依赖关系并安装 Webmin 软件包,还会安装它所需的其他组件,包括 Perl 编程语言等。

还有更多...

Webmin 还提供了一个 .deb(Debian 软件包)文件,可以手动下载并安装。如果因为某些原因你想以这种方式安装,需要按照以下步骤操作:

  1. 访问 Webmin 的下载页面 www.webmin.com/download.html,并复制当前 Debian 包的地址。该软件包的文件名为 webmin_NNN_all.deb,其中 NNN 表示当前的版本号。

  2. 使用 wget 下载该软件包:

    $ wget http://prdownloads.sourceforge.net/webadmin/webmin_NNN_all.deb
    
    
  3. 首先,使用以下命令安装 Webmin 所依赖的所有软件包:

    $ sudo apt-get install perl libapt-pkg-perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl apt-show-versions python
    
    
  4. 然后,运行以下命令从软件包文件中安装 Webmin:

    $ sudo dpkg --install webmin_NNN_all.deb
    
    

    提示

    系统可能会提示某个 Webmin 所依赖的包缺失。例如,你可能会看到如下错误信息:

    dpkg: dependency problems prevent configuration of webmin:
     webmin depends on PACKAGE-NAME; however:
     Package PACKAGE-NAME is not installed.
    
    

    如果看到此错误,应该在安装 Webmin 之前先安装 PACKAGE-NAME 所指定的包。

另见

有关在基于 Debian 的系统上安装 Webmin 以及 APT 包管理的一般信息,可以在以下 Webmin 和 Debian 网站上找到:

在基于 RPM 的系统上安装 Webmin

在基于 RPM 的系统上安装 Webmin,例如 RHEL、Fedora、CentOS 或 openSUSE,与在基于 Debian 的系统上安装一样简单。在这里,我们将依赖同样出色的包管理系统——Red Hat Package ManagerRPM)和yum工具。Yum可以自动解析和安装依赖项,并确保在进行系统更新时,Webmin 也会自动更新。

在基于 SUSE 的系统上,您也可以使用yum工具,但它默认并未安装。在这些系统上,使用zypper命令行工具或 YaST 界面可能更为方便。在本食谱中,我们将提供zypper作为yum命令的替代方法,供 SUSE 系统使用。

如何操作...

安装 Webmin,请按照以下步骤操作:

  1. 虽然 Webmin 在多个系统中都有提供,但其包通常不会保持最新。我们将通过创建描述仓库的文件,将 Webmin 的仓库添加到系统中。创建路径为/etc/yum.repos.d/webmin.repo的文件,并向其中添加以下内容:

    [Webmin]
    name=Webmin Distribution Neutral
    #baseurl=http://download.webmin.com/download/yum
    mirrorlist=http://download.webmin.com/download/yum/mirrorlist
    enabled=1
    
    

    提示

    在大多数系统上,vi 文本编辑器默认已安装,但如果您之前没有使用过它,可能会有点难度。如果您想使用一个易于操作的编辑器,可以尝试 nano。您可以通过执行以下命令来安装它:

    $ sudo yum install nano
    
    

    安装后,您可以使用 nano 编辑webmin.repo文件,通过以下命令进行编辑:

    $ sudo nano /etc/yum.repos.d/webmin.repo
    
    

    注意

    在基于 SUSE 的系统上,您无需手动编辑仓库文件。您可以通过执行以下命令来添加 Webmin 的仓库:

    $ sudo zypper addrepo -f http://download.webmin.com/download/yum "Webmin Distribution Neutral"
    
    
  2. 我们还需要将 Webmin 仓库所使用的 GPG 密钥添加到 RPM 用于认证包的密钥列表中。可以通过执行以下命令完成此操作:

    $ wget http://www.webmin.com/jcameron-key.asc
    $ sudo rpm --import jcameron-key.asc
    $ rm jcameron-key.asc
    
    
  3. 现在,您可以刷新yum缓存以包括 Webmin 的仓库。可以通过以下命令完成此操作:

    $ sudo yum makecache
    
    

    注意

    在基于 SUSE 的系统上,执行以下命令:

    $ sudo zypper refresh
    
    
  4. 完成这些准备工作后,您可以使用以下命令安装 Webmin:

    $ sudo yum install webmin
    
    

    注意

    在基于 SUSE 的系统上,执行以下命令:

    $ sudo zypper install webmin
    
    

它是如何工作的...

使用yum安装 Webmin 的原理与在 Debian 系统上使用apt-get安装 Webmin 完全相同。请参考前一章节中的它是如何工作的...部分。

还有更多...

Webmin 也提供了一个可以手动下载并安装的 RPM 包。如果因为某些原因您希望通过这种方式安装,您需要按照以下步骤操作:

  1. 访问 Webmin 的下载页面,网址为 www.webmin.com/download.html,并复制当前 RPM 包的地址。包文件将命名为 webmin-NNN.noarch.rpm,其中 NNN 表示当前版本号。

  2. 使用 wget 下载包:

    $ wget http://prdownloads.sourceforge.net/webadmin/webmin-NNN.noarch.rpm
    
    
  3. 然后,运行以下命令从包中安装 Webmin:

    $ sudo yum localinstall webmin-NNN.noarch.rpm
    
    

注意

在基于 SUSE 的系统上,执行以下命令:

$ sudo yast --install webmin-NNN.noarch.rpm

参见

关于在基于 RPM 的系统上安装 Webmin 的更多信息,请参阅以下 Webmin 网站和维基:

在另一台系统上安装 Webmin

即使您的系统不使用 Debian 或 RPM 包管理器,您的发行版仍可能提供 Webmin 包。例如,Arch Linux 和 Gentoo 提供 Webmin 包,而 FreeBSD 提供 Webmin 包和端口。

如果您的系统没有提供 Webmin 包,您可以使用本文档中概述的步骤在类 Unix 系统上(如 Linux、BSD 和 OS X)安装 Webmin。

注意

可以在 Webmin 的网站上找到支持的操作系统的完整列表:

www.webmin.com/support.html

准备工作

在安装 Webmin 之前,请确保您的系统上已安装 Perl 版本 5。您可以使用以下命令验证这一点:

$ perl --version

为了启用连接的 SSL 加密,您应安装 Perl 模块 Net::SSLeay。您可以使用以下命令验证是否已安装。如果未安装 Net::SSLeay,则会报错。如果已安装,该命令将不会生成任何输出。

$ perl -e "use Net::SSLeay"

如何操作...

执行以下步骤安装 Webmin:

  1. 访问 Webmin 的下载页面,网址为 www.webmin.com/download.html

  2. 复制到最新版本的 Unix tar/gzip 格式包的链接。链接将类似于以下内容,只是 NNN 需要替换为当前版本号:prdownloads.sourceforge.net/webadmin/webmin-NNN.tar.gz

  3. 使用 wget 下载包:

    $ wget http://prdownloads.sourceforge.net/webadmin/webmin-NNN.tar.gz
    
    
  4. 使用以下命令解压缩存档:

    $ tar -xzf webmin-NNN.tar.gz
    
    
  5. 进入提取的目录,并通过以下命令启动交互式安装脚本:

    $ cd webmin.NNN
    $ sudo ./setup.sh /usr/local/webmin
    
    
  6. 将会询问您一系列问题。对于以下问题,您可以按 Enter 接受默认建议的答案。在下面的提示行中,默认值以括号形式提供:

    Config file directory [/etc/webmin]: 
    Log file directory [/var/webmin]: 
    Full path to perl (default /usr/bin/perl): 
    Web server port (default 10000): 
    
    
  7. Webmin 将尝试检测您操作系统的名称和版本。确保此信息正确;否则,Webmin 可能无法正常工作。检测到的系统版本将显示在类似以下行中:

    ***************************************
    Operating system name:    Mac OS X
    Operating system version: 10.9
    ***************************************
    
    
  8. 在以下提示处为第一个 Webmin 管理员用户选择用户名和密码:

    Login name (default admin): 
    Login password: 
    Password again: 
    
    
  9. 对以下问题回答 yes (y):

    Use SSL (y/n): y
    Start Webmin at boot time (y/n): y
    
    
  10. 安装完成后,你可以删除 webmin-NNN.tar.gz 压缩包以及用于安装的解压后的 webmin-NNN 文件夹。

它是如何工作的...

Webmin 安装脚本能够在大多数类 Unix 操作系统上安装它。

在启动安装脚本时,我们指定了希望将 Webmin 的程序文件安装在 /usr/local/webmin 路径下。如果你想将它安装到其他位置,可以使用不同的路径。

Webmin 在安装过程中会询问你一系列问题。例如,它会询问你将配置文件存储在哪里(默认存储在 /etc/webmin/)和日志文件存储在哪里(默认存储在 /var/webmin/)。这些位置可以更改,但默认值在大多数系统中都能正常工作。

你还需要指定第一个 Webmin 用户的用户名和密码。这个用户将通过 Webmin 完全控制你的系统,并能够添加更多的用户账户。

另请参见

你可以在 Webmin 的官网上找到更多关于安装的信息:www.webmin.com/tgz.html

寻找适合你系统的 Webmin 软件包。以下是一些链接:

连接到 Webmin

启动 Webmin 所需的唯一客户端软件是一个网页浏览器。你可以使用服务器的 IP 地址或域名连接到 Webmin。Webmin 允许你更改它用于连接的 IP 地址、端口或域名。

准备工作

第一步是检查你服务器的 IP 地址。你可以通过运行 /sbin/ifconfig 命令来查看。它会提供很多关于系统中配置的网络接口的信息,包括每个接口下的 inet addr 标题下的 IP 地址。你的系统上至少会有两个网络接口。其中一个会被称为 lolo0,这是仅用于同一机器之间连接的本地回环接口,IP 地址是 127.0.0.1。另一个接口很可能被称为 eth0en0,这是你机器的主要网络适配器。如果要从其他计算机连接,请注意这个 IP 地址。你还可以为这个 IP 设置 DNS 记录,然后使用域名连接。

如何操作...

你可以通过执行以下步骤连接到 Webmin:

  1. 打开你的网页浏览器,输入以下地址,但将 webmin.host 替换为你服务器的 IP 地址或域名:https://webmin.host:10000

    提示

    如果你的浏览器报告无法建立与服务器的连接,那么可能是你在服务器上运行了防火墙,阻止了进入的连接。在大多数 Linux 系统中,默认的防火墙叫做 iptables,你可以通过执行以下命令来允许所有进入的 TCP 流量通过 10000 端口:

    $ sudo iptables -I INPUT -p tcp --dport 10000 -j ACCEPT
    
    
  2. 不幸的是,在成功连接后,你首先会看到一个警告,内容大致是:此站点的安全证书无效! 你可以忽略这个警告,继续访问 Webmin。有关更多信息,请查看本食谱中的 它是如何工作的... 部分。

    提示

    如果你收到一个错误,提示建立安全连接失败,请尝试使用常规 HTTP 连接到 http://webmin.host:10000

在下一个界面,你将被要求提供一个具有管理员权限的用户的登录名和密码。这个用户几乎总是 root 用户,或者是通过 sudo 授予了所有权限的用户。输入用户名和密码,然后点击按钮进行登录。

登录后,Webmin 会向你展示一个主屏幕,显示系统概览,类似于以下截图:

如何操作...

这个欢迎界面展示了 Webmin 的主界面。在左侧,我们看到一个侧边栏,里面包含了一个层次化的菜单,列出了所有已安装的模块,并按类别进行组织。右侧则展示了当前激活模块的界面(在这种情况下,是系统信息)。

它是如何工作的...

Webmin 在你的服务器上运行一个 Web 服务器,端口号为 10000。由于浏览器默认连接到 80 端口(或者在使用 HTTPS 时是 443 端口),我们需要在 URL 中指定端口号。

如果你的系统中安装了 Perl 模块 Net::SSLeay,那么所有连接到 Webmin 的连接都会加密,以防止窃听或中间人攻击。为了建立加密连接,我们指示浏览器使用 HTTPS 协议进行连接。如果你尝试通过常规的 HTTP 连接,Webmin 会提供一个页面,将你重定向到加密连接,类似于以下截图:

如何操作...

当我们建立加密连接时看到的错误信息是因为我们用来加密通信的证书是 Webmin 自己生成的,并未被商业的、受信任的证书颁发机构签署。这不需要担心。自签名证书有一个重要的优点:它是免费的,而且提供与商业证书相同的加密效果。

还有更多...

Webmin 默认使用 10000 端口来托管其 Web 服务器,并会接受来自任何网络接口的连接。如果需要,你可以修改这些选项。

更改 Webmin 的监听端口

通过从菜单选择以下选项,导航到 端口与地址 配置模块:Webmin | Webmin 配置。然后,点击 端口与地址 图标,你将看到以下屏幕。在此屏幕中,你可以通过在 监听端口 | 特定端口 中指定端口来更改 Webmin 监听连接的端口。暂时将 绑定到 IP 地址 字段的值保持为 任何地址。请参阅以下截图:

更改 Webmin 的监听端口

将端口更改为 10001 或任何你喜欢的未使用端口号,然后点击 保存

提示

你可以通过执行netstat命令获取已使用端口的列表。服务器上的守护进程使用某些端口监听传入连接,这些端口不能用于 Webmin。在 Linux 上,你可以使用以下命令来获取监听端口的列表:

$ netstat -ltn

在基于 BSD 的系统上,使用以下命令:

$ netstat -nap tcp | grep LISTEN

Webmin 将更改其端口并将你重定向到新的地址。

指定 Webmin 监听的 IP 地址

你可以使用 端口与地址 屏幕来选择 Webmin 监听的 IP 地址。如果你的机器上安装了多个网络接口(例如,一个用于访问互联网,一个用于本地网络),这将很有用。你还可以使用此选项选择回环接口,只允许来自同一台机器的连接或通过 SSH 隧道的连接(参见第三章中的 通过 SSH 隧道安全连接到 Webmin)。要仅限本地流量连接,请选择 绑定到 IP 地址 | 仅限地址...,并输入 127.0.0.1,如下图所示:

指定 Webmin 监听的 IP 地址

安装额外的 Webmin 模块

Webmin 具有模块化架构,可以通过安装附加模块来扩展它。大多数稳定的 Webmin 模块已捆绑在 Webmin 中,因此在大多数情况下你实际上不需要安装它们。已安装但未启用的模块位于菜单的 未使用模块 部分。它们通常会在你安装它们依赖的软件时自动激活。例如,你可能会在该部分看到 MySQL 数据库服务器 模块。当你在系统上安装 MySQL 或其他受支持的软件时,Webmin 会检测到它并将相应的模块移到菜单中的相应位置。

安装附加软件后,你可能需要点击菜单底部的 刷新模块 链接,并重新加载浏览器才能使此更新生效。

准备工作

如果你发现了一个不错的第三方模块,而它没有与 Webmin 一起捆绑,你可以按照此方法安装它。请注意:Webmin 模块将拥有对系统的特权访问权限;你绝不应该安装来自你不完全信任的来源的模块。

如何操作...

要安装额外的 Webmin 模块,请执行以下步骤:

  1. 复制 Webmin 模块位置的 URL。它将在一个扩展名为.wbm.wbm.gz的文件中。

  2. 通过前往Webmin | Webmin 配置 | Webmin 模块,导航到安装标签。你将看到以下屏幕:如何操作...

  3. 选择从ftp 或 http URL 安装选项,并将模块的 URL 粘贴到提供的文本框中。

  4. 在安装模块之前,你可以选择哪些用户将被允许使用它。选择授予所有 Webmin 用户访问权限

  5. 点击安装模块。接下来的页面将显示安装进度、模块在磁盘上的安装位置、它将在菜单中出现的部分,以及一个指向模块屏幕的链接。

  6. 重新加载 Webmin 以查看新模块出现在菜单中。

它是如何工作的...

Webmin 将下载并解压模块归档文件,并在/usr/share/webmin/目录中创建一个新的模块文件夹。当你重新加载 Webmin 时,它会扫描模块目录,发现新模块并将其添加到菜单中。

每个 Webmin 模块可以对所有用户或特定用户组可用。这个选择可以在模块安装过程中做出,也可以在Webmin | Webmin 用户设置中稍后进行。有关用户和访问控制的更多信息,请参见第二章,用户管理

还有更多...

Webmin 还可以从两个仓库下载模块文件:一个是托管在webmin.com的标准模块仓库,另一个是可能托管在互联网上任何地方的第三方模块仓库。

从仓库安装模块

为了从某个仓库安装模块,请执行以下步骤:

  1. 导航到Webmin | Webmin 配置 | Webmin 模块 | 安装

  2. 点击www.webmin.com行尾的省略号(...)按钮,或第三方模块来自

  3. 选择你想要安装的模块,并按照之前描述的方式进行安装。

Webmin 将自动从仓库的 URL 下载文件。

卸载模块

如果你想卸载一个模块,请导航到Webmin | Webmin 配置 | Webmin 模块 | 删除,选择你想要删除的模块,然后点击删除所选模块。在接下来的页面中,你将被要求确认操作,模块将被删除。

另见

监控 Webmin 的操作

Webmin 的一个有用功能是它会记录其执行的每个操作。有时候可以参考此历史记录,以检查用户通过 Webmin 界面如何更改系统配置。

准备工作

为了充分利用 Webmin 的日志记录功能,应启用通过 Webmin 进行的文件更改的监视。这样可以稍后回滚更改。

要启用此功能,请转到Webmin | Webmin Configuration | Logging,并设置对这两个问题的答案为记录每个操作对文件的更改?在执行操作前记录所有修改的文件,以便回滚?

如何做到……

要监视 Webmin 正在执行的操作,请执行以下步骤:

  1. 要访问 Webmin 的日志,请转到Webmin | Webmin Actions Log

  2. 选择过滤器将搜索范围缩小到仅显示今天通过 Webmin 执行的日志条目,然后单击搜索。您将看到一个表格,列出了今天通过 Webmin 执行的所有操作。

  3. 单击其中一个操作,以查看操作的完整描述。此屏幕将告知您何时由哪个用户执行了操作,从哪个 IP 登录,并使用了哪个 Webmin 脚本。

  4. 通过向日志条目注释字段写入文本并单击保存,您将遇到类似于以下内容:如何做到……

  5. 通过单击标记为Session ID的链接,查看此用户会话中执行的所有操作。注释的操作将在列表中可见,并带有星号标记。

它的工作原理……

Webmin 会将用户执行的所有操作记录在日志文件/var/webmin/webmin.log中。用户注释存储在/var/webmin/annotations目录中。如果启用了文件更改的监视,每个更改都记录在/var/webmin/diffs目录中。请注意,这些目录在繁忙系统上随时间可能会变得相当大。

Webmin 操作日志界面允许您搜索这些日志文件,显示它们,并用它们来撤消文件更改。

还有更多……

如果按照本文档的准备工作部分启用了文件更改监视,您可以使用 Webmin 撤消这些更改。

回滚文件更改

作为练习,转到Webmin | Webmin Configuration | User Interface,并将页面背景设置为带有 RGB 十六进制值C9DFFF的浅蓝色。返回Webmin | Webmin Actions Log,然后找到您的操作并查看其详细信息。在更改的文件和执行的命令部分,您将看到记录了对文件/etc/webmin/config的更改,如下面的屏幕截图所示:

回滚文件更改

选中文件更改旁边的复选框,然后单击回滚所选文件按钮。确认回滚并返回操作详情页面。注意背景颜色恢复为白色。

另请参阅

  • 若想了解更多监控系统的方式,请查看第五章,监控你的系统

控制在启动时哪些系统服务被启动

在启动过程中,操作系统应该加载所有将在后台运行的服务。这包括数据库服务器、Web 服务器、像 Webmin 这样的工具和其他系统进程。服务器发行版默认非常精简,因此它们只会启动少数几个关键服务。Webmin 允许你通过启动和关闭模块控制哪些脚本被执行。

如何操作...

执行以下步骤以检查哪些系统服务在启动时被启动:

  1. 导航到系统 | 启动和关闭

  2. 选择一个服务暂时禁用。如果你的系统有avahi守护进程或rsync服务,这些可以暂时禁用一分钟而不会造成问题。参考下图:如何操作...

  3. 在这些服务旁边勾选复选框,然后点击立即禁用并在启动时禁用按钮。你将看到一个屏幕,通知你该服务已经停止,并且从下次启动时不再启动。

  4. 返回启动和关闭界面,重新选择相同的服务,然后点击立即启动并在启动时启动按钮,恢复你之前的更改。

它是如何工作的...

当你的操作系统启动时,它首先加载系统内核,然后启动一个名为init(初始化的缩写)的进程,执行各种初始化脚本以启动系统服务。在 Linux 下,这些脚本存储在一个目录中(/etc/init.d),并通过在一个特殊目录中创建指向它们的符号链接来激活,这个特殊目录会在启动时执行所有脚本。Webmin 允许你通过创建或删除这些符号链接,或执行其他特定于系统的激活功能,来控制哪些初始化脚本被执行。

前面提到的初始化系统通常被称为SysV 风格的 init。它以历史悠久的 UNIX 系统 V 命名,UNIX 系统 V 启发了所有现代 Unix 类操作系统,包括 Linux 和 BSD。许多发行版正在逐步转向更现代的替代方案,如 Upstart 和 Systemd。关于这些系统与 SysV-init 的区别细节超出了本书的范围,但 Webmin 尝试为它们提供一个通用的接口。本食谱中的截图可能会根据你所使用的初始化系统有所不同。

还有更多...

Webmin 还允许你轻松创建自己的初始化脚本,并验证启动的服务是否真的在运行。

创建自定义初始化脚本

大多数服务器包在安装时会附带自己的初始化脚本,并在你的初始化系统中激活它们。如果你安装的包没有附带脚本,你可以使用 Webmin 为你创建一个简单的初始化脚本。

进入系统 | 启动和关机,点击创建新的启动和关机操作链接。

注意

根据你使用的初始化系统,这个链接也可能被命名为创建新操作创建新的 Upstart 服务创建新的 systemd 服务等。

系统会要求你指定启动项的名称和描述,以及两个命令:一个用于启动服务,一个用于关闭服务。填写完毕后,点击创建,Webmin 将自动为你创建一个基本的初始化脚本。

创建自定义初始化脚本

检查活动进程

即使服务在启动时成功启动,也可能会崩溃。要检查哪些服务实际上正在运行,请进入系统 | 正在运行的进程。在这里,你将看到一个按进程启动顺序排列的进程树。你还可以按所有者或进程所使用的 CPU 或内存量对进程进行排序。参考以下截图:

检查活动进程

点击 Webmin 某个进程的进程 ID,以获取更多关于它的信息,包括该进程仍然保持打开的文件或网络连接。

检查已安装的软件包

Webmin 提供了一个简便的界面,让你能够查看系统的包管理系统。你可以使用它来检查已安装的软件包,并查看每个软件包所安装的文件。

如何操作...

要检查已安装的软件包,请执行以下步骤:

  1. 进入系统 | 软件包。参考以下截图:如何操作...

  2. 通过在搜索软件包表单中输入软件包的名称或部分描述来搜索你感兴趣的软件包。例如,输入webmin并点击搜索软件包。你还可以通过点击软件包树按钮浏览软件包列表。

  3. 如果一个软件包已安装,它将出现在软件包列表中。点击软件包的名称以查看软件包详情页面。

它是如何工作的...

Webmin 能够确定操作系统使用的是哪个软件包管理系统,并提供一个统一的界面来执行常见任务,如检查、安装和卸载软件包。在后台,Webmin 会为你执行适当的命令(如apt-getyumrpmyast等),并以网页形式显示结果。

还有更多…

除了仅仅查看已安装的软件包,通常还需要检查哪些文件是由某个软件包安装的。你也可能对某个特定的磁盘文件感兴趣,并希望检查是哪个软件包安装了它。Webmin 让你可以轻松获取这些信息。

查看通过软件包安装的文件

要查看从某个软件包安装的文件,请执行以下步骤:

  1. 进入系统 | 软件包,输入软件包的名称(例如,webmin),然后点击搜索软件包

  2. 在软件包列表中,点击软件包名称以查看其详细信息。

  3. 要查看此软件包安装了哪些文件,请点击 列出文件 按钮。

识别哪个软件包安装了某个文件

要确定是哪个软件包安装了某个文件,请执行以下步骤:

  1. 转到 系统 | 软件包

  2. 识别文件 部分,输入文件名或命令,或点击省略号 (...) 按钮以浏览您的磁盘。

  3. 点击 搜索 按钮。

如果文件被包管理系统识别,您将看到一个包含文件信息的屏幕,其中包括安装该文件的软件包的名称:

识别哪个软件包安装了某个文件

安装软件包

Webmin 能够利用您的操作系统包管理来安装额外的软件。如果您使用的是基于 Debian 的系统,例如 Ubuntu,您可以从 .deb 文件或 APT 仓库安装软件包。如果您使用的是基于 RPM 的系统,例如 CentOS 或 openSUSE,您可以从 .rpm 文件或 yum 仓库安装软件包。

准备就绪

许多 Web 应用程序依赖于一个名为 ImageMagick 的图像处理库。许多用于创建、编辑、组合或转换位图图像(如 PNG 和 JPEG)的程序都使用此库。在本教程中,我们将安装 ImageMagick,但相同的过程可以应用于您发行版仓库中可用的任何其他软件。

操作方法...

按照以下步骤使用 Webmin 安装软件包:

  1. 转到 系统 | 软件包

  2. 选择 从仓库安装 单选按钮。请注意,您实际上不会看到 仓库 这个词,而是适合您系统的仓库名称(APT、YUM、Ports 等)。

  3. 点击 搜索仓库,然后输入软件包名称 imagemagick,点击 查找匹配的软件包 执行搜索。

  4. 您将看到与您的搜索匹配的软件包列表,包括 imagemagick——您要安装的软件包。点击软件包名称来选择它。

  5. 您将返回到 软件包 屏幕,现在您可以点击 安装 按钮。

Webmin 将下载并安装 ImageMagick 及其一长串依赖项。在结果屏幕上,您可以看到所有已安装软件包的详细信息。

小贴士

如果您正在安装的软件包提供了 Webmin 可以管理的组件(如 Apache、MySQL、PostgreSQL 和 Postfix),您需要执行两个额外步骤。点击 Webmin 主菜单中的 刷新模块 链接,然后刷新整个浏览器。这将确保 Webmin 识别新安装的软件并更新其菜单。

工作原理...

Webmin 会判断你的操作系统使用的是哪个包管理系统。它执行适当的命令,搜索可用的软件库,以查找与你的查询匹配的软件包,并与其依赖项一起安装。相同的任务可以通过命令行完成,但 Webmin 会抽象出与你的打包系统特定的命令语法,这样你可以在不同的操作系统中使用相同的界面。

还有更多...

Webmin 还允许你从你可能拥有的软件包文件中安装软件。为了做到这一点,请按照此步骤操作,但选择从上传的文件单选按钮,并上传你的文件,而不是搜索软件库。如果你的软件包文件太大,无法通过浏览器上传,你可以通过其 URL 来安装。

请注意,这种方法要求你在安装软件包之前手动安装其依赖项。

将已安装的软件包更新到最新版本

开源社区不断发布他们管理的软件的更新。保持这些升级最新非常重要,因为它们通常包含修复在你的软件中发现的安全漏洞。

如何操作...

要更新已安装的软件包,请执行以下步骤:

  1. 导航到系统 | 软件包更新。你将看到所有可在软件库中找到更新版本的包列表。请参考以下截图:如何操作...

  2. 在更新之前,你可以点击刷新可用的软件包按钮,以确保你获得最新的更新信息。

  3. 确保所有带有可用更新的软件包旁边的复选框都被选中,然后点击更新选中的软件包

  4. 下一屏将显示所有将要更新的包的列表,以及可能的新依赖包。点击安装来执行更新。

  5. 下一屏将显示更新的进度。在导航到其他屏幕之前,请确保页面已完全加载。

  6. 当你返回到软件包更新屏幕时,你现在应该看到消息未找到可更新的软件包,这表明所有的软件包都是最新的。

它是如何工作的...

Webmin 判断你的操作系统使用的是哪个包管理系统,并查询软件包库以获取有关最新可用版本的信息。你可以通过点击刷新可用的软件包来触发此软件包缓存更新。当你选择执行更新时,Webmin 执行适当的包管理命令来安装最新版本。

还有更多...

Webmin 还会通知你是否有其自身模块的更新可用。此通知将出现在系统信息页面,这是你登录时显示的第一页。如果你看到此通知,请点击立即安装更新来安装模块更新,如下截图所示:

还有更多...

启用 Webmin 发送电子邮件

Webmin 是一个很好的工具,可以监控您的服务器状态。当需要您关注的事件发生时,您可以设置它发送电子邮件通知您。

准备工作

Webmin 需要访问邮件服务器才能发送电子邮件。在第十二章中,我们将介绍如何设置邮件服务器。然而,如果您不打算自己设置邮件服务器,或者在设置之前想要开始监控您的系统,您可以使用外部电子邮件服务。

Webmin 可以通过 SMTP 发送电子邮件,但不支持 TLS/SSL 加密。您需要一个支持通过 SMTP 连接且不加密的提供商账户。

如何操作...

执行以下步骤以启用 Webmin 发送电子邮件:

  1. 如果您想通过外部 SMTP 账户发送电子邮件,请导航到Webmin | Webmin 配置 | 发送电子邮件,并将使用 SMTP 发送电子邮件选项设置为通过 SMTP 发送到远程邮件服务器

  2. 提供 SMTP 服务器的地址,将SMTP 服务器身份验证设置为以登录方式,并提供您账户的用户名和密码。

  3. Webmin 发送电子邮件的发件人地址选项设置为一个授权的电子邮件地址。

  4. 点击保存以保存设置。如何操作...

  5. 返回到Webmin | Webmin 配置 | 发送电子邮件,并使用发送测试消息表单来测试您的配置。

它是如何工作的...

Webmin 能够通过未加密的 SMTP 与远程服务器通信,因此您的邮件将实际从那里发送。请注意,包括您的密码在内的配置会以明文形式保存在服务器的/etc/webmin/mailboxes/config文件中。该文件对所有拥有管理员权限的用户可见,他们可以读取您的电子邮件密码。

另见

  • 查看第十二章,设置电子邮件服务器,了解如何设置您自己的邮件服务器。

获取新版本软件包的电子邮件通知

如果您有多个服务器在运行,并且安装了不同的软件,定期手动检查软件更新可能变得繁琐。Webmin 允许您安排自动检查更新,并在有新版本软件包发布时向您发送电子邮件。

准备工作

确保 Webmin 已设置为发送电子邮件。有关更多信息,请参考本章的启用 Webmin 发送电子邮件部分。

如何操作...

要在新版本的软件包发布时收到电子邮件通知,请执行以下步骤:

  1. 导航到系统 | 软件包更新并启用计划检查选项

  2. 按计划检查更新?设置为每天检查更新,并提供一个电子邮件地址,若有更新可用,报告将发送至该地址。请参考以下截图:如何操作...

它是如何工作的...

cron 是一个系统工具,在后台作为守护进程运行,并启动计划在特定时间执行的任务。当启用计划检查选项时,Webmin 会在系统的cron表中添加一项条目,执行其更新验证脚本。然后,cron守护进程将每天(根据设置,可能是每小时或每周)执行一次该脚本。如果 Webmin 发现有可用更新,它会通过电子邮件通知你。

还有更多…

你可以设置 Webmin 在更新可用时自动安装这些更新。但这可能并不像看起来那样是个好主意,因为每次更新都有可能导致系统出现问题。通常这种情况不会发生,但最好由人工监控更新过程,并在更新应用后验证系统是否一切正常。

阅读已安装软件的文档

你在系统上安装的大多数软件包都会附带文档。Webmin 提供了一个简单的工具,用于在这些手册中进行搜索。

如何操作…

要查看已安装软件的文档,请执行以下步骤:

  1. 转到系统 | 系统文档,并在搜索框中输入wget作为搜索词。

  2. 匹配选项设置为名称和内容

  3. 勾选手册页面软件包文档旁边的复选框,然后点击搜索

Webmin 将搜索所有可用的文档,并显示包含wget的所有手册页面和软件包说明。

它是如何工作的…

附带的软件包文档通常包括程序的手册页面和打包信息。man页面包含关于如何使用已安装软件的说明。它们以特殊格式存储(通常在/usr/share/man/usr/local/man或类似位置),并使用man命令显示。另一方面,软件包信息可能包括有关如何准备该软件包、如何使用它等内容。软件包文档通常以文本或 HTML 文件形式存储在/usr/share/doc中。

Webmin 会扫描可用的手册页面、软件包文档文件和 Perl 模块文档,查找包含你搜索词的内容,并以网页形式显示所有结果,方便查看。

还有更多…

Webmin 提供了另一个重要的搜索表单,位于侧边栏菜单的模块类别列表下。这允许你对 Webmin 本身进行详细搜索,扫描其文档以及用户界面的各个元素。例如,如果你使用这个表单搜索发送测试邮件这一短语,Webmin 将显示一个结果列表,并提供一个指向发送电子邮件模块的链接,允许你发送测试邮件。

第二章:用户管理

在本章中,我们将覆盖:

  • 创建 Webmin 用户

  • 创建一个具有特定模块和选项访问权限的 Webmin 组

  • 允许用户使用系统凭证登录 Webmin

  • 基于系统账户创建 Webmin 用户

  • 控制当前谁在使用 Webmin

  • 创建系统用户账户

  • 修改用户的 UID 和其他信息

  • 临时禁用用户账户

  • 创建和编辑系统组

  • 更改用户密码

  • 导出用户并将其导入到另一个系统

  • 安装 Usermin

介绍

Webmin 的用户管理功能非常强大。你可以使用 Webmin 管理系统上的用户和组,决定哪些用户可以访问 Webmin,以及他们可以看到哪些模块。你还可以创建专门的 Webmin-only 用户,这些用户在系统中没有常规账户,但仍然可以访问选定的 Webmin 模块。

如果你是系统的主要管理员,你可以设置 Webmin,让其他管理员仅修改系统配置中的特定部分。例如,你可以允许子管理员配置 Apache 网络服务器,但不能更改其他设置。这个工作流程非常常见,实际上,Webmin 的一个兄弟产品 Usermin 被开发出来,允许非管理员通过类似 Webmin 的环境访问数据库、配置虚拟主机、设置 cron 任务以及查看本地邮件。

注意

Webmin 区分两种类型的用户:

  • Unix 用户系统用户)是你系统的标准用户。通常他们可以通过控制台或 SSH 登录到系统。

  • Webmin 用户是专门为 Webmin 创建的账户。这类用户可以登录 Webmin,但可能无法登录系统的其他部分。

任何系统用户都可以被赋予 Webmin 用户的身份。你也可以配置 Webmin,在每次添加或删除系统用户时自动添加或删除 Webmin 账户。由你决定最适合你情况的方式——将 Webmin 用户账户与系统账户分开,还是保持它们的同步。

另一个需要记住的重要概念是 Webmin 组。类似于系统组,这是具有特定权限的用户组。你可以决定哪些模块对 Webmin 组的所有成员开放。通常,如果你有多个具有相同权限的用户,应该将他们分配到一个组中,然后将模块权限分配给该组,而不是单独分配给每个用户。这样将使以后的管理变得更容易。

创建 Webmin 用户

为某人授予 Webmin 访问权限的最简单方法是为其创建一个 Webmin 用户账户。你可以控制用户允许从哪些 IP 地址登录,甚至可以设置在一周中的哪些时段允许访问。在创建账户时,你可以指定该用户将访问哪些模块,或者他/她将属于哪个组。

在本教程中,我们将创建一个只允许访问单一模块的新用户。

准备工作

我们将创建一个仅用于一次的密码的新用户账户,用户在首次登录后必须更改此密码。为了使用该一次性密码,我们需要在 Webmin 中启用一个功能。执行以下步骤来设置密码过期策略:

  1. 进入Webmin | Webmin 配置 | 认证

  2. 设置密码过期策略选项为提示用户输入新密码(密码已过期)

  3. Webmin 的服务器进程将会重启;请等待几秒钟后再继续操作。

如何操作...

执行以下步骤以创建新的 Webmin 用户:

  1. 导航到Webmin | Webmin 用户界面,然后点击创建一个新的 Webmin 用户

  2. 在用户创建界面,指定用户名、密码和用户的真实姓名。你可以为密码设置任意长的随机字符串,因为我们预期用户在首次登录后更改密码。请将密码记录下来,以便我们之后使用。

    提示

    强密码是由从大字母表中随机选取的大量字符组成的长字符串。如果你使用所有字母数字字符(a-z, A-Z 和 0–9),那么每个字符大约会为密码强度增加 6 位熵。这意味着,对于一个 128 位密码,你需要一个 22 字符的字符串,对于 256 位强度,你需要 43 个字符,依此类推。你可以使用一个简单的 Perl 一行代码生成伪随机密码,如下所示:

    $ perl -le'@chars=(a..z,A..Z,0..9,_);$p.=$chars[rand(@chars)] while($i++<22);print $p'
    

    如果你希望使用由量子机械白噪声生成的真正随机密码,请访问 GRC 的超高安全密码页面:

    www.grc.com/passwords.htm

  3. 勾选下一次登录时强制更改密码选项:如何操作...

  4. 安全性和限制选项部分,将不活动注销时间设置为30分钟,并将最低密码长度设置为10个字符。

  5. 可用 Webmin 模块部分,勾选服务器部分中的读取用户邮件模块。

  6. 点击创建按钮以创建账户。

工作原理...

Webmin 保持自己的用户账户数据库,与系统用户列表分开。账户列表默认保存在miniserv.users文件中,路径为/etc/webmin/。有关每个账户可以访问哪些模块的信息则存储在webmin.acl文件中,路径为/etc/webmin/acl代表访问控制列表)。

当用户尝试登录 Webmin 时,它会检查这些文件以确定提供的登录信息是否正确,账户是否活动以及用户可以访问哪些模块。基于这些信息,Webmin 登录用户并为其创建一个界面。

还有更多...

Webmin 提供额外的功能,使账户管理更加简单。例如,如果您需要创建一些类似的账户,您可以创建一个账户然后克隆它。如果您想预览 Webmin 对特定用户的界面显示,您可以切换到该用户的账户而无需知道他们的密码。

克隆一个 Webmin 用户

要克隆已存在的用户账户,请转到Webmin | Webmin Users,然后点击您想要克隆的用户的用户名。在编辑 Webmin 用户屏幕的底部,您会找到一个标有Clone的按钮。如果您点击它,将进入一个账户创建页面,选项会根据您克隆的用户的设置预填。

切换到用户

如果您想检查 Webmin 为特定用户提供哪些选项,可以转到Webmin | Webmin Users,点击用户名,然后点击屏幕底部的Switch to User按钮。测试完成后,如果此用户无法访问Webmin Users模块,则需要注销然后重新登录为自己。

另请参见

  • 在下一个食谱中,创建一个具有对特定模块和选项的访问权限的 Webmin 组,我们将详细介绍如何授予用户对特定模块选项的访问权限。

创建一个具有对特定模块和选项的访问权限的 Webmin 组

Webmin 用户应该组织成组。如果您有多个希望拥有相同特权的用户,创建一个组是正确的方式。Webmin 提供非常精细的权限,您可以授予每个组。您可以设置以下三种类型的权限:

  • 指定哪些 Webmin 模块对一个组可用

  • 设置适用于所有模块的全局权限

  • 设置模块级别的访问控制设置,指定每个模块的哪些选项可用

    小贴士

    一个个人账户的权限可以配置为相同粒度。

如何做到...

在此食谱中,我们将创建一个仅限于查看/var/log目录中日志文件的 Webmin 组:

  1. 要创建一个新的 Webmin 组,请导航到Webmin | Webmin Users,然后点击Create a new Webmin group

  2. 将新组命名为log_viewers,并提供一个组描述。

  3. 可用的 Webmin 模块部分,仅选择System Logs,然后点击Create

  4. 组创建完成后,我们可以指定更详细的权限。返回Webmin | Webmin Users,然后在Webmin 组部分点击新组的名称。

  5. 您将注意到可用 Webmin 模块部分中模块的名称现在是链接。点击系统日志链接以打开此模块的访问控制配置。

  6. 设置权限,如以下截图所示,以仅授予对来自/var/log的日志的只读访问权限,没有其他模块权限:如何操作...

    注意

    注意,完全访问此模块允许用户查看任何文件作为日志。这可能会使用户未经授权地访问系统中的其他文件。

    提示

    您可以通过点击重置为完全访问按钮来重置模块权限为完全访问。

让我们验证新组权限是否按预期工作:

  1. 根据创建 Webmin 用户的步骤为测试创建一个新用户。

  2. 组成员列表中选择log_viewers,将其分配给他/她。

  3. 转到这位新用户的编辑 Webmin 用户界面,并点击切换到用户按钮。

您将会像新用户一样看到 Webmin,并且您的访问仅限于系统日志模块,您只能查看来自/var/log的日志。

工作原理...

默认情况下,Webmin 将现有组的信息存储在/etc/webmin/webmin.groups文件中。有关特定模块权限的信息存储在访问控制列表ACL)文件中。每个模块在/etc/webmin中都有自己的目录,包含每个组和用户的单独 ACL 文件。例如,名为module_name的模块的 ACL 文件组和名为group_name的组将存储在/etc/webmin/module_name/group_name.gacl。名为user_name的用户的类似文件将存储在/etc/webmin/module_name/user_name.acl中。每当用户访问模块时,Webmin 都会检查这些文件,并确定要向他们提供哪些选项。

注意

每个 ACL 文件的确切结构特定于其各自的模块;当升级 Webmin 到新版本时,这些文件也可能会发生变化。手动编辑这些文件需要熟悉模块的内部代码,因此最好通过 Webmin 的界面来编辑权限。

更多信息...

除了特定模块的访问权限外,Webmin 还允许您指定全局权限,这些权限修改了所有模块的行为。

所有模块的权限

要为组设置 Webmin 全局权限,请转到Webmin | Webmin 用户,点击组名,并打开所有模块的权限部分。

在这里,您可以设置当模块要求用户选择文件时在 Webmin 文件选择器中可见的文件,哪些用户和组将在其选择器小部件中可见,以及其他全局选项:

所有模块的权限

参见

  • 你可以为每个希望分配到某个组的用户创建 Webmin 账户,也可以设置 Webmin 为所有系统组的成员自动创建账户,并将他们分配到一个 Webmin 组。有关更多信息,请参阅配方,基于现有系统用户账户创建 Webmin 用户

允许用户使用系统凭证登录 Webmin

Webmin 的默认设置不允许普通系统用户登录 Webmin,但至少在安装后允许一个用户登录。根据你的 Webmin 包中的设置,可能会有以下几种情况:

  • root 用户

  • 具有sudo权限的用户(特别是那些拥有ALL=(ALL) ALL规则的用户)

  • 手动安装 Webmin 时创建的用户

在本配方中,我们将允许所有 Unix 组的用户以有限权限登录 Webmin。

准备工作

我们需要首先创建一个标准的 Webmin 账户,所有我们授予访问权限的系统用户将共享此账户。请参考配方,创建 Webmin 用户,按照说明创建一个名为webmin_user的 Webmin 账户,并为其分配特定权限。

如何操作...

按照以下步骤,允许系统组的成员登录 Webmin:

  1. 导航到Webmin | Webmin 用户 | 配置 Unix 用户认证界面。

  2. 选择允许下列 Unix 用户登录单选按钮。

  3. 选择选项,允许组成员的用户以您为此目的创建的 Webmin 用户身份登录。

  4. 如果你的标准用户名为webmin_user,你的界面将类似于以下截图:How to do it...

  5. 点击保存按钮以保存您的设置。

从现在开始,所有属于users组的 Unix 用户都可以登录 Webmin,并拥有与您选择的 Webmin 用户相同的权限。

工作原理...

如果我们使用前述配置,Webmin 将会根据你系统中配置的可插拔认证模块PAM)服务来验证登录凭证。在其基本设置中,PAM 会根据存储在标准系统文件(/etc/passwd/etc/shadow)中的凭证进行验证。

注意

如果系统上的 PAM 配置有所不同,登录信息可能会通过外部服务(如 LDAP、NIS、Kerberos、Active Directory)进行验证,或者在 SQL 数据库中查找。默认情况下,Webmin 使用系统的通用配置(system-authcommon-auth),但也可以使用它自己的单独设置。

Webmin 还会检查认证用户所属的系统组。如果这些组中有任何一个列在 Webmin 的配置中,或者该用户账户单独列出为允许登录,用户将以关联的 Webmin 账户登录。

还有更多…

为了允许通过sudo具有无限制访问权限的用户以root身份登录 Webmin,请按以下步骤操作:

  1. 导航到Webmin | Webmin 用户 | 配置 Unix 用户认证

  2. 勾选允许可以通过 sudo 执行所有命令的用户以 root 身份登录复选框。

  3. 点击保存

基于系统账户创建 Webmin 用户

在之前的食谱中,我们讨论了创建 Webmin 用户并允许系统用户以选定的 Webmin 账户登录。您也可以选择让 Webmin 账户和系统账户之间有一个更直接的一对一对应关系。您可以通过为已存在的选定用户创建 Webmin 账户,并为未来添加的用户设置账户同步来实现这一点。

准备工作

在本食谱中,我们将为每个系统用户创建一个 Webmin 账户。所有新的 Webmin 账户将被分配到一个 Webmin 组。在开始之前,请按照食谱设置 Webmin 组,创建一个具有特定模块和选项访问权限的 Webmin 组

如何操作...

我们的第一步是为现有的系统用户创建 Webmin 账户:

  1. 导航到Webmin | Webmin 用户 | 将 Unix 用户转换为 Webmin 用户

  2. 选择您希望添加到 Webmin 的用户。

  3. 选择要分配给他们的 Webmin 组。

  4. 点击立即转换

所有选定用户的 Webmin 账户现在应该已经创建。您可以在Webmin 用户屏幕上查看它们。

第二步是指示 Webmin 自动为所有新创建的系统用户创建账户:

  1. 导航到Webmin | Webmin 用户 | 配置 Unix 用户同步

  2. 勾选复选框,在系统账户创建和删除时创建和删除 Webmin 账户。

  3. 同时,选择将新用户的密码设置为 Unix 认证选项:如何操作...

  4. 选择您希望新用户添加到的 Webmin 组,并点击保存

从现在起,每个新创建的系统账户将与自动创建的 Webmin 账户关联。

注意

请注意,Webmin 不会同步通过命令行创建的账户或通过直接编辑系统配置文件创建的账户。只有通过 Webmin 创建的系统账户才会接收关联的 Webmin 账户。

它是如何工作的...

Webmin 会检查您的系统配置文件(/etc/passwd/etc/group),找到系统用户列表,并根据您的选择创建相应的 Webmin 账户。

注意

实际上,Webmin 并不直接读取 passwd 文件,而是使用如 getpwent 这样的系统调用来检查系统的密码数据库。这意味着账户信息也可以从数据库或外部服务(如 NIS 或 LDAP)读取。

如果您设置了用户同步,Webmin 会在其用户创建功能中添加一个额外的步骤,自动为每个新系统用户设置一个新的 Webmin 账户。

控制当前谁在使用 Webmin

Webmin 会记录所有用户执行的操作。您可以查看当前打开的用户会话列表,检查在会话期间执行了哪些操作,或者关闭会话,强制用户注销。

如何操作...

执行以下步骤检查当前登录到 Webmin 的用户:

  1. 导航到Webmin | Webmin 用户

  2. 点击查看登录会话图标。

  3. 要查看用户在本次会话中执行的操作,请点击任何会话旁边的查看日志链接。

你可以关闭任何会话,除了你自己的会话,并强制用户重新登录。要执行此操作,请点击会话 ID列中的链接。下次该用户点击链接或提交表单时,系统将要求其重新登录。

它是如何工作的...

每当用户登录时,Webmin 会为其创建一个会话。一个会话由一个特定的 ID 和与该会话所有者及其是否处于活动状态相关的信息组成。

会话 ID 会通过安全 cookie 传递给用户的浏览器,借此 Webmin 能识别来自同一用户的后续请求。该标识符存储在 Webmin 的日志文件中,用于将用户在登录和注销期间执行的操作分组。你可以在 Webmin 的日志中搜索与任何会话相关的操作。

如果你选择结束会话,Webmin 会从活动会话列表中删除该会话的标识符。当用户再次向 Webmin 发出请求时,cookie 中传递的会话标识符将不再被识别,用户需要重新登录,从而创建一个新会话。

创建系统用户账户

在 Unix 中创建用户账户是一个多步骤的过程:你需要将用户数据添加到系统配置文件中,创建主目录,将模板文件复制到该目录,并将这些文件的所有权设置为新用户。Webmin 为你自动化了这个过程。

提示

此外,如果你设置了同步,Webmin 还会为新用户创建一个 Webmin 账户。有关账户同步的更多信息,请参考食谱 基于现有系统账户创建 Webmin 用户

准备工作

我们将创建一个新用户账户,并为其设置一次性密码,用户在第一次登录后需要更改密码。为了允许用户通过 Webmin 更改密码,请前往Webmin | Webmin 配置 | 身份验证,并将密码过期策略选项设置为提示用户在密码过期时输入新密码

如何操作...

执行以下步骤创建一个系统用户账户:

  1. 导航到系统 | 用户和组,然后点击创建新用户

  2. 提供基本账户信息:用户名真实姓名

  3. 用户 ID主目录设置为自动

  4. 将用户的默认 shell 设置为 /bin/bash

  5. 对于密码,选择普通密码,并在文本框中输入一个长的随机字符串。保存这个字符串。在密码选项中,回答,以启用下次登录时强制更改密码

    提示

    查看食谱 创建 Webmin 用户,其中包含有关生成强密码的说明。

  6. 组成员资格中将主组保留为系统默认设置。

  7. 创建时部分的问题中,回答,以创建用户主目录并复制模板文件。

  8. 同样,回答,以确定是否在其他模块中创建用户

  9. 点击创建

  10. 将新的用户名和密码发送给用户。用户将在首次登录后被要求更改密码。

工作原理...

这里发生了许多操作,我们一步步来看。

我们要求 Webmin 为我们指定的真实姓名的用户创建一个帐户。用户将能够使用我们提供的用户名登录。我们告诉 Webmin 自动生成用户 ID主目录。UID 将是比 500 或 1000 更高的第一个可用整数,具体取决于系统。主目录将放置在/home/下,并以用户名命名。

我们将用户的 Shell 设置为/bin/bash,这是大多数现代 Linux 发行版的默认用户 Shell。如果您的用户更喜欢使用其他 Shell,如kshzshfish,可以在安装该 Shell 的包后在此处进行设置。

提示

如果您希望防止用户登录系统控制台(或通过 SSH 和 FTP 登录),可以将 Shell 设置为/bin/false。这将阻止 Shell 访问,但允许用户使用其他不需要 Unix 用户身份验证的系统服务,如电子邮件或 Webmin。

接下来,我们为用户创建了一个一次性密码。无论用户通过控制台还是 Webmin 登录,首次登录后都将强制要求用户更改密码。

在创建帐户时,我们需要将用户分配到一个主组中。在一些系统中,默认组会被命名为users;而其他系统则会为新用户创建一个私有组,名称与用户相同。作为系统管理员,您可以根据需要决定如何使用这些组。

因为我们回答了,设置主目录的问题,Webmin 为我们处理了这个问题,并为新用户创建了目录及所需的所有文件。

最后,通过回答,以确定是否在其他模块中创建用户帐户,我们告诉 Webmin 将新帐户的信息提供给 Webmin 的其他部分。这样,新用户将在其他模块的配置设置中可用(例如,文件共享)。

修改用户的 UID 和其他信息

修改现有用户的基本信息通常很简单。这个规则的例外是更改用户的 UID。如果用户在两个不同的 Unix 系统上有账户,且两个系统都必须识别为同一个人时,可能需要进行 UID 更改。一个典型的例子是通过 NFS 共享文件,正如我们将在第六章中讨论的那样,管理系统中的文件

更改 UID 需要更新该用户所有文件的所有权。这可能会非常繁琐,但 Webmin 会为我们完成这项工作。

如何操作...

按照以下步骤修改用户的 UID:

  1. 导航至系统 | 用户和组,然后点击你要编辑的账户的用户名链接。

  2. 在下一个页面,你将能够编辑所有基本的用户信息,包括用户名、ID、主目录位置、选择的默认 Shell 程序、主组和次组等。

  3. 用户 ID更改为不同的值。

  4. 保存时部分,回答所有文件来响应是否更改文件中的用户 ID?的问题。

  5. 如果你确定用户只在自己的主目录中拥有文件,你可以限制更新为主目录

    注意

    限制文件更新到用户的主目录会加快速度,但任何属于用户但位于其他目录中的文件将会成为孤儿文件。如果稍后创建了一个新用户,并且使用了剩余的 UID,那么这些文件可能会意外地归新用户所有。只有在你确信用户不拥有任何位于主目录外的文件时,才选择这个选项。

  6. 点击保存

    提示

    你可以使用相同的方法来更改用户主组的 GID。

它是如何工作的...

Webmin 会用你提供的信息更新用户的系统数据。然后,它会扫描磁盘,查找属于该用户的文件,并更新文件所有者的 UID。

暂时禁用用户账户

如果一个人不再使用你的系统,通常最好不要删除他们的账户,而是禁用它。也许你需要保留数据以便进行取证,或者该用户将来可能需要再次访问系统,或者该用户是你系统上某些文件的所有者,而你不想删除这些文件或让它们变成孤儿文件。

如何操作...

通过 Webmin 禁用用户账户非常简单。执行以下步骤即可:

  1. 导航至系统 | 用户和组,然后点击你要编辑的账户的用户名链接。

  2. 在下一个页面,勾选标有暂时禁用登录的框。

  3. 点击保存

    提示

    你可以通过相同的步骤重新启用账户。只需取消勾选暂时禁用登录框,然后点击保存

它是如何工作的...

要禁用用户账户,Webmin 会更新/etc/shadow文件,该文件存储哈希过的用户密码。所选用户的密码哈希会被一个感叹号(!)前置,这会使哈希失效并使密码无法使用,从而用户将无法再登录。去除感叹号将重新启用账户。

创建和编辑系统组

通过 Webmin 创建和编辑系统组非常简单,只需按照所列的步骤操作即可。

如何操作...

我们首先通过以下步骤来创建一个组:

  1. 导航至系统 | 用户和组,然后点击本地组标签。

  2. 点击创建新组

  3. 在下一个页面,你将被要求指定基本的组信息。将组名设置为选择的名称,并将组 ID保持为自动。忽略密码字段。

  4. 现在,您可以通过将用户从左侧列移动到右侧列,向组中添加您选择的任何用户。

  5. 点击创建以完成并创建该组。

现在,您可以通过执行以下步骤来编辑该组:

  1. 返回系统 | 用户和组,并点击本地组标签。

  2. 点击组名列中的组链接。

  3. 系统将带您到一个类似于创建组时使用的表单界面,唯一的区别是,如果您现在更改组的 ID,您可以告诉 Webmin 使用新 ID 更新系统中的文件。

  4. 点击保存按钮以保存更改。

它是如何工作的...

根据您使用的操作系统,Webmin 将直接修改存储组信息的系统文件(/etc/group, /etc/gshadow),或使用专用工具更新组信息(例如 OS X 上的dscl—目录服务命令行工具)。

当您更改组的 GID 时,Webmin 还会扫描您的文件系统,并更新该组拥有的所有文件的 GID。

更改用户密码

当用户忘记密码时,他/她会联系您作为系统管理员并请求密码提示。出于安全原因,密码仅以加密哈希的形式存储在您的系统中,而不是明文。因此,您无法向用户发送密码,但可以重置密码并将新密码发送给用户。在这种情况下,最佳做法是将新密码设置为仅能使用一次,允许用户登录,但要求他/她立即将其更改为自己选择的密码。

在本教程中,我们将描述如何将用户的密码重置为一次性密码。

准备工作

为了在 Webmin 中使用一次性密码,我们需要启用此功能。请转到Webmin | Webmin 配置 | 身份验证,并将密码过期策略选项设置为提示用户输入新密码以更改已过期的密码

如何操作...

执行以下步骤以更改用户密码:

  1. 导航至系统 | 用户和组,并点击您要更改密码的帐户的用户名链接。

  2. 密码部分,选择普通密码,并输入一长串随机字符。请记下这串字符,因为稍后我们会将其作为一次性登录密码发送给用户。

    提示

    查看教程创建 Webmin 用户,了解如何生成强密码的相关说明。

  3. 密码选项部分,对下次登录强制更改密码?问题选择

  4. 点击保存以提交更改。

  5. 将新的一次性密码发送给用户。

它是如何工作的...

Webmin 会修改系统的密码文件(/etc/shadow),使用我们提供的新字符串更新用户存储的密码哈希。

您的系统还会记录密码上次更改的时间。Webmin 会将此设置更改为 0(等同于 1970 年 1 月 1 日)。这会导致系统在用户下次登录时要求更改密码。Webmin 也会尊重此设置,并在用户登录 Webmin 时要求其更改密码。请注意准备工作部分中描述的步骤。

将用户导出并导入到另一台系统

当您为组织设置另一台服务器时,可能需要在新系统上重新创建多个用户账户。Webmin 的用户管理模块可以将现有用户账户的数据导出到一个特殊的批处理文件,然后您可以将该文件导入到任何运行 Webmin 的其他系统中。这样可以快速且轻松地重新创建多个账户。

如何操作...

在本教程中,我们将从一台系统(源系统)导出选定的用户,并将它们导入到第二台系统(目标系统)中。

我们首先按照以下步骤导出用户:

  1. 在源系统上,导航到系统 | 用户和组,然后点击标记为导出到批处理文件的链接。

  2. 批处理文件格式设置为标准的 passwd 和 shadow 文件

    提示

    请注意,您应使用与目标操作系统兼容的导出格式。如果您导出到 Linux 系统,请使用标准格式;但如果是导出到 BSD、Mac OS 或 AIX 系统,则应使用这些系统特定的格式。导入大量账户之前,务必先在少量用户账户上进行测试。

  3. 批处理文件目标设置为在浏览器中显示

  4. 要导出的用户设置为仅用户,然后点击行末的省略号(...)。

  5. 将弹出一个新的用户选择窗口,您可以在其中选择要导出的账户名称。

  6. 通过点击屏幕左侧用户名,选择账户。如果您选错了账户,可以通过点击右侧已选用户中列出的账户名来移除它。选择完成后,点击确定

  7. 回到导出批处理文件界面,点击立即导出

  8. 结果批处理文件将作为文本显示在您的浏览器中;您可以将其复制到剪贴板或保存为本地文件。

现在,您可以将账户导入到另一台机器中。

  1. 在目标系统上,导航到系统 | 用户和组,然后点击标记为运行批处理文件的链接。

  2. 批处理数据源设置为文本框中的文本,并将导出的批处理文件内容粘贴到提供的文本区域中。

  3. 对以下问题回答

    • 在其他模块中创建、修改或删除用户?

    • 为创建的用户创建主目录?

    • 将文件复制到创建的用户的主目录?

    • 密码已经加密?

  4. 您的屏幕应类似于以下截图:操作方法...

  5. 点击执行批处理以导入账户。

它是如何工作的...

Webmin 使用一个简单而强大的文件格式来描述其对用户和组的操作。此文件中的每一行描述一个单独的操作,操作可以是 createmodifydelete。每行中的字段由冒号字符(:)分隔,类似于 Unix 用户文件(/etc/passwd)的格式。第一字段是操作名称,第二字段包含我们希望执行操作的用户或组的名称,后续字段包含附加数据。

以下是 Webmin 批处理文件格式的简要说明:

Webmin 用户操作的批处理文件格式

Webmin 的批处理指令以文本形式编写,每行描述一个操作。以下标准格式用于 Linux 系统用户的操作:

create:username:passwd:uid:gid:realname:homedir:shell:min:max:warn:inactive:expire
modify:oldusername:newusername:passwd:uid:gid:realname:homedir:shell:min:max:warn:inactive:expire
delete:username

Webmin 批处理指令中使用的字段类似于标准 Unix 系统文件中存储的字段。以下是 Webmin 批处理指令中使用的各个字段:

  • username:这是我们希望执行操作的账户的用户名(例如,archer)。

  • oldusernamenewusername:这两个字段用于修改操作。用户名字段使用两次,以防我们想要更改其值。第一次是当前的用户名,第二次是我们希望更改成的值。如果不想更改用户名,可以将 newusername 留空。

  • passwd:这是可能已加密为哈希值或以明文提供的密码(例如,myVeryLongPassword123456789)。如果此字段只包含一个 x 字符,则表示账户已被锁定。

  • uid:这是用户的 ID,表示为一个数字(例如,500)。如果此字段为空,Webmin 将自动分配一个 ID。

  • gid:这是用户主组的 ID(例如,500)。如果在 create 操作中此字段为空,Webmin 将自动创建一个与用户同名的新组。

  • realname:这是用户的真实姓名(例如,Sterling Archer)。

  • homedir:这是用户的主目录(例如,/home/archer)。

  • shell:这是用户的默认 shell 程序(例如,/bin/bash)。

  • min:这是系统允许用户更改密码的最短天数。你可以将此值设置为 0,以取消此限制。

  • max:这是系统强制用户更改密码的最长天数。将其设置为 0 以取消此功能。

  • warn:这是密码过期前的天数,在此期间用户将被警告即将到来的密码更改。

  • inactive:这是密码过期后的天数,在此期间用户仍可以登录并更改密码。超过此时间后,用户将无法登录。

  • expire:这是密码过期的日期,以自 1970 年 1 月 1 日以来的天数表示。

    提示

    如果你正在执行 modify 操作,你可以保持所有字段为空,除了你想要更改的字段。

Webmin 的批处理文件格式用于对组进行操作

以下格式用于对系统组的操作:

create:groupname:passwd:gid:member,member,...
modify:oldgroupname:newgroupname:passwd:gid:member,member,...
delete:groupname

以下字段被使用:

  • groupname:这是我们想要操作的组的名称(例如,users)。

  • oldgroupnamenewgroupname:这些字段用于修改操作。组名字段使用两次,以防我们想要更改其值。第一次是组的当前名称,第二次是我们希望设置的新值。

  • passwd:组密码并不常用。它们可能用于限制用户将自己添加到组中的权限。将此字段设置为星号或感叹号(*!)来禁用此功能。

  • gid:这是组的 ID(例如,100)。如果此字段为空,Webmin 将自动将其设置为下一个可用的值。

  • member:这是应该成为此组成员的用户账号的用户名(例如,archer)。

还有更多…

Webmin 的批处理文件格式可以用来对系统用户和组进行操作。此功能不仅限于系统之间导出和导入数据,批处理文件还可以快速修改或删除多个账户。

导出和导入系统组

为了将一个系统的系统组列表导出到另一个系统,你可以按照以下步骤操作,但在你导航到系统 | 用户和组时,执行导入和导出之前,切换到本地组选项卡。

批量更新用户账户

假设你发现自己处于需要更改所有系统用户账户的情况。假设我们决定将所有账户的默认 shell 程序更改为 zsh。为此,你应该为每个用户准备一个批处理文件,其中 username 被每个账户的用户名替代:

modify:username:::::::/bin/zsh:::::

接下来,导航到系统 | 用户和组;点击标记为运行批处理文件的链接,提供你的批处理文件并执行它。这将更新所有用户账户的默认 shell 程序。

相同的方法也可以用于更新任何标准账户字段的值。

批量删除用户账户

如果你需要删除大量用户,可以为每个用户创建一个批处理文件,其中username由每个用户的名称替代:

delete:username

我们按照之前描述的方式运行文件。

提示

你可以使用相同的方法删除多个组;只需使用组名代替用户名,并在执行批处理文件之前切换到本地组选项卡。

参见

安装 Usermin

如果你希望通过类似 Webmin 的界面向系统用户提供基本功能,可以使用 Webmin 的伴侣产品——Usermin。这个环境与 Webmin 一样易于使用,并提供一些不需要管理员权限的功能:

  • 阅读邮件

  • 设置邮件转发和自动回复

  • 设置定时邮件

  • 更改密码

  • 执行系统命令

  • 在浏览器中打开 SSH 会话

  • 配置 Apache 虚拟主机

  • 配置 MySQL 或 PostgreSQL 数据库

  • 设置 CRON 作业或定时命令执行

如何操作…

安装 Usermin 非常简单,使用方式也类似 Webmin。主要区别在于你连接到不同的端口;Usermin 的默认端口是 20000。

让我们从安装 Usermin 开始:

  1. 如果你是通过 Webmin 的仓库安装的,请按照第一章中的安装软件包步骤,安装名为usermin的包。

    小提示

    如果你是从包文件而非仓库安装的 Webmin,请前往未使用模块 | Usermin 配置,点击标有安装 Usermin 包的按钮。

  2. 安装包后,在 Webmin 的侧边栏菜单中点击刷新模块并重新加载 Webmin。

安装后,Usermin 会自动启用。Usermin 的使用方式与 Webmin 相似。Usermin 的默认端口是 20000,因此你可以通过 Web 浏览器连接到它,使用以下地址;只需将webmin.host替换为服务器的 IP 地址或域名:

https://webmin.host:20000

你现在可以以任何系统用户身份登录,探索 Usermin 的功能。

Usermin 的配置是通过 Webmin 完成的,配置选项位于Webmin | Usermin 配置模块中。请注意,这个界面与 Webmin 的主设置界面类似。配置选项相似,但仅限于 Usermin 的功能。

首先,让我们决定哪些用户可以访问 Usermin:

  1. 前往Webmin | Usermin 配置 | 允许的用户和组

  2. Usermin 登录访问控制部分,选择仅允许列出的用户

  3. 你现在可以提供一个用户列表,指定哪些用户可以访问 Usermin。如果你希望将一个组的所有成员添加到列表中,请在组名之前加上@符号,即@groupname

其次,让我们决定哪些 Usermin 模块可以使用:

  1. 前往Webmin | Usermin 配置 | 可用模块

  2. 勾选你希望用户可以使用的模块旁边的框。如果你不确定某个模块的功能,最好先不勾选它,直到你确定需要它为止。

  3. 为了配置每个模块的特定选项,请前往Webmin | Usermin 配置 | Usermin 模块配置

  4. 点击模块名称并设置其选项。

  5. 你将能够设置模块的全局选项(全局模块配置标签)和默认值,用户可以在(默认用户首选项标签)中进行覆盖。

它是如何工作的...

Usermin 是 Webmin 的附加包,默认安装在目录/usr/share/usermin中。它的功能与 Webmin 相似,但专注于提供无需 root 权限的基本功能访问。

另请参见

由于 Usermin 的功能类似于 Webmin,你可以参考本书中的其他章节,了解其使用和配置,特别是以下章节:

  • 第一章, 设置你的系统

  • 第八章, 运行 Apache Web 服务器

  • 第九章, 运行 MySQL 数据库服务器

  • 第十章, 运行 PostgreSQL 数据库服务器

你可以在以下网址找到有关 Usermin 的更多信息:doxfer.webmin.com/Usermin/Introduction

第三章:保护你的系统

在本章中,我们将涵盖以下主题:

  • 设置 Linux 防火墙

  • 允许通过防火墙访问某项服务

  • 通过端口扫描验证防火墙

  • 关闭不必要的服务

  • 验证密码强度

  • 禁用 SSH 上的 root 登录

  • 限制 Webmin 访问特定的 IP 地址

  • 通过 SSH 隧道安全地连接到 Webmin

  • 自动关闭不活动的 Webmin 会话

介绍

有些人说,唯一安全的机器就是关闭的那一台。这可能是真的,但那台机器并不太有用。如果你想让你的服务器更具功能性,你必须将其打开,并且很可能会暴露给互联网上好奇的目光。

在线计算机安全是一个足够庞大的话题,值得专门撰写一本书。事实上,有一整排这样的书籍可以随时获取。在本章中,我们将学习一些基本技巧,这些技巧将帮助你在将服务器上线之前保护你的服务器。如果你的服务器暴露在互联网上,跟进进行更深入的安全研究,并且每天监控你的机器的运行状况是一个好主意。因为这是一本关于 Webmin 的书,所以我们只讨论 Webmin 可以帮助的领域。

本章分为三个部分:

  • 我们将首先列出一个系统管理员应当牢记的安全问题基础检查清单。如果 Webmin 可以帮助你解决这些问题,我们会在本书中指引相应的配方。

  • 本章的前六个配方涵盖与一般系统安全相关的主题。

  • 剩余的配方将涉及如何保护 Webmin 本身。

服务器安全检查清单

有一些基本的安全预防措施,你应当在任何暴露于互联网的计算机系统上采取。这份清单并不全面;可能还有其他你想要做的事情,但这是一个很好的起点,你不应忽视这些领域。

保持系统更新

软件从来不完美,错误每天都会被发现。这些错误有的只是令人不便,但有些则可能被恶意人士利用,入侵你的机器。保持系统更新,及时安装安全补丁,是在线系统维护中的关键部分。有关如何保持更新的信息,请参考第一章中的更新已安装的包到最新版本当新版本的包发布时通过电子邮件提醒配方。

关闭不必要的服务

如果你的 FTP 服务器软件存在安全漏洞,但该服务未在运行,那么这个漏洞的危险性就不会太大。关闭所有不必要的服务以减少系统的暴露面是个好主意。有关此主题的更多信息,请参考本章中的关闭不必要的服务通过端口扫描验证防火墙配方。

为你的系统构建防火墙

你可以使用包过滤软件来限制对你系统的访问。你可以决定是否只允许来自互联网上特定区域的人连接,哪些端口应该接受连接,或者某些服务是否仅在本地可用。有关更多信息,请参阅本章中的设置 Linux 防火墙通过防火墙允许访问服务配方。

执行备份

如果发生故障,保持所有重要数据的备份非常重要,最好是存储在另一个系统中,且位置不同。有关更多信息,请参阅第七章,备份你的系统

监视你的系统

如果服务器出现问题,确保你是第一个知道的人很重要。密切关注系统日志,并设置系统自动发送包含日志更新的电子邮件。如果有人入侵你的系统,他们可能会篡改日志。因此,将日志保存在一个单独的专用日志服务器上是个好主意。有关更多信息,请查看第五章,监视你的系统

验证密码强度

无论你的安全措施有多严格,如果你将 root 密码设置为 rootadmin,你的服务器肯定会被黑客入侵。同样,你应定期验证用户密码的强度。请参阅本章中的验证密码强度配方。实际上,完全禁用 root 通过 SSH 登录是个好主意。有关此内容,请查看禁用 root 通过 SSH 登录配方。

验证系统安全性并设置入侵检测和防御软件

以下内容超出了本书的范围。然而,如果你希望确保服务器尽可能安全,你应当实现以下流程:

设置 Linux 防火墙

Linux 系统内置了防火墙软件。这个数据包过滤框架被称为netfilter(自 Linux 2.4 版本起)。它通过一个名为iptables的工具来控制,该工具指示内核如何处理传入和传出的网络数据包。

在这个教程中,我们将从一个空的iptables配置(防火墙禁用)开始,并配置它丢弃任何传入的网络包,除非是我们明确允许的。在设置防火墙之前,我们应该回顾一些与网络通信和iptables组织相关的基本概念。

以下是一些基本的数据包过滤概念:

  • 数据包:互联网是一个分组交换网络。这意味着所有的通信都是通过将内容拆分成称为数据包的小块来实现的,这些数据包从一个计算机传递到网络中的另一个计算机。

  • IP 地址:互联网上的机器地址由数值 IP 地址指定,例如93.184.216.119(IPv4)或2606:2800:220:6d:26bf:1447:1097:aa7(IPv6)。

  • 端口号:大多数常见应用程序使用 TCP 或 UDP 传输协议,这些协议需要一个特定的端口号来区分同一台计算机上运行的不同服务。

  • 数据包头:每个经过网络的数据包都包含一个头部,指明它来自哪里以及将去向何方。这使得互联网上的路由器能够将数据包引导到正确的方向,或者向发送方发送错误信息。

  • 数据包过滤:防火墙软件能够检查数据包头部,并决定是否允许某个特定的数据包继续传输,或者应该丢弃它。

一些 iptables 术语

iptables工具能够对数据包执行一组相当复杂的操作。用于决定数据包命运的规则被分为几个层次的组织,具体如下:

  • :这是最高级别的组织方式。iptables工具允许你过滤网络数据包(使用filter表),设置网络地址转换系统(使用nat表),或修改数据包(使用mangle表)。我们将重点关注数据包过滤功能(filter),以创建一个防火墙。

  • :每个表包含多个规则链,这些链会在特定情况下应用。filter表中内置的链分别是INPUT(应用于进入系统的数据包)、OUTPUT(应用于系统产生的数据包)和FORWARD(应用于进入系统但目标为其他系统的数据包)。在本教程中,我们将重点关注传入流量和INPUT链。

  • 规则:任何通过防火墙的数据包都会与相应链中的规则进行比较。规则可以根据特定的源或目标 IP 地址、端口号进行匹配,也可以根据特定的网络接口、协议或连接状态进行匹配。规则按特定顺序尝试,第一个匹配数据包的规则将决定数据包是被接受还是丢弃。

  • 默认策略:如果数据包没有匹配任何规则,其处理方式将由链的默认策略决定。

准备工作

在本教程中,我们将从头开始设置防火墙配置,并重置系统可能自带的任何配置。这并非必要,如果您知道iptables的工作原理,您可以基于系统默认的防火墙配置进行修改。在这种情况下,您可以跳到教程通过防火墙允许访问某服务部分。

Webmin 还提供了一系列预定义的配置,您可以用来初始化防火墙。这些配置在启用防火墙后或通过导航到网络 | Linux 防火墙并点击重置防火墙时可用。Webmin 的预定义防火墙配置选项如以下截图所示:

Getting ready

以下表格描述了 Webmin 预定义的防火墙配置的作用:

选项 描述
允许所有流量 这是一个没有任何规则的配置,默认情况下允许所有流量通过。
阻止所有外部接口的传入连接 这将防止网络连接到您的服务器,仅允许已建立的连接和基本的 DNS 和 ICMP 数据包通过。
阻止所有除 SSH 和 IDENT 外的外部接口连接 这与阻止所有外部接口的传入连接相同,但允许传入的 SSH 连接,且不幸的是,允许身份识别协议IDENT)的请求。建议不要允许后者。
阻止所有除 SSH、IDENT、ping 和高端口之外的接口连接 这与阻止所有除 SSH 和 IDENT 外的外部接口连接相同,但还允许服务器响应 ping 命令,并允许访问 1024 到 65535 范围内的大多数端口。这些高端口可能会被非 root 用户启动的进程用来接受连接。在开放的互联网环境中不应使用此配置。
阻止所有,除了用于虚拟主机的端口,在接口 这允许对大多数常用服务的传入连接,例如 SSH、HTTP、邮件、FTP 和 DNS。这也允许连接到 Webmin、Usermin,以及不幸的是 IDENT。
在外部接口上进行网络地址转换 这将在 POSTROUTING 链上设置伪装规则。这允许您的服务器作为网络网关为您网络中的其他计算机提供服务。

如何操作...

执行以下步骤以设置防火墙:

  1. 检查系统是否已经设置了iptables防火墙。您可以通过导航到网络 | Linux 防火墙来完成此操作。

  2. 如果您的防火墙已经设置好,您将在过滤表的链中看到一系列规则。通过点击重置防火墙来创建一个新的防火墙配置。

  3. 选择允许所有流量选项,勾选开机时启用防火墙框,并点击设置防火墙

  4. 确保 Webmin 显示的是数据包过滤(filter)表,并且尚未设置任何规则。您的屏幕应类似于以下截图:如何操作...

  5. 现在,我们将创建一组基本规则,以确保您的防火墙能够正常工作。第一条规则将允许属于已建立连接的传入数据包。通过点击添加规则,将第一条规则添加到传入数据包部分的INPUT链中。

    设置以下选项:

    • 操作设置为接受

    • 对于连接状态,选择等于,并勾选已建立(ESTABLISHED)相关(RELATED)

    然后,点击创建按钮。

  6. 第二条规则将允许传入的网络诊断(ICMP)数据包(pingtraceroute等)。再次点击添加规则,并在点击创建之前设置以下选项:

    • 操作设置为接受

    • 对于网络协议,选择等于,并选择ICMP

  7. 第三条规则将允许来自我们自己的机器通过本地环回接口的任何连接。按照前面的步骤创建该规则:

    • 操作设置为接受

    • 对于传入接口,选择等于,并选择lo

  8. 前述规则足以使您的网络接口在大多数情况下正常工作。我们现在可以添加一些特定于我们需求的规则。让我们创建一个规则,允许传入的 SSH 连接。按照以下选项创建规则:

    • 操作设置为接受

    • 对于网络协议,选择等于,并选择TCP

    • 对于目标 TCP 或 UDP 端口,选择等于,并将端口设置为22

    • 对于连接状态,选择等于,并选择新建(NEW)

  9. 我们的最终规则将允许传入的 Webmin 连接。创建一个与 SSH 相同的规则。不过,选择端口 10000,而不是 22。

    提示

    Webmin 还使用 UDP 端口 10000 来发现网络中运行 Webmin 的其他服务器。如果您计划使用 Webmin 的集群功能,您还应该为端口 10000 和网络协议 UDP添加规则。

  10. 最后,我们将链的默认策略设置为丢弃不符合任何规则的数据包。选择默认操作为丢弃,然后点击设置默认操作为按钮。

    注意

    您可以选择丢弃拒绝数据包。当数据包被丢弃时,您的服务器不会响应,而当它们被拒绝时,则会发送一个友好的端口关闭响应。

  11. 在此阶段,您的防火墙配置应类似于以下截图。请确认您没有犯任何错误。如何操作...

    允许传入 SSH 和 Webmin 连接的防火墙配置,但会丢弃所有其他连接。

  12. 要激活您的新防火墙,请点击应用配置按钮。

    提示

    使用网络工具(如 Webmin)修改防火墙配置有点棘手;如果您犯了错误,可能会导致自己被锁定。紧急情况下,您可以通过系统控制台登录并发出以下命令,临时禁用防火墙:

    $ sudo iptables -F INPUT
    $ sudo iptables -P INPUT ACCEPT
    
    

    第一个命令会清除(删除)INPUT链中的所有规则,第二个命令将其默认策略设置为ACCEPT传入数据包。这些更改是临时的,系统重启后默认配置将被重置。

它是如何工作的...

Webmin 在这里真的帮了大忙,特别是如果您的系统没有默认的防火墙配置。Webmin 会发出一长串命令来创建一个空的但有效的iptables配置。然后,它将此配置保存到文件中,并允许我们向其中添加规则。当我们要求 Webmin 在启动时启用防火墙时,它还会将适当的命令添加到系统的网络配置脚本中。

还有更多...

iptables能为您做的事情远不止这些。例如,将 Webmin 访问仅限于您自己和一些管理员同事是一个好主意。互联网上的其他人甚至不需要知道您正在运行 Webmin。为了实现这一点,您可以限制访问为一组 IP 地址或互联网子网。

返回您为 Webmin 访问创建的规则,并添加另一个条件。将源地址或网络设置为您正在连接的机器的 IP。如果您希望授权整个网络段的访问,还需在斜杠字符(/)后指定子网掩码。例如,如果您希望将访问限制为来自 10.10.10.0 到 10.10.10.255 之间 IP 的请求,可以使用以下地址和掩码:10.10.10.0/255.255.255.0

提示

在这个食谱中,我们只设置了过滤进入网络流量的规则。防火墙还可以控制从服务器到互联网的流量。对于可能被用户安装的恶意软件侵害的机器,最好阻止其向外的连接。

另见

  • 你可以通过扫描端口来验证防火墙是否按预期工作。有关更多信息,请参考通过端口扫描验证防火墙的食谱。

  • 如果你有兴趣了解iptables的更多功能,可以查看其文档:www.netfilter.org/documentation/

  • 有关 Webmin 防火墙模块功能的更多信息,请查看它的 Wiki 页面:doxfer.com/Webmin/LinuxFirewall

通过防火墙允许访问服务

一旦防火墙设置完毕,所有未经授权的流量进入你的服务器时都会被丢弃。如果你决定向服务器添加一个服务,你需要添加另一条防火墙规则来允许流量进入并访问该服务。否则,外部用户将无法访问该服务。事实上,他们甚至无法看到该服务正在运行,连接将会超时。

准备工作

确保你的防火墙已经设置好。有关更多信息,请参考设置 Linux 防火墙的食谱。确保你知道服务所使用的端口号和协议。常见的端口号,如 Web 服务器的 80 和 443,以及 FTP 的 20 和 21,可以在/etc/services文件中找到。默认情况下,Usermin 使用端口 20000。

如何操作...

访问服务通过防火墙的步骤:

  1. 进入网络 | Linux 防火墙

  2. 点击添加规则按钮,在进入的数据包(INPUT)部分。

  3. 设置以下选项:

    • 执行的操作设置为接受

    • 对于网络协议,选择等于并选择TCP(如果你的服务需要 UDP,则选择UDP

    • 对于目标 TCP 或 UDP 端口,选择等于并设置端口号为所需的端口号

    • 对于连接状态,选择等于并选择NEW

  4. 点击创建

    提示

    iptables规则是按特定顺序应用的。这些规则按 Webmin 中的显示顺序从上到下排列。如果一个接受或丢弃的规则匹配一个数据包,那么在此规则下方的其他规则将不再生效。当你设置一个规则来接受某种类型的数据包时,请确保它位于更一般的规则之前,以免该数据包被丢弃或拒绝。使用灰色的向上箭头将规则向上移动。

  5. 点击应用配置按钮以激活更改。

它是如何工作的...

我们创建了一条新的防火墙规则,允许数据包进入,前提是它们使用我们指定的协议(TCP 或 UDP)、我们选择的端口号,并且它们是启动连接的数据包(NEW 状态)。

Webmin 将我们的规则添加到iptables配置文件中,并加载新的防火墙配置。从此以后,指定端口的数据包将被允许安全地进入你的系统。

还有更多内容...

你可能希望在系统上运行仅对同一台机器可访问的服务。你的 Web 应用程序的数据库服务器可能就是这样一个例子。如果你希望仅本地允许访问某个服务,你可以创建一个防火墙规则,允许只有通过本地回环接口发来的请求。

创建仅在内部网络可访问的服务

为了创建一个仅限本地的服务,请按照本食谱中描述的相同步骤操作,但在规则中添加另一个条件。在Incoming interface下,选择Equals并选择lo(本地回环接口的名称)。

注意

我们的默认防火墙配置(在设置 Linux 防火墙食谱中描述)允许所有本地发起的请求进入。你可以通过删除该规则并仅允许本地访问特定服务来禁用此行为。

参见

  • 有关iptables防火墙工作原理的更多信息,请参阅本章中的设置 Linux 防火墙食谱。

通过端口扫描验证你的防火墙

在配置好防火墙后,你可能希望检查是否无意中留下了不必要的开放端口。一个很好的方法是从另一台机器发起扫描,告诉你在服务器上发现了哪些开放端口。只有与你希望公开访问的服务相关联的端口应该被发现。

准备工作

我们将在本食谱中使用两台机器。一台是扫描机器,另一台是我们要扫描的服务器。

Nmap 是一个非常优秀且广泛可用的端口扫描工具。首先,我们在扫描机器上安装它。你可以通过大多数 Linux 发行版的仓库、BSD 的端口或 OS X 上的 Homebrew 来安装它。你也可以从nmap.org/download.html下载 Windows 版安装程序。

操作步骤...

执行以下步骤通过端口扫描验证你的防火墙:

  1. 在你的扫描机器上,打开终端窗口并输入以下命令(这里,webmin.host是你希望扫描的服务器的 IP 地址或域名):

    $ nmap -sT webmin.host
    
    

    你应该会看到以下输出:

    Starting Nmap 6.25 ( http://nmap.org ) at 2013-08-13 21:42 CEST
    Nmap scan report for 37.139.1.192
    Host is up (0.039s latency).
    Not shown: 998 filtered ports
    PORT      STATE SERVICE
    22/tcp    open  ssh
    10000/tcp open  snet-sensor-mgmt
    
    Nmap done: 1 IP address (1 host up) scanned in 17.65 seconds
    
    
  2. 输出列出了在你的服务器上发现的开放端口。其中,你会发现端口 22 用于 SSH 连接,端口 10000 用于 Webmin。如果在扫描中发现了意外的端口,你可能需要返回防火墙配置并关闭它们。

    小贴士

    一些 ISP 可能会在扫描数据包到达你正在测试的服务器之前将其阻塞。例如,发往端口 25 的数据包通常会被阻塞,以对抗垃圾邮件。

    你可以通过在暂时禁用服务器防火墙的情况下对其进行扫描,来验证你执行的扫描是否有效。当服务器没有活动的防火墙时,你的远程扫描结果应类似于在服务器本身上执行以下命令的结果。这个netstat命令列出了服务器上开放的端口。

    $ netstat –ltn
    
    

    查看本章中的关闭不必要的服务食谱,了解更多关于使用netstat的信息。

工作原理...

使用默认选项时,Nmap 扫描将向指定机器的 1,000 个最常用端口发送 SYN 数据包(初始连接握手的第一部分)。如果机器在某个端口上接受连接,它将返回 SYN/ACK 数据包,确认它已准备好建立连接。通过这一点,Nmap 可以确定端口是开放的。

对于那些防火墙设置为丢弃的端口,连接将被标记为filtered,因为它们完全没有返回任何信息。对于防火墙设置为拒绝的端口,将返回端口不可达消息,并在扫描中标记为closed

还有更多...

Nmap 有各种选项。它可以用来扫描整个网络,扫描某台计算机的每个端口,或者执行一个不需要扫描计算机管理员权限的扫描。

使用 Nmap 进行主机发现

如果你想了解网络段上哪些计算机是活动的,可以输入以下命令,指定你希望扫描的 IP 地址范围:

$ nmap -sn 10.10.10.0-255

扫描所有端口

默认情况下,Nmap 扫描仅扫描 1,000 个最常用的端口。如果你想更彻底地扫描每一个端口,可以使用以下命令(带有-p-参数)。请注意,这种扫描可能需要几分钟。

$ sudo nmap -sT -p- webmin.host

在没有管理员权限的情况下进行扫描

Nmap 的标准端口扫描技术需要扫描计算机的管理员权限,因为它使用原始套接字来仅执行连接的第一部分(发送 SYN 数据包)。如果你没有管理员权限,可以执行另一种类型的扫描,通过发出以下命令(带有-sP参数)来启动一个正常的连接:

$ nmap -sP webmin.host

另请参阅

关闭不必要的服务

避免潜在安全问题的最佳方法是禁用你没有在主动使用的服务。这个食谱将列出识别有开放网络端口并禁用的运行中系统服务的步骤。

如何操作...

让我们从识别在你的系统上打开网络端口的进程开始。这可以通过以下步骤完成:

  1. 导航到其他 | 命令行

  2. 输入命令netstat -tulpen并点击执行命令

你将看到一个列出具有活动网络连接的服务器进程的列表。

Local Address 列中,你会看到类似 0.0.0.0:22 的条目。这意味着某个进程正在监听端口 22。PID/Program name 列将告诉你哪个进程负责打开这个端口。

如果你识别出某个不再使用的进程,并且知道它对系统并非必需,你可以根据以下步骤禁用它:

  1. 导航至 系统 | 启动与关闭

  2. 找到与该进程相关的启动项,并勾选其名称旁边的框。

  3. 点击 立即禁用并在启动时禁用 按钮。

  4. 返回 其他 | 命令行外壳

  5. 再次执行 netstat -tulpen 命令,并检查该进程是否不再出现在列表中。

工作原理...

netstat 命令允许你显示有关网络连接的信息。-tulpen 作为助记符(tulpen 在德语中意味着郁金香)用于列出所有正在监听连接的开放端口的服务器。各个参数的功能如下:

  • -t 列出 TCP 连接。

  • -u 列出 UDP 连接。

  • -l 仅列出正在监听的连接(服务器)。

  • -p 将显示进程 ID 和程序名称。

  • -e 会显示扩展信息。

  • -n 会将数据显示为数字,而不是解析为名称。

验证密码的强度。

如果你允许管理员用户通过用户名和密码登录到系统,那么系统的安全性仅取决于这些用户使用的密码。定期尝试破解系统上的所有密码是个好主意。如果发现某些密码容易猜测或通过暴力破解能轻松破解,你应要求用户更改密码。

正在准备中。

对于这个操作,我们将使用名为 John the Ripper 的密码破解程序。首先安装名为 john 的软件包。更多细节请参考 第一章,设置你的系统,中的 安装软件包 部分。

如何操作...

John the Ripper 尝试通过暴力破解密码,这意味着它会尝试所有单词和字符组合。如果系统上的某个用户设置了强密码(长且复杂),John 将无法在合理时间内破解它。你应让破解程序运行几天,然后判断剩余的密码是否足够强大。

注意

John the Ripper 尝试成为一个良好的系统公民,仅使用那些本来会被闲置的 CPU 周期。尽管如此,它仍然可能降低系统的响应速度。因此,如果你的系统负载很重或者其速度至关重要,你可以选择在另一台机器上进行密码破解。

执行以下步骤以识别弱密码:

  1. 进入 系统 | 计划任务,并创建一个新的命令,设置在 5 分钟后以 root 权限执行,命令路径为 /root 目录,命令内容为 john /etc/shadow。有关更多信息,请参阅 第四章中的 设置未来执行的命令 章节,控制系统 部分。

  2. 几个小时后,你可以查看已破解的密码数量。进入 其他 | 命令行 并执行以下命令:

     john -show /etc/shadow
    
    
  3. 此命令会显示所有已破解的密码及其信息,并显示 John the Ripper 仍在尝试破解的密码数量。你可以随时返回第二步检查破解进度。

  4. 你应该重置那些密码已被破解的用户的密码,并通知他们相关情况。有关详细信息,请参阅 第二章中的 更改用户密码 章节,用户管理 部分。

如果经过几天后仍有一些密码未被破解,你可以认为这些密码足够强大,并通过以下步骤停止 John the Ripper:

  1. 进入 系统 | 正在运行的进程

  2. 点击 CPU 选项以 显示 按照处理器使用情况排序的进程。

  3. 在列表的顶部,你将看到 john。点击它的 PID。

  4. 进程信息 屏幕上,点击 终止 按钮来停止此次破解会话。

    提示

    你可以通过执行以下命令来恢复已停止的破解会话:

    john –restore
    
    

    使用与第一步相同的程序将其调度到后台执行。

  5. 当你决定结束密码破解时,应该删除由 John the Ripper 创建的文件。这些文件将存储在 /root/.john 目录中。特别重要的是要删除 john.pot 文件,因为它包含所有被破解的密码,并且所有具有管理员权限的用户都可以读取该文件。

它是如何工作的……

你将系统用户的密码哈希值提供给 John the Ripper。john 程序首先确定你的系统使用了哪些哈希技术和盐值。然后,它会对字典文件中的每个单词应用相同的哈希算法。如果它生成的哈希值与某个用户的密码哈希值相同,则该单词就是密码——密码破解成功。尝试完字典文件中的所有单词后,John the Ripper 会尝试所有可能的字母组合。这个过程需要较长时间,并且会消耗大量的 CPU 资源。如果你发现 John 花费了很长时间(超过几天)来破解密码,你可以判断密码已经足够强大,决定停止。

禁用 root 用户通过 SSH 登录

允许 root 用户通过 SSH 登录是一个潜在的安全漏洞。攻击者可能通过尝试每一个 root 用户的密码来入侵系统。建议禁止 root 用户通过 SSH 登录,并以其他拥有 sudo 权限的用户身份登录,进行管理任务。

如何实现...

执行以下步骤以禁用 root 登录:

  1. 进入 服务器 | SSH 服务器 | 认证

  2. 允许 root 用户登录吗? 问题回答

  3. 点击 保存

  4. 返回到 SSH 服务器 模块屏幕,点击 应用更改

它是如何工作的...

Webmin 通过设置 PermitRootLoginno 来更新 SSH 配置文件(/etc/ssh/sshd_config)。从此,SSH 将视每个输入的 root 用户密码为错误。

限制 Webmin 访问特定的 IP 地址

防火墙是你防御的第一道防线,但在运行 Webmin 的互联网服务器上,你应采取额外的预防措施。Webmin 允许你限制特定 IP 地址和网络的访问。以这种方式保护 Webmin 是个好主意,否则攻击者可以尝试猜测你的密码并控制你的系统。

在本食谱中,我们将配置 Webmin 仅接受来自你 IP 地址的连接。

准备工作

在开始之前,你应该确定当前用于连接 Webmin 的 IP 地址。为此,登录 Webmin 并进入 Webmin | Webmin 用户 | 查看登录会话。你的活动登录会话将以粗体显示,并且你的地址将列在 IP 地址 列中。

如何实现...

限制 Webmin 访问,请执行以下步骤:

  1. 进入 Webmin | Webmin 配置 | IP 访问控制

  2. 允许的 IP 地址 设置为 仅允许来自列出的地址

  3. 在下面的文本框中输入你的 IP 地址。

  4. 点击 保存。Webmin 会保存更改并重新启动。

从此以后,你将能够从指定的 IP 地址连接。但尝试从其他计算机连接 Webmin 的用户将收到 HTTP 403 错误(访问被拒绝)

它是如何工作的...

Webmin 在其服务器配置文件中存储有关哪些主机被允许连接的信息(默认是 /etc/webmin/miniserv.conf)。允许主机访问的行以关键字 allow 开头,并指定用空格分隔的 IP 地址和范围列表。例如,它可能看起来像下面这样:

allow=93.184.216.119 192.0.2.0/24

每当客户端尝试连接时,Webmin 会检查此配置,决定是否允许传入的连接。

还有更多...

Webmin 的 IP 访问控制模块非常灵活,允许你以多种方式指定 IP 地址集。

允许来自多个 IP 地址的访问

允许从多个位置访问 Webmin 的最简单方法是将多个 IP 地址添加到IP 访问控制模块的文本框中。你可以根据需要添加任意数量的 IP 地址,只需将每个 IP 地址放在单独的一行上。

允许来自动态分配 IP 的访问

许多互联网服务提供商动态分配 IP 地址。这种地址可能在未来某个时候发生变化,这可能会导致你无法连接到 Webmin。如果你正在使用动态 IP 地址,可以考虑注册动态 DNS 服务。动态 DNS 服务将为你提供一个主机名,能够自动更新以匹配你的变化 IP。保持此信息最新需要在你的计算机或网络路由器上设置一个守护进程。

注意

有很多动态 DNS 提供商,其中一些还提供基本的免费服务。你可以查看以下提供商,或搜索“动态 DNS 提供商”:

DynamicDNS: dyn.com

NoIP: noip.com

FreeDNS: freedns.afraid.org

要让 Webmin 允许你的动态分配 IP 地址访问,请转到IP 访问控制模块并输入你的动态 DNS 提供商提供的主机名。

允许来自 IP 范围的访问

如果所有 Webmin 用户使用的是同一个互联网服务提供商,他们很可能在使用共享网络。如果你知道该子网共享的 IP 地址范围,你可以使用子网地址/掩码或地址/掩码位格式来指定这个范围:

192.0.2.0/24
192.0.2.0/255.255.255.0

注意

上述两行是等价的,都指定了192.0.2.0192.0.2.255之间的所有 IP 地址。在指定 IP 范围时不要过于宽泛。使用你的互联网服务提供商所使用的所有公共 IP 范围并不是一个好主意,因为潜在的攻击者可能已经控制了同一服务商连接到互联网的某台计算机。

允许来自本地网络的访问

如果你的服务器可以通过本地网络访问,你可以让 Webmin 允许来自局域网内的所有连接。为了实现这一点,请按照本食谱中的步骤操作,但还需勾选将本地网络包括在列表中的框。

通过 SSH 隧道安全地连接到 Webmin

如果你的服务器已连接到互联网,并且你使用 SSH 进行连接,可以通过禁止 Webmin 接受任何远程连接来确保服务器安全。然后,你可以通过 SSH 隧道连接到 Webmin。这将降低你机器的潜在攻击面,并保护你免受 Webmin 本身可能存在的安全漏洞。任何攻击者都必须破解你的 SSH 账户或以其他方式获得本地系统访问权限,才能连接到 Webmin。

准备工作

在开始之前,你应该按照本章中的限制 Webmin 访问特定 IP的步骤,并将 IP 地址127.0.0.1添加到允许连接到 Webmin 的主机列表中。

在这个食谱中,我们将使用大多数系统上都可以找到的 SSH 命令行版本,但它在 Windows 上不可用。请查看本食谱中的还有更多内容...部分,了解针对 Windows 的具体说明。

如何操作...

执行以下步骤以安全连接到 Webmin:

  1. 在客户端机器上,打开终端窗口并发出以下命令。然而,将username替换为你的用户名,将webmin.host替换为你服务器的 IP 地址或主机名:

    $ ssh -L 15000:localhost:10000 username@webmin.host
    
    
  2. 输入你的 SSH 用户名和密码以建立连接。

  3. 在客户端机器上,打开浏览器并导航到 URL https://localhost:15000

现在你应该能够通过 SSH 隧道使用 Webmin 了。

它是如何工作的...

你可以通过发出以下命令来打开 SSH 隧道:

$ ssh -L client_port:remote_host:remote_port username@ssh_host

SSH 隧道连接的机器如下图所示:

它是如何工作的...

当你打开一个隧道时,SSH 客户端会在它运行的机器上打开一个网络端口(client_port)。这个端口现在将接受连接,所有进入的数据包将被 SSH 客户端程序拦截。SSH 客户端会对其进行加密,并使用 SSH 协议将其发送到 SSH 服务器机器。SSH 服务器会解密数据包并将其转发到远程机器(remote_host:remote_port)。远程机器发送的响应也会被加密,并通过隧道反向传输。

我们用来连接 Webmin 的隧道更简单,因为只涉及两台机器。当地机器同时是 SSH 客户端机器,而远程机器同时是 SSH 服务器。

当我们发出命令时

$ ssh -L 15000:localhost:10000 username@webmin.host

我们正在本地计算机上打开端口 15000,而webmin.host上的 SSH 服务器将转发所有数据包到其自身机器的 Webmin 端口(localhost:10000)。实际上,通过连接到我们自己计算机的端口 15000,我们就能像直接连接到那台机器一样访问远程 Webmin 界面。

还有更多内容...

在这个食谱中,我们将介绍另外两件事:允许其他机器访问 SSH 隧道以及使用 Putty 在 Windows 上创建 SSH 隧道。

与其他机器共享 SSH 隧道

默认情况下,SSH 客户端只允许隧道连接来自同一机器的连接。你可以使用-g选项覆盖这一设置:

$ ssh -g -L 15000:localhost:10000 username@webmin.host

这个命令将允许所有能够通过端口 15000 连接到 SSH 客户端机器的计算机访问远程机器上的 Webmin。

使用 Putty 在 Windows 上创建隧道

如果你正在运行 Windows,可以从www.chiark.greenend.org.uk/~sgtatham/putty/下载 Putty SSH 客户端。

  1. 为了在 Windows 上创建 SSH 隧道,启动 Putty。

  2. 会话部分,在主机名(或 IP 地址)字段中输入 Webmin 主机的主机名或 IP 地址,如下图所示:在 Windows 上使用 Putty 创建隧道

  3. 打开配置部分,依次导航到连接 | SSH | 隧道

  4. 将端口15000指定为源端口

  5. localhost:10000指定为目标

  6. 选择标记为本地的单选按钮,如下图所示:在 Windows 上使用 Putty 创建隧道

  7. 点击添加

  8. 点击打开以建立连接。

  9. 输入您的 SSH 用户名和密码。

  10. 在客户端计算机上,打开浏览器并导航到https://localhost:15000

现在,您应该能够通过 SSH 隧道使用 Webmin。

另请参见

一旦能够建立到 Webmin 的隧道连接,您就不再需要为其提供远程访问权限。您可以从防火墙配置中删除 Webmin 的条目,并指示 Webmin 仅在本地 IP 127.0.0.1 上监听连接。

  • 请参阅本章的设置 Linux 防火墙方法。

  • 请参阅第一章中的指定 Webmin 监听的 IP 地址部分,系统设置

自动关闭不活跃的 Webmin 会话。

默认情况下,Webmin 的登录会话不会设置过期时间。这会造成潜在的安全风险。如果用户在登录 Webmin 后离开计算机而未进行操作,攻击者可能利用这种情况对系统进行破坏或禁用其安全性。幸运的是,通过更改 Webmin 设置,可以轻松解决这一问题。

如何操作...

执行以下步骤以自动关闭不活跃的 Webmin 会话:

  1. 导航到Webmin | Webmin 配置 | 认证

  2. 勾选标记为自动注销的复选框,并设置在 10 分钟不活动后自动注销。

  3. 点击保存

它是如何工作的...

Webmin 将身份验证选项存储在其服务器配置文件中(默认是/etc/webmin/miniserv.conf)。定义用户在不活动时间后将自动注销的行以logouttime关键字开头,并指定以分钟为单位的时间。例如,它可能看起来像这样:

logouttime=10

每当客户端尝试连接时,Webmin 会检查会话数据库,查看该用户上次连接的时间。Webmin 会参考其配置,确定经过的时间是否未超过允许的时间。如果用户在允许的不活跃时间过后还想执行某个操作,系统会要求用户重新登录。

第四章:控制您的系统

本章将涵盖以下主题:

  • 在服务器上执行命令

  • 以其他用户身份执行命令

  • 设置未来执行的命令

  • 使用 cron 定期调度命令执行

  • 为经常执行的命令创建一个面板

  • 创建一个面板,用于执行经常使用的数据库命令

  • 在浏览器中运行终端模拟器

介绍

Webmin 允许您仅使用浏览器远程控制系统。无论您是需要执行单个命令,还是需要完整的终端访问,Webmin 都提供了每个任务的便捷工具。为了让您的生活更轻松,Webmin 还允许您为每个执行多次的任务设置控制面板。对于需要反复执行的命令,Webmin 为您提供了一个易于使用的界面来创建 cron 任务。

在服务器上执行命令

在使用 Webmin 的服务器上执行命令的最简单方法是命令外壳模块。在这个例子中,我们将执行一个列出我们机器上所有网络服务的命令。

如何操作...

执行以下步骤来执行netstat命令:

  1. 导航到其他 | 命令外壳

  2. 在文本框中输入命令。要列出您系统上所有活动的网络服务器,请使用netstat –tl命令。

  3. 点击执行按钮。

您将看到一个页面,显示命令的输出。在屏幕底部,您将看到一个表单,允许您执行另一个命令。您可以通过点击清除历史记录按钮来清除命令输出:

如何操作...

它是如何工作的...

Webmin 默认以 root 用户身份执行您输入的每个命令,并将每个命令保存到当前登录用户的历史文件中。Webmin 还会跟踪您使用cd命令进入的目录,但其他环境变量将在命令执行之间不被保留。

还有更多...

有时,您可能需要执行相互依赖的多个命令。在 Webmin 的基本命令外壳中,您可以通过将多个命令合并为一个执行来实现这一点。

执行一系列命令

执行一系列命令的最基本方法是使用分号(;)字符分隔命令。按照以下步骤操作:

  1. 导航到其他 | 命令外壳

  2. 输入以下两个命令(用分号分隔):

    export MESSAGE="Hello from Webmin!" ; echo $MESSAGE
    
    
  3. 点击执行按钮。

第一个命令(export)会在执行命令的环境中设置一个变量。第二个命令(echo)将该变量的值发送到标准输出。因此,您应该能看到该消息显示在屏幕上。如果您分别执行这些命令,环境变量将在执行之间不被保留。

有条件地执行命令

如果你希望执行一系列命令,其中第二个命令只有在第一个命令成功完成时才执行,可以使用逻辑与操作符(&&)将它们连接。这样,只有第一个命令成功完成(返回退出代码值为0)时,第二个命令才会被执行。请按以下步骤操作:

  1. 导航至其他 | 命令行

  2. 输入以下两个命令(用&&分隔):

    /bin/true && echo "Last command exited cleanly"
    
    
  3. 点击执行按钮。

你应该会在屏幕上看到消息,上一个命令已成功退出

如果上一个命令返回的退出代码表示发生错误,则该消息不会显示。通过执行以下命令亲自试试吧:

/bin/false && echo "Last command exited cleanly"

你不会看到任何输出,因为第二个命令并没有被执行。

这种方法对make && make install等命令特别有用,这些命令在软件的编译和安装过程中使用,其中第二个命令只有在第一个命令成功时才应执行。

执行历史命令

因为 Webmin 会保留你执行的所有命令历史记录,你可以从列表中选择以前的命令重新执行,而无需重新输入它们。

执行第一个命令后,你将看到之前的命令列表出现在命令文本框下方:

执行历史命令

要执行历史命令,请从列表中选择它并点击执行上一个命令。你也可以通过点击编辑之前的命令按钮来更改命令。如果你希望清除命令历史记录,请点击清除命令按钮。

作为其他用户执行命令

有时,执行其他用户身份下的命令是非常有用的。例如,某些服务的管理命令默认只能由与该服务相关联的系统用户访问。你也可能希望测试某个用户账户是否配置正确,并以其他用户身份执行命令,检查它是否按预期工作。

准备中

在本教程中,我们将通过发出createdb命令来创建一个新的 PostgreSQL 数据库,数据库名为testdb,该命令可由postgres用户使用。如果你还没有安装 PostgreSQL,可以参考第十章,运行 PostgreSQL 数据库服务器,获取有关安装和运行该数据库系统的信息。

操作步骤...

要以其他用户身份执行命令,我们将使用运行进程模块:

  1. 导航至系统 | 运行进程

  2. 显示行中选择运行..

  3. 要运行的命令文本框中输入createdb testdb

  4. 选择等待完成作为运行模式

  5. 以用户身份运行文本框中输入postgres

  6. 点击运行按钮。操作步骤...

页面会将你重定向到显示命令输出信息的页面。如果命令执行时没有输出,你将被告知没有生成任何输出。

它是如何工作的...

Webmin 通过系统调用执行你传递给它的命令。它收集所有命令的输出并显示在下一个屏幕上。由于 Webmin 进程本身是以root身份运行的,因此它在执行命令时可以模拟任何用户。

还有更多内容...

Webmin 为在此模块中执行命令提供了更多选项。

将输入传递给命令

如果你愿意,可以在输入到命令文本区域中输入命令的输入数据。提供的数据将通过标准输入STDIN)传递给由你的第一个命令执行的程序:

  1. 导航到系统 | 运行中的进程

  2. 显示行中选择运行..

  3. 要运行的命令文本框中输入sort

  4. 选择等待直到完成作为运行模式

  5. 输入到命令文本区域中输入单词列表,每个单词占一行。

  6. 点击运行按钮。

输出屏幕将显示你提供的单词的排序列表。

此功能对于执行用脚本语言编写的短小程序也很有用:

将输入传递给命令

在后台运行任务

如果任务需要较长时间才能完成,你可以在后台执行它。此选项不会向你展示命令的输出,但你可以安全地断开 Webmin 连接,而不会中断命令的执行。

设置一个将在未来执行的命令

有时安排命令在未来某个时间点执行是有用的。例如,你可能想要在夜间(当系统不忙时)更新或同步数据库,或从备份中恢复文件。你也许不想等到合适的时机,而是希望你的系统在特定的时刻自动执行命令。Webmin 为你提供了访问系统命令调度功能的权限,并且让你能够轻松设置和移除计划任务。

准备工作

对于这个例子,我假设你已经在服务器上安装了 MediaWiki(运行 Wikipedia 的软件),并且你想安排在每周日凌晨 2:30 执行其checkUsernames脚本。

在开始之前,你应该注意以下事项:

  • 你希望执行的维护脚本的名称(在本例中,我假设它被称为checkUsernames.php

  • 脚本应该执行的目录(在本例中是/var/www/mediawiki/maintenance

  • 执行脚本的解释器(php

    提示

    我们假设你的系统已安装 PHP 命令行包,并且php二进制文件已经放置在二进制搜索路径中。默认的搜索路径通常包括/bin/sbin/usr/bin/usr/local/bin等位置。如果你要执行的二进制文件不在这些默认搜索路径中,你应该使用二进制文件的绝对路径,即以/开头的路径,例如/usr/bin/php

  • 应执行脚本的用户(root

如何操作...

要设置将被执行的命令,请执行以下步骤:

  1. 导航到 系统 | 已调度命令

  2. 以用户身份运行 文本框中输入将执行脚本的用户名称(root)。

  3. 在提供的字段中输入所需的未来日期和时间。设置为下周日的凌晨 2:30。

  4. 运行目录 文本框中,输入应执行脚本的目录名称(/var/www/mediawiki/maintenance)。

  5. 要执行的命令 字段中输入你希望执行的命令,通常包括脚本解释器的名称和脚本的名称。在我们的示例中,应该是 php checkUsernames.php

  6. 完成后发送电子邮件? 问题回答

  7. 点击 创建 按钮。

在接下来的屏幕上,你将看到当前已调度命令的列表。请参阅以下截图:

如何操作...

工作原理...

Webmin 使用系统的命令调度功能(在 Unix 系统中称为 at),允许用户将命令的执行推迟到指定的未来时间。

我们在本配方中所做的步骤也可以通过命令行执行,方法是输入以下命令:

$ su root
# cd /var/www/mediawiki/maintenance
# echo 'php checkUsernames.php' | at -m 02:30 8.9.2013

at 命令将通过标准输入传递的命令封装到脚本文件中,这些脚本文件存储在一个目录中(通常是 /var/spool/at/var/spool/cron/atjobs/)。atd 守护进程会等待指定的执行时间,并在合适的时刻执行这些脚本。

Webmin 还允许你列出和删除已调度的任务。查看本配方的 更多... 部分。任务列出可以通过命令行使用 atq 命令进行,删除特定任务可以使用 atrm 命令,并传入任务编号作为参数。

更多...

要查看系统上调度执行的命令列表,请返回到 系统 | 已调度命令。请参阅以下截图:

更多...

要取消这些命令中的任何一个,请勾选其 ID 旁边的框并点击 取消选定的命令 按钮。

另见

  • 如果你希望重复执行相同的命令,请查看下一个配方,使用 cron 定期调度命令执行

使用 cron 定期调度命令执行

许多任务需要定期重复执行。这些任务包括诸如备份重要文件、检查软件更新、删除旧的临时文件以及检查日志中是否有异常消息以警告管理员等日常工作。

你的应用程序可能还有一些其他任务,也需要定期运行,Webmin 提供了一个比命令行 crontab 工具更直观的界面来创建和管理 cron 作业。

准备工作

在本教程中,我假设你有一个由 Drupal 提供支持的网站,网址为 http://example.com/。Drupal 有一系列需要定期执行的任务(更新缓存、检查更新等)。为了触发这些任务,我们将设置一个 cron 任务,它会定期访问以下网址:http://example.com/cron.php?cron_key=XYZ

如何操作……

要将命令添加到 cron 调度中,请按照以下步骤操作:

  1. 导航到系统 | 已安排的 Cron 任务

  2. 点击标记为创建一个新的计划 cron 任务的链接。

  3. 在标记为作为执行 cron 任务的用户的文本框中指定你的用户名。

  4. 是否启用?问题回答

  5. 命令文本框中指定以下命令:

    curl -s 'http://example.com/cron.php?cron_key=XYZ'
    
    

    注意

    curl 是一个广泛可用的命令,用于通过各种网络协议使用 URL 语法传输数据。我们使用上述命令连接到并从我们的 web 服务器下载网页。Drupal 使用这种策略来触发维护任务。传递给 curl-s 参数可以防止其输出进度条或错误信息。

  6. 给任务添加一个描述,例如,Drupal periodic tasks for Example.com

  7. 现在,指定你希望任务执行的频率。我们需要指定任务执行时的具体分钟数:在分钟下,选择选定的…并随机选择一个分钟数,例如 19。我们希望任务每天运行两次。因此,在小时下,选择选定的…并选择 012。我们希望任务每天执行,因此在日期月份星期几下选择全部

  8. 点击保存按钮。

它是如何工作的……

Webmin 将在我们选择的用户的 crontabcron 表格)文件中添加我们指定的任务。这些文件通常存储在 /var/spool/cron/crontabs 目录下。

时间是以分钟、小时、日期、月份和星期几为单位进行指定的。计划的命令将在与这些设置完全匹配的时间执行。例如,如果我们指定时间为 19 分钟,0 点和 12 点,且选择所有日期、月份和星期几,那么命令将会在每天的 0:19 和 12:19 执行。cron 守护进程会等到适当的时间,然后执行计划的命令。

提示

你不应该让所有任务在整点时开始,因为这样可能会导致不必要的系统负载峰值。任务应当分散在每个小时内。如果你还没有安排很多任务,可以随便选一个时间。如果你的 cron 做了很多工作,可能需要检查一下在任务最少的时候进行调度。

还有更多……

Webmin 的界面让我们对 cron 任务有更多的控制权。

临时禁用 cron 任务

如果我们想要暂时禁用一个 cron 任务,可以编辑 crontab 并通过在任务行前添加哈希符号(#)来注释掉该行。Webmin 通过提供图形化界面来简化这一操作。

  1. 导航到系统 | 已安排的 Cron 任务

  2. 点击你想要禁用的命令。

  3. 选择作为是否激活?问题的答案。

  4. 点击保存按钮。

克隆一个 Cron 任务

如果你想创建一个类似已存在 Cron 任务的任务,请使用 Webmin 的克隆功能。

  1. 转到系统 | 已调度的 Cron 任务

  2. 点击你想要复制的命令。

  3. 点击克隆任务按钮。

  4. 一个预填充的任务创建屏幕将会打开。根据需要修改任务设置。

  5. 点击创建按钮。

指定哪些用户可以使用 cron 调度任务

出于安全原因,你可能希望限制哪些用户能够调度 Cron 任务。你可以选择允许所有用户访问,选择特定有访问权限的用户,或者选择拒绝访问的用户。

注意

如果你允许某些用户创建 Cron 任务,所有其他用户将无法创建。反之,如果你拒绝某些用户创建 Cron 任务,你实际上是授予了其他用户这一权限。

  1. 转到系统 | 已调度的 Cron 任务

  2. 点击标记为控制用户访问 Cron 任务的链接。

  3. 选择仅允许列出的用户复选框。

  4. 点击同一行中的省略号(),然后使用用户选择器选择哪些用户被允许创建 Cron 任务。

创建一个面板,用于执行你经常运行的命令

有些命令你会反复执行。在这种情况下,你可能希望使用 Webmin 的自定义命令模块来创建一个方便的控制面板,点击按钮即可执行命令。

提示

使用此功能,你还可以允许某些用户以其他用户身份运行命令。这也是创建脚本的替代方案,并且可以用来存储长命令或复杂命令的语法。

准备工作

在本教程中,我们将创建一个自定义按钮,使用 drush 命令清除 Drupal 网站的缓存。你可能会想使用其他命令,因此在开始之前请记下它的语法和你希望执行命令的目录。

如何操作...

要创建自定义命令按钮,请按照以下步骤操作:

  1. 转到其他 | 自定义命令

  2. 点击标记为创建新自定义命令的链接。

  3. 提供命令的简短描述,例如:清除缓存

  4. HTML 描述字段中提供更长的描述,例如:清除 Example.com 的 Drupal 缓存

  5. 命令文本框中输入命令。在我们的示例中,命令是drush cache-clear all

  6. 运行目录字段中指定命令将要执行的目录。在我们的示例中,我们将指定 Drupal 网站安装目录:/var/www/drupal

  7. 作为用户运行字段中指定具有执行命令权限的用户名。

  8. 点击保存按钮。

你将被带回到自定义命令模块,此时会出现一个新的命令按钮。点击按钮执行你的命令。你可以随时返回到其他 | 自定义命令,通过点击此按钮运行你的命令。

它是如何工作的...

Webmin 将自定义命令配置存储在/etc/webmin/custom目录下。每当你访问自定义命令模块时,Webmin 会读取这些配置文件,并动态地为你构建一个管理面板。当你按下与命令相关联的按钮时,Webmin 会为你执行该命令。

还有更多...

Webmin 的自定义命令功能还有很多其他选项。

克隆命令

如果你想创建一个类似于已存在的自定义命令的命令,可以使用 Webmin 的克隆功能。

  1. 导航到系统 | 自定义命令

  2. 点击你希望复制的命令下方的编辑命令链接。

  3. 点击克隆按钮。

  4. 将会打开一个新的命令界面。根据需要修改设置。

  5. 点击创建按钮。

指定命令参数

如果你的命令需要参数,你可以构建一个更复杂的用户界面,要求你指定这些参数的值。

在我们的示例中,我们设置了一个控制面板条目来执行以下命令:

drush cache-clear all

最后的参数(all)指定应清除哪些缓存。此参数的其他可能值包括:theme-registrymenucss-js等。让我们扩展我们的控制面板,以便在执行时要求用户提供此参数:

  1. 导航到其他 | 自定义命令

  2. 点击我们在本示例中创建的命令下方的编辑命令链接。

  3. 将命令更改为drush cache-clear $cacheType$cacheType将是我们参数值的占位符。

  4. 现在,让我们将参数添加到命令表单并指定其显示方式。指定cacheType参数名称,添加描述,指定类型菜单..,并键入以下命令:

    printf "all\ntheme-registry\nmenu\ncss-js" |
    
    

    注意

    不要忘记在末尾添加管道符号(|),否则菜单将无法正确显示。

    命令行将可能的参数值输出为单独的行。请查看以下截图:

    指定命令参数

  5. 点击保存按钮。

    提示

    在此示例中,我们使用printf命令指定了可能的参数值,并通过换行符(\n)将每个值分隔开来。

    另一种指定可能参数值的方法是将它们保存到文件中(每行一个值),并在文本框中指定该文件的路径名。

实际上,你已经创建了一个自定义命令表单,允许你在执行之前指定参数值。请参考以下截图:

指定命令参数

使命令在 Usermin 中可用

您可能决定通过 Usermin 将您的自定义控制面板命令提供给非管理员用户。这非常简单。请按照以下步骤操作:

  1. 导航至其他 | 自定义命令

  2. 点击您希望在 Usermin 中提供的命令下方的编辑命令链接。

  3. 在 Usermin 中可用?问题回答

  4. 现在,登录到 Usermin 并导航至其他 | 自定义命令,以查看可用的命令。

另见

  • Webmin 的在线帮助提供了有关创建自定义命令的更多技巧和建议。点击每个 Webmin 界面上的帮助..链接以访问这些信息。

  • 有关设置 Usermin 的更多信息,请参阅第二章,用户管理中的食谱,安装 Usermin

创建一个包含您经常执行的数据库命令的面板

在上一个食谱中,我们创建了一个易于使用的控制面板,允许您通过点击按钮来执行自定义命令。Webmin 允许您通过添加自定义命令来扩展此功能,这些命令可在 MySQL 和 PostgreSQL 数据库上执行 SQL 查询。

准备工作

为了按照本食谱操作,您需要安装并设置 MySQL 或 PostgreSQL 数据库。有关如何操作的详细信息,请参考第九章,运行 MySQL 数据库服务器,以及第十章,运行 PostgreSQL 数据库服务器

在本食谱中,我假设您正在运行一个使用名为django的数据库并将其缓存存储在名为cache的数据库表中的 Web 应用程序。我们将创建一个自定义命令,用于清空(截断)cache表。您的情况可能会有所不同。因此,在开始之前,请记下以下几点:

  • 您想要运行查询的数据库名称

  • 您想要执行的 SQL 命令的语法

  • 具有适当权限的数据库用户的名称和密码

  • 数据库服务器的位置(如果与本地主机不同)

  • 您正在连接的数据库类型(MySQL 或 PostgreSQL)

如何操作...

为了创建一个自定义的数据库命令按钮,请按照以下步骤操作:

  1. 导航至其他 | 自定义命令

  2. 点击标记为创建新 SQL 命令的链接。

  3. 提供命令的简短描述,例如:清除缓存

  4. HTML 描述字段中提供更长的描述,例如:为 Example.com 清除 Django DB 缓存

  5. 选择您使用的数据库的类型:MySQL 或 PostgreSQL。

  6. 输入数据库名称;在我们的例子中,它是django

  7. 输入将要执行的 SQL 命令,在我们的例子中,它将是:

    TRUNCATE TABLE cache;
    
    
  8. 输入具有适当权限以执行 SQL 命令的数据库用户的用户名和密码。

  9. 如果数据库托管在不同于本地主机的服务器上,请指定该服务器,或者选择将此服务器作为数据库服务器主机

  10. 点击 创建 按钮。

它是如何工作的...

Webmin 将自定义命令配置存储在 /etc/webmin/custom 目录中。每当您访问 自定义命令 模块时,Webmin 会读取这些配置文件,并动态为您构建一个管理面板。当您点击与命令相关的按钮时,Webmin 会连接到数据库服务器并为您执行 SQL 命令。

另请参见

  • 还有更多选项可供设置自定义命令。有关更多信息和示例,请参考前面的操作步骤,创建一个您经常执行的命令面板

  • Webmin 的在线帮助提供了有关创建自定义命令的更多提示和技巧。点击每个 Webmin 屏幕上的帮助..链接以访问这些信息。

在浏览器中运行终端模拟器

尽管 Webmin 提供了广泛的选项来控制您的系统,但有时您会遇到需要更直接访问系统的情况。在这种情况下,您应当配备一个功能齐全的终端模拟器和 SSH 客户端。如果您需要通过终端在服务器上执行快速操作,但没有访问到工具,Webmin 允许您在浏览器中打开一个简单的终端模拟器。

如何操作...

要在浏览器中运行服务器终端,请按照以下步骤操作:

  1. 导航到 其他 | 文本登录

  2. 使用具有 SSH 访问权限的用户的用户名和密码登录系统。

  3. 执行您的命令行任务。

  4. 输入 exit 并按 Enter 键以关闭您的终端会话。

它是如何工作的...

Webmin 使用一个名为 Ajaxterm 的组件,通过 SSH 连接到您的系统,将您的命令传递给服务器,并在网页浏览器中显示终端输出。

欲了解更多信息,请访问 Ajaxterm 网站 github.com/antonylesuisse/qweb

还有更多...

另有一个组件允许您通过 Webmin 访问计算机的终端。您可以通过导航到 其他 | SSH 登录 找到它。该组件具有类似的功能,但它要求在浏览器中运行 Java,出于安全原因,不建议使用。

第五章:系统监控

在本章中,我们将涵盖以下主题:

  • 查看并搜索系统日志文件

  • 将 Syslog 消息保存到文件

  • 将其他日志文件添加到 Webmin

  • 配置日志文件轮转

  • 列出最近的登录记录

  • 当服务停止运行时接收电子邮件

  • 自动重启停止运行的服务

  • 监控远程服务器

介绍

当你的服务器运行时,它会记录它执行的所有操作。每当一个服务启动或停止,定时任务运行,邮件消息发送,尤其是当某个操作产生了意外结果或错误时,都会创建一个日志条目。

日志消息帮助你解决服务器上的问题。如果某些功能无法正常工作,通常会在某处找到日志消息,解释发生了什么以及问题所在。日志消息还允许你检测到异常情况,例如有人试图入侵你的服务器。定期查看系统日志非常重要。

每条日志消息都有其有效期。几周或几个月后,旧的日志消息可以被删除,以防止日志文件增长过大,占满磁盘空间。

在本章中,我们将演示如何使用 Webmin 作为一个方便的工具来查看系统日志文件,如何帮助你进行日志轮转以保持档案并删除旧条目。我们还将演示如何使用 Webmin 监控系统,通过定期测试来发现问题,甚至尝试自动修复一些问题。

查看并搜索系统日志文件

你可以配置 Webmin 的系统日志模块,使其成为系统日志信息的单一来源。在本步骤中,我们将演示如何通过 Webmin 的界面轻松快速地查看和扫描日志文件。在接下来的两个步骤中,我们将展示如何将其他日志文件添加到此模块,以创建一个全面的系统活动概览。

准备工作

在这个步骤中,我们将检查位于/var/log/auth.log文件,该文件记录了与身份验证和授权相关的消息。大多数 Debian 家族的系统默认都会有此文件,但如果你使用的是其他系统,可能找不到它。你可以按照步骤“将 Syslog 消息保存到文件”来将此文件添加到你的系统中。

当然,你可以按照相同的步骤查看系统日志模块中列出的任何其他文件。

操作步骤...

按照以下步骤查看日志消息:

  1. 进入系统 | 系统日志。你将看到通过 Webmin 提供的可用日志文件列表。

  2. 点击/var/log/auth.log文件行中的查看...链接。

  3. 默认情况下,Webmin 会显示该日志文件的最后 20 条消息(行)。要查看更多行,请在文件的最后[ ]行字段中输入40,然后点击刷新按钮。

  4. auth.log 文件将显示用户登录的信息。我们可以通过过滤器显示仅与 Webmin 相关的消息。在字段中输入 webmin,选择 Only show lines with text,然后点击 Refresh: 如何操作...

  5. 现在,你可以测试新消息是否出现在日志中。使用另一个浏览器登录 Webmin,然后返回并再次点击 Refresh,以查看与登录尝试相关的新消息出现在日志中。

工作原理…

在后台,Webmin 使用 tail 命令显示系统日志的最后几行。如果你想在终端实现类似的视图,可以使用以下命令:

$ sudo tail -n 40 /var/log/auth.log

如果你想过滤日志,只显示包含单词 webmin 的行,可以将 tail 命令与 grep 组合使用,如下所示:

$ sudo grep webmin /var/log/auth.log | tail -n 40

还有更多…

在系统上调试问题时,通常需要在执行任务时查看日志文件消息的实时出现,任务结束时可能会有错误。Webmin 可以自动刷新日志显示,以便显示新的消息。

配置系统日志自动刷新

按照以下步骤配置系统日志自动刷新:

  1. 导航到 System | System Logs

  2. 点击左上角的 Module Config 链接。

  3. Seconds between log view refreshes 设置为 10,然后点击 Save

现在,当你显示日志时,它会每 10 秒自动刷新一次视图,包括所有过滤条件。你可以在进行调试任务时保持这个窗口打开,并实时查看日志中输出的消息。

提示

根据你的浏览器,Webmin 的自动刷新功能可能会被安全机制禁用,该机制会检查每个传入的 HTTP 请求是否有正确的引用来源头。你可以通过以下步骤禁用此机制:

  • 导航到 Webmin | Webmin Configuration | Trusted Referrers

  • 对于 Referrer checking enabled? 提示,选择 No

  • 点击 Save

你还可以使用 tail 命令的 -f 选项跟踪文件输出的变化,如下所示:

$ sudo tail -f /var/log/auth.log

另见

  • 在这个方案中,我们讨论了如何查看和过滤日志文件。在接下来的两个方案中:将 Syslog 消息保存到文件将其他日志文件添加到 Webmin,我们将演示如何将其他日志消息添加到此界面。

将 Syslog 消息保存到文件

Unix 和相关系统的标准日志协议叫做 Syslog。大多数现代 Linux 发行版使用如 RsyslogSyslog-NG 的实现,它们执行相同的任务:

  • 允许系统上的软件发送 Syslog 消息

  • 按类型和优先级分隔传入的消息,并将它们保存到不同的文件中

大多数系统工具将日志消息发送到 Syslog,但其他服务器软件(如 Apache、MySQL 或 PostgreSQL)默认情况下会将消息直接保存到磁盘上的文件中。

Webmin 允许您控制 Syslog,并决定哪些消息保存到哪些文件。为了理解 Syslog 如何区分消息,我们需要解释两个概念:设施优先级

每条发送到 Syslog 的消息都有一个设施级别和优先级级别。根据这些属性,您可以决定丢弃哪些消息,保留哪些消息以及保存到哪里。

一个设施级别描述了该消息的类型。由于程序通常使用相同的设施发送所有消息,因此它通常指定发送消息的程序类型。以下表格列出了不同的设施级别:

Facility 相关的消息
authauthpriv 与用户授权或安全性相关的消息。这些可能包含敏感信息(尤其是authpr iv),应仅对受信任的系统用户可访问。
cron 与计划命令执行相关的消息。
daemon 后台进程(系统守护进程)输出的消息。
ftp 与 FTP 服务器相关的消息。
kern 系统内核生成的消息。
local0local7 您可以配置本地程序使用这些设施将日志消息发送到 Syslog。
lpr 与打印相关的消息。
mail 与邮件服务器相关的消息。
mark 一个特殊设施,定期生成时间戳。
news 废弃。
syslog 与 Syslog 本身相关的消息。
user 与用户进程相关的消息。如果在发送消息时未指定其他设施,则默认为此设施。
uucp 废弃。
* 上述所有。

优先级(严重性)级别描述了日志消息的重要性。您可以使用此描述来指定哪些消息丢弃,哪些消息保留。优先级级别有一个特定的顺序,您可以选择例如记录所有优先级为warning及以上的消息。以下表格列出了从最高到最低的优先级级别:

优先级 描述
emerg 紧急—系统不稳定。这是最高优先级级别。
alert 警报—必须立即采取行动。
crit 严重—系统处于严重状态。需要采取行动。
err 错误—发生了错误,需要修复。
warning 警告—某些功能没有按预期工作。请检查配置。
notice 通知—系统执行了一个重要操作。
info 信息—关于系统正常功能的信息性消息。
debug 调试—主要用于设置服务和调试问题的详细消息。

正在准备中

在这个食谱中,我们将使用 Webmin 指示 Syslog 守护进程将所有与用户授权相关的日志消息保存到/var/log/中的auth.log文件。如果你使用的是基于 Debian 的系统,系统中可能已经存在这个文件。在这种情况下,你可以将这些消息保存到名为auth2.log的第二个文件中进行练习,稍后再删除配置。

如何做...

按照以下步骤将 Syslog 消息保存到文件:

  1. 转到系统 | 系统日志

  2. 点击添加新系统日志链接。

  3. 选择日志到文件,并指定/var/log/auth.log作为文件名。

  4. 验证日志活动?是否设置为

  5. 设施下,选择多个,并输入与认证相关的两个设施名称(用逗号分隔):auth,authpriv

  6. 优先级下,选择所有如何做...

  7. 点击保存按钮。

  8. 点击应用更改按钮,位于系统日志模块屏幕的底部。

    提示

    在某些系统中,应用更改按钮可能不可见或没有效果。在这种情况下,你需要手动重启 Syslog 服务。

    如果你的系统使用 Rsyslog,你可以使用以下命令重启它:

    $ sudo service rsyslog restart
    

    请参考第四章中通过 Webmin 执行命令的食谱,了解如何通过 Webmin 执行命令。

如食谱中所述,你现在可以查看/var/log/auth.log文件,查看和搜索系统日志文件

它是如何工作的...

根据你的选择,Webmin 会更新你的 Syslog 配置文件并重启服务。你的 Syslog 守护进程会读取新的配置;如有必要,创建一个新的输出文件来保存日志消息,并将选定的消息发送到该文件。

还有更多...

在更改 Syslog 配置后,你可能希望检查日志消息是否正确路由到预定目标。你可以通过执行 logger 命令将日志消息发送到 Syslog。该命令的语法如下:

logger -p facility.priority "The message text"

例如,如果你想发送一条优先级为info、设施为auth的消息Hello Syslog,请使用以下命令:

$ logger -p auth.info "Hello Syslog"

检查auth.log文件,查看你的日志条目。

将其他日志文件添加到 Webmin

不使用 Syslog 的服务器守护进程直接将其日志消息保存到磁盘上的文件中。Webmin 允许你以本章第一个食谱所描述的方式查看、搜索和监视所有日志文件。为了方便引用,你可以将常用的日志文件添加到系统日志模块的列表中。

准备工作

你需要调试问题的日志消息就在那里,你只需要知道在哪里查找。在将它们添加到 Webmin 之前,你需要找到日志文件的完整路径。

在 Linux 系统中,日志通常存储在/var/log目录中。以下表格列出了常用服务的日志消息默认位置:

守护进程 默认日志文件位置
Apache 2 消息可能会输出到:/var/log/apache2/access.log/var/log/apache2/error.log,等等。
MySQL 消息可能会输出到:/var/log/mysql/mysql.log,或者通过daemon设施发送到 Syslog。
PostgreSQL 消息可能会输出到:/var/log/pgsql_log,或者通过local0设施发送到 Syslog。
PHP PHP 没有指定默认的日志位置。如果 PHP 作为 Apache 模块运行,消息可能会出现在 Apache 日志中。检查你的php.ini文件,看看是否启用了日志记录。
Webmin 消息可能会输出到:/var/webmin/webmin.log以及/var/webmin中的其他文件。

因为每个系统发行版可能会以稍微不同的方式配置你的服务,所以如果你无法在默认位置找到日志文件,请检查服务的配置文件以确定其日志位置。

在此操作中,我们将 Apache 的访问日志(/var/log/apache2/access.log)和错误日志(/var/log/apache2/error.log)添加到 Webmin 的系统日志模块中。

如何操作...

要通过 Webmin 监控额外的日志文件,按照以下步骤操作:

  1. 导航到系统 | 系统日志

  2. 点击左上角的模块配置链接。

  3. 其他要显示的日志文件字段中,添加每个日志文件的路径及其描述,每个条目占一行,如下所示:

    /var/log/apache2/access.log Apache access log
    /var/log/apache2/error.log Apache error log
    

    如何操作...

  4. 点击保存按钮。

你添加的文件将出现在系统日志列表中。

它是如何工作的...

额外的文件定义存储在配置文件(/etc/webmin/syslog/config)中。每次 Webmin 准备系统日志模块页面时,它都会检查此文件并将文件添加到其列表中。

还有更多...

你还可以使用 Webmin 临时查看日志文件,而无需将其永久添加到系统日志中。操作步骤如下:

  1. 导航到系统 | 系统日志

  2. 查看日志文件字段中输入日志文件的路径。你也可以点击省略号()按钮,使用文件选择器。

  3. 点击查看按钮。

配置日志文件轮转

日志消息对于调试问题、分析系统使用模式以及检查是否有人试图入侵服务器非常有用。然而,每条消息只有在一段时间内有用,旧日志可以被删除以释放磁盘空间。

日志轮转是一种策略,确保最新的日志消息始终可用,而较旧的消息存储在单独的文件中,这些文件可以压缩以节省空间。几周或几个月后,根据日志类型,最旧的消息可以被删除。

Webmin 允许你控制logrotate工具,该工具会为你自动执行日志文件的轮换。你安装的大多数软件包会自带logrotate配置文件,这些文件会被放置在/etc/logrotate.d目录中。将配置文件放在此目录中可以确保这些文件会纳入日志轮换控制。Webmin 提供了一个图形界面,帮助你轻松创建和修改这些文件。

准备工作

在创建日志轮换任务之前,请确保你的系统已安装logrotate软件包。更多信息请参阅第一章中的安装软件包部分,标题为配置你的系统

在本食谱中,我们将为名为custom.log的日志文件创建一个logrotate配置,该日志文件包含一个名为customd的守护进程的日志输出。我们将安排每周轮换该日志文件,保留四周的历史日志,并压缩所有除最新日志归档之外的日志。我们还将指示 Webmin 在日志轮换后重启守护进程,以便它开始写入新的日志文件。

在创建logrotate配置时,你需要提供日志文件路径以及重启日志守护进程的命令语法。一些软件具有特殊命令,用于通知守护进程日志已被轮换,这样就不需要完全重启。请参阅守护进程文档以查找相关命令。

如何操作...

按照以下步骤创建logrotate配置:

  1. 导航到系统 | 日志文件轮换

  2. 点击标记为添加一个新的日志文件以进行轮换的链接。

  3. 日志文件路径字段中,输入你想要轮换的文件的完整路径。你可以在单独的行中指定多个文件,或通过指定目录路径并跟随星号来包含整个目录的内容。在我们的例子中,我们要轮换一个文件,因此应输入:/var/log/custom.log

  4. 轮换计划设置为每周

  5. 保留的旧日志数量设置为4

  6. 对于压缩旧日志文件?问题,选择

  7. 对于延迟压缩直到下一个周期?问题,选择。这将确保最新的日志归档文件不会被压缩,从而使其更容易查看,但会占用一些磁盘空间。

  8. 对于轮换后重新创建日志文件?问题,选择。如果你留空模式所有者字段,logrotate将以与原日志文件相同的所有权和权限创建该文件。

  9. 轮换后运行的命令字段中,输入重启服务的命令,该服务会写入日志文件。在我们编造的示例中,这个命令是:service customd restart

  10. 点击创建按钮。

如何工作...

Webmin 会在/etc/logrotate.d目录中创建一个logrotate配置文件,将你指定的日志文件放入轮换控制之下。

还有更多内容...

Webmin 的界面还有许多其他功能可以控制logrotate

按需旋转日志文件

日志文件的旋转由计划的 cron 命令触发,每天运行一次。如果你希望更早地旋转日志文件,可以随时手动触发旋转:

  1. 导航到系统 | 日志文件旋转

  2. 点击标记为强制旋转日志的按钮。

编辑默认选项

Webmin 允许你设置默认选项,这些选项适用于所有日志旋转例程,除非被覆盖。请执行以下步骤进行设置:

  1. 导航到系统 | 日志文件旋转

  2. 点击标记为编辑全局选项的按钮。

旋转日志时通过电子邮件发送日志文件

logrotate可以设置为在旋转日志时发送日志文件的副本给你:

  1. 导航到系统 | 日志文件旋转

  2. 点击旋转文件下的文件名链接。这将允许你编辑现有的日志旋转配置。

  3. 在删除前通过电子邮件发送日志文件?选择并指定一个电子邮件地址。

你可以指定是否希望在旋转日志时通过电子邮件发送最新创建的日志文件归档,或者即将被删除的最旧归档。

列出最近的登录记录

每当用户登录或注销时,关于该事件的信息会被记录在交互式登录会话的日志中。你可以使用 Webmin 查看此日志。

如何操作...

按以下步骤列出最近的登录记录:

  1. 导航到系统 | 用户与组

  2. 使用屏幕底部的表单。选择标记为仅用户的单选按钮,并输入你感兴趣的用户的用户名。你也可以选择全部列出所有用户的登录记录。

  3. 点击标记为显示按用户登录的按钮。

你将看到从上次日志旋转以来所选用户的登录列表。

它是如何工作的...

Webmin 检查名为wtmp的标准 Unix 文件,通常存储在/var/log/wtmp中,记录了系统上所有的登录和注销历史。这个文件是二进制格式的,因此不能使用标准的文本日志解析工具查看。如果你想在命令行查看登录历史,可以使用last命令,例如,last root会显示 root 用户的登录记录。

你还可以使用其他相关命令,如下所示:

  • lastlog命令显示所有用户的列表,以及他们上次登录的时间

  • sudo lastb命令显示失败的登录尝试信息

  • who命令显示当前登录的用户列表。

还有更多...

Webmin 还允许你查看当前登录的用户:

  1. 导航到系统 | 用户与组

  2. 点击标记为显示登录用户的按钮。

当服务停止运行时接收电子邮件

你将服务器设置为执行特定服务:运行网站、托管数据库或交换电子邮件。如果该服务停止工作,你的访客、客户或同事会抱怨,因此如果出现问题,你应该是第一个知道的人。

Webmin 提供了一个强大的监控系统,可以定期检查服务器的状态,并在发现异常时向你发送电子邮件。

准备就绪

Webmin 的监控服务将使用你的本地电子邮件服务器发送电子邮件提醒。有关如何设置电子邮件服务器,请参见第十二章,设置电子邮件服务器

在你可以使用 Webmin 的监控功能之前,你需要激活它。按照以下步骤操作:

  1. 转到其他 | 系统和服务器状态

  2. 点击标记为计划监控的按钮。

  3. 是否启用计划检查?问题回答

  4. 当服务停止时发送电子邮件设置为当服务停止时,以便在监控器测试失败时接收单一消息。如果你更喜欢收到垃圾邮件,可以选择在任何服务停止时都接收电子邮件。

  5. 选择发送电子邮件状态报告至选项,并提供你的电子邮件地址:准备就绪

  6. 点击保存按钮。

当监控器有报告时,你应当收到电子邮件提醒。你应该设置一个测试监控器,故意让它失败,以检查这些电子邮件是否能够发送到你。

在本教程中,我们将设置一个监控器,检查 Apache web 服务器是否正在运行。有关如何设置 Apache 的信息,请参见第八章,运行 Apache Web 服务器

如何操作...

按照以下步骤,当服务器上的服务停止运行时,接收电子邮件提醒:

  1. 我们将使用一个监控器,检查由给定命令启动的服务是否仍在运行。首先要检查的是启动服务的命令名称。我们可以通过转到系统 | 运行中的进程模块来实现。在 Debian 上,Apache 的命令是:/usr/sbin/apache2 -k start。字符串apache2是唯一的,只出现在与该服务器相关的进程中,因此我们将设置我们的测试,在运行进程的表格中扫描此字符串。如果没有找到匹配的进程,我们的测试将失败。记下 Apache 正在运行的进程数。在我的配置中,与 Web 服务器相关的进程有六个。

  2. 转到其他 | 系统和服务器状态

  3. 从下拉列表中选择检查进程作为监控类型,然后点击添加监控器类型:按钮。

  4. Apache 进程指定为描述。

  5. 是否按计划检查?问题回答,并选择何时通知你,例如是,并报告状态变化

  6. 通知方法部分勾选标有电子邮件的框。

  7. 检查命令文本框中,输入一个正则表达式,匹配启动 Apache 的命令的名称。字符串apache2可以工作,但如果你想更精确,可以使用 Perl 正则表达式。

  8. 在步骤 1 中输入数字到标记为监控认为进程正在运行所必须存在的进程数的字段中。在我们的配置中,Apache 运行了六个进程,因此我们会指定这个数字。如果这些进程中的任何一个失败,我们将收到通知。

  9. 点击创建按钮。

如果 Apache 的任何进程停止运行,你现在应该会收到一封电子邮件。为了测试监控,可以停止 Apache 五分钟,然后检查是否收到邮件报告。

它是如何工作的...

当你激活 Webmin 的监控功能时,它会创建一个定时任务,按计划运行监控脚本。每个监控测试可以返回成功或失败状态。如果测试返回失败状态,Webmin 将向在定时监控配置中指定的邮箱发送警报邮件。

还有更多内容...

Webmin 的监控功能非常丰富,我们将在本节以及后续的专门实例中介绍其各个方面。

检查监控历史记录

Webmin 会保留所有监控的状态历史记录,允许你查看某个监控通过和失败的时间:

  1. 导航至其他 | 系统与服务器状态

  2. 点击选择的监控名称,例如,Apache Webserver监控。

  3. 展开屏幕底部的状态历史部分。

    提示

    如果你的监控刚开始运行,可能暂时没有历史数据可供检查。完成几个监控周期后再回来查看。如果历史记录完全没有显示,说明你的监控设置可能不正确。

使用预定义的监控

在这个实例中,我们创建了一个自定义监控,用于检查 Apache 进程是否在运行。事实上,Webmin 有不少预定义的监控类型,无需配置,只需要激活即可。例如,要使用 Apache 的预定义监控,按照以下步骤操作:

  1. 导航至其他 | 系统与服务器状态

  2. 从下拉列表中选择Apache Webserver作为监控类型,然后点击添加该类型监控:按钮。

  3. 根据需要自定义报告设置。

  4. 点击创建按钮。

监控系统负载

除了检查特定软件是否在运行外,Webmin 还可以监控其他系统资源。例如,当系统的 CPU 使用率过高时,你可以收到通知。这可能表明服务器流量很大,但也可能是某个进程陷入无限循环,需要被终止,或者是正在进行的拒绝服务攻击。按照以下步骤监控系统负载:

  1. 导航至其他 | 系统与服务器状态

  2. 从下拉列表中选择负载平均值作为监控类型,然后点击添加该类型监控:按钮。

  3. 根据需要自定义报告设置。

  4. 为了避免获取到短时间的正常活动信息,请将负载平均值检查时长选择为 15 分钟。

  5. 一般来说,最大负载平均值应为机器的 CPU 核心数。

    提示

    如果您只有一个 CPU,过去 15 分钟的负载平均值大于 1 则表示系统超载。在一台双核机器上,负载低于 2 表示系统没有超载。不同的操作系统以略微不同的方式计算此值,因此您可能需要在正常操作时使用uptime命令测试您的服务器,以检查什么样的负载平均值是系统的正常值。

    您可以在 Wikipedia 上找到更多关于系统负载的信息:en.wikipedia.org/wiki/Load_(computing)

  6. 点击创建按钮。

监控磁盘空间

如果服务器的磁盘空间完全用完,它将会停滞不前。为了避免这种情况,您应该监控系统并在文件空间使用率达到高值(如 90%)时做出反应。按照以下步骤监控磁盘空间:

  1. 转到其他 | 系统和服务器状态

  2. 从下拉列表中选择磁盘空间作为监控类型,然后点击添加监控类型:按钮。

  3. 检查的文件系统下拉菜单中选择根文件系统(/)。

  4. 选择选项总百分比,并将其设置为 90%。

  5. 点击创建按钮。

另见

  • 除了在系统监控测试失败时向您发送电子邮件,Webmin 还可以尝试自动响应。请参阅下一个食谱,自动重启停止运行的服务,了解更多信息。

  • 关于 Webmin 监控功能的更多信息可以在其 wiki 中找到:doxfer.webmin.com/Webmin/SystemAndServerStatus

自动重启停止运行的服务

Webmin 的监控功能可以在检测到系统问题时发出警报,但它也可以通过执行命令自动响应已检测到的问题。例如,如果某个服务停止运行,您可以尝试自动重启它。

准备工作

本食谱是前一个食谱,接收服务停止运行时的电子邮件的扩展。在开始此食谱之前,请确保您已经完成了前一个食谱中的设置步骤。

在本食谱中,我们将告诉 Webmin 监控 Apache,并在它停止运行时自动重启。

如何操作...

按照以下步骤自动重启停止运行的服务:

  1. 转到其他 | 系统和服务器状态

  2. 点击Apache Web 服务器监控的链接。

  3. 要运行的命令部分,在如果监视器停止运行,运行命令文本框中输入启动 Apache 的命令。在大多数 Linux 发行版中,命令是service apache2 start

  4. 点击保存按钮。

它是如何工作的...

Webmin 会创建一个 cron 任务,定期运行其监控工具。如果监控从成功变为失败,Webmin 会执行您预设的命令。这些命令可以用来重启已停止的服务,从而自动响应并纠正系统状态。

这是一个适用于 Web 服务器、邮件服务器或应用服务器等服务的好策略。但对于像数据库这样的服务,可能不是最好的选择,因为在重新启动时,它可能需要您介入来修复诸如数据库表损坏等问题。

监控远程服务器

您可以使用 Webmin 的监控功能,定期检查不运行 Webmin 的远程服务器的状态。由于我们对远程服务器的访问权限有限,我们只能测试它的外部可见状态。尽管如此,这仍然是一个非常有用的工具,它可以告诉我们其他服务器是否正在运行,并在特定端口上提供网络服务。如果远程服务器上的某个服务停止,Webmin 会通过电子邮件通知我们。

准备工作

这是 服务停止时接收电子邮件 的教程扩展版。在开始这个步骤之前,请确保按照该教程中的设置步骤进行操作。

在本教程中,我们将让 Webmin 定期检查远程 Web 服务器是否正在运行,并返回预期的 HTML 页面。

如何操作...

按照以下步骤监控远程服务器:

  1. 导航至 其他 | 系统和服务器状态

  2. 从下拉列表中选择 远程 HTTP 服务 作为监控类型,并点击 添加监控类型: 按钮。

  3. 请求的 URL 字段中,输入您期望在远程服务器上找到的网页 URL,例如:http://example.com/index.php

  4. HTTP 请求方法 设置为 GET

  5. 页面必须匹配正则表达式 字段中,输入包含您期望 Web 服务器响应的 HTML 代码片段的字符串。这可以是页面标题或远程网站上其他不经常变化的文本。

    注意

    例如,如果我们监控 en.wikipedia.org/wiki/Main_Page,我们可以检查字符串 Wikipedia, the free encyclopedia,这是我们期望在正确生成的页面标题中出现的内容。

  6. 点击 创建 按钮。

它是如何工作的...

Webmin 会创建一个 cron 任务,定期运行其监控工具。远程 HTTP 服务监控器尝试与配置为在给定 URL 下响应的 Web 服务器建立连接。如果连接建立成功,Webmin 会请求指定的网页并扫描它以查找我们的正则表达式。

如果监控无法建立连接,或者返回的网页与我们的正则表达式不匹配,测试将失败;监控会改变其状态并发送电子邮件警报信息。

还有更多...

Webmin 能够监控远程 Web 服务器,但也可以用来远程监控其他服务。

检查远程服务器是否运行

你正在运行的远程服务器可能是一个防火墙或其他网络基础设施,未暴露任何网络服务。即使是这样安全的服务器,仍然应该对 ICMP ping 回显请求作出响应。Webmin 可以向远程服务器发送 ping 数据包,以确定它是否可通过网络访问。请执行以下步骤检查远程服务器是否在线:

  1. 进入 其他 | 系统与服务器状态

  2. 从下拉列表中选择 远程 Ping 作为监视类型,并点击 添加类型监视器: 按钮。

  3. 要 ping 的主机 字段中,输入远程服务器的 IP 地址或域名。

  4. 点击 创建 按钮。

检查远程服务器是否运行网络服务

如果你知道远程服务器应该监听的端口号,你可以使用 Webmin 测试几乎任何网络服务。Webmin 将向远程服务器的特定端口发送 TCP 连接请求。如果远程服务器响应,Webmin 会立即关闭连接。如果服务器未响应,将发送警报信息。

  1. 进入 其他 | 系统与服务器状态

  2. 从下拉列表中选择 远程 TCP 服务 作为监视类型,并点击 添加类型监视器: 按钮。

  3. 要连接的主机 字段中,输入远程服务器的 IP 地址或域名。

  4. 连接端口 字段中指定服务端口。

  5. 点击 创建 按钮。

第六章:管理系统中的文件

在本章中,我们将涵盖:

  • 从服务器下载文件

  • 上传文件到服务器

  • 管理服务器上的文件和目录

  • 更改文件的所有权和权限

  • 设置 Windows 的网络共享文件夹

  • 挂载 Windows 共享文件夹

  • 设置 NFS 共享卷

  • 挂载远程 NFS 卷

  • 通过 SFTP 授予用户对服务器的访问权限

  • 通过 FTP 授予用户对服务器的访问权限

介绍

Webmin 提供了将文件传输到服务器及从服务器传输文件的功能,并且还提供了一个完整的文件管理器,可以在浏览器中作为 Java 小应用运行。在本章中,我们将介绍如何使用这些功能通过 Webmin 管理服务器上的文件,而无需额外的工具。

本章的后半部分将展示如何使用 Webmin 通过Windows 网络CIFS)、网络文件系统NFS)和文件传输协议FTP)设置本地网络上的文件共享。如果您想通过互联网访问您的文件,最佳的解决方案是使用安全文件传输协议SFTP)功能,本章也涵盖了这一部分内容。

本章中的两个示例挂载 Windows 共享文件夹挂载远程 NFS 卷展示了如何通过 Webmin 设置 CIFS 或 NFS 客户端,并使远程文件资源在您的系统上可用。

从服务器下载文件

您经常会遇到需要查看文件内容或从服务器下载文件的情况。Webmin 的上传和下载模块使这些任务变得非常简单。

在此示例中,我们将检查系统的主机名数据库文件,查看您是否定义了任何本地主机名条目,这些条目会覆盖通过 DNS 解析的域名。这个文件大多数系统存储在/etc/hosts中。

如何操作...

按照以下步骤从服务器下载文件:

  1. 转到其他 | 上传和下载

  2. 选择从服务器下载标签。

  3. 点击文件下载行中的省略号()按钮。

  4. 在文件浏览器中选择位于/etc目录下的hosts文件。

  5. 对于问题是否在浏览器中显示(如果可能)?请选择

  6. 点击下载

hosts文件将在浏览器中显示。如果您希望将文件下载到磁盘,只需在第 5 步选择

如何运作...

Webmin 从您选择的系统磁盘中访问文件。如果文件包含文本,它会直接在浏览器中显示。如果您选择下载文件,Webmin 将向响应中添加 HTTP 头(如Content-Disposition: Attachment),迫使浏览器显示保存对话框,允许您将文件保存到磁盘,而不是在浏览器中显示。

另见

  • 如果您想下载整个目录及其内容,请查看本章稍后的下载目录及其内容部分,在管理服务器上的文件和目录食谱中可以找到相关信息。

将文件上传到服务器

Webmin 的图形界面使您能够轻松地将文件从本地计算机上传到服务器。Webmin 还允许您直接从 Web URL 将文件传输到服务器,而无需先下载到本地计算机。

准备好

在本食谱中,我们将上传一个默认的欢迎信息,由 Apache Web 服务器提供服务。有关设置 Apache 的信息,请参考第八章,运行 Apache Web 服务器

如果您希望执行相同的任务,首先在本地系统中准备一个简单的 HTML 文件,并将其保存为index.html。您当然也可以按照相同的步骤上传其他任何文件到服务器上的任何位置。

如何操作...

按照以下步骤将文件上传到服务器:

  1. 转到其他 | 上传和下载

  2. 选择上传到服务器选项卡。

  3. 要上传的文件部分点击四个按钮之一,从本地磁盘选择您的文件。如果需要,可以使用其他按钮选择额外的文件。

  4. 点击文件或目录上传到字段右侧的省略号()按钮,使用文件浏览器选择要上传文件的目录。选择/var/www作为 Apache 提供文件的默认根目录。

  5. 设置将拥有磁盘中文件的用户,或者将由用户拥有字段保持为root。如何操作...

  6. 点击上传按钮。

上传进度窗口将弹出,告知您上传状态。上传完成后,Webmin 将显示一个屏幕,告知您上传到服务器的数据量。

它是如何工作的...

Webmin 使用 HTTP 协议将文件传输到您的服务器。上传的文件将属于选择的用户作为拥有者。此功能无需额外工具即可完成上传少量文件到服务器等简单任务。

还有更多...

Webmin 还允许您直接从 Web URL 将文件传输到服务器,无需先下载到本地计算机。

从 Web 直接下载文件到服务器

假设您想在欢迎网页上使用 jQuery。如果您知道它的 URL,可以直接将库下载到服务器上。对于 jQuery,您可以从code.jquery.com/jquery-1.10.0.min.js下载。

  1. 转到其他 | 上传和下载

  2. 选择从 Web 下载选项卡。

  3. 将所需的 URL 粘贴到要下载的 URL文本字段中。

  4. 单击下载到文件或目录字段右侧的省略号()按钮,并使用文件浏览器选择您希望上传文件的目录。选择/var/www作为默认的根目录,Apache 将在该目录中提供文件。

  5. 设置将拥有文件的用户,或者将由用户拥有字段保持为root

  6. 下载模式设置为立即,显示进度

  7. 单击下载 URLs按钮。

下载进度屏幕将显示,告知您下载的状态。

在后台从网页下载文件

如果您希望从较慢的服务器下载大文件,Webmin 允许您安排下载在后台执行。

为了实现这一点,按照从网页直接下载文件到服务器部分中的步骤操作,但将下载模式字段设置为后台进行。您可以将下载时间设置为当前时间或稍后时间。如果您已配置 Webmin 发送邮件,如第一章中所述,设置您的系统,您可以指示 Webmin 在传输完成时通知您。

在服务器上管理文件和目录

Webmin 提供了一个简单但功能强大的文件管理器,您可以直接在浏览器中访问它。

准备工作

Webmin 的文件管理器作为 Java 小程序运行。为了使用它,您需要在本地计算机上安装 Java 并启用其在浏览器中的使用。您不需要在服务器上安装 Java。

如何操作...

在本节中,我们将讨论文件管理器的基本功能,例如在服务器上复制和移动文件。

如何操作...

Webmin 的文件管理器

复制或移动文件或目录

执行以下步骤以创建或移动文件或目录:

  1. 导航至其他 | 文件管理器

  2. 浏览文件系统,找到包含您希望操作的文件或目录的目录,并单击文件进行选择。

  3. 单击工具栏中的复制按钮以复制文件,或单击剪切按钮以移动文件。

  4. 浏览文件系统,找到目标目录。

  5. 单击粘贴按钮。

文件将从源目录传输到目标目录。如果目标目录已经包含同名文件,则会弹出对话框,您可以指定备用名称或选择相同名称以覆盖目标文件。

重命名文件或目录

执行以下步骤以重命名文件或目录:

  1. 导航至其他 | 文件管理器

  2. 浏览文件系统,找到包含您希望重命名的文件或目录的目录,然后单击文件名以选择它。

  3. 单击重命名按钮,并在弹出对话框中提供新文件名。

  4. 单击弹出对话框中的重命名按钮。

删除文件或目录

执行以下步骤以删除文件或目录:

  1. 导航至其他 | 文件管理器

  2. 浏览文件系统,找到包含你想删除的文件或目录的目录,并点击文件名进行选择。

  3. 点击删除按钮。

  4. 在弹出对话框中点击删除按钮确认删除。

编辑服务器上的文件

执行以下步骤编辑服务器上的文件:

  1. 导航到其他 | 文件管理器

  2. 浏览文件系统,找到包含你希望编辑的文件的目录,并点击文件名进行选择。

  3. 点击编辑按钮。

  4. 在弹出对话框中编辑文件内容。

  5. 在弹出对话框中点击保存并关闭按钮以完成编辑。

在服务器上创建目录

执行以下步骤在服务器上创建目录:

  1. 导航到其他 | 文件管理器

  2. 浏览文件系统,找到你希望创建子目录的目录。

  3. 找到带有目录图标的新建按钮并点击它。

  4. 在弹出窗口中,通过将新目录的名称附加到路径上,提供新目录的完整路径。

  5. 点击弹出对话框中的创建按钮。

在服务器上创建新文件

执行以下步骤在服务器上创建新文件:

  1. 导航到其他 | 文件管理器

  2. 浏览文件系统,找到你希望创建新文件的目录。

  3. 找到带有空白文件图标的新建按钮并点击它。

  4. 在弹出窗口中的文件名字段中,通过将新文件的名称附加到提供的路径中,提供新文件的完整路径。

  5. 你可以选择在大文本框中输入内容来为文件添加初始内容。

  6. 在弹出对话框中点击保存并关闭按钮以创建新文件。

在服务器上创建符号链接

在许多情况下,创建指向其他位置的文件或目录的符号链接非常有用。对于大多数实际用途,符号链接的行为就像它们所链接的对象,但它们只是指向原始位置的指针。这意味着你可以通过多个文件系统路径访问同一个目录或文件。执行以下步骤在服务器上创建符号链接:

  1. 导航到其他 | 文件管理器

  2. 浏览文件系统,找到你希望创建新符号链接的目录。

  3. 找到带有箭头图标的新建按钮,表示链接。

  4. 链接来源字段中,输入你希望创建链接的完整路径。

  5. 链接到字段中,输入你要创建链接的文件或目录的完整路径。

  6. 点击创建按钮以创建链接。

提示

符号链接可以引用绝对路径(以根目录 / 开头),也可以引用相对路径。在相对路径中,两个点表示链接所在目录的父目录。例如,如果我们在目录 A 中有 file 文件,并且想在兄弟目录 B 中创建链接,我们可以将链接指向 ../A/file。这样,我们可以将 AB 两个目录一起移动到另一个位置,而符号链接仍然指向相同的文件。

下载目录及其内容

Webmin 的文件管理器允许你下载整个目录及其内容,作为一个压缩档案文件,具体步骤如下:

  1. 导航到 其他 | 文件管理器

  2. 浏览文件系统到你想下载的目录的父目录。

  3. 单击目录的名称以选择它。

  4. 单击工具栏中的保存按钮。

  5. 在弹出的对话框中,点击TAR.GZ按钮,将目录下载为一个由 GZIP 压缩的磁带档案文件。

    注意

    磁带档案(TAR)文件格式能够保留你下载文件的大多数元数据,如所有权、权限和扩展文件属性(尽管无法保留 SELinux 上下文或 POSIX ACLs)。

    你也可以选择以 ZIP 格式下载文件,这在某些系统上可能更容易提取,但文件的元数据将丢失。

  6. 将文件保存到本地计算机。

从压缩档案中提取文件

如果你的服务器上有 ZIP、TAR 或 GZIP 格式的压缩档案,Webmin 的文件管理器允许你通过以下步骤提取其内容:

  1. 导航到 其他 | 文件管理器

  2. 浏览文件系统到包含归档文件的目录。

  3. 单击归档文件的名称以选择它。

  4. 单击工具栏中的提取按钮。

  5. 在弹出对话框中点击

注意

请注意,如果你的目录中已包含与归档中文件同名的文件,这些文件将被覆盖,而不会进一步提示确认。

它是如何工作的……

Webmin 的文件管理器在你本地计算机的 Java 虚拟机中运行。Java 小程序嵌入在 Webmin 的网页中,可以通过浏览器访问。每当你在文件管理器中执行一个操作时,Java 小程序会向你的服务器发送一个请求,包含应执行的操作指令。

注意

文件管理请求通过 HTTP 协议发送。如果你在 Webmin 中启用了 HTTPS 支持,指令将通过 SSL 加密。

Webmin 在服务器上执行这些指令,并将它们的效果信息及其他显示所需的信息发送回文件管理器窗口的下一屏幕。

参见

  • 有关 Webmin 文件管理器功能的更多信息,请参考本章中的更改文件所有权和权限一节。

更改文件所有权和权限

Webmin 的文件管理器允许您操作标准的 POSIX 文件所有权和权限。该功能的用户界面易于使用且功能强大,允许您递归修改文件,但能够区分文件和目录。

在类 UNIX 系统中,每个文件系统节点(文件、目录等)都由一个用户和一个组拥有。系统还会为每个节点存储权限信息,包括文件所有者、组和其他用户的权限。标准权限如下表所示:

二进制表示法 八进制表示法 权限名称 描述
000 0 没有任何权限。
001 1 执行 执行程序文件或遍历目录。在大多数情况下,也需要读权限。
010 2 写入文件或在目录中创建文件条目。
100 4 读取 读取文件内容或列出目录内容。
011 3 写和执行 以上提到的权限组合。
101 5 读和执行
110 6 读写
111 7 读、写和执行

八进制表示法通常使用,因为它是最简洁的。例如,常用的文件权限表示为644,其中6(读写位)表示文件所有者的权限,4(读位)表示文件所属组和所有其他用户的权限。我们可以将权限设置为640,以禁止任何不属于我们组的用户访问。

另一方面,目录的标准权限表示为755,它与644类似,但为所有权限添加了执行位,允许所有人进入目录。

注意

设置第三种权限时要小心,因为此权限适用于所有可以访问您系统的用户。

如果您从另一个系统复制目录到您的服务器,目录的所有权和权限信息可能会丢失或设置不当。在本教程中,我们将递归地编辑目录,改变目录及其内容的所有者和权限。我们会将所有文件的权限设置为644,并将所有子目录的权限设置为755

准备工作

在本教程中,我们将使用 Webmin 的文件管理器,它作为一个 Java 小程序运行。为了使用它,您需要在本地计算机上安装 Java 并启用浏览器中的 Java 功能。您不需要在服务器上安装 Java。

如何操作...

让我们开始吧。按照以下步骤更改文件的所有权和权限:

  1. 导航到其他 | 文件管理器

  2. 浏览文件系统,找到包含您要操作的文件或目录的目录,并点击目录名称以选择它。

  3. 首先,我们将为目录及其所有内容设置权限755

    1. 点击工具栏中的信息按钮。

    2. 用户其他的所有类型下,勾选读取列出复选框。

    3. 仅为 用户(所有者)勾选 写入 权限,确保 其他 没有勾选 写入 权限。

    4. 应用更改到 选项设置为 此目录及所有子目录和文件如何操作...

    5. 点击 保存 按钮。

  4. 接下来,我们将只对目录及其子目录中的文件设置权限 644

    1. 点击工具栏中的 信息 按钮。

    2. 取消勾选所有类型的 列出 权限:用户其他

    3. 应用更改到: 选项设置为 此目录及其子目录下的文件

    4. 点击 保存 按钮。

它是如何工作的...

Webmin 的文件管理器在本地计算机的 Java 虚拟机上运行。Java 小程序嵌入在 Webmin 的网页中,可以通过浏览器访问。每当你在文件管理器中执行一个操作时,Java 小程序会向服务器发送一个 HTTP 请求,指示应该执行哪些操作。Webmin 会在服务器上执行这些操作,并将它们的效果以及显示在文件管理器窗口下一屏所需的其他信息一并返回。

还有更多...

Webmin 的文件管理器有许多与文件权限相关的其他选项。

启用可执行文件的 setuid 位

通常,当用户从文件中执行程序时,该程序会以该用户的权限运行。在特殊情况下,当一个可执行文件被标记为 setuid(执行时设置用户 ID)位时,执行的程序将以可执行文件的所有者权限运行,而不是运行程序的用户权限。这在用户必须向通常没有访问权限的文件写入数据时非常有用。例如,当用户更新自己的密码时,他们会修改 /etc 目录下的 shadow 文件,普通用户没有权限访问该文件。按照以下步骤为文件设置 setuid 位:

  1. 进入 其他 | 文件管理器

  2. 浏览文件系统,找到包含你希望操作的文件的目录,并点击文件名进行选择。

  3. 点击工具栏中的 信息 按钮。

  4. 所有权 下勾选标记为 Setuid 的复选框。

  5. 点击 保存 按钮。

为目录设置 sticky 位

sticky 位是现代 UNIX 类系统中目录的一个有用特性。如果一个目录设置了 sticky 位,那么目录中的文件只能由各自的拥有者或 root 用户编辑或删除,不管其他文件权限如何。这一特性通常应用于 /tmp 目录,在这个目录中,所有用户都可以创建文件,但只能删除或重命名自己拥有的文件。

Webmin 的文件管理器允许你通过以下步骤在目录上设置 sticky 位:

  1. 进入 其他 | 文件管理器

  2. 浏览文件系统到包含您要操作的目录的目录,然后点击目录名称进行选择。

  3. 点击工具栏中的信息按钮。

  4. 权限下勾选标有粘滞的复选框。

  5. 点击保存按钮。

更改目录上的 ACL

如果您的系统支持文件系统访问控制列表ACL),您可以使用它们为文件和目录指定额外的权限。例如,您可以选择设置默认权限,这些权限将应用于目录中创建的所有新文件。如果您有一个 Webmin 用于存放备份文件的目录,您可以选择默认情况下使备份对其他用户不可访问。

您可以通过以下步骤使用 Webmin 操作 ACL:

  1. 导航到其他 | 文件管理器

  2. 浏览文件系统到包含您要操作的目录的目录,然后点击目录名称进行选择。

  3. 点击工具栏中的ACL按钮。

  4. 从下拉菜单中选择默认其他,然后点击添加类型的 ACL按钮。

  5. 取消勾选读取写入执行的所有框。更改目录上的 ACL

  6. 创建 ACL窗口中点击保存按钮,然后在主 ACL 窗口中点击保存按钮。

为 Windows 设置网络共享文件夹

在局域网上运行的服务器可以作为共享文件的存储库非常有用。如果您本地网络中的其他计算机运行的是 Microsoft Windows,设置网络文件服务器的最佳选择是 Windows 标准的公共互联网文件系统CIFS)协议。Webmin 可以通过安装并帮助您配置 Samba 包实用工具来协助您设置这种类型的网络共享。

提示

不建议在公开的互联网环境中使用 Windows 文件共享。外部计算机经常扫描 Windows 文件共享协议的漏洞,如果在安全补丁发布并应用之前,某个漏洞被广泛利用,您可能会成为攻击的受害者。

确保您的防火墙阻止用户数据报协议UDP)端口 137、138 和 139,以及 TCP 端口 137、139 和 445 的外部网络流量。这些端口用于 Windows 文件共享,应仅允许本地网络中的受信任计算机访问。

如果您需要通过互联网提供网络资产,使用本章后面将介绍的 SFTP 或 FTP 协议会是一个更好的选择。

准备工作

为了在您的服务器上设置 Windows 文件共享,您需要从您的发行版仓库安装 Samba 包。如果 Samba 已经安装,您将在 Webmin 主菜单的服务器部分找到Samba Windows 文件共享模块;否则,您会在未使用的模块部分找到它。

在大多数系统中,Webmin 能够自动下载 Samba 包及其依赖项。请导航到未使用的模块 | Samba Windows 文件共享并点击链接下载并安装该软件包。或者,你也可以按照第一章中安装软件包的步骤,安装名为samba的软件包。

注意

在本书发布时,Webmin 支持的是 Samba 3 系列,而不是更新的 Samba 4。

安装完成后,按照第三章中通过防火墙允许访问服务的步骤,解锁 TCP 端口 137、139 和 445 以及 UDP 端口 137-139。

准备就绪

请按照第一章中控制启动时哪些系统服务被启动的步骤,确保nmbsmbwinbind服务被启动并设置为开机自动启动。

最后,我们可以设置服务器在网络中的可见性。请导航到服务器 | Samba Windows 文件共享 | Windows 网络,将工作组设置为WORKGROUP或你的组织中使用的其他名称。将服务器描述设置为你希望服务器在网络中显示的名称。你可以将描述字段设置为%h,这会导致 Samba 使用服务器的默认主机名。

如何操作...

在这个步骤中,我们将创建一个共享的网络文件夹,供 Windows 用户使用。Linux 和 OS X 也能够访问 CIFS 服务器,因此这种类型的网络附加存储将广泛可用于你的本地网络。

创建 UNIX 伪用户

我们将创建一个可以供多个用户访问的共享网络文件夹。这个共享资源必须存储在我们服务器的磁盘上,并且必须属于一个 UNIX 用户。为了简化文件所有权和权限的管理,我们将创建一个名为samba的特殊伪用户。这个用户不与任何一个人关联,并且该账户无法登录到我们的系统。该用户将仅拥有共享目录中的所有文件,目录将创建在/srv/samba。请按照第二章中创建系统用户账户的步骤来创建一个伪用户。使用以下设置:

  • 用户名: samba

  • 真实姓名: Samba 网络伪用户

  • 主目录: /srv/samba

  • Shell: /usr/sbin/nologin

    注意

    nologin二进制文件可能位于其他路径下,如/sbin/nologin。你也可以使用/bin/false,该命令不会返回礼貌的提示信息,但同样会阻止用户登录。

  • 密码: 不允许登录

  • 主组: 与用户同名的新组

  • 将模板文件复制到主目录?:

  • 是否在其他模块中创建用户?

这些设置显示在以下截图中:

创建 UNIX 伪用户

创建 Samba 共享网络文件夹

下一步是创建实际的共享网络资源。Webmin 使这部分变得非常简单。按照以下步骤创建共享网络文件夹:

  1. 导航到服务器 | Samba Windows 文件共享

  2. 点击创建新的文件共享链接。

  3. 共享名称设置为SharedFolder或更合适的描述。

  4. 共享目录设置为/srv/samba

  5. 由于我们在设置伪用户账户时已经创建了目录,因此对于是否自动创建目录?,选择

  6. 可用可浏览都设置为

  7. 点击创建按钮。

创建 Samba 用户账户

Samba 存储着独立于系统用户列表的用户列表。Webmin 允许你通过执行以下步骤轻松地为系统用户创建 Samba 用户账户:

  1. 导航到服务器 | Samba Windows 文件共享

  2. Samba 用户部分点击转换用户

  3. 转换 Unix 用户设置为仅列出的用户或 UID 范围,然后使用省略号按钮(...)打开用户选择弹出窗口,选择一个你希望授予 Samba 访问权限的用户。

  4. 为新创建的用户设置密码为设置为使用此密码,并为该用户输入密码。

  5. 点击转换用户按钮。

提示

用户可以通过 Usermin 更改其密码。有关设置 Usermin 的信息,请参见第二章中的安装 Usermin配方,用户管理部分。

如果用户在 Samba 服务器上的用户名和密码与其 Windows 上的用户名和密码匹配,他们应该能够透明地进行身份验证,在访问共享文件夹时无需重新输入密码。

授予 Samba 用户访问共享文件夹的权限

过程的最后一步是授予 Samba 用户访问我们创建的共享文件夹的权限。我们还将告知 Samba,应将所有传入文件的 UNIX 所有权设置为在前一部分中创建的伪用户samba。按照以下步骤授予 Samba 用户访问共享文件夹的权限:

  1. 导航到服务器 | Samba Windows 文件共享

  2. 点击我们刚创建的共享的名称。

  3. 编辑文件共享屏幕上,点击安全性与访问控制图标。

  4. 可写?设置为

  5. 可读/写用户设置为应该具有写入权限的用户列表。使用省略号(...)按钮打开有用的用户选择弹出窗口。

  6. 点击保存按钮。

  7. 返回到编辑文件共享屏幕,点击文件权限图标。

  8. 强制 UNIX 用户强制 UNIX 组设置为samba

  9. 点击保存按钮。

注意

如果你正在运行Security Enhanced LinuxSELinux),你可能会遇到一个问题,即用户能够访问共享文件,但无法列出、读取或写入文件。这是因为 SELinux 阻止了它认为未经授权的对底层目录的访问。你可以通过禁用 SELinux 或为/srv/samba配置 SELinux 安全上下文来解决此问题。有关更多信息,请查看此链接:fedoraproject.org/wiki/SELinux/samba

稍等片刻,你应该能够从网络上的其他计算机访问你的共享文件。在 Windows 网络WORKGROUP中查找你的服务器,或在 OS X 的Shared侧边栏中查找。

它是如何工作的……

Samba 的配置存储在/etc/smb.conf/etc/samba/smb.conf中,具体取决于操作系统。Webmin 的图形界面使你能够编辑存储在此文件及相关文件中的选项,从而修改 Samba 的配置,无需学习该文件复杂的语法。Samba 会自动频繁重新读取其配置,因此在进行大多数常见配置更改后,通常不需要重新启动smb及相关守护进程。

还有更多……

你可以做很多与 Samba 相关的操作,但这里没有足够的空间来涵盖所有内容。我们不得不省略的话题包括:在你的网络上共享服务器连接的打印机、使用微软的 Active Directory 服务进行用户身份验证、设置访问控制列表以维护 Windows 和 UNIX 系统上的文件所有权等。

在本节的其余部分,我们将介绍 Webmin 可以帮助您完成的其他一些功能。

共享主目录

在许多系统中,Samba 会自动创建主目录共享。这允许用户通过网络访问存储在其主目录中的文件。如果这是一个你不打算启用的功能,你可以暂时禁用它或永久删除该共享配置。以下是使主目录不可用的步骤:

  1. 导航到Servers | Samba Windows File Sharing

  2. 点击SharedFolder

  3. 设置Available?No

  4. 点击Save按钮。

检查谁已连接并断开会话

如果你想查看谁通过 Samba 连接到你的服务器并断开连接,请执行以下步骤:

  1. 导航到Servers | Samba Windows File Sharing

  2. 点击View all connections链接。

  3. 标记与您想要断开连接的会话相关的进程 ID。

  4. 点击Disconnect Selected Users按钮。

注意

断开一个正在打开文件的用户可能会导致他们 Windows 机器上的程序停止运行。断开用户时请小心。

调试 Samba

如果你在使用 Samba 时遇到问题,应该检查其日志文件中的错误信息。Samba 的日志消息存储在/var/log/samba目录中。你会在这里找到多个文件,因为服务器会为每个连接的客户端保存单独的文件。默认情况下,Samba 的日志记录非常安静,因为记录每个操作会严重降低服务的性能。如果你遇到问题,可能希望临时增加 Samba 日志的详细程度;完成后记得将其恢复到默认值。按照以下步骤来更改 Samba 的日志详细度:

  1. 转到服务器 | Samba Windows 文件共享 | 其他选项

  2. 调试级别设置为更高的值。初始值设为1,如果日志文件中仍未找到有用的信息,可以进一步提高该值。

  3. 点击保存按钮。

  4. Samba Windows 文件共享屏幕上,点击重启 Samba 服务器按钮。这将输出有关服务器启动时记录消息的信息,这些消息可能包含有用的诊断信息。

挂载 Windows 共享文件夹

网络附加存储卷使用 CIFS 协议是相当常见的。允许设置此类共享的工具已经内置在流行的操作系统中,如 Microsoft Windows 和 OS X。许多 NAS 设备也使用此协议,通常运行 Linux 的 Samba 包的某个版本。在桌面环境中挂载 CIFS 共享是相当简单的,但如果你希望服务器始终能够访问 CIFS 卷该怎么办呢?Webmin 可以帮助你设置一个自动挂载的网络文件系统,在系统启动时连接到远程 CIFS 服务器。

准备工作

在你的系统能够访问 CIFS 网络卷之前,你需要安装一个附加的包,通常名为cifs-utils。有关如何使用 Webmin 安装软件包的信息,请参见第一章中的安装软件包

如何操作...

按照以下步骤将 Windows 共享文件夹挂载到你的文件系统中:

  1. 由于我们需要以明文形式存储 CIFS 用户凭据(用户名和密码),因此我们需要先创建一个受保护的隐藏文件。在服务器上创建一个路径为/root/.smbcredentials的文件,并在其中写入以下内容,将cifsusernamecifspassword替换为具有访问 CIFS 共享文件夹权限的用户的用户名和密码。将文件的所有者设置为root,并将权限设置为600

    username=cifsusername
    password=cifspassword
    

    提示

    你可以使用 Webmin 的文件管理器来创建文件并编辑其权限。有关如何管理服务器上的文件和目录,请参阅本章中的管理文件和目录

  2. 转到系统 | 磁盘和网络文件系统

  3. 类型下拉菜单中选择通用互联网文件系统(cifs)

  4. 点击添加挂载按钮。

  5. 挂载为设置为类似/mnt/remoteshare的本地路径。

  6. 保存挂载?设置为保存并在启动时挂载

  7. 服务器名称设置为远程 CIFS 服务器的 IP 地址或完全限定域名。

  8. 共享名称设置为远程共享的名称。如果你使用本章节中的食谱创建了共享,名称将是SharedFolder

  9. 凭据文件设置为/root/.smbcredentials

  10. 用户文件所有者设置为root

  11. 组文件所有者设置为users

    提示

    你可以指定另一个用户或为 Samba 创建一个特殊的伪用户,如本章节中的设置 Windows 共享文件夹食谱所描述。

  12. 文件权限设置为0660

  13. 目录权限设置为0770

  14. 点击创建按钮。

如何操作...

如何操作...

/etc/fstab目录包含有关系统在启动时挂载的所有文件系统的信息。这包括本地磁盘和远程网络卷。在创建永久 CIFS 挂载时,Webmin 会在你的文件中创建一行额外的内容。此行将具有以下格式:

\\192.168.1.50\sharedfolder	/mnt/remoteshare    cifscredentials=/root/.smbcredentials,nounix,uid=0,gid=100,dir_mode=0770,file_mode=0660     0      0

上述行包含以下信息:

  • 192.168.1.50:这是 CIFS 服务器的 IP 地址或域名。

  • sharedfolder:这是 CIFS 共享的名称。

  • /mnt/remoteshare:这是共享将挂载的本地文件路径。

  • /root/.smbcredentials:这是存储 CIFS 用户名和密码的文件路径。

  • uid=0:这指定了共享文件由root用户拥有。

  • gid=100:这指定了共享文件由users组拥有,通常会允许你系统上的所有用户访问这些文件。

  • file_mode=0660dir_mode=0770:这些指定了所有共享文件的权限——读取、写入和列出——适用于users组的所有成员。

还有更多...

如果你只希望挂载一次 CIFS 共享,而不将其设置为服务器文件系统的永久组件,可以简化此食谱。

按照本食谱中的如何操作...部分中的步骤进行操作,但不要创建凭据文件,而是将用户名和密码放入登录名登录密码字段中。同时将保存挂载设置为不保存

这相当于执行以下命令:

$ sudo mount -t cifs //192.168.1.50/sharedfolder/mnt/remoteshare-o username=cifsusername,password=cifspassword,file_mode=0660,dir_mode=0770,nounix,uid=0,gid=100

设置 NFS 共享卷

网络文件系统NFS)是一种分布式文件系统协议,旨在允许系统通过网络共享文件资源。NFS 服务器可以导出其文件系统的一部分,然后远程客户端系统可以将导出的目录挂载为其本地文件系统的一部分。Webmin 可以帮助你使用 NFS 导出目录进行共享。

注意

NFS v3 保留 UNIX 权限和文件所有权,但检查谁是谁的工作由客户端系统完成。这意味着,如果 NFS 服务器上的某个用户的 uid 值为 500,那么该用户在 NFS 客户端系统上的 uid 也应该相同。否则,他的文件可能会被分配给其他用户,或者根本没有用户。这是设置 NFS 服务器和客户端时需要考虑的重要安全因素。确保两台系统具有相同的用户账户。

准备工作

NFS 服务器可能在安装时已经内置在您的系统中。如果是这样,Webmin 应该会识别它并启用 NFS 导出模块。如果您在菜单的网络部分看到该模块,说明 NFS 服务器已经安装;否则,我们需要手动安装它。

根据您的系统,NFS 服务器可能会打包为 nfs-kernel-servernfs-utils。在您的仓库中找到合适的包并安装。有关更多信息,请参考第一章中的安装软件包部分,配置您的系统

转到系统 | 启动与关闭,并验证 rpcbind 服务是否在我们的系统上运行。如果没有,请选择它并点击立即启动并开机启动按钮。

提示

在防火墙保护的系统上运行 NFS 服务器有些棘手。NFS 服务器的各个组件的端口号是动态分配的,可能会随时间变化。您可以通过编辑配置文件强制系统为 NFS 相关服务分配静态端口号。这些文件的位置和语法取决于您的系统发行版和版本。请搜索 nfs iptables 以及您的操作系统名称,查找适合您系统的操作说明。

如果您的系统运行在一个受防火墙保护的安全内部网络中,且防火墙位于另一台机器上,您也可以考虑禁用 NFS 服务器上的防火墙。

如何操作...

在本食谱中,我们将导出 /home/shared 并使其可供远程系统的用户使用,目标 IP 地址为 192.168.1.60。我们将使用更简单且广泛支持的 NFS 版本 3。按照以下步骤设置 NFS 共享卷:

  1. 转到网络 | NFS 导出

  2. 点击添加新的导出链接。

  3. NFS 版本设置为3

    注意

    在设置第一个 NFS 导出时,您可能看不到版本选择屏幕。不要担心,版本 3 是默认设置。

  4. 要导出的目录设置为/home/shared

  5. 导出设置为主机(s),并指定目标主机的 IP 地址或域名,例如 192.168.1.60

  6. 只读?设置为

  7. 信任远程用户设置为除了 root 之外的所有人,如下图所示:如何操作...

    提示

    默认情况下,root 用户帐户在 NFS 中会被“压缩”。这意味着来自客户端系统的 root 在服务器上显示为用户 nobody。你可以通过使用信任远程用户:所有人选项来更改这种行为(该选项在导出上设置 no_root_squash 标志)。这涉及到严重的安全问题,只有在绝对必要时才能执行,因为你必须信任所有允许挂载该共享的远程机器上的 root 访问用户。

  8. 点击创建按钮。

  9. 返回到NFS 导出屏幕,点击应用更改按钮。

它是如何工作的…

NFS 导出列在 /etc/exports 中。当创建一个导出时,Webmin 会在这个文件中添加一行,而 NFS 服务器会读取这个文件。例如,我们创建的导出将通过这个简单的条目来表示:

/home/shared	192.168.1.60 (rw)

该行中的第一个字段表示将被导出的目录(/home/shared),后面是可以访问该导出的机器的 IP 地址或域名,以及选项。在这个简单的例子中,唯一的选项是 rw,表示该导出可以以读写模式挂载。

更多内容...

如果你想检查当前由 NFS 服务器提供的导出内容,可以执行以下命令:

$ sudo exportfs

授予多个客户端访问权限

如果你希望将 NFS 导出提供给多台机器,你可以使用通配符来指定主机。例如,要将导出提供给 intra.mydomain.com 域中的所有服务器,你可以将主机设置为 *.intra.mydomain.com

如果你希望指定子网,可以改为使用IPv4 网络子网掩码字段。例如,要让你的导出对所有 IP 地址在 192.168.1.0-192.168.1.255 范围内的机器可用,你可以将IPv4 网络设置为 192.168.1.0子网掩码设置为 24

另见

  • 请参阅本章中的挂载远程 NFS 卷教程,了解如何在客户端机器上使用导出的文件夹。

挂载远程 NFS 卷

如果你的服务器有访问通过 NFS 导出的远程卷,Webmin 可以帮助你将该卷挂载为文件系统的一部分。

准备中

NFS 客户端支持可能会默认安装在你的系统上,或者随着 NFS 服务器软件一起安装。请验证名为 nfs-utilsnfs-common(取决于你的系统)的软件包是否已安装,或者在需要时安装它。有关更多信息,请参阅第一章中的检查已安装的软件包安装软件包教程,设置你的系统部分。

如何操作...

在这个教程中,我们将挂载由 IP 为 192.168.1.50 的远程 NFS 服务器导出的 /home/shared 目录到本地挂载点 /mnt/remoteshare。执行以下步骤来挂载远程 NFS 卷:

  1. 导航到网络 | NFS 导出

  2. 类型下拉菜单中选择网络文件系统(nfs)

  3. 点击添加挂载按钮。

  4. 挂载为设置为/mnt/remoteshare

  5. NFS 主机名设置为192.168.1.50

  6. NFS 目录设置为/home/shared

    提示

    在此阶段,点击NFS 目录字段旁的省略号()按钮是个好主意。应该会出现一个可用导出目录的列表。如果没有出现,可能是网络连接存在问题,或者 NFS 服务器没有正确地将目录导出到我们的客户端系统。

  7. 等待网络接口启动?设置为

  8. 在后台重试挂载?设置为

  9. 允许用户中断?设置为,如下图所示:如何操作...

  10. 点击创建按钮。

它是如何工作的...

在启动时,系统会根据/etc/fstab文件中的描述来挂载文件系统。当创建永久挂载点时,Webmin 会在该文件中添加一行,表示对应的 NFS 导出。

这是此操作创建的条目:

192.168.1.50:/home/shared     /mnt/remoteshare    nfs     _netdev,intr,bg     0      0

前面的条目包含以下字段:

  • 192.168.1.50:/home/shared指定了远程服务器的地址和导出目录的路径,中间用冒号分隔。

  • /mnt/remoteshare指定了本地挂载点的位置。

  • nfs指定该条目代表一个 NFS 导出。

  • _netdev,intr,bg字段指定了挂载选项,这是我们在创建共享时选择的。例如,_netdev选项告诉系统等待网络可用后再进行挂载。

  • 最后的两个字段设置为0,表示此文件系统在备份或磁盘检查时不应被考虑。

还有更多...

你不需要在/etc/fstab中做条目来临时挂载 NFS 卷。你可以通过 Webmin 完成这项操作;只需将保存选项设置为不保存。这相当于执行以下命令:

$ sudo mount -t nfs -o intr,bg 192.168.1.50:/home/shared /mnt/remoteshare

挂载 NFS v4 导出

Webmin 还可以挂载 NFS 版本 4 导出的共享。在这个版本的 NFS 中,导出的组织方式略有不同。目录不会逐个导出,而是作为整个伪文件系统的一部分导出。你需要在挂载点挂载整个文件系统,导出的目录会成为挂载点的子目录。

使用 Webmin 创建 NFS v4 挂载点的区别有两点。你应该从类型下拉菜单中选择网络文件系统 v4(nfs4),并将NFS 目录设置为/,因为整个导出文件系统将挂载在一个位置。

参见

  • 查看本章中的设置 NFS 共享卷教程,了解如何在服务器上设置 NFS 导出。

通过 SFTP 向用户提供访问你的服务器的权限

用户可能需要通过互联网传输文件到和从您的服务器。您可以通过简单且安全的方式启用此功能,使用 SSH 文件传输协议 (SFTP)。设置此功能不需要安装除了您可能已经运行的 SSH 服务器外的任何其他软件,以便远程控制您的服务器。所有具有 SSH 访问权限的用户也可以使用 SFTP 客户端程序(如 Filezilla)访问您的服务器。

在此配方中,我们将为用户设置一个帐户,该用户将能够将文件传输到您的服务器,但不具有访问系统命令行 shell 的能力。

准备就绪

如果尚未在系统上安装 SSH 服务器,请按照 第一章 中的 Installing software packages 配方,Setting Up Your System,安装 openssh-server 包。

安装后,按照 第三章 中的 Allowing access to a service through the firewall 配方,Securing Your System,来解除 TCP 端口 22 的阻塞。

如何做…

为了启用用户的 SFTP-only 访问,我们需要将用户的 shell 设置为 sftp-server 程序。让我们首先找到您系统上此程序的位置:

  1. 导航到 Servers | SSH Server | Edit Config Files

  2. 确保从下拉菜单中选择了 sshd_config(服务器配置)文件,而不是 ssh_config 文件(默认客户端配置)。

  3. 找到以 Subsystem sftp 开头的行。在我的 Debian 系统上,这一行如下所示:

    Subsystem sftp /usr/lib/openssh/sftp-server
    

这意味着 SFTP 服务器二进制文件位于 /usr/lib/openssh/sftp-server

下一步是将 SFTP 服务器二进制文件的路径添加到 /etc/shells 文件中列出的可用用户 shell 列表中。您可以执行以下命令作为用户 root

echo '/usr/lib/openssh/sftp-server' >> /etc/shells

按照以下步骤授予用户对服务器的 SFTP 访问权限,而不允许他们登录:

  1. 导航到 System | Users and Groups

  2. 单击要赋予 SFTP 访问权限但不允许其以其他方式登录的用户的名称。

  3. 将用户的 Shell 更改为 sftp-server,应该在可用 shell 的下拉列表中。

用户现在可以通过 SFTP 访问您的服务器。该用户将无法登录到系统的命令行 shell。

注意

使用设为 sftp-server 的 shell 的用户可以根据 Unix 权限访问您服务器的整个文件系统。如果您希望用户访问其他系统上的文件,可以授予用户对其他目录的读写权限。

要创建额外的仅 SFTP 用户,请按照 第二章 中的 Creating a system user account 配方,User Management,但确保将其 Shell 设置为 sftp-server

提示

当用户通过 SFTP 连接到服务器时,他们首先看到的目录列表将是他们的主目录。请记住,你可以将用户的主目录设置为文件系统中的任何位置。你还可以通过在他们的主目录中创建指向系统上他们应该最容易访问位置的符号链接,来简化用户的操作。

它是如何工作的……

用户的 shell 程序是系统在用户登录时启动的第一个程序。如果这个 shell 是 sftp-server,那么用户只能与这个程序进行交互。它是传输文件所必需的,但不会允许用户在系统上执行其他操作或启动其他程序。

用户帐户的定义存储在 /etc/passwd 中。当我们创建帐户或更改用户的 shell 程序设置时,Webmin 会编辑此文件。

另见

  • 有关设置专用 FTP 服务的信息,请查看本章中的 通过 FTP 向用户提供访问权限 配方。

通过 FTP 向用户提供访问权限

文件传输协议 (FTP) 是互联网上最流行的数据交换协议之一。FTP 服务器允许用户进行身份验证并将文件上传到你的机器。此类访问不需要授予用户在服务器上的其他权限,并且你可以限制通过 FTP 访问用户的主目录。

注意

请注意,FTP 是一种非常不安全的协议,因为用户名和密码在没有加密的情况下交换,除非你启用 TLS。如果你的服务器运行在不可信的网络中,建议使用 SFTP。

如何操作……

允许用户通过 FTP 访问系统的第一步是安装 FTP 服务器守护进程。我们将使用稳定且功能丰富的 ProFTPd 服务器,Webmin 对它的支持很好。按照以下步骤设置 FTP 服务器:

  1. 导航到 未使用的模块 | ProFTPD 服务器

  2. 点击链接;这会指示 Webmin 自动下载并安装软件包。

    提示

    在此阶段,如果在系统分发版的包仓库中找不到 ProFTPD 软件包,你可能会遇到问题。大多数发行版包含 ProFTPD 软件包,但你可能需要启用额外的仓库。

    例如,如果你正在运行来自 RedHat 家族的 Linux 发行版(如 RHEL、CentOS、Fedora 等),你应该通过执行以下命令来添加 企业 Linux 额外软件包 (EPEL) 仓库:

    $ sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
    
    

    在 32 位(i386)系统上,将 x86_64 替换为 i386

    在撰写本书时,EPEL 索引的最新版本是 6.8;请检查 EPEL 网站上当前的最新版本,并根据需要修改命令中的 URL。更多信息可以在 fedoraproject.org/wiki/EPEL 找到。

  3. 刷新页面以更新 Webmin 的界面。

  4. 导航到系统 | 启动和关机,勾选proftpd旁边的框,并点击立即启动并设置为开机启动按钮。

如果服务器未启动,请运行以下命令检查配置:

$ sudo proftpd --configtest

你可能会看到类似以下的警告:

warning: unable to determine IP address of 'server-name'

这意味着服务器无法基于其主机名来确定自己的 IP 地址。修复这一问题的最简单方法是按照以下步骤操作:

  1. 导航到网络 | 网络配置 | 主机地址

  2. 点击添加新主机地址链接。

  3. IP 地址指定为127.0.0.1,将主机名指定为server-name。只需将server-name替换为你的服务器主机名。

  4. 点击创建按钮。

    注意

    这将向/etc/hosts文件中添加以下行:

    127.0.0.1   server-name
    
    

打开防火墙中的 FTP 访问

如果客户端从防火墙后连接到服务器,应该使用被动模式来建立 FTP 连接。按照以下步骤告诉 ProFTPd 应使用哪个端口范围进行被动连接,并在防火墙中打开这些端口以及端口21

  1. 导航到服务器 | ProFTPD 服务器 | 网络选项

  2. PASV 端口范围设置为 IANA 推荐的动态端口号范围。例如,设置为6000060099之间。此范围的大小决定了有多少客户端可以以被动模式同时连接到你的服务器。

  3. 点击保存按钮。

  4. 返回到ProFTPd 服务器模块页面,点击应用更改按钮。

  5. 请参照第三章中通过防火墙允许访问服务的操作步骤,保护系统,并允许在端口21以及上面设置的端口范围60000-60099上接收 TCP 连接,如下图所示:

打开防火墙中的 FTP 访问

此时,你的 FTP 服务器应该已经启动并运行。尝试使用 FTP 客户端从另一台计算机连接到服务器。尝试以除 root 之外的任何普通用户身份登录。

提示

如果你使用的是 SELinux,可能无法登录到 FTP 服务器,并且在 ProFTPd 日志中可能会看到奇怪的Permission denied错误消息。如果是这种情况,你需要设置一个 SELinux 标志,允许 FTP 访问。你可以通过执行以下命令之一来实现:

若要仅允许 FTP 访问用户的主目录,请使用以下配置:

$ sudo setsebool ftp_home_dir on

若要允许 FTP 访问整个文件系统,请使用以下配置:

$ sudo setsebool allow_ftpd_full_access on

它是如何工作的……

Webmin 能够使用你的系统的包管理系统下载并安装 ProFTPd 软件包。该软件包附带一个启动脚本,通过该脚本我们启动了服务器并将其设置为在系统启动时自动启动。

被动模式和主动模式 FTP 连接

文件传输协议使用两条同时连接在服务器和客户端之间交换数据。一条连接用于发送指令(命令通道),另一条用于传输文件(数据通道)。命令通道始终由客户端打开,客户端通过专门用于 FTP 的端口(通常是端口号 21)与服务器建立连接。然而,数据通道可以通过两种不同的方式打开:

  • 主动模式(非被动):服务器主动打开数据连接到客户端。这种方法并不常见,因为客户端通常隐藏在多个防火墙和 NAT 后面,这使得连接变得不可能。

  • 被动模式:在这里,服务器向客户端发送一个端口号,然后被动地等待客户端连接到该端口。端口号是从短暂端口号范围中动态分配的。互联网号码分配局IANA)建议使用 49152 到 65535 之间的数字作为动态端口号。

全局配置和虚拟服务器

ProFTPd 服务可以运行多个虚拟服务器,并为每个服务器提供不同的配置。每个虚拟服务器都运行在不同的 IP 地址上,因此,如果你的服务器通过不同的接口连接到网络或多个网络,你可以在每个 IP 上设置一个具有不同配置的 FTP 服务器。特定于服务器的设置可以通过 Webmin 的虚拟服务器部分访问。它将包含至少一个配置——默认服务器全局配置部分中的设置适用于所有服务器,但每个虚拟服务器可以选择是否使用默认的全局值,或者覆盖它。在大多数情况下,你的服务器将仅运行一个虚拟服务器。在这种情况下,存储在全局配置默认服务器部分的设置没有实际区别。你应当记住这一点,因为如果你在全局配置中更改了设置,而该更改似乎没有效果,可能是因为在默认服务器配置中被覆盖了。

还有更多...

ProFTPd 服务器非常灵活。这里列出一些你可能希望设置的常见选项。

限制用户访问主目录

如果你希望用户仅能通过 FTP 访问其主目录中的文件,请执行以下步骤:

  1. 导航到服务器 | ProFTPD 服务器

  2. 虚拟服务器部分点击默认服务器

  3. 点击文件和目录

  4. 限制用户到目录部分,选择主目录

  5. 点击保存按钮。

拒绝某些用户的 FTP 访问

如果你希望拒绝某些用户通过 FTP 访问,请执行以下步骤:

  1. 导航到服务器 | ProFTPD 服务器 | 拒绝的 FTP 用户

  2. 你将看到一份被拒绝通过 FTP 访问的系统用户列表。将你希望阻止通过 FTP 访问服务器的用户的用户名添加到列表末尾(每行一个用户名)。

  3. 点击 保存 按钮。

仅限 FTP 用户

你可以允许用户通过 FTP 访问你的服务器,但通过执行以下步骤防止他们通过其他方式登录到你的服务器:

  1. 转到 系统 | 用户和组

  2. 点击你想要限制登录的用户的用户名。

  3. 将用户的 Shell 设置为 /usr/sbin/nologin

    注意

    nologin 可执行文件可能位于系统的其他路径下,例如 /sbin/nologin

  4. 点击 保存 按钮。

另见

  • 你可以在不安装额外 FTP 服务器的情况下启用服务器上的文件共享,而是依赖 SSH 服务器。有关更多信息,请查看本章中的通过 SFTP 让用户访问你的服务器这一部分。

第七章:备份系统

在本章中,我们将讨论以下主题:

  • 备份配置文件

  • 从备份恢复配置文件

  • 自动备份配置文件

  • 创建选定目录的备份

  • 创建整个挂载点的备份

  • 备份到远程主机

  • 设置自动备份

  • 备份数据库

引言

存储在服务器上的数据通常比存储数据的服务器硬件更为重要和有价值。保持服务器的安全性和数据的安全是系统管理员的首要任务之一。尽管我们希望避免硬件故障或恶意安全攻击等问题,但我们需要为解决这些问题的后果做好准备。定期备份数据对于从意外灾难中恢复至关重要。你还应该定期测试所创建的备份,确保它们在需要时能够恢复数据。

在本章中,我们将提供一些示例,演示 Webmin 如何帮助你备份以下内容:

  • 服务器上的数据文件,例如应用程序的源代码和用户输入或上传的数据。请参阅创建选定目录的备份

  • 存储在数据库中的信息。请参阅备份数据库

  • 配置设置。请参阅备份配置文件

  • 整个服务器文件系统。请参阅创建整个挂载点的备份

在设计备份策略时,请牢记以下事项:

  • 完整备份或增量备份:服务器或目录的完整备份会存储该位置的所有文件。此类备份可能非常大,即使是压缩后,创建备份也可能需要很长时间。另一方面,增量备份只会存储自上次备份以来已更改的文件。这会占用更少的空间,并且可以迅速完成。然而,增量备份恢复起来稍微有些困难,因为你必须先恢复上一个完整备份,然后再从增量备份中添加自上次完整备份以来创建的文件。

  • 在线或离线备份:在线备份可以被服务器或其他计算机轻松访问,而离线备份则存储在磁带或断开连接的磁盘上,通常放在架子上。没有人工干预,无法访问它。在线备份更方便,但如果恶意攻击者接管了你的系统,他/她可以将其删除。最好也保留离线备份副本。

  • 本地或异地备份:将备份保存在与服务器同一建筑物中,在火灾或其他灾难发生时无法保护数据。你可能希望将额外的备份存放在另一个远程位置。

一个完美的备份策略应该存储每日(甚至每小时)的增量备份,并定期(每周或每月)进行完整备份,最好是以离线和异地形式保存。你保留的备份数量将决定你能追溯多长时间来恢复丢失或损坏的文件。

提示

备份可能包含敏感数据,如密码或其他机密信息。请确保安全存储备份,可能考虑加密存储在异地的文件。

在本章中,我们将演示如何创建备份,但你需要确保备份文件存储在安全位置并定期进行测试。

备份配置文件

你花费了大量时间来设置系统并优化其配置,以获得最佳的性能和功能。删除配置文件或甚至做出不最优的更改可能会带来严重后果,尤其是在生产环境中。在进行更改之前,你应先备份配置文件,并保持备份文件,以便在需要时恢复到先前的配置。Webmin 提供了一个帮助你做到这一点的功能。

准备工作

在本教程中,我们将创建包含当前日期的备份文件名。我们需要启用此功能。因此,在开始备份过程之前,进入Webmin | 备份配置文件 | 模块配置,并对是否进行备份目标的 strftime 替代?的问题回答

如何操作...

执行以下步骤以备份配置文件:

  1. 在根目录下创建一个用于存储本地备份的目录,例如/backups

    提示

    确保你的备份目录存储在一个有足够磁盘空间的分区上,以免意外填满整个磁盘。将/backups放在单独的分区或/var/backups目录中可能是一个好主意。

    你还应该保护备份位置免受窥探。你可以使用权限和 ACL 来实现这一点,具体操作可以参考第六章中更改文件所有权和权限部分的更改目录的 ACL一节,管理系统文件

  2. 进入Webmin | 备份配置文件

  3. 选择立即备份选项卡。

  4. 要备份的模块列表中,选择你打算操作的模块,例如Webmin 配置

    提示

    你可以备份多个模块,甚至所有模块,以获取更完整的备份。

  5. 备份目标设置为本地文件,并为文件名指定以下路径:/backups/webmin-config-%Y%m%d%H%M.tgz

  6. 包含在备份中设置为服务器配置文件如何操作...

  7. 点击立即备份按钮。

Webmin 配置文件将以文件形式备份到/backups目录中。文件名将包含备份的日期和时间。

它是如何工作的...

Webmin 知道哪些配置文件被它帮助配置的服务使用。当你备份某个模块的配置文件时,Webmin 会将这些文件压缩成一个 TAR 文件并存储在你指定的位置。

由于我们激活了 strftime 替换,前面带有百分号(%)的模式将被日期组件替换。例如,%Y 将被年份数字替换,%m 被月份数字替换。完整的可用标记列表可以通过点击是否对备份目标执行 strftime 替换?链接在模块配置界面中找到。

提示

Webmin 仅备份它所知道的文件。如果你想对服务器上的所有配置文件进行完整备份,你应该考虑备份整个/etc目录。更多信息请参考本章中的创建指定目录的备份章节。

还有更多...

Webmin 允许你使用 FTP 或 SFTP(SSH)协议将文件备份到远程服务器。操作步骤与前面部分列出的一样,唯一不同的是需要将备份目的地选项更改为FTP 服务器SSH 服务器。为了将文件传输到远程服务器,你还需要指定远程服务器的 IP 地址或域名,以及远程服务器上的用户名和密码。你还可以选择将备份文件下载到你用来连接 Webmin 的计算机上,选择在浏览器中下载作为目的地选项。

另见

  • 本章还有其他两个与 Webmin 配置文件备份相关的章节。请参阅本章中的从备份恢复配置文件自动备份配置文件章节。

从备份恢复配置文件

如果你使用 Webmin 创建配置文件的备份,当你在备份后修改了设置并遇到问题时,可以使用这些备份文件恢复系统设置。

如何操作...

恢复配置备份,请按照以下步骤操作:

  1. 转到Webmin | 备份配置文件

  2. 选择立即恢复选项卡。

  3. 要恢复的模块列表中,选择与您要恢复其配置的软件相关的模块,例如Webmin 配置

  4. 设置为本地文件,点击省略号()按钮打开文件选择器,选择备份文件。

    提示

    你还可以选择一个位于远程 FTP 或 SSH 服务器上的文件,或从你用来连接 Webmin 的计算机上传文件。

  5. 应用配置?设置为

  6. 仅显示将恢复的内容?设置为

  7. 点击立即恢复按钮。

工作原理...

Webmin 在备份档案内保持每个模块使用的文件的索引。当您选择一个或多个模块进行恢复时,Webmin 将用备份的配置文件替换它们的活动配置文件。如果有必要,Webmin 将重新启动使用恢复的配置文件的服务。

还有更多...

在恢复实际备份之前,最好先检查从备份中恢复的文件,而不实际做出任何更改。为此,请按照前面的步骤操作,但将仅显示将要恢复的内容?选项设置为

如果需要,您还可以检查存储在备份中的配置文件的内容。毕竟,备份只是一个压缩的TAR档案,所以您可以解压文件并查看它们。请查看第六章的管理服务器上的文件和目录示例,了解如何在不离开 Webmin 的情况下进行此操作。

另请参见

  • 本章节中还有两个与 Webmin 备份配置设置文件相关的示例。请查看本章节中的备份配置文件自动备份配置文件示例。

自动备份配置文件

Webmin 允许您设置一个定时计划,自动创建系统配置文件的备份。您可以使用此选项来保留系统配置更改的滚动存档。

准备工作

在这个示例中,我们将创建包含当前日期的备份文件名。我们需要启用此功能,因此在开始之前,请导航到Webmin | 备份配置文件 | 模块配置,并对问题是否进行备份目标的 strftime 替换?回答

如何操作...

执行以下步骤以自动备份配置文件:

  1. 在根目录下创建一个目录来存储本地备份,例如/backups

    提示

    确保备份目录存储在具有足够磁盘空间的分区上,以避免意外填满整个磁盘。将/backups放在单独的分区上或放置在/var/backups中可能是一个好主意。

    您还应该保护备份位置免受窥探。您可以使用权限和 ACL 来做到这一点,正如在第六章的更改目录的 ACL部分中所解释的那样,管理系统上的文件

  2. 导航到Webmin | 备份配置文件

  3. 选择定时备份选项卡。

  4. 点击添加一个新的定时备份链接。

  5. 要备份的模块列表中选择所有模块。

  6. 备份目标设置为本地文件,并为文件名指定以下内容:/backups/system-config-%Y%m%d%H%M.tgz

  7. 备份中包含的内容设置为服务器配置文件

  8. 打开备份计划部分。

  9. 电子邮件结果发送到地址字段中提供你的电子邮件地址。

  10. 何时发送电子邮件设置为始终

    提示

    在收到几封确认备份正常工作的电子邮件后,你可以回来将此选项切换为仅当发生错误时

  11. 启用定期备份?设置为,选择简单计划,然后从下拉菜单中选择每天(午夜时分)

  12. 点击创建按钮。

系统配置文件将每天午夜备份到/backups目录中的一个文件。该文件名将包含备份的日期和时间。

工作原理...

Webmin 创建了一个cron作业,该作业在每个午夜运行。该任务会创建一个压缩的 TAR 归档,包含 Webmin 所知道的所有配置文件。如果在创建备份归档时发生错误,将会发送电子邮件到提供的地址。

另见

  • 查看本章的从备份恢复配置文件部分,以了解在出现问题时如何恢复设置。

创建选定目录的备份

Webmin 允许你轻松地将目录内容备份到一个TAR(磁带归档)文件中。备份任务会被保存,因此你将来可以通过单击一次来重新执行备份。

注意

TAR 文件格式保留了有关每个文件的所有权和权限设置的信息。然而,它并不存储文件的扩展属性。如果你正在使用扩展属性并且使用的是 ext 文件系统,应该使用 dump 命令。有关使用 dump 命令进行备份的更多信息,请参阅本章的创建整个挂载点的备份

准备工作

在本教程中,我们将创建包含当前日期的备份文件名。我们需要启用此功能。所以,在开始之前,请导航到系统 | 文件系统备份 | 模块配置并对问题是否执行备份目标的 strftime 替换?回答

如何操作...

  1. 在根目录下创建一个目录来存储备份,例如/backups

  2. 导航到系统 | 文件系统备份

  3. 在文本框中输入你希望备份的目录路径,例如/var/www

  4. 选择TAR 格式选项。

  5. 点击添加一个新的目录备份按钮。

  6. 备份到设置为文件或磁带设备,并在文本框中输入目标备份文件名,例如 /backups/www-%Y%m%d%H%M.tgz

  7. 打开备份选项部分。

  8. 压缩归档?设置为是,使用 gzip

  9. 点击立即创建并备份按钮。

目录的备份将以压缩的TAR归档形式创建,并保存到指定的目标位置。文件名将包括创建的日期和时间。

工作原理...

Webmin 会在指定的备份位置创建所选目录的 Gzip 压缩 TAR 归档。这大致等同于在命令行中运行以下命令:

$ tar -czf /backups/backup-destination.tgz /backup/source/directory

在创建备份之前,Webmin 还会执行 sync 命令,刷新文件系统缓冲区,将未写入的更改提交到磁盘。

还有更多...

当需要从备份中恢复文件时,您有多种选择。您可以先将文件恢复到一个单独的目录,然后再将它们移动到原始位置。您还可以直接将文件从归档恢复到原始位置。

从备份归档中恢复文件

以下步骤会将文件提取到临时位置,您需要将它们移动到最终位置:

  1. 创建一个临时目录(/tmp/restore),我们将在其中存储恢复的文件,然后再将它们放回原来的位置。

  2. 导航到系统 | 文件系统备份

  3. 如果系统提示选择恢复的文件系统类型,请选择TAR

  4. 点击恢复文件系统备份按钮。

  5. 从文件或设备恢复设置为文件或磁带设备,然后使用文件选择器(...按钮)找到您想要恢复的备份归档。

  6. 恢复到目录设置为/tmp/restore

  7. 仅显示备份中的文件?设置为

  8. 如果您的备份归档是使用 Gzip 压缩的,请将解压归档?设置为是,使用 gzip

  9. 点击立即恢复备份按钮。

  10. 将您想要恢复的文件从/tmp/restore目录移动到原始位置。

  11. 删除/tmp/restore目录。

    提示

    若要将文件自动放回原位置,请将根目录(/)作为恢复到目录。请注意,选择此选项会将备份中的文件放回原处,但不会删除自备份以来创建的文件。如果您只想恢复自备份以来已删除的文件,可以使用不覆盖文件?选项。

另见

  • 请参阅本章中的创建整个挂载点的备份备份到远程主机设置自动备份的相关内容,了解更多关于系统文件备份的信息。

创建整个挂载点的备份

Webmin 允许您设置使用 UNIX dump 命令的备份任务,以归档整个 ext 文件系统的挂载点。与使用 TAR 创建归档相比,这种策略有许多优势。首先,文件系统中包含的所有信息都得以保留,包括扩展文件属性、ACL、特殊文件等。

其次,dump 允许您创建增量存档,仅包含自上次备份以来更改的文件。dump 命令使用级别概念区分完整和部分备份。级别 0 备份将存档所有文件(完整备份),而级别 1 将仅存档自上次级别 0 备份以来更改的文件。级别 2 备份将存档自上次级别 1 备份以来更改的所有文件,依此类推。共有 10 个级别可供选择,您不需要使用连续级别编号。一个可能的 dump 策略是每月执行一次级别 0 备份,每周执行一次级别 3 备份,每天执行一次级别 6 备份。这意味着每日备份相对较小且速度快,因为它们仅跟踪本周内的更改。

如果您使用 dump 的增量备份策略,您将需要从每个级别的存档中恢复备份。例如,如果您遵循上一段描述的 0-3-6 策略,则应从最近的级别 0 开始恢复文件,然后是最近的级别 3,最后是最近的级别 6 存档。

提示

dump 命令旨在将备份存档写入磁带驱动器。Webmin 将能够帮助您将文件写入磁带设备;在创建备份任务时,只需指定设备名称而不是目标文件名。

准备工作

在开始之前,请在系统上安装 dump 包,或检查其是否已安装。有关更多信息,请参阅 第一章 中的 安装软件包 配方,设置您的系统

您还应准备备份目的地,该目的地位于除您计划备份的文件系统之外的其他文件系统上。这可以是外部驱动器、网络文件系统或磁带设备。在本示例中,假设您正在备份到作为 /media/backups 挂载的外部磁盘。

如何做...

  1. 导航到 系统 | 文件系统备份

  2. 在文本字段中,输入要备份的挂载点,例如 /

  3. 单击 添加新目录备份 按钮。

  4. Backup to 设置为 文件或磁带设备 并在文本字段中输入目标备份文件名,例如 /media/backups/root-fs-level0-%Y%m%d%H%M.ext4dump

    注意

    不需要文件扩展名,但将来快速检查备份存档中包含的文件系统类型可能会有用。根据您的系统更改 ext4ext3ext2

  5. 打开 备份选项 部分。

  6. Update /etc/dumpdates file? 设置为

  7. Dump level 设置为 0 (完整备份)

  8. Compress data? 设置为 是,级别为 并输入 2

  9. 单击 创建并立即备份 按钮:如何做...

将整个文件系统的挂载点备份为压缩的 dump 存档到指定的目的地。文件名将包括创建的日期和时间。

工作原理...

Webmin 使用dump命令创建一个备份档案,其中包含指定源目录挂载的文件系统中的所有文件。文件系统中包含的所有元数据也被存储在档案中。备份通过bzip算法进行压缩,以减小档案的大小。

还有更多...

为了创建一个增量备份,使其更快完成并使用更少的磁盘空间,请创建一个非 0 级别的dump备份。

创建增量备份档案

另一级别的dump档案将只包含自上次进行较低级别备份以来修改过的文件。按照前面章节中的相同步骤创建增量备份,但将Dump 级别参数更改为其他值,并确保文件名(或磁带标签)反映此档案包含该级别的备份。请记住,您需要所有级别的最新备份档案,包括 0 级备份,才能恢复所有备份的文件。

从备份档案恢复数据

要从dump档案恢复备份,请按照以下步骤操作:

  1. 导航到系统 | 文件系统备份

  2. 如果系统提示选择恢复的文件系统类型,请选择您备份的文件系统类型,例如EXT4

  3. 点击恢复文件系统备份按钮。

  4. 从文件或设备恢复设置为文件或磁带设备,并使用文件选择器(...按钮)来查找您要恢复的备份档案。

  5. 恢复到目录设置为已备份的挂载点位置,例如根挂载点的//home/等。

    提示

    您不必输入原始路径作为恢复目标。您可以输入另一个路径,将备份提取到不同的位置。

  6. 恢复的文件设置为备份中的所有文件

  7. 仅显示备份中的文件?设置为

  8. 点击立即恢复备份按钮。

    提示

    通过选择仅显示备份中的文件?选项,您可以查看备份档案中包含的文件。

    如果您只想恢复少数文件或目录,请将恢复的文件设置为列出的文件,并输入以空格分隔的路径列表。

另见

  • 查看本章中的备份到远程主机设置自动备份章节,以获取有关如何备份系统文件的更多信息。

备份到远程主机

将备份档案存储在本机的本地硬盘上,并不能保护您免受硬件故障或恶意攻击。当机器出现故障时,备份也会丢失。因此,备份应存储在另一台远程服务器上。

最简单的备份远程主机的方式是使用网络文件共享协议,如 NFS 或 CIFS。首先,在远程服务器上创建一个网络卷,然后将该卷挂载到本地服务器上。现在,你可以像访问本地存储的文件一样,轻松地备份远程系统上的文件。查看第六章,管理系统文件,获取使用 NFS 或 CIFS 设置网络文件共享的说明。

如果你只有 SSH 访问权限,或者希望备份到远程磁带设备,可以按照此处所列的步骤进行操作。我们将演示 Webmin 如何帮助你通过 SSH 设置tardump来进行远程备份。

准备工作

我们服务器的root用户需要通过 SSH 访问远程服务器,而无需输入密码。SSH 将使用密钥而非密码;因此,我们需要指示远程服务器接受该密钥。

首先找到我们服务器root用户的公钥。默认情况下,密钥存储在名为/root/.ssh/id_rsa.pub的文件中。

如果此文件不存在,你可能需要为服务器的root用户创建一个 SSH 公钥和私钥对。可以通过在终端中输入以下命令来完成,但需要将root@my_server替换为你服务器root用户的电子邮件地址:

# ssh-keygen -P "" -f "/root/.ssh/id_rsa"-t rsa -C "root@my_server"

下一步是指示远程服务器接受使用此密钥的 SSH 连接。假设我们要以名为backups的用户身份登录远程服务器。我们需要将本地服务器/root/.ssh/id_rsa.pub文件的内容追加到远程服务器上用户主目录中的/home/backups/.ssh/authorized_keys文件末尾。

注意

通过在用户主目录中名为~/.ssh/authorized_keys的文件中放置任何密钥所建立的连接,将被视为合法的、授权的连接。

完成此操作后,我们服务器的root用户应该能够通过 SSH 以backups用户身份登录到远程服务器,而无需提供密码。

最后一步是确保远程主机上安装了rmt命令,并注意rmt二进制文件的路径。你可以通过以root用户身份运行命令which rmt来检查。如果命令未找到,请在远程主机上安装rmttar软件包。

如何操作...

你可以将 Webmin 中创建的任何文件系统备份任务转换为远程备份。首先,按照本章中创建指定目录的备份创建整个挂载点的备份的步骤创建一个备份任务。然后执行以下步骤进行远程备份:

  1. 导航到系统 | 文件系统备份

  2. 单击要备份的目录列中的链接,以修改你想要的备份。

  3. 备份到 选项切换为 主机,并输入远程主机的 IP 地址或域名,后跟用户名和远程服务器上备份文件的路径。

  4. 远程备份命令 设置为 SSH如何操作...

  5. 打开 备份选项 部分。

  6. 如果您正在修改一个 TAR 备份任务,将 远程系统中的 rmt 路径 设置为 rmt 二进制文件在远程服务器上的路径。

  7. 点击 保存并立即备份 按钮。

备份任务将会运行,并且一个包含备份的归档文件将在远程服务器上指定的位置创建。

它是如何工作的...

tardump 命令的现代版本能够使用 SSH 协议,将备份归档通过互联网安全地传输到远程备份服务器。Webmin 会帮助您设置运行 tardump 通过 SSH 所需的稍微复杂的选项。

设置自动备份

备份应定期执行。您可以使用 cron 来自动化此过程,并在指定的时间运行备份任务。Webmin 的备份功能使这变得非常简单。

如何操作...

您可以将 Webmin 中创建的任何文件系统备份任务转换为自动备份。首先按照本章中 创建选定目录的备份创建整个挂载点的备份 配方中的描述创建一个备份任务。然后执行以下步骤来设置自动备份:

  1. 导航至 系统 | 文件系统备份

  2. 点击 要备份的目录 列中的链接,以修改您想要的备份。

  3. 打开 备份计划 部分。

  4. 设置 计划备份启用?启用,按以下所选时间

    提示

    如果您有一系列希望一起运行的备份任务,Webmin 允许您安排在一个备份完成后,运行下一个备份任务。

  5. 选择 简单计划每周(星期天)

    提示

    如果需要,可以选择更复杂的计划,标记任务将在每月的哪几分钟、几小时和哪几天执行。

  6. 电子邮件计划输出 设置为您的电子邮件地址。

  7. 点击 保存 按钮。

它是如何工作的...

Webmin 会在系统 root 用户的 cron 表中添加一个条目,启动备份任务。每当 cron 在预定时间运行时,备份任务将会启动。当备份任务完成时,您应该会收到一条关于任务成功或失败的消息。

备份数据库

Webmin 可以帮助您设置一个计划,自动备份托管在系统上的所有数据库。Webmin 会将数据库作为 SQL 文件转储到本地文件系统的目录中,或本地挂载的远程网络卷中。

提示

您可以将数据库的备份保存到本地目录,并将该目录的备份传输到远程服务器。您还可以指示 Webmin 运行一个命令,在将本地备份传输到远程位置后删除旧的本地备份。

如何操作...

  1. 根据你使用的数据库系统,在 Webmin 主菜单的服务器部分点击MySQL 数据库服务器PostgreSQL 数据库服务器链接。

  2. 点击备份数据库按钮。

  3. 备份到目录字段中,输入一个目录,备份将保存在该目录下,例如/backups/databases

  4. 是否创建目标目录?设置为。Webmin 将创建一个具有适当所有者和权限的目录,以便数据库系统将输出写入其中。

  5. 备份计划部分,将启用定时备份?设置为是,在下面选择的时间

  6. 将备份状态邮件发送到字段中,输入你的电子邮件地址。

  7. 发送电子邮件通知设置为所有备份

    提示

    在你收到几封电子邮件确认备份按预期工作后,你可以回来将此选项切换为仅在发生错误时

  8. 选择简单计划并选择每日(午夜时)

    提示

    选择一个更复杂的计划—如果需要的话—通过标记任务执行时的分钟、小时和日期。

    如何操作...

  9. 点击保存按钮。

    提示

    你可以点击立即备份按钮,立即将数据库保存为 SQL 文件。

它是如何工作的...

Webmin 访问你的数据库系统,并为服务器上的每个数据库创建一个 SQL 转储文件。数据库文件将存储在指定目录的磁盘中。当你为自动备份设置计划时,Webmin 会将一项任务添加到root用户的 cron 表中,以在指定的时间创建备份。当备份任务完成时,Webmin 会将电子邮件发送到指定的地址,但我们将其设置为仅在发生问题时发送电子邮件,以避免不必要的垃圾邮件。

另见

  • 请查看第九章,运行 MySQL 数据库服务器,以及第十章,运行 PostgreSQL 数据库服务器,了解更多关于使用 Webmin 帮助下运行数据库服务器的信息。

第八章:运行 Apache Web 服务器

在本章中,我们将涵盖以下几点内容:

  • 在您的系统上安装 Apache

  • 重启 Apache

  • 启用 Apache 模块

  • 创建一个静态 HTML 网站

  • 创建虚拟主机

  • 为目录、文件和位置设置选项

  • 创建一个受密码保护的网站

  • 显示目录中文件的列表

  • 重定向传入的请求

  • 设置带有 SSL 的加密网站

  • 记录传入请求和错误

  • 使用 Webalizer 分析日志文件

介绍

对大多数人来说,Web 就是互联网。自从 1990 年代以来,万维网已成为几乎每个人日常生活的一部分。网站为我们提供信息;社交媒体让我们与他人沟通;在线零售让我们可以在全球购物。超文本传输协议HTTP)是使互联网所有这些杀手级功能成为可能的基础。

现代 Web 浏览器能够做的不仅仅是显示超文本。由于包含了 JavaScript 运行时,Web 已经成为最广泛使用的计算平台。程序员如果想覆盖尽可能多的用户群体,就无需为每个操作系统创建一个版本的应用程序。相反,他们可以创建一个 Web 应用程序,能够在每个支持浏览器的设备上运行。

这种安排对系统管理员来说也是一个福音,因为他们可以选择将许多服务以 Web 应用程序的形式实现,而不必担心在许多客户端计算机上安装支持的软件。等到升级时,更新一个服务器比更新每个客户端系统要高效得多。

有很多 Web 服务器可以选择,但 Apache 无疑是最受欢迎的解决方案,Webmin 对它的支持也非常好。另一个目前正在获得流行的开源 Web 服务器是 Nginx,但 Webmin 对它的支持目前非常有限。

在本章中,我们将讨论与设置 Apache、配置 Apache 以提供静态网站以及分析日志文件相关的主题。在第十一章,运行 Web 应用程序中,我们将讨论与运行动态网站和 Web 应用程序相关的内容。

在您的系统上安装 Apache

一些操作系统默认包含 Apache Web 服务器。其他系统则在其软件库中提供 Apache 包,您可以快速安装带有默认配置的 Apache。

准备工作

首先检查 Apache 是否已经安装在您的系统上。如果已经安装,Webmin 应该能够识别它,并将 Apache Webserver 模块放入其菜单中的 服务器 部分。

如何操作...

按照以下步骤在您的系统上设置 Apache:

  1. 按照第一章中安装软件包的步骤,找到并安装 Apache Web 服务器包。你应该使用可用的 Apache 2 包。

    注意

    根据你的系统,Apache 版本 2 包可能被命名为apache2或仅为httpd

  2. 如果你使用的是iptables防火墙,按照第三章中通过防火墙允许访问服务的步骤,允许通过端口80的传入连接,如果你计划使用 HTTPS,还需要通过端口443如何操作...

  3. 导航到服务器 | Apache Web 服务器,点击启动 Apache链接来启动 Web 服务器(如果安装过程中没有自动启动)。

  4. 为了验证 Apache 是否正常工作,使用浏览器访问 URL http://your.server,其中 your.server 是你安装 Apache 的机器的域名或 IP 地址。

Apache 测试页面应该会问候你。它可能会简单地显示它工作了!或者提供更多关于如何在你的操作系统上运行 Apache 的信息。

它是如何工作的...

操作系统的包维护者为你的系统提供了一个工作的 Apache 默认配置。安装该包并启动 HTTP 服务器守护进程应该足以为进一步自定义提供一个功能正常的起点。

HTTP 服务器默认监听 80 和 443 端口。当你用浏览器访问 Web 服务器时,它会在发出标准的 http:// 请求时尝试连接到 80 端口,或者在发出安全的 https:// 请求时连接到 443 端口。你应该确保这些端口上的连接不会被系统防火墙丢弃。

可以配置 Apache 监听其他端口的连接,但此时每次连接都必须在 URL 字段中输入端口号。这类似于连接到 Webmin,它运行在非标准的 HTTP 端口 10000 上。

还有更多...

我们不希望每次服务器重启时都手动启动 Apache,因此我们应该激活软件包中包含的init脚本,让服务自动启动。我们还应该监控服务器,并在 HTTP 服务不可用时提醒我们。

设置 Apache 在系统启动时启动

按照以下步骤在系统启动时启动 Apache:

  1. 导航到系统 | 启动和关机

  2. 选择 Apache Web 服务器的 init 脚本旁边的复选框(它可能会被命名为apache2httpd或类似名称)。

  3. 点击开机启动按钮。

监控 Apache 是否正常运行

如果 HTTP 服务器崩溃,用户将无法连接到你的网站或使用你的 Web 应用程序。如果发生这种情况,你应该尽快收到通知,以便采取适当的措施重启并修复服务器。

第五章,监控你的系统,详细介绍了与监控服务器状态相关的话题。特别查看一下 接收服务停止时的电子邮件通知自动重启停止运行的服务 这两个配方。同时,从第二台机器监控你的服务器也是一个好主意,这样即使整个服务器不可用,你也能收到故障通知。更多信息,请查看配方 监控远程服务器

另见

  • Apache 拥有模块化架构,安装并激活额外组件可以扩展其功能。查看本章中的配方 启用 Apache 模块 以获取更多信息。

重启 Apache

每次你修改 Apache Web 服务器的配置,或者通过额外的模块(如 mod_wsgi)修改与 Apache 一起运行的运行时环境(如 PHP)或 Web 应用时,都需要重启服务器守护进程。

操作方法...

使用 Webmin 重启 Apache 非常简单:

  1. 导航到 服务器 | Apache Web 服务器

  2. 点击 应用更改 链接来重启服务器。

工作原理...

在 Webmin 的 Apache Web 服务器模块中点击 应用更改 会让 Apache 优雅地重启。这会使 Apache 完成所有请求的处理,但停止接受新的连接。当 Apache 完成发送最后一个响应后,它会重启并恢复接受连接。从用户的角度来看,这会导致一些请求完成的时间变长,但重启过程应该是透明的。重启后,Apache 会按照新的配置文件工作。

你也可以使用以下命令以类似的方式重启 Apache:

$ sudo apachectl graceful

还有更多...

通过 Webmin 修改 Apache 配置,可以避免语法错误的烦恼。然而,有时你需要手动进行自定义配置修改。这样做时,你应该在重启服务器之前检查配置语法,因为语法错误会导致 Apache 在重启后无法正常启动。

验证 Apache 配置语法

为了检查配置文件是否没有错误(否则 Apache 无法启动),请执行以下命令:

$ sudo apachectl configtest

如果一切正常,命令将返回 Syntax OK 的消息。

启用 Apache 模块

Apache HTTP 服务器采用模块化架构。可以通过添加额外的模块来扩展服务器功能。虽然这些模块可以编译进服务器本身,但在大多数系统中,它们是作为共享库单独安装的。Apache 的配置文件决定了服务器启动时加载哪些模块。

Webmin 提供了一个简单的表单来启用和禁用 Apache 模块。在这个配方中,我们将激活 mod_rewrite 模块。

操作方法...

按照以下步骤启用 Apache 模块:

  1. 转到 服务器 | Apache Webserver | 全局配置 | 配置 Apache 模块

  2. 选中 rewrite 模块的复选框。

  3. 点击 启用所选模块 按钮。

它是如何工作的……

Webmin 会向 Apache 的配置中添加一行,加载选定的模块。在 Apache 1 版本中,加载模块的指令是 AddModule,而在版本 2 中是 LoadModule

在某些系统中,Apache2 实际上并不将 LoadModule 行存储在主配置文件(/etc/apache2/httpd.conf)中,而是将每个模块存储在 /etc/apache2/mods-available/ 目录中的单独文件中。这些模块通过在 /etc/apache2/mods-enabled 目录中创建符号链接来激活,所有这些文件在服务器启动时会包含在配置中。在使用这种配置方式时,系统提供了特别的脚本来处理根据需要创建或删除这些符号链接。实际上,我们可以通过执行以下命令并重启 Apache 来启用 rewrite 模块:

$ sudo a2enmod rewrite

可以通过以下命令禁用该模块:

$ sudo a2dismod rewrite

还有更多……

Apache HTTP 服务器软件包包括大多数常用模块,但可以作为软件包安装或从源代码编译安装其他模块。

从软件包安装额外的模块

如果你想包含一个额外的 Apache 模块,而这个模块并没有随服务器捆绑一起,你可以在系统软件包仓库中搜索它。带有 Apache 模块的包名可能因发行版而异。例如,如果你想安装 mod_wsgi 模块,你可以在名为 libapache2-mod-wsgiapache2-mod-wsgi 或仅为 mod_wsgi 的包中找到它,具体取决于你的系统。按照 第一章 中 安装软件包 的步骤,安装该软件包。

创建静态 HTML 网站

Apache 服务器可以执行的最简单任务是提供静态网站。当浏览器向此类网站发送 HTTP 请求时,Apache 会处理传入的 URL,将路径映射到磁盘上的文件,并将该文件的内容返回给浏览器。如果文件包含 HTML 代码,浏览器将渲染网页。

一个 Apache 实例可以为多个网站提供服务,但在本教程中,我们将仅配置一个网站作为 Apache 的默认站点。如果这是你唯一的配置,它将在无论传入请求关联的 IP 地址或域名是什么的情况下使用。

在本教程中,我们将配置 Apache 作为单站点服务器。它将从目录 /var/www/default 响应传入的请求,并提供静态文件。

如果你希望在不同的域名下提供不同的网站,你需要为每个域名创建虚拟主机配置。这个主题在 创建虚拟主机 的教程中进行了介绍。

如何操作……

我们将指示 Apache 监听所有传入的请求,并在端口 80 上创建一个单站点服务器,具体如下:

  1. 导航到服务器 | Apache Web 服务器。在全局配置选项卡中,选择网络和地址

  2. 监听地址和端口设置为所有地址上的端口80

  3. 清除名称虚拟服务器的地址字段。如何操作...

    现在我们可以设置服务器的根文档目录,文件将从该目录提供服务。

  4. 创建一个目录来存放静态网站的 HTML 文件:/var/www/default

  5. 通过创建一个名为/var/www/default/index.html的文件,并包含以下内容来创建一个基本的 HTML 页面:

    <!DOCTYPE html>
    <html>
      <body>
        <h1>Hello World!</h1>
      </body>
    </html>
    
  6. 导航到默认 Apache 服务器的配置部分:服务器 | Apache Web 服务器 | 现有虚拟主机

  7. 点击默认虚拟主机的图标。在大多数情况下,这个配置将被称为默认服务器,但是如果您的安装附带了一个虚拟服务器配置,并且设置为处理任何地址并自动调整所有服务器名称,如下图所示,请使用这个配置:如何操作...

  8. 点击文档选项,并将文档根目录设置为/var/www/default

  9. 点击保存按钮。

  10. 点击应用更改链接。

  11. 在浏览器中输入服务器的 IP 地址或域名:http://your.server。您应该会看到我们刚刚创建的index.html文件中的Hello World!

现在您可以将整个静态网站上传到/var/www/default目录并在您的服务器上托管它。

它是如何工作的……

Apache 配置分为三个主要部分:全局设置、默认服务器设置和虚拟主机设置。如果请求的主机名或 IP 地址与已配置虚拟 Web 服务器的名称或地址匹配,则使用虚拟主机设置。如果没有找到匹配的虚拟主机配置,请求将传递到默认主机。

在我们的配置中,我们没有指定虚拟主机,因此默认主机将处理每个传入的请求。我们将默认主机配置为从/var/www/default目录提供文件,这相当于在主 Apache 配置文件中设置DocumentRoot指令。

另见

  • Apache 是一个功能非常丰富的 web 服务器,因此有许多选项可以设置,Webmin 可以帮助您完成其中的许多操作。浏览本章中的所有其他示例,了解如何自定义您的服务器。

创建虚拟主机

一个 Apache 服务器可以同时托管多个网站。如果您的服务器有多个网络接口,每个网站可以托管在单独的 IP 地址上,但更常见的做法是所有网站共享相同的 IP 地址,并通过与网站关联的域名来区分。

注意

单个 Web 服务器通过同一个 IP 地址托管多个不同域名的网站,这是 HTTP 协议的一个特点。当你在地址栏输入http://example.com时,浏览器会查找与example.com域名关联的服务器 IP 地址,并打开与该 IP 的端口 80 的连接。Web 主机的名称(example.com)作为请求的Host:头部信息传递。

单个 Apache 实例可以支持多个配置。服务器会检查每个传入请求的 IP 地址和Host:头部信息,并根据这些信息决定使用哪个配置。如果你有与example.com关联的特殊配置(虚拟主机),Apache 会将其应用于所有发往http://example.com的请求。如果没有该地址的配置,则会使用默认的服务器配置。

准备工作

在这个教程中,我们将为域名example.com创建一个虚拟服务器配置。

你可以通过与域名提供商设置 DNS 条目来配置一个域名指向你的服务器。如果你的域名还没有指向你的服务器,你可以在测试过程中通过在客户端计算机的/etc/hosts文件中添加条目来模拟这一过程。你将从该计算机连接并测试你的服务器。

提示

如果你使用的是 Windows 机器进行测试,你需要在目录%SystemRoot%\system32\drivers\etc中找到hosts文件。

维基百科提供了不同系统中hosts文件的位置:en.wikipedia.org/wiki/Hosts_%28file%29#Location_in_the_file_system

hosts文件条目包含服务器的 IP 地址和你希望指向该 IP 的主机名,两者由空格分隔,例如:

198.51.100.1    example.com

如何操作...

执行以下步骤来创建虚拟主机:

  1. 创建一个目录,用于存放静态站点的 HTML 文件 /var/www/example.com

  2. 创建一个基础的 HTML 页面,方法是创建一个名为/var/www/example.com/index.html的文件,内容如下:

    <!DOCTYPE html>
    <html>
      <body>
        <h1>Welcome to Example.com</h1>
      </body>
    </html>
    
  3. 进入Servers | Apache Webserver

  4. 选择Create virtual host标签。

  5. Document Root设置为/var/www/example.com

  6. Server Name设置为example.com如何操作...

  7. 点击Create Now按钮。

  8. 点击Apply Changes链接。

现在,你应该能够通过浏览器访问新站点,网址为http://example.com

工作原理...

Webmin 通过在 Apache 配置文件中添加以下部分来创建虚拟服务器:

<VirtualHost *:80>
ServerName example.com
DocumentRoot "/var/www/example.com"
</VirtualHost>

上述指令指定服务器应监听80端口上的连接,如果遇到任何指向Host: example.com的请求,它应该使用这个配置来服务这些请求。在这个VirtualHost部分中的唯一另一行指示 HTML 文件应该从哪个目录提供。这个虚拟主机的其他选项将被添加到这个VirtualHost部分,以进一步自定义虚拟服务器的配置。

还有更多...

Apache 虚拟主机具有高度可定制性。你可以通过导航到服务器 | Apache Web 服务器 | 现有虚拟主机,然后点击带有Server Name example.com的服务器旁边的图标,找到新创建的虚拟服务器的配置界面。

创建基于 IP 的虚拟主机

如果你的机器配备了多个网络接口,Apache 也可以在不同的 IP 地址上创建独立的虚拟主机。这个过程与之前描述的步骤非常相似,但你应该设置处理 连接到地址特定地址,并提供虚拟主机的 IP 地址,而不是指定Server Name

创建基于 IP 的虚拟主机

另见

  • 你可以创建一个虚拟主机,使用加密的 HTTPS 协议,而不是标准的 HTTP。有关详细信息,请查看示例设置带 SSL 的加密网站

设置目录、文件和位置的选项

Apache 允许你在目录或文件级别上自定义设置。这意味着,匹配你服务器上特定路径的请求将与对网站其他部分的请求处理方式不同。

每个目录的选项可以通过 Apache 的配置文件中的<Directory>指令来设置。以这种方式设置的选项将应用于所选目录及其所有子目录。对子目录设置的<Directory>选项将覆盖更高层级目录的设置。

本地设置也可以通过将它们放置在一个特殊文件中(默认情况下称为.htaccess)来指定,该文件位于一个目录中。必须在目录上设置AllowOverride选项,才能使.htaccess文件生效。

在这个例子中,我们将创建一个特定目录的配置,这允许在该目录及其子目录中使用.htaccess文件。

准备工作

我们将在默认服务器配置中设置特定的选项,针对目录/var/www/default。在开始之前,请注意你想要设置配置指令的目录的完整路径,并确认哪个虚拟主机提供该目录中的文件(如果不是默认虚拟服务器)。

如何操作...

执行以下步骤以设置目录、文件和位置的选项:

  1. 导航到服务器 | Apache Web 服务器 | 现有虚拟主机

  2. 选择你想要自定义的虚拟主机,例如默认服务器

  3. 创建每目录、文件或位置选项部分,将类型设置为目录

  4. 选择精确匹配并将路径设置为/var/www/default

    提示

    你还可以输入通配符路径,如/var/www/default/site*。以这种方式设置的选项将应用于所有匹配的目录。

    如果你需要更大的灵活性,可以选择匹配正则表达式选项,并使用正则表达式指定路径。

    如何操作...

  5. 点击创建按钮。

  6. 你将被带到虚拟服务器选项界面,在每目录选项部分会有一个新的条目。点击标有目录 /var/www/default的图标。

  7. 在目录配置界面中,点击标有文档选项的图标。

  8. 选项文件可以覆盖部分,选择选择下面的...并勾选所有框。如何操作...

  9. 点击保存按钮。

  10. 点击应用更改链接。

它是如何工作的...

当我们选择设置每目录选项时,Webmin 会为我们创建一个<Directory>指令并填充所选选项。在我们展示的示例中,我们选择允许所有设置被本地.htaccess文件覆盖。这样就创建了以下配置部分:

<Directory "/var/www/default">
AllowOverride All
</Directory>

如果我们选择编辑默认服务器,<Directory>指令将被创建在主 Apache 配置文件中。这些设置将始终应用于该目录,无论是使用哪个虚拟主机访问它。如果你想创建每目录设置,只有在选择的虚拟服务器中应用,你可以在现有虚拟主机标签中选择该服务器。通过这种方式创建的设置将保存在特定的<VirtualHost>部分内。

还有更多内容...

Webmin 允许你通过每目录选项用户界面设置大多数本地选项,这些选项适用于你所使用的 Apache 版本。四处浏览,熟悉这个部分,你就能在需要时快速调整设置。

Apache 允许你通过匹配目录的文件系统路径设置本地选项,但你也可以匹配请求文件或 URL 地址的名称。

设置匹配模式文件名的选项

Apache 允许你对与特定模式匹配的文件设置特定选项。例如,允许外部用户读取.htaccess和其他本地 Apache 配置文件的内容并不是一个好主意。你可以通过以下步骤来防止访问所有这些文件(统一匹配正则表达式^\.ht):

  1. 导航到服务器 | Apache Web 服务器 | 现有虚拟主机

  2. 选择默认服务器选项。

  3. 创建每目录、文件或位置选项部分,将类型设置为文件

  4. 选择匹配正则表达式,并将路径设置为正则表达式^\.ht

  5. 点击创建按钮。

  6. 点击标有文件正则表达式 ^.ht的图标。

  7. 点击标有访问控制的图标。

  8. 限制访问部分,将唯一的操作设置为拒绝所有请求设置匹配模式的文件选项

  9. 点击保存按钮。

  10. 点击应用更改链接。

为特定 URL 设置选项

您可能希望将自定义设置应用于特定的 URL,这些 URL 不一定匹配某个特定的底层文件系统路径或文件名。在这种情况下,可以使用 Apache 的<Location>指令,Webmin 将协助您进行配置。

以动态生成的/server-status页面为例,该页面在启用mod_status模块时为您提供服务器概况。您的磁盘中没有名为server-status的路径,但您仍然可以通过创建基于位置的配置来控制对该 URL 的请求。

您可能希望服务器信息仅对有限的用户组可用。我们可以将对该 URL 的访问限制为仅来自127.0.0.1的本地主机 IP 请求:

  1. 导航至服务器 | Apache Web 服务器 | 现有虚拟主机

  2. 选择默认服务器选项。

  3. 创建每个目录、文件或位置选项部分,将类型设置为位置

  4. 选择精确匹配,并将路径设置为/server-status

  5. 点击创建按钮。

  6. 点击标有位置/server-status的图标。

  7. 点击标有访问控制的图标。

  8. 限制访问部分,将访问检查顺序设置为先允许再拒绝

  9. 将唯一的操作设置为允许来自 IP 的请求..,并指定127.0.0.1

  10. 点击保存按钮,然后再次进入访问控制

    注意

    Webmin 始终在列表中提供一个空条目。当您再次进入该部分时,您将能够添加第二个访问限制。

  11. 限制访问部分,添加第二个操作拒绝所有请求为特定 URL 设置选项

  12. 点击保存按钮。

  13. 点击应用更改链接。

更改匹配的路径或模式

如果您已经创建了一组本地设置,但需要更改它们应用的路径,请按照以下步骤操作:

  1. 导航至服务器 | Apache Web 服务器 | 现有虚拟主机

  2. 点击您希望自定义的虚拟主机图标。

  3. 每个目录选项中,点击您希望重新定位的本地设置图标。

  4. 修改应用于部分的匹配模式。

使用.htaccess文件设置选项

使用.htaccess文件是一种便捷的方式,可以让没有服务器管理权限的用户在目录级别自定义 Apache 服务器的本地设置。只要用户能够修改设置文件,他们就可以调整服务器,而无需管理员的支持。通过.htaccess文件进行的设置更改不需要重新启动服务器。

注意

你应该注意到,使用 .htaccess 文件会降低 Apache 的性能,因为服务器在每次请求时都必须在请求的目录中查找设置文件(并且可能还会查找更高级目录中的 .htaccess 文件)。

以下是创建 .htaccess 选项文件的步骤:

  1. 导航到 服务器 | Apache Webserver | 全局配置 | 每目录选项文件

  2. 输入你想为其写 .htaccess 文件的目录路径,例如 /var/www/example.com,然后点击 创建选项文件 按钮。

你将进入一个屏幕,允许你通过 .htaccess 文件修改本地设置。

创建受密码保护的网站

HTTP 协议提供了一种基本的用户身份验证功能。当请求发送到受保护的网站或网站中的受保护区域时,浏览器会提示用户输入用户名和密码。如果提供的值与授权用户匹配,则授予对该网站的访问权限。

注意

基本的 HTTP 身份验证方法在 Apache 上设置非常简单,特别是在 Webmin 的帮助下。此功能的主要缺点是其安全性较差,且不太具备自定义性。如果你打算在开放的互联网中使用这种身份验证方法,确保它与加密的 HTTPS 协议结合使用。

准备工作

在开始之前,确保在你的 Apache 配置中启用了 auth_basic 模块。有关更多信息,请查看配方 启用 Apache 模块

如何操作...

执行以下步骤以创建一个受密码保护的网站

  1. 导航到 服务器 | Apache Webserver | 现有虚拟主机

  2. 选择你希望用密码保护的虚拟服务器。

  3. 如果你已经有了要保护的目录的设置部分,可以跳到第 7 步。

  4. 创建每目录、文件或位置选项 部分,将 类型 设置为 目录

  5. 选择 精确匹配,并将 路径 设置为你网站的根文档,例如 /var/www/example.com

    提示

    你可以通过为子目录创建每目录设置来用密码保护你网站的某个子部分。

  6. 点击 创建 按钮。

  7. 每目录选项 部分,点击目录配置部分的链接。

  8. 点击标有 访问控制 的图标。

  9. 认证领域名称 部分,指定一个描述,当用户提示输入密码时将显示该描述,例如 请输入您的 ISIS 密码

  10. 认证类型 设置为 基本

  11. 通过登录限制访问 设置为 所有有效用户

  12. Basic login user file types 设置为 文本文件

  13. 用户文本文件 设置为 /etc/apache2/htpasswd/etc/httpd/htpasswd,具体取决于你的 Apache 配置目录的位置。

    提示

    密码文件永远不应通过 Web 服务器访问。你应该将其保存在文档根目录之外。如果你需要将其保存在文档根目录中,按照为匹配模式的文件设置选项部分的步骤限制对它的访问。

    操作步骤...

  14. 点击保存按钮,然后通过点击应用更改链接来重启 Apache。

创建用户账户

执行以下步骤创建用户账户:

  1. 再次输入访问控制以配置该目录。

  2. 点击标记为编辑用户的新链接,位于用户文本文件一行中。

  3. 点击添加新用户链接。

  4. 明文指定用户名和密码。创建用户账户

  5. 点击保存按钮。

它是如何工作的...

Webmin 通过在 Apache 配置中创建<Directory>指令,并为auth_basic模块添加相应的指令,来创建一个受密码保护的网站。例如,前面提到的指令将把以下部分添加到 Apache 配置中:

<Directory "/var/www/example.com">
AuthName "Please enter your ISIS password"
AuthType Basic
require valid-user
AuthBasicProvider file
AuthUserFile /etc/apache2/htpasswd
</Directory>

Webmin 还帮助你创建有效的用户名和密码对,这些将被视为有效用户。此信息存储在由AuthUserFile指令指定的文件中。

还有更多...

Apache 密码与系统的用户账户信息分开存储。如果你希望这些账户保持同步,Webmin 可以通过为你执行该任务来大大帮助你。

保持 Apache 和系统账户同步

执行以下步骤以保持 Apache 和系统账户同步:

  1. 导航到服务器 | Apache Web 服务器 | 现有虚拟主机

  2. 选择受密码保护的虚拟服务器。

  3. 每目录选项部分,点击链接进入受密码保护的目录配置部分。

  4. 点击标记为访问控制的图标。

  5. 点击标记为编辑用户的新链接,位于用户文本文件一行中。

  6. 勾选标记为当 Unix 用户被添加时添加用户当 Unix 用户被更改时更改用户当 Unix 用户被删除时删除用户的复选框。

  7. 点击保存按钮。

另见

  • 如果你想在互联网上使用 HTTP 基本认证,请确保将其与 SSL 连接加密结合使用。详情请参阅设置加密网站与 SSL部分。

  • 同时确保htpasswd文件无法通过 Web 服务器访问。有关防止访问其位置的方法,请参考为目录、文件和位置设置选项部分。

显示目录中文件的列表

Web 服务器是一个很好的可下载文件存储库。这种文件分发方式在很大程度上取代了匿名 FTP,因为它为用户提供了更无缝的体验。如果您希望为用户提供具有自动生成索引的文件目录访问权限,Apache 是完成此任务的合适工具。

注意

在大多数情况下,列出网站目录中的文件并不必要,有时甚至可能暴露敏感信息给潜在的攻击者。仅在有意义的地方使用目录列表。

准备工作

在此步骤中,我们将展示目录/var/www/example.com/downloads的文件列表,该目录由虚拟主机example.com通过 URLhttp://example.com/downloads提供服务。请注意文件路径、虚拟主机名称和您实际使用的 URL,并进行适当替换。

如何操作...

执行以下步骤以显示目录中文件的列表:

  1. 创建目录/var/www/example.com/downloads,并在其中放置一些可供下载的文件。

  2. 导航到服务器 | Apache Webserver | 现有虚拟主机

  3. 选择将提供文件服务的虚拟主机,例如服务器名称 example.com

  4. 创建每目录、文件或位置选项部分,将类型设置为目录

  5. 选择精确匹配,并将路径设置为您的站点根文档,例如/var/www/example.com/downloads

  6. 点击创建按钮。

  7. 每目录选项部分,点击标有目录 /var/www/example.com/downloads的链接。

  8. 点击标有文档选项的链接。

  9. 目录选项设置为如下所选

  10. 生成目录索引设置为

  11. 点击保存按钮。

  12. 点击标有目录索引的按钮。

  13. 目录索引选项设置为如下所选

  14. 勾选标有显示精美目录索引的复选框。

  15. 使用此表单设置目录列表的显示偏好。

  16. 点击保存按钮。

  17. 点击应用更改链接。

现在,您应该能够看到 URLhttp://example.com/downloads下的文件列表。

它是如何工作的...

Webmin 通过在您的 Apache 配置中创建<Directory>指令来生成目录列表配置。例如,上述步骤会将以下部分添加到虚拟主机配置中:

<Directory "/var/www/example.com/downloads">
Options Indexes
IndexOptions FancyIndexing
</Directory>

还有更多...

默认情况下,Apache 的目录列表页面包含一个包含目录路径的头部和一个包含有关服务器和 Apache 信息的底部。您可以通过将名为HEADER.htmlREADME.html的文件放置在目录中来自定义头部和底部的内容。在这些文件中放置的任何 HTML 代码都会显示在文件列表页面上。如果您希望防止 Apache 列出这些文件,请转到目录索引选项屏幕,并在要在目录索引中忽略的文件字段中输入它们的名称(每行一个文件名)。

另请参见

重定向传入请求

您可以使用 Apache 的 HTTP 重定向将传入请求转发到另一个地址。如果您的网页地址发生变化,或者您希望创建一个易于记忆的 URL 地址,该地址会重定向到特定页面的更长地址,这将非常有用。

假设我们曾经在oldsite.com/articles/托管了许多文章,而我们决定将网站迁移到另一个域名,现在相同的文章将托管在http://example.com/info/

我们可以在旧站点上配置 Apache,将所有传入请求重定向到新域。

准备就绪

在开始之前,请确保在 Apache 配置中启用了alias模块。有关更多信息,请查看配方启用 Apache 模块

如何操作…

在您的旧服务器上,按照以下步骤将请求重定向到新域:

  1. 导航到服务器 | Apache Web 服务器 | 现有虚拟主机

  2. 选择将执行重定向的虚拟主机,例如默认服务器

  3. 点击标有别名和重定向的图标。

  4. 填写正则表达式 URL 重定向表单,输入以下数据:

    • From: /articles/(.*)

    • 状态: 301

    • To: http://example.com/info/$1

    注意

    From字段中由(.*)标记的正则表达式组捕获任何在/articles/之后的字符串,并将捕获的内容放置在To字段的$1占位符中。

    HTTP 重定向状态301表示资源已被永久移动。如果重定向是临时的,通常使用状态302

  5. 点击保存按钮。

  6. 点击应用更改链接。

它是如何工作的…

Webmin 通过在您的虚拟主机配置文件中添加RedirectMatch指令来创建重定向。前面示例中的步骤将创建以下指令:

RedirectMatch 301 /articles/(.*) "http://example.com/info/$1"

如果我们不使用正则表达式,一个更简单的Redirect指令就足够了,例如:

Redirect 301 /articles/ "http://example.com/info/"

还有更多…

一个名为mod_alias的 Apache 模块提供了Redirect指令。这些指令允许您在地址之间创建简单的转发。另一个名为mod_rewrite的模块提供了一种更加复杂的重定向机制,可以根据 URL 的每一部分、文件系统测试、服务器和环境变量、HTTP 头、时间戳等重定向传入请求。不幸的是,mod_rewrite指令的语法可能非常独特和复杂,因此手动编辑其配置文件仍然是最好的选择。

更多信息可以在 Apache 官网找到:httpd.apache.org/docs/current/rewrite/

创建文件系统别名

如果你想从服务器的文档根目录之外的目录提供文件,或者希望从多个位置提供同一目录的文件,可以使用本地别名而不是重定向。重定向会将用户转发到另一个 URL,而别名对用户透明,它从相同的 URL 提供不同的内容。

例如,我们可以将站点的图片存储在目录/var/www/resources/images中,但使用别名从 URL/images/提供它们。最终用户不会察觉文件是直接提供的还是通过别名提供的。

按照以下步骤,从以/images/开头的 URL 提供位于/var/www/resources/images的文件:

  1. 导航到服务器 | Apache Webserver | 现有虚拟主机

  2. 选择执行重定向的虚拟主机,例如默认服务器

  3. 点击标记为别名和重定向的图标。

  4. 填写文档目录别名表单,内容如下:

    • : /images/

    • : /var/www/resources/images

提示

在你能从另一个文件系统位置提供文件之前,可能需要创建一个特定目录的 Apache 配置,这样服务器才能将这些文件公开。有关更多信息,请查看配方为目录、文件和位置设置选项

设置加密网站与 SSL

HTTP 协议是以明文形式通过互联网传输的。这意味着通信可能被网站的最终用户和服务器管理员以外的人截获和读取。在大多数情况下,交换的信息是公开的,这种安全漏洞是可以接受的。在其他需要交换密码或其他机密信息的情况下,不应使用简单的 HTTP。幸运的是,感谢 HTTPS 协议,它通过增加加密层,保障了网络通信的安全。

注意

HTTPS 使用的 SSL 加密是在实际 HTTP 会话开始之前添加的。这意味着基于名称的虚拟服务器,通常在 HTTP 头中指定,不能与 HTTPS 一起使用。实际上,这意味着每个 SSL 保护的网站必须通过一个专用的 IP 地址提供。

如果你只打算在服务器上创建一个 HTTPS 网站,那就没问题。但如果你计划创建更多的安全网站,你需要为每个站点为服务器添加一个独立的网络接口,并为每个站点分配独立的 IP 地址。

如果你的服务器只有一个 IP 地址,并且你必须提供多个 HTTPS 站点,你可以使用一种名为服务器名称指示SNI)的技术。有关更多信息,请查看这个维基百科页面:en.wikipedia.org/wiki/Server_Name_Indication

准备工作

在开始之前,请确保ssl模块已在 Apache 配置中启用。有关更多信息,请查看配方启用 Apache 模块

下一步将是获取密钥和证书,这些将用于签署和加密 HTTPS 通信。您可以选择创建自己的自签名证书,或从商业证书机构购买签名证书。您可以快速且免费地生成自签名证书,但访问浏览器将向用户报告您的网站无法完全信任,因为没有外部认证机构认证用于加密通信的证书。第三方也可能伪造自签名证书,因此无法保证别人不会冒充您。

商业证书稍微难以获得,每年需要支付几美元,但您的用户将能够信任他们连接到您的网站,并且不会看到警告,而是在浏览器地址栏中看到一个漂亮的彩色锁定图标。

创建 SSL 证书的过程需要在您的系统上安装openssl软件包。如果您需要安装它,请查看第一章中的安装软件包部分,设置您的系统。密钥和证书不一定要在服务器上生成;您可以在任何具有openssl命令的机器上生成它们。

生成私钥

SSL 建立在非对称加密的基础上,使用两把密钥:一把是公开的,另一把是私密的(或称为私钥)。公开密钥用于加密消息或验证其签名,而私钥用于解密消息并创建签名。私钥应该仅为其所有者所知,并保存在受保护的文件中。

使用此命令生成强大的 RSA 私钥,并将其保存到文件key.pem中:

$ openssl genrsa -out key.pem 2048

拥有您的私钥的人可以冒充您,即使您购买了签名证书。更改密钥文件的权限,使只有 root 用户可以读取它,并确保它不会落入不正确的手中。使用以下命令更改权限:

$ chmod 400 key.pem

创建自签名证书

您可以使用以下命令创建自签名证书。该证书将保存到文件cert.pem中,并由您的私钥(来自key.pem)签名,且有效期为 365 天:

$ openssl req -new -key key.pem -x509 -nodes -days 365 -out cert.pem

在生成证书时,您将被要求回答一系列问题,包括国家名称、州或省、城市、组织、组织单位和电子邮件地址。如果您想留空任何字段,请输入一个点(.)并按Enter键。您还需要为证书提供一个常用名称,在本例中,它将是您网站的完整域名(例如,www.example.com)。请记住,证书中的常用名称必须与您的域名完全匹配,因此为www.example.com生成的证书无法在example.com上使用,反之亦然。

提示

如果你需要一个可以在多个域名上使用的证书,你可以准备一个通配符证书,或者一个在Subject Alt Name字段中指定多个域名的证书。

获取商业签名的证书

为了获得商业签名的证书,你需要生成一个由私钥签名的证书签名请求CSR)文件。你将这个文件发送给商业证书颁发机构,该机构会验证你的身份,处理支付,并将签名证书返回给你。

你可以使用以下命令根据你的私钥(key.pem)生成 CSR 文件(csr.pem):

$ openssl req -new -key key.pem -out csr.pem

你将被问到与生成自签名证书时相同的一系列问题。确保准确指定这些信息;如果这些数据与提供给证书颁发机构的信息不一致,可能会导致认证过程出现问题。

检查证书数据

一旦你拥有了证书(cert.pem),可以通过以下命令查看其中包含的信息:

$ openssl x509 -noout -text -in cert.pem

如何操作...

按照以下步骤设置由 Apache 运行的 SSL 保护的 HTTPS 网站:

  1. 准备以下内容:

    • 私钥文件(key.pem

    • 证书文件(cert.pem

    • 将与 SSL 一起使用的 IP 地址(例如,198.51.100.1

    • 证书中指定的域名作为通用名称(例如,www.example.com

    • 包含网站文件的目录路径(例如,/var/www/www.example.com

    • 系统中 Apache 配置目录的路径(例如,/etc/apache2

  2. key.pemcert.pem 文件复制到 Apache 配置目录。

    注意

    在任何情况下,这些文件都不应该出现在公开可用的文档目录中。请将它们保存在仅根用户可访问的安全位置。

  3. 确保 key.pem 文件的权限设置如下,具有严格限制:

    $ sudo chmod 400 key.pem
    
    
  4. 导航到服务器 | Apache Webserver | 创建虚拟主机,并根据以下设置准备一个虚拟服务器。更多信息请参考“创建虚拟主机”教程:

    • 处理到特定地址的连接:198.51.100.1

    • 端口443

    • 文档根目录/var/www/www.example.com

    • 服务器名称www.example.com

    如何操作...

  5. 导航到新创建的虚拟服务器的选项屏幕,然后点击SSL 选项图标。

  6. 设置启用 SSL?

  7. 设置证书/私钥文件/etc/apache2/cert.pem

  8. 设置私钥文件/etc/apache2/key.pem如何操作...

  9. 点击保存按钮。

  10. 点击应用更改链接。

现在,你可以使用浏览器连接到你网站的 HTTPS 地址 https://www.example.com

如何工作...

Webmin 通过将以下指令添加到 Apache 虚拟主机的配置中来启用 SSL:

SSLEngine on
SSLCertificateFile /etc/apache2/cert.pem
SSLCertificateKeyFile /etc/apache2/key.pem

这种基本配置使得使用 HTTPS 协议与服务器通信成为可能。当浏览器发起 HTTPS 连接时,请求会发送到服务器的 443 端口。在 HTTP 对话开始之前,进行 SSL 握手,所有随后的通信都将加密。

还有更多...

如果您准备了一个监听 HTTPS 请求的虚拟服务器,使用 443 端口,客户端将无法通过标准的 HTTP 请求连接到此服务器的 80 端口。您可能想为同一域准备一个第二个虚拟主机,将所有传入流量重定向到以https://开头的 URL。有关更多信息,请查看重定向传入请求的做法。

记录传入的请求和错误

托管网站的服务器会引起很多关注。它被用户访问,被索引搜索机器人扫描,并且被潜在的攻击者审视,以查看是否能够突破。您的 Web 服务器应该记录所有这些流量的信息,您应该定期查看这些日志,以确保一切正常运行。

默认情况下,Apache 保留两种类型的日志文件:访问日志,包含有关每个传入请求的信息;错误日志,包含关于遇到问题的信息。您可以配置 Apache 保持单一的日志文件对,但在大多数情况下,为每个虚拟服务器保留单独的访问日志和错误日志更为有用。

准备就绪

Apache 的日志功能高度可定制,您可以设置服务器以多种不同方式输出日志条目。一些格式已经被公认为标准,目前,推荐的日志标准被昵称为合并日志格式。它记录了许多信息,其中包括:

  • 远程 IP 或主机名(%h

  • 如果请求经过身份验证,远程用户(%u

  • 时间(%t

  • 请求的第一行,包含所使用的 HTTP 方法和请求路径(%r

  • HTTP 响应状态:200 表示成功,404 表示未找到,等等(%>s

  • 响应大小(以字节为单位)(%O

  • 发起此请求的页面(%{Referer}i

  • 标识请求浏览器类型和版本的用户代理字符串(%{User-Agent}i

所有这些字段形成了合并日志格式,表示为:

%h %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"

您应该确保在服务器配置中启用了昵称为“combined”的格式。如果没有,您可以按照以下方式将其添加:

  1. 导航到默认 Apache 服务器的配置部分,路径为服务器 | Apache Web 服务器 | 现有虚拟主机 | 默认服务器

  2. 点击日志文件

  3. 确保列表中包含名为combined的日志格式。如果缺少此格式,请添加一条条目,使用昵称combined和以下格式字符串:

    %h %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i"
    
  4. 默认日志格式设置为combined准备就绪

  5. 点击保存按钮。

  6. 点击应用更改链接。

您可以在 Apache 文档中找到更多关于日志格式的信息:

httpd.apache.org/docs/current/mod/mod_log_config.html

操作步骤...

在这个教程中,我们将为服务于域名example.com的虚拟主机设置日志记录。我们将指导 Apache 将访问日志条目保存在/var/log/apache2/example.com-access.log中,错误日志保存在/var/log/apache2/example.com-error.log中。如果您的系统使用/var/log/httpd或其他目录来存储 Apache 日志,请相应地修改路径。按照以下步骤记录传入请求和错误日志:

  1. 导航至服务器 | Apache Web 服务器 | 现有虚拟主机

  2. 点击您想要设置日志选项的主机图标。

  3. 点击日志文件

  4. 错误日志设置为设置为文件,并输入日志文件路径:/var/log/apache2/example.com-error.log

  5. 错误日志级别设置为警告条件(warn)

  6. 默认日志格式设置为combined

  7. 访问日志文件下,将格式设置为默认,并将写入文件路径设置为/var/log/apache2/example.com-access.log操作步骤...

  8. 点击保存按钮。

  9. 点击应用更改链接。

工作原理...

Webmin 通过在<VirtualHost>部分添加以下指令来配置虚拟服务器的日志记录:

ErrorLog /var/log/apache2/example.com-error.log
LogLevel warn
LogFormat "combined"
TransferLog /var/log/apache2/example.com-access.log

这些指令告诉 Apache 在哪里保存该主机的访问日志和错误日志,访问日志使用什么格式(LogFormat),以及错误报告的详细程度(LogLevel)。

另见

  • Apache 日志文件在流量高的站点上增长非常快。请查看第五章中的教程配置日志文件轮换,了解如何使用logrotate来处理增长的日志文件。

  • Webmin 可以为您显示收集到的日志文件消息;请查看本章节中添加其他日志文件到 Webmin的教程,位于第五章,监控您的系统

  • 一个叫做 Webalizer 的程序可以帮助你分析 Apache 日志文件。查看本章节中的教程使用 Webalizer 分析日志文件,了解更多信息。

使用 Webalizer 分析日志文件

Web 服务器的日志文件包含了大量有用的信息,但它们太长且冗余,不容易阅读。为了全面了解网站的状态,您需要一个工具来分析其访问日志文件的内容。一个这样的工具叫做Webalizer;它易于安装并且与 Webmin 集成良好。Webalizer 解析日志文件并生成 HTML 格式的图形报告,将日志文件转化为清晰的图表和表格。

准备工作

请按照第一章中安装软件包的教程,安装webalizer软件包。

操作步骤...

记下你想要分析的 Apache 访问日志文件的位置。在这个例子中,我们将为托管在example.com上的网站准备 Webalizer 报告,访问日志文件存储在/var/log/apache2/example.com-access.log。执行以下步骤以使用 Webalizer 分析日志文件:

  1. 创建一个目录来存储这个网站的 Webalizer 报告。比如,/var/stats/example.com可能是一个合适的位置。

  2. 转到服务器 | Webalizer 日志文件分析

  3. 点击添加新的日志文件进行分析链接。

  4. 基础日志文件路径设置为/var/log/apache2/example.com-access.log

    提示

    即使你使用logrotate旋转日志,Webalizer 也会读取整个日志文件家族,包括压缩的备份日志归档文件。

  5. 写入报告的目录设置为你创建的报告目录/var/stats/example.com

  6. 以用户身份运行 webalizer设置为root

  7. 是否始终重新处理日志文件? 设置为

  8. 报告生成后是否清除日志文件? 设置为

  9. 报告选项设置为使用全局选项

  10. 计划报告生成设置为启用,并选择下方的时间

  11. 使用简单计划,设置为每日(午夜时分)

  12. 点击创建按钮。

新的 Webalizer 分析条目将出现在列表中。如果你不想等到第二天,可以立即生成报告:

  1. 点击新创建的日志分析条目。

  2. 点击生成报告按钮,然后在下一屏幕点击查看已完成的报告链接。

从现在起,你可以随时进入服务器 | Webalizer 日志文件分析,点击屏幕右侧的链接查看每日更新的 Webalizer 报告。

运行原理...

Webmin 会创建一个 cron 任务,每晚午夜执行webalizer二进制文件。Webalizer 解析指定的日志文件并生成一个图形报告,报告以 HTML 页面的形式展示。当你查看报告时,Webmin 会在浏览器中显示 Webalizer 生成的 HTML 页面。

还有更多内容...

你可以自定义 Webalizer 生成报告的某些方面。你可以通过进入服务器 | Webalizer 日志文件分析页面,并点击编辑全局选项按钮来全局编辑设置。

你还可以通过以下步骤为报告设置自定义选项:

  1. 转到服务器 | Webalizer 日志文件分析

  2. 点击你想要自定义报告的日志文件名称。

  3. 报告选项设置为自定义选项

  4. 点击保存按钮。

  5. 返回列出 Webalizer 报告的屏幕,再次点击日志文件名称。

  6. 点击屏幕底部的新编辑选项按钮。

  7. 自定义报告设置,然后点击保存按钮。

第九章:运行 MySQL 数据库服务器

在本章中,我们将涵盖以下主题:

  • 安装 MySQL 数据库服务器

  • 允许通过网络访问 MySQL

  • 通过 SSH 隧道访问 MySQL 服务器

  • 创建新数据库

  • 创建用户并授予数据库权限

  • 创建数据库备份

  • 执行自定义 SQL 命令

  • 从备份中恢复数据库

  • 编辑数据库结构

  • 编辑数据库中的记录

  • 检查谁在使用你的数据库服务器

  • 安装 phpMyAdmin

介绍

MySQL 是一个强大的开源数据库管理系统。MySQL 服务器易于设置并且扩展性很好。这个数据库系统为一些世界上最大的网站提供支持,包括 Facebook、Twitter 和 Wikipedia。

MySQL 采用分布式客户端-服务器架构。单个服务器可以同时为多个客户端程序提供数据库服务。运行在与服务器相同机器上的客户端通常通过 Unix 套接字连接。客户端也可以运行在不同的机器上,通过网络连接到数据库服务器。MySQL 使用 TCP 连接,服务器的默认监听端口是 3306。

注意

Unix 域套接字是用于进程间通信的通道。不同程序在同一台机器上运行时,可以读写套接字中的信息,从而实现程序之间的通信。Unix 套接字作为文件系统的节点表示,因此你可以通过列出创建套接字的目录内容来找到它。

MySQL 的权限系统非常细粒度。每个客户端的访问权限可以被限制在部分数据库上,并且在每个数据库上允许执行不同的 SQL 命令。

数据库服务器维护一份客户端账户列表,这些账户与系统用户账户是分开的。每个客户端账户不仅由用户名和密码定义,还由用户连接的主机定义。由于这个解决方案,复杂的权限定义成为可能。例如,相同的用户名和密码可以在本地用于执行管理任务,但在远程仅允许查看服务器状态。

默认的 MySQL 安装会创建一个名为 root 的超级管理员账户以及一个匿名账户,允许无需身份验证即可连接到数据库服务器。在生产环境中,确保为 root 账户设置强密码,并禁用匿名账户非常重要。

注意

除了用户名和密码外,MySQL 还可能要求客户端提供证书以提高安全性。

Webmin 对 MySQL 的支持非常出色,允许您执行与数据库服务器运行相关的大多数任务。在本章中,我们将演示 Webmin 如何帮助您安装 MySQL,设置通过网络访问服务器,管理用户帐户,创建数据库,编辑数据库的结构和数据。我们还将演示如何自动备份数据库并恢复备份文件。如果您发现需要一个更先进的基于网页的管理工具,我们将演示如何在服务器上设置 phpMyAdmin。

安装 MySQL 数据库服务器

几乎所有附带开源软件包管理解决方案的操作系统都提供 MySQL 软件包以供安装。在本节中,我们将从软件包安装 MySQL,并在您的系统上进行设置。服务器包还会自动安装 MySQL 的命令行客户端包。

如何操作...

按照以下步骤在您的服务器上设置 MySQL:

  1. 按照第一章中安装软件包一节的步骤,设置您的系统,查找并安装 MySQL 数据库服务器包。

    大多数发行版在其软件包存储库中提供多个版本的 MySQL。在一些系统中,您会找到一个名为 mysql-server 的元包,它安装最新版本。在其他系统中,您会找到版本号在名称中的包,例如 mysql-server-5.5mysql55-server,用于安装 5.5.x 版本。除非有理由使用旧版本,否则请选择最新版本的软件包。

  2. 转到 系统 | 启动和关闭

  3. 选择 MySQL 数据库服务器的启动脚本旁边的复选框(它的名称可能是 mysqlmysqldmysql-server 或类似的名称)。

  4. 点击 立即启动并开机自启 按钮。

  5. 点击 Webmin 主菜单底部的刷新模块链接,然后重新加载浏览器以更新菜单。

  6. 转到 服务器 | MySQL 数据库服务器

Webmin 应该能够连接到您的 MySQL 服务器。此时,您将看到一个数据库列表,其中应该包括默认的数据库,如 information_schemamysql

提示

如果您看到警告:Perl 模块 DBI 和 DBD::mysql 未安装在您的系统上,请点击链接并按照 Webmin 的说明安装缺失的 Perl 模块。

默认的 MySQL 设置适用于开发或测试服务器。然而,如果您打算在生产环境或共享服务器上使用数据库,请继续阅读本节的更多内容部分。

它是如何工作的...

Webmin 帮助您从发行版的存储库中找到并安装 mysql-server 包。该包包含一个启动脚本,我们已启用该脚本,以便在您的机器启动时启动数据库服务器。

默认的 MySQL 安装包含许多便利的功能,如匿名用户帐户或可以不提供密码即可作为 root 登录的能力。这些默认选项使得启动 MySQL 变得更加简单。但是,它们不应该在生产环境中使用,因为它们构成重大安全风险。

还有更多...

执行以下步骤,使 MySQL 在生产环境中更安全。

使 MySQL 准备好进行生产使用

按照以下步骤为你的 MySQL 服务器提供基本安全性:

  1. 使用终端仿真器(例如通过 SSH)连接到你的服务器。

    提示

    你也可以使用 Webmin 的 Text Login 模块。

  2. 输入以下命令:mysql_secure_installation

  3. 通过按 Y 然后 Enter 确认所有问题,除非你知道你想要其他推荐设置以外。

mysql_secure_installation 脚本执行以下任务:

  • 为数据库 root 用户设置密码

  • 删除数据库的匿名访问;从现在开始,MySQL 将仅允许授权用户访问

  • 禁止 root 用户远程登录,因为这个用户通常只应该从同一台计算机访问数据库

  • 删除 test 数据库。

参见

  • 如果你想让其他计算机访问你的数据库,查看本章节的 允许通过网络访问 MySQL 部分。

允许通过网络访问 MySQL

访问 MySQL 数据库的程序(称为客户端)可能在与服务器相同的计算机上运行。在这种情况下,客户端和服务器将通过 Unix 域套接字进行最有效的通信,这是通过文件系统访问的进程间通信通道,类似于文件或目录。套接字的访问受文件系统权限控制。

其他客户端程序可能仅能通过 TCP 网络套接字进行通信。这些客户端可以使用回环接口和 IP 地址 127.0.0.1 连接到本地服务器。在这种情况下,MySQL 服务器必须编译为支持网络并配置为在回环接口上监听连接。

但是,如果客户端程序位于服务器以外的机器上,则它们之间的通信必须通过使用 TCP 协议的网络进行。为了使这种通信成为可能,你需要在防火墙中开放一个例外,并指示 MySQL 在物理网络接口上监听传入的网络连接。

提示

你也可以通过 SSH 隧道传输 MySQL 流量,这可能是更安全的解决方案。查看 通过 SSH 隧道远程访问数据库服务器 部分以获取更多信息。

准备就绪

如果你计划使数据库服务器通过网络可用,你应该采取措施来确保其安全。查看本章节的 使 MySQL 准备好进行生产使用 部分以获取更多信息。

在开始之前,请按照第三章中通过防火墙允许访问服务一节的步骤,允许通过防火墙将传入的 TCP 流量导入端口 3306,如下图所示:

准备就绪

如何操作...

本配方的步骤将分为以下四个部分:

  • 首先,我们将指示 MySQL 在标准 MySQL 端口(3306)上监听传入的网络连接

  • 然后,我们将创建一个名为 dbuser 的数据库用户

  • 我们将授予对名为 testdb 的数据库的访问权限

  • 最后,我们将通过从第二台客户端机器连接到我们的服务器来测试设置

指示 MySQL 服务器监听网络连接

为了使 MySQL 接受传入的网络连接,请执行以下步骤:

  1. 转到服务器 | MySQL 数据库服务器 | MySQL 服务器配置

  2. MySQL 服务器监听地址设置为任何

  3. 点击保存并重新启动 MySQL按钮。

创建新用户

为了创建一个新用户,请执行以下步骤:

  1. 转到服务器 | MySQL 数据库服务器 | 用户权限

  2. 点击创建新用户链接。

  3. 用户名设置为 dbuser密码设置为强密码,主机设置为任何

  4. 点击创建按钮。

授予用户访问数据库的权限

为了授予用户访问数据库的权限,请执行以下步骤:

  1. 转到服务器 | MySQL 数据库服务器 | 数据库权限

  2. 点击创建新数据库权限链接。

  3. 数据库行中,选择已选并选择您的 testdb 数据库。

  4. 用户名设置为创建的用户的名称,即 dbuser

  5. 主机设置为任何,以允许用户从任何地方连接。

    提示

    为了增加安全性,您应该指定一个用户可以连接的 IP 地址或域名。您可以使用 % 作为地址的一部分来指定通配符。例如,192.168.0.% 表示整个 192.168.0.1/24 子网,而 %.example.com 包括域名下的所有主机。

  6. 权限列表中选择所有权限。

  7. 点击创建按钮。

测试连接

尝试从网络中的第二台机器连接到数据库服务器。如果另一台机器上安装了 MySQL 命令行客户端,您可以通过在终端输入以下命令来测试连接,但请将mysql-host替换为 MySQL 服务器的 IP 或域名:

$ mysql -u dbuser -p -h mysql-host -D testdb

如果连接成功,您将看到以下欢迎消息,其中包括服务器的 MySQL 版本:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 58
Server version: 5.5.31-0+wheezy1 (Debian)
mysql> exit
Bye

当您到达 mysql> 提示符时,可以开始执行 SQL 命令。输入 exit 并按 Enter 断开连接。

如何操作...

为了允许 MySQL 服务器接受传入的网络连接,Webmin 会编辑您服务器的配置文件(通常位于 /etc/my.cnf/var/db/mysql/my.cnf/etc/mysql/my.cnf)。

服务器配置中有两行指定了服务器将接受哪些连接。例如,如果我们只希望接受本地连接,这些行可以写成如下:

socket=/var/lib/mysql/mysql.sock
bind-address=127.0.0.1

第一行指示 MySQL 创建一个本地 Unix 套接字,用于与同一机器上的其他程序通信,而第二行则指示它在本地回环接口(127.0.0.1)上监听传入连接。为了使服务器在所有接口上都能监听传入的网络连接,Webmin 只需删除 bind-address 这一行。

我们通过在同一网络下的另一台计算机上发出以下命令来测试连接:

$ mysql -u dbuser -p -h mysql-host -D testdb

该命令启动 MySQL 命令行客户端。指定的选项如下:

  • -u:此选项指定尝试连接到服务器的用户

  • -p:此选项指示我们希望系统提示输入密码

  • -h:此选项指定我们尝试连接的主机

  • -D:此选项指定我们连接后要使用的数据库

为了创建数据库用户并授予他们权限,Webmin 直接在 MySQL 的内部配置数据库中操作数据。如果你想手动执行相同的操作,可以使用命令行客户端连接到 MySQL 服务器,并发出以下命令。

首先,以 root 用户连接到本地数据库服务器:

$ mysql -u root -p

接下来,发出以下 MySQL 命令:

mysql> CREATE USER 'dbuser'@'%' IDENTIFIED BY 'strongpassword';
mysql> GRANT ALL PRIVILEGES ON testdb.* TO 'dbuser'@'%';
mysql> FLUSH PRIVILEGES;

第一条命令创建了一个名为 dbuser 的用户,而第二条命令为该用户提供对 testdb 数据库的完全访问权限。最后一条命令强制 MySQL 服务器重新加载关于用户和权限的信息,以便新用户可以连接。

提示

MySQL 命令行客户端会将所有输入的命令历史保存在一个文件中。如果我们执行之前列出的命令,历史文件将包含我们新创建用户的密码。为了避免这种情况,我们可以在连接到服务器之前,通过发出以下命令指示 MySQL 在此会话期间不保存历史记录:

$ export MYSQL_HISTFILE=/dev/null

还有更多内容...

本食谱允许用户远程访问单一数据库。出于安全原因,主管理账户(root)不应允许从其他计算机连接到你的服务器。如果你仍希望允许对数据库服务器进行一些远程管理(如创建数据库、用户等),可以按照以下步骤进行操作。

远程管理数据库

按照以下步骤创建一个账户,用于远程管理:

  1. 导航至 服务器 | MySQL 数据库服务器 | 用户权限

  2. 点击 创建新用户 链接。

  3. 设置 用户名 为一个管理账户名。尽量选择一个比 admin 更难猜测的用户名。

  4. 设置 密码 为一个非常强的密码。

  5. 设置 主机 为你的管理用户将要连接的 IP 地址范围。

  6. 权限 列表中,仔细选择你确定需要远程访问的权限。

    注意

    关于每个权限的详细信息,可以在 MySQL 文档中的 MySQL 提供的权限 部分找到,链接如下:

    dev.mysql.com/doc/refman/5.6/en/privileges-provided.html

  7. 点击 创建 按钮。

    现在你应该能够从远程客户端计算机连接到服务器(mysql-host)。连接时无需指定数据库名称:

    $ mysql -u administrative_user -p -h mysql-host
    
    

另见

为了使远程访问和管理你的 MySQL 数据库更加安全,你可以通过 SSH 隧道来传输连接。

  • 查看本章中的 通过 SSH 隧道访问 MySQL 服务器 食谱以获取说明。

通过 SSH 隧道访问 MySQL 服务器

如果你的服务器托管了一个网站,并且在同一台机器上运行数据库系统,那么禁用 MySQL 的远程网络访问会更安全。另一方面,你可能仍然希望远程管理你的数据库,你可以通过 SSH 连接隧道化 MySQL 流量来实现。

注意

数据库系统的一个最重要方面是它查找并返回你请求的数据的速度。通过 SSH 隧道传输流量会为此通信增加显著的开销。这个解决方案非常适合间歇性的管理任务,但通常不适合作为直接连接数据库系统的替代方案。

准备工作

你想要连接的服务器必须同时运行 MySQL 服务器和 SSH 服务器。远程客户端机器必须安装 SSH 客户端和 MySQL 客户端软件。记下服务器的 IP 地址或域名(mysql-host)、SSH 用户名(ssh-user)、MySQL 用户(mysql-user)和数据库名称(database-name)。在这个步骤中需要替换为相应的值。

如何操作...

为了创建 MySQL 的 SSH 隧道,请按照以下步骤操作:

  1. 在客户端机器上执行以下命令:

    $ ssh -L 15000:localhost:3306 ssh-user@mysql-host
    
    

    这会在客户端机器上的端口 15000 和服务器的端口 3306 之间创建一个隧道。现在你可以通过将 MySQL 连接到客户端计算机的本地端口 15000 来访问远程数据库。

  2. 在客户端系统上执行以下命令以测试连接:

    $ mysql -u mysql-user -p  -D database-name -h 127.0.0.1 -P 15000
    
    

它是如何工作的...

SSH 客户端充当你机器上运行的 MySQL 客户端与远程服务器之间的通信中介。它会打开端口 15000 并监听传入连接。所有到达端口 15000 的数据包都会被加密并通过 SSH 转发到服务器。在服务器端,SSH 接收数据包,解密后将其发送到端口 3306。响应通过相同的通道返回。

有关 SSH 隧道的更多信息,请参见通过 SSH 隧道安全连接 Webmin食谱,详见第三章,安全加固系统

还有更多...

一些 MySQL 客户端集成了在连接远程数据库时设置 SSH 隧道的功能。

在 MySQL Workbench 中创建 SSH 隧道

像 MySQL Workbench 或 Sequel Pro 这样的流行 GUI 客户端,允许你在与数据库连接设置相同的窗口中指定 SSH 连接设置。所有情况下的步骤都类似。在 MySQL Workbench 中,你将按照以下步骤设置连接:

  1. 在客户端计算机上运行 MySQL Workbench。

  2. 数据库菜单中选择连接到数据库

  3. 连接方式设置为通过 SSH 的标准 TCP/IP

  4. SSH 主机名设置为远程服务器的 IP 地址或域名。

  5. SSH 用户名设置为具有 SSH 访问权限的系统用户。

  6. MySQL 主机名设置为 127.0.0.1

  7. MySQL 服务器端口设置为 3306

  8. 用户名设置为 MySQL 用户的名称。

  9. 点击测试连接按钮。参考以下截图:在 MySQL Workbench 中创建 SSH 隧道

系统会要求你输入 SSH 用户的密码,然后是 MySQL 用户的密码。如果一切顺利,你将看到一条消息,提示连接参数正确。

另见

  • 有许多工具可以让你连接和控制你的 MySQL 数据库。Webmin 提供了广泛的工具来执行大多数常见任务,后续章节中会描述这些工具。一个更强大的基于 Web 的 MySQL 专用解决方案是 phpMyAdmin,本章节的安装 phpMyAdmin食谱中将进行讨论。

  • 你可以从以下网站下载本食谱中提到的 GUI 客户端:

  • 有关 SSH 隧道的更多信息,请参见通过 SSH 隧道安全连接 Webmin食谱,详见第三章,安全加固系统

创建新数据库

通过 Webmin 界面创建新 MySQL 数据库非常快捷和简单。

如何操作...

按照以下步骤创建一个新数据库:

  1. 导航至服务器 | MySQL 数据库服务器

  2. 点击创建一个新数据库链接。

  3. 输入数据库名称,例如,new_db

  4. 字符集设置为utf8 (UTF-8 Unicode)

  5. 排序规则设置为utf8_unicode_ci (UTF-8 Unicode)

    注意

    字符集指定了字母字符在数据库中的存储方式,而utf8字符集包含了大多数字母表中的所有字母。另一方面,排序规则指定了字母在按字母顺序排序时应该放置的顺序。utf8_unicode_ci排序规则旨在成为通用的,但可能会有地区性差异,使得像utf8_polish_ci这样的本地排序规则更适合你的情况。

  6. 初始表设置为

  7. 点击创建按钮。

它是如何工作的……

Webmin 会根据你提供的信息,通过连接到 MySQL 服务器并执行以下命令来创建一个新数据库:

mysql> CREATE DATABASE `new_db` CHARACTER SET utf8 COLLATE utf8_unicode_ci;

另见

  • 为了使数据库可用,你需要授予用户访问数据库的权限。有关说明,请参阅本章中的创建用户并授予数据库权限一节。

  • 如果你有初始的数据库结构或内容,可以通过使用 SQL 命令文件将它们上传到服务器。有关更多信息,请查看本章中的执行自定义 SQL 命令一节。

  • 有关字符集和排序规则的更多信息,可以在 MySQL 手册中的以下链接找到:dev.mysql.com/doc/refman/5.7/en/charset-charsets.html

创建用户并授予数据库权限

由于 MySQL 的客户端-服务器架构,服务器可能会接受来自多个客户端的连接。连接的客户端通过用户名和密码向 MySQL 进行身份验证。关于用户账户和权限的信息存储在一个名为mysql的内部数据库中。

MySQL 账户与系统账户是分开的,通常这是一件好事,因为它们通常代表在服务器上运行的应用程序,而非实际用户。每个连接到数据库服务器的应用程序应该有自己的用户账户,并且访问权限仅限于该应用程序运行所需的数据库。允许应用程序具有 root 级别的访问权限是不明智的,因为如果应用程序被攻击者入侵,攻击者可能会窃取或损坏系统上的所有数据库。

除了用户名和密码外,MySQL 账户还通过用户允许连接的主机来描述。这意味着'user'@'localhost''user'@'remotehost'是不同的账户,这些账户可能具有不同的访问权限。

不幸的是,这意味着如果一个用户需要从多个主机访问,就必须创建多个账户,或者更糟的是,如果用户的位置在网络中变化。在这种情况下,你可以指定%作为主机地址的一部分,作为通配符。例如,192.168.0.%将指定整个192.168.0.1/24子网,而%.example.com将指定一个域内的所有主机。

如果用户的来源位置无法缩小到某个网络或 IP 地址范围,建议使用 SSH 隧道,而不是让数据库服务器对整个互联网开放访问权限。有关更多信息,请参考本章中的通过 SSH 隧道访问 MySQL 服务器

准备工作

除非你有特别的理由使用它们,否则应该移除 MySQL 的匿名账户。匿名账户是默认为测试目的创建的,但它们可能会在调试用户权限问题时造成困难。

假设,举个例子,你有一个可以从任何地方访问的用户账户:'user'@'%',但你同时也有一个可以从本地主机访问的匿名账户@'localhost'。如果你尝试从本地主机以user身份连接,MySQL 将首先检查一个更精确地指定入站连接主机的权限条目(@'localhost'@'%'更具体)。这会导致user被赋予匿名账户的权限,而不是预期的'user'@'%'账户。你可以通过执行以下 MySQL 命令来检查你当前以哪个用户身份连接:

mysql> SELECT CURRENT_USER();

你将看到如下输出:

+----------------+
| CURRENT_USER() |
+----------------+
| @localhost     |
+----------------+

输出显示我们被视为匿名用户@'localhost'。解决这个问题的方法是为user添加一个新的账户'user'@'localhost'。然后,当我们重新登录时,我们将看到同一命令的以下输出:

+----------------+
| CURRENT_USER() |
+----------------+
| user@localhost |
+----------------+

如果你没有特别的需求,最好是完全删除匿名账户,这样更安全也更方便。

如何操作...

在本节中,我们将创建一个名为dbuser的用户,并允许该用户从本地机器访问testdb数据库。用户必须使用强密码进行身份验证。请根据你的实际情况准备好用户名、数据库名和密码。

创建用户账户

要创建一个用户账户,请执行以下步骤:

  1. 进入服务器 | MySQL 数据库服务器 | 用户权限

  2. 点击创建新用户链接。

  3. 用户名设置为dbuser

  4. 密码设置为强密码。

  5. 主机设置为localhost

  6. 权限列表中,不要选择任何权限。

    注意

    我们不需要授予该账户任何全局权限,因为该用户的访问权限仅限于特定的数据库。

  7. 点击创建按钮。

授予权限

要授予权限,请执行以下步骤:

  1. 进入服务器 | MySQL 数据库服务器 | 数据库权限

  2. 点击创建新数据库权限链接。

  3. 数据库设置为已选择,然后从列表中选择testdb

  4. 用户名设置为dbuser

  5. 主机设置为localhost

  6. 权限列表中,选择所有权限,如下截图所示:授予权限

  7. 点击创建按钮。

创建的账户和权限将允许dbuser连接并完全控制testdb数据库,当其连接到本地 MySQL 服务器时。

提示

当客户端从本地计算机连接时,MySQL 服务器将使用与localhost关联的账户,无论连接是通过套接字还是 TCP 建立。然而,如果您创建了一个与127.0.0.1关联的账户,它将在通过 TCP 连接时使用,但在通过套接字连接时不会使用。当通过 IPv6 使用 TCP 连接时,还会使用本地计算机的 IPv6 地址::1。最好为localhost设置账户,以避免这种混淆。

工作原理...

Webmin 通过直接操作mysql数据库来创建账户并授予权限。具体来说,它向userdb表添加一行,然后执行FLUSH PRIVILEGES命令。

如果您想手动执行相同的操作,您可以使用 MySQL 命令行客户端连接到 MySQL 服务器并发出以下命令。

首先以 root 身份连接到本地数据库服务器:

$ mysql -u root -p

接下来,发出 MySQL 命令:

mysql> CREATE USER 'dbuser'@'localhost' IDENTIFIED BY 'strongpassword';
mysql> GRANT ALL PRIVILEGES ON testdb.* TO 'dbuser'@'localhost';
mysql> FLUSH PRIVILEGES;

第一个命令创建了一个名为dbuser的用户,第二个命令授予该用户对testdb数据库的完全访问权限。最后一个命令强制 MySQL 服务器重新加载关于用户和权限的信息,以便新用户能够连接。

还有更多...

Webmin 允许您指定更细粒度的访问权限——可以在数据库表级别,甚至是数据库表中的特定列级别。它还允许您为通过 Webmin 创建的新系统用户自动创建 MySQL 账户。

授予特定数据库表的权限

为了授予特定数据库表的权限,请执行以下步骤:

  1. 导航到服务器 | MySQL 数据库服务器 | 表权限

  2. 从列表中选择一个数据库并点击在数据库中添加新权限按钮。

  3. 从列表中选择一个数据库

  4. 用户名设置为之前定义的 MySQL 用户的名称。

  5. Host设置为与用户账户关联的主机名。

  6. 表权限字段权限列表中选择您希望授予的权限,如下图所示:授予特定数据库表的权限

  7. 点击创建按钮。

授予特定数据库表中某一列的权限

要授予特定数据库表中某一列的权限,请执行以下步骤:

  1. 导航到服务器 | MySQL 数据库服务器 | 字段权限

  2. 从列表中选择一个数据库和表,并点击在数据库和表中添加新权限按钮。

  3. 从列表中选择一个数据库表的字段

  4. 用户名设置为之前定义的 MySQL 用户的名称。

  5. Host设置为与用户账户关联的主机名。

  6. 权限列表中选择您希望授予的权限。

  7. 点击创建按钮。

自动授予新系统用户 MySQL 访问权限

要自动授予所有系统用户 MySQL 访问权限,请执行以下步骤:

  1. 导航到服务器 | MySQL 数据库服务器 | 用户权限

  2. 何时同步部分选择所有三个复选框。

  3. 新用户的权限列表中选择权限。例如,如果你希望系统的每个用户都是 MySQL 管理员,则选择所有权限。请谨慎使用此选项。

  4. 创建具有主机的用户设置为特定主机,并输入localhost自动授予新系统用户 MySQL 访问权限

  5. 点击保存按钮。

从现在开始,通过 Webmin 创建的每个新用户账户将自动获得一个与系统密码相同的 MySQL 账户。如果通过 Webmin 更改了密码,则 MySQL 账户将更新;如果通过 Webmin 删除了对应的系统账户,则 MySQL 账户也将被删除。

创建数据库备份

Webmin 可以帮助你备份 MySQL 数据库。只需点击几下,你就可以备份任何数据库。Webmin 还可以帮助你设置定时任务,定期自动创建备份。

准备工作

在开始之前,创建一个目录来存储本地备份文件。你可以将这些文件保存在根目录/root/backups下的/backups,或者存放在任何方便的位置。

提示

Webmin 创建的备份文件对所有系统用户可读。这可能带来安全风险,因为数据库备份通常包含敏感数据,如散列的用户密码。你应该删除备份目录中除 root 组之外用户的所有权限。你可以通过以下命令来完成:

$ sudo chmod o-rwx /backups

如果你的文件系统支持访问控制列表,你还可以为该目录中新创建的文件设置默认的掩码,使得这些文件无法被组外的用户读取。你可以通过以下命令设置/backups的默认 ACL:

$ sudo setfacl -d -m other:- /backups

查看第六章中的更改文件所有权和权限部分,了解更多信息。

操作步骤...

按照以下步骤创建数据库备份:

  1. 导航到服务器 | MySQL 数据库服务器

  2. 点击表示你想要备份的数据库的图标。

  3. 点击备份数据库按钮。

  4. 备份到文件设置为路径,例如/backups/database-name.sql.bz2

  5. 备份的表设置为所有表

  6. 打开其他备份选项部分。

  7. 是否将删除表语句添加到备份?设置为

    注意

    这有助于将创建的备份导入现有数据库。具有相同名称的表会在导入备份中的表之前被删除(丢弃)。

  8. 备份的字符集设置为UTF-8 Unicode

  9. 选择压缩格式Bzip2

    注意

    Bzip2 对于文本类型文件(如 SQL 命令文件)提供了非常好的压缩效果。

  10. 点击立即备份按钮。

工作原理...

Webmin 执行 mysqldump 命令,输出一系列创建整个数据库所需的 SQL 命令。然后将数据库“转储”通过 bzip2 压缩算法进行压缩并保存到输出文件中。如果你想在终端中执行相同的备份操作,可以运行类似以下的命令(确保正确设置 mysqldump 选项):

$ mysqldump --add-drop-table --routines database-name | bzip2 -c > /backups/database-name.sql.bz2

还有更多内容...

Webmin 是一个非常强大的备份工具。以下是一些其他易于访问的功能。

自动备份所有数据库

Webmin 可以帮助你自动备份服务器托管的部分或所有数据库。这些备份将通过 cron 定期执行。有关调度命令的更多信息,请查看 第四章中的使用 cron 定期调度命令。为了自动备份所有数据库,请执行以下步骤:

  1. 进入服务器 | MySQL 数据库服务器

  2. 点击备份数据库按钮。

  3. 备份到目录设置为备份目录的位置,例如/backups

  4. 打开其他备份选项部分。

  5. 备份中是否添加删除表语句?设置为

  6. 备份的字符集设置为UTF-8 Unicode

  7. 压缩格式设置为Bzip2

  8. 打开备份计划部分。

  9. 发送备份状态邮件到设置为你的电子邮件地址。

  10. 启用计划备份?设置为是,按以下选定的时间,设置简单计划并选择每日(午夜时分)

    注意

    请注意,许多任务可能会安排在系统的午夜时分启动,如果系统资源有限,你可以选择其他时间。通过标记分钟、小时和月份的日期来选择一个更复杂的计划。

  11. 点击保存按钮。

将数据库表导出为 CSV

Webmin 可以将数据库中的单个表导出为逗号分隔值CSV)文件,任何电子表格程序,如 Excel、Calc 或 Gnumeric,都可以打开该文件。要将数据库表导出为 CSV,请执行以下步骤:

  1. 进入服务器 | MySQL 数据库服务器

  2. 点击包含该表的数据库的图标。

  3. 点击你想要导出的表的图标。

  4. 点击导出到 CSV按钮。

  5. 文件格式设置为带引号的 CSV

  6. 是否包含列名?设置为

  7. 导出目的地设置为在浏览器中显示

  8. 点击立即导出按钮。

另请参见

  • 你可以通过使用网络文件共享协议(如 NFS 或 CIFS)轻松地将备份文件传输到远程主机。首先在远程服务器上创建一个网络卷,然后将该卷挂载到你的服务器上。接着,你就可以像本地存储文件一样,轻松地将文件备份到远程系统的目录中。请参阅 第六章,管理系统中的文件,获取使用 NFS 或 CIFS 设置网络文件共享的说明。

  • 另一种将数据库备份副本存储到远程的方式是使用 SSH 协议将备份目录发送到远程服务器。请查看 第七章,系统备份,中的 备份到远程主机,了解更多信息。

执行自定义 SQL 命令

Webmin 提供了一个简洁的界面,用于访问你的 MySQL 数据库服务器,让你能够执行任意 SQL 命令。这是一个非常有用的功能,尤其在你想快速查找数据库中的某些内容或对多个数据行进行批量更新时。

如何操作...

按照以下步骤在数据库上执行 SQL 命令:

  1. 导航到 服务器 | MySQL 数据库服务器

  2. 点击代表你想要使用的数据库的图标,例如 mysql

  3. 点击 执行 SQL 按钮。

  4. 在文本区域输入 SQL 命令,例如:

    SELECT host,user FROM user;
    
    

    如何操作...

  5. 点击 执行 按钮。

系统会显示通过 SELECT 命令返回的数据,并且可以排序。

它是如何工作的...

Webmin 会将 SQL 命令传递给数据库服务器。如果命令返回错误,它会在屏幕上显示。如果命令返回数据行,Webmin 会将其转换为 HTML 页面并显示在屏幕上。请注意,Webmin 是以 root 用户身份运行的,因此在执行命令时需要小心。

另见

  • Webmin 还可以帮助你执行保存于文件中的完整 SQL 脚本。有关更多信息,请参阅本章中的 从备份中恢复数据库

  • 你可以将常用的命令保存在 Webmin 的一个易于使用的控制面板中。有关更多信息,请查看 第四章,控制你的系统,中的 创建包含你常用的数据库命令的面板

  • 如果你发现需要一个更完整的、基于 Web 的 MySQL 管理工具,可以考虑安装 phpMyAdmin。本章的 安装 phpMyAdmin 说明了如何操作。

从备份中恢复数据库

数据库可能被存储为包含 SQL 指令的文本文件,这些指令可以重建数据库。如果你有一个 SQL 备份文件,可以使用 Webmin 恢复它。

准备工作

大型备份应在执行之前上传到服务器。如果您的备份文件很大,请将其上传到服务器并记录其位置。有关更多信息,请参阅 第六章 在您的系统上管理文件 中的 将文件上传到服务器 部分。

我们将把备份还原到现有数据库中。如果您还没有创建数据库,请先按照 创建新数据库 部分的说明进行操作。

怎么做……

按照以下步骤从备份中还原数据库或执行保存在文件中的 SQL 脚本:

  1. 转到 服务器 | MySQL 数据库服务器

  2. 单击代表您要还原备份的数据库的图标。

  3. 单击 执行 SQL 按钮。

  4. 选择 从文件运行 SQL 选项卡。

  5. 如果您已将文件上传到服务器,请选择 从本地文件 并在文本框中输入文件的位置。否则,请选择 从已上传文件 并从磁盘选择一个文件。

    提示

    Webmin 可以处理使用 gzip 或 bzip2 压缩的 SQL 文件。

  6. 单击 执行 按钮。

怎么工作……

Webmin 将整个 SQL 指令文件传送到 MySQL 服务器。服务器逐行执行文件中存储的每个指令,逐行重建数据库。

如果您想在终端中执行相同的任务,可以使用以下命令:

$ mysql database-name < backup-file.sql

还有更多内容……

Webmin 可以从诸如 Excel、Calc 或 Gnumeric 之类的电子表格程序创建的 CSV 文件中导入单个表到您的数据库中。

按照以下步骤导入 CSV 文件:

  1. 转到 服务器 | MySQL 数据库服务器

  2. 单击代表您要还原备份的数据库的图标。

  3. 单击 执行 SQL 按钮。

  4. 选择 导入文本文件 选项卡。

  5. 如果您已将文件上传到服务器,请选择 从本地文件 并在文本框中输入文件的位置。否则,请选择 从已上传文件 并从磁盘选择一个文件。

  6. 要导入数据的表 下拉列表中选择一个表。

  7. 字符集 设置为 utf8 (UTF-8 Unicode)

  8. 单击 执行 按钮。

您将看到一个信息屏幕,描述成功导入多少行或遇到了哪些错误。

编辑数据库结构

Webmin 允许您通过易于使用的界面快速修改 MySQL 数据库中表的结构。在本示例中,我们将演示如何执行以下任务列表:

  • 在数据库中创建表

  • 向数据库表添加列

  • 编辑列

  • 创建索引

  • 删除索引

  • 删除列

  • 删除数据库中的表

准备工作

为了演示目的,我们将使用一个名为 testdb 的数据库。您可以按照本章节 创建新数据库 部分的步骤通过 Webmin 创建一个带有此名称的数据库。

怎么做……

testdb数据库中,我们将创建一个名为people的表,并向该表添加一个名为name的列。然后,我们将更改该字段的宽度,将其设置为唯一索引,最后从数据库中删除索引、字段和表。

在数据库中创建表

为了在数据库中创建表,执行以下步骤:

  1. 导航到服务器 | MySQL 数据库服务器

  2. 点击表示testdb数据库的图标。

  3. 点击创建新表按钮。

  4. people指定为表名

  5. 表类型设置为myisam

    注意

    表类型选项指定该表使用的存储引擎。这决定了表的可用特性,例如myisam允许全文搜索索引,而innodb支持事务。您可以在 MySQL 手册中找到有关存储引擎的更多信息:

    dev.mysql.com/doc/refman/5.6/en/storage-engines.html

  6. 提供将作为此表主键的字段定义。填写以下字段定义:

    • 字段名id

    • 数据类型int

    • 类型宽度11

    • 自动递增

    • 允许空值

    在数据库中创建表

  7. 点击创建按钮。

向数据库表中添加字段

为了向数据库表中添加字段,执行以下步骤:

  1. 导航到服务器 | MySQL 数据库服务器

  2. 点击表示testdb数据库的图标。

  3. 点击表示people表的图标。

  4. 从类型下拉菜单中选择varchar并点击添加字段类型按钮。

  5. 填写以下字段定义:

    • 字段名name

    • 类型宽度80

    • 类型选项不区分大小写

    • 允许空值

    • 默认值NULL

    • 是主键的一部分吗?

  6. 点击创建按钮。

编辑字段

要编辑字段,执行以下步骤:

  1. 导航到服务器 | MySQL 数据库服务器

  2. 点击表示testdb数据库的图标。

  3. 点击表示people表的图标。

  4. 点击字段name的链接。

  5. 类型宽度设置为128

  6. 点击保存按钮。

创建索引

为了创建索引,执行以下步骤:

  1. 导航到服务器 | MySQL 数据库服务器

  2. 点击表示testdb数据库的图标。

  3. 点击表示people表的图标。

  4. 点击创建索引按钮。

  5. 索引名称设置为unique_name

  6. 索引中的字段列表中选择字段name

  7. 索引类型设置为唯一

  8. 点击创建按钮。

删除索引

要删除索引,执行以下步骤:

  1. 导航到服务器 | MySQL 数据库服务器

  2. 点击表示testdb数据库的图标。

  3. 点击表示unique_name索引的图标。

  4. 点击删除按钮。

删除字段

为了删除字段,执行以下步骤:

  1. 转到 服务器 | MySQL 数据库服务器

  2. 点击代表 testdb 数据库的图标。

  3. 点击代表 people 表的图标。

  4. 点击 name 字段的链接。

  5. 点击 删除 按钮。

从数据库中删除表

要从数据库中删除一张表,请执行以下步骤:

  1. 转到 服务器 | MySQL 数据库服务器

  2. 点击代表 testdb 数据库的图标。

  3. 点击代表 people 表的图标。

  4. 点击 删除表 按钮,并在随后的屏幕上确认。

它是如何工作的...

Webmin 为相应的 CREATEDROPALTER TABLE SQL 命令准备语法,执行这些命令,并以 root 用户身份在 MySQL 服务器上运行它们。

另请参见

  • 如果你发现需要一个更完整的基于网页的 MySQL 管理工具,可以考虑安装 phpMyAdmin。有关安装 phpMyAdmin 的详细信息,请参考 安装 phpMyAdmin 这一教程。

编辑数据库中的记录

Webmin 允许你通过简单的界面快速编辑 MySQL 数据库中的数据。在本教程中,我们将演示如何添加、编辑和删除数据库表中的记录。

准备工作

在本教程中,我们将使用基于在 创建新数据库编辑数据库结构 章节中创建的 testdb 数据库的示例。

如何执行...

我们将向 testdb 数据库中的 people 表添加一条记录;然后编辑同一条记录,最后删除它,以展示如何在 Webmin 中执行这些操作。

向数据库表添加一行

要向数据库表中添加一行,请执行以下步骤:

  1. 转到 服务器 | MySQL 数据库服务器

  2. 点击代表 testdb 数据库的图标。

  3. 点击代表 people 表的图标。

  4. 点击 查看数据 按钮。

  5. 点击 添加行 按钮。

  6. 在文本框中填写一个名字。

  7. 点击 保存 按钮。

编辑一行

要编辑一行,请执行以下步骤:

  1. 转到 服务器 | MySQL 数据库服务器

  2. 点击代表 testdb 数据库的图标。

  3. 点击代表 people 表的图标。

  4. 点击 查看数据 按钮。

  5. 勾选你希望编辑的记录旁边的复选框。

  6. 点击 编辑选中的行 按钮。

  7. 修改文本框中的姓名值。

  8. 点击 保存 按钮。

删除一行

要删除一行,请执行以下步骤:

  1. 转到 服务器 | MySQL 数据库服务器

  2. 点击代表 testdb 数据库的图标。

  3. 点击代表 people 表的图标。

  4. 点击 查看数据 按钮。

  5. 勾选你希望删除的记录旁边的复选框。

  6. 点击 删除选中的行 按钮。

它是如何工作的...

Webmin 为相应的 INSERTUPDATEDELETE SQL 命令准备语法,执行这些命令,并以 root 用户身份在 MySQL 服务器上运行它们。

另请参见

  • 如果你发现你需要一个更为完整的基于网页的 MySQL 管理工具,可以考虑安装 phpMyAdmin。具体步骤请参见 安装 phpMyAdmin 章节。

检查谁在使用你的数据库服务器

在调试网络连接性、审计安全性或仅仅是出于好奇时,你可能需要检查谁连接到你的数据库服务器。在 Webmin 中,这些信息只需几次点击即可获得。

操作步骤...

按照以下步骤操作:

  1. 导航到 服务器 | MySQL 数据库服务器

  2. 点击 数据库连接 图标。

你将看到一个活跃连接的列表,或者看到一条信息,表示除了 Webmin 之外,当前没有其他客户端连接到数据库。参考以下截图:

操作步骤...

工作原理...

Webmin 会查询你的 MySQL 服务器以获取有关活跃客户端连接的信息。你也可以通过在 MySQL 客户端中运行 SQL 命令 SHOW PROCESSLIST 来获得相同的信息:

mysql> SHOW PROCESSLIST;

你将看到以下输出:

+------+------+-----------+------+---------+------------------+
| Id   | User | Host      | db   | Command | Info             |
+------+------+-----------+------+---------+------------------+
| 5797 | root | localhost | NULL | Query   | SHOW PROCESSLIST |
+------+------+-----------+------+---------+------------------+
1 row in set (0.00 sec)

还有更多...

Webmin 还简化了关闭任何不必要连接的操作。客户端需要重新建立连接,才能继续使用数据库。

按照以下步骤关闭连接:

  1. 导航到 服务器 | MySQL 数据库服务器

  2. 点击 数据库连接 图标。

  3. 在活跃连接描述旁边标记复选框。

  4. 点击 终止选中的连接 按钮。

安装 phpMyAdmin

phpMyAdmin 是一个常用的 MySQL 数据库管理工具。它是一个基于网页的应用程序,像 Webmin 一样,但专门用于所有与 MySQL 服务器管理相关的任务。它易于使用,是数据库用户和管理员的得力工具。

注意

系统软件包已配置为在 Apache 上运行 phpMyAdmin。Apache Web 服务器和 PHP 作为软件包依赖项一起安装。如果你尚未使用 Apache 和 PHP,这将为你的数据库服务器暴露一个潜在的攻击入口。请考虑安装 phpMyAdmin 的安全影响,并确保其保持最新。

操作步骤...

按照以下步骤在你的系统上设置 phpMyAdmin:

  1. 安装名为 phpmyadmin(或根据你的系统选择 phpMyAdmin)的软件包。有关更多信息,请参见 安装软件包 章节,位于 第一章,设置你的系统

    提示

    在某些系统上,你可能需要添加一个额外的仓库来安装该软件包。例如,如果你使用的是 RedHat 系列的 Linux 发行版(如 RHEL、CentOS、Fedora 等),你应该添加 企业 Linux 的额外软件包EPEL)仓库。有关设置 EPEL 的信息,可以参见 通过 FTP 让用户访问你的服务器 章节,位于 第六章,管理你系统上的文件

  2. 由于 phpMyAdmin 运行在 Apache 之上,你应该确保该服务器已安装在你的系统中,并且能够通过浏览器访问。按照 第八章 中的 在系统上安装 Apache 配方,启动并运行 Apache。

  3. 访问以下 URL,但请将 webmin-host 替换为你的服务器的 IP 或域名:webmin-host/phpmyadmin

    提示

    在某些系统上,phpMyAdmin 被配置为仅允许来自本地主机的连接。如果你希望更改此行为,请前往 服务器 | Apache Web 服务器 | 默认服务器,选择 phpMyAdmin 目录的 每目录选项,然后更改其 访问控制 设置。更多信息请参阅 第八章 中的 设置目录、文件和位置的选项 这一配方,运行 Apache Web 服务器

    有关在你的系统发行版中设置 phpMyAdmin 所需的额外步骤的信息,可以在软件包文档文件中找到。请参阅 第一章 中的 阅读已安装软件的文档 配方,设置你的系统

  4. 现在你可以使用 MySQL 帐户的用户名和密码登录。

    注意

    phpMyAdmin 将以本地计算机连接的方式登录,因此将使用分配给 localhost 上帐户的权限。

它是如何工作的...

phpMyAdmin 是一个用 PHP 编写的应用程序。phpMyAdmin 的主配置文件名为 config.inc.php,通常安装在 /etc/ 目录下。不同发行版的示例位置列在下面的表格中。应用程序本身的代码以 PHP 脚本文件的形式存储在名为 phpMyAdmin 的目录中。

因为 phpMyAdmin 由 Apache 提供服务,所以安装包包括一个特定应用程序的配置文件,该文件将被 Web 服务器加载。此文件告诉 Apache phpMyAdmin 存储在哪个磁盘位置,以及它的哪些目录应该在 Web 上可用。

文件 操作系统 / 发行版 位置
phpMyAdmin 配置文件 Debian /etc/phpmyadmin/config.inc.php
CentOS /etc/phpMyAdmin/config.inc.php
OpenSUSE /etc/phpMyAdmin/config.inc.php
phpMyAdmin 文件 Debian /usr/share/phpmyadmin
CentOS /usr/share/phpMyAdmin
OpenSUSE /srv/www/htdocs/phpMyAdmin
phpMyAdmin 的 Apache 配置文件 Debian /etc/phpmyadmin/apache.conf
CentOS /etc/httpd/conf.d/phpMyAdmin.conf
OpenSUSE /etc/apache2/conf.d/phpMyAdmin.conf

无论包维护者如何决定准备它,你都可以通过进入Servers | Apache Webserver | Default Server,并为 phpMyAdmin 目录选择每目录选项,来调整 Apache 配置。

还有更多内容...

phpMyAdmin 是一个功能非常强大的工具,你可以在其文档中找到关于如何使用它的详细信息:docs.phpmyadmin.net/en/latest/

第十章:运行 PostgreSQL 数据库服务器

本章将介绍以下内容:

  • 安装 PostgreSQL 数据库服务器

  • 定位 PostgreSQL 服务器配置文件

  • 允许通过网络访问 PostgreSQL

  • 通过 SSH 隧道访问 PostgreSQL 服务器

  • 创建新数据库

  • 创建用户并授予权限

  • 创建数据库的备份

  • 执行自定义 SQL 命令

  • 从备份恢复数据库

  • 编辑数据库结构

  • 编辑数据库中的记录

  • 安装 phpPgAdmin

介绍

PostgreSQL 是一个强大的开源关系 数据库管理系统DBMS)。它具有强大的类型系统和高级编程功能。这使得它能够存储和处理复杂值,如地理坐标、JSON 对象和数组。

PostgreSQL 使用分布式客户端-服务器架构,这意味着数据库服务器和客户端应用程序可以在不同的机器上运行。如果客户端和服务器在同一系统上运行,它们可以使用 Unix 套接字进行通信;否则,它们通过网络使用 TCP 套接字进行通信。PostgreSQL 服务器默认使用端口号 5432,但如果需要,可以更改此设置。

注意

Unix 域套接字是用于进程间通信的通道。运行在同一台机器上的不同程序可以读写套接字信息,从而实现程序之间的通信。Unix 套接字作为文件系统的节点进行表示,因此你可以通过列出创建它的目录的内容来找到一个套接字。

PostgreSQL 数据库管理系统(DBMS)非常流行,大多数操作系统发行版都提供了其易于安装的软件包。每个 PostgreSQL 服务器都托管一个 集群,该集群由一组数据库、相关的配置文件和正在运行的进程组成。在某些系统上,集群必须在安装软件包后初始化。初始化会创建集群的目录结构,并用标准数据库填充它。标准数据库 template1 扮演着特殊的角色,因为所有新数据库默认都是以它为模板创建的。

PostgreSQL 系统的安装涉及创建一个特殊用户,通常命名为 postgres。该用户对你的数据库拥有完全的管理员控制权限,Webmin 将以该用户身份运行大多数数据库命令和脚本。

Webmin 允许你执行与 PostgreSQL 数据库服务器运行相关的许多任务。在本章中,我们将演示如何通过 Webmin 安装 PostgreSQL、设置通过网络访问服务器、管理用户账户、创建数据库并编辑其结构和数据。我们还将演示如何自动备份数据库并恢复备份文件。如果你发现需要一个更高级的基于 Web 的管理工具,我们将演示如何在服务器上设置 phpPgAdmin。

安装 PostgreSQL 数据库服务器

大多数带有开源软件包管理解决方案的操作系统都提供 PostgreSQL 软件包以供安装。在本食谱中,我们将从软件包安装 PostgreSQL,并在你的系统上进行设置。安装服务器软件包时,会自动安装 PostgreSQL 命令行客户端软件包。

如何操作...

执行以下步骤安装 PostgreSQL 数据库服务器:

  1. 按照第一章中安装软件包的步骤,设置你的系统,查找并安装 PostgreSQL 数据库服务器软件包。

    注意

    在大多数软件包仓库中,PostgreSQL 服务器的软件包简单地命名为postgresql-server。如果你的发行版允许你选择不同版本的 PostgreSQL,则软件包名称将包含版本号,例如postgresql-9.1postgresql93-server。除非你有理由坚持使用旧版本,否则选择包含最新版本的软件包。

  2. 点击 Webmin 主菜单底部的刷新模块链接,并重新加载浏览器以更新菜单。

  3. 进入服务器 | PostgreSQL 数据库服务器。你应该能看到一个列出已安装数据库的界面,其中应包含postgresqltemplate1等默认数据库。

  4. 如果你没有看到数据库列表,而是看到一个表示数据库系统尚未初始化的消息,请点击初始化数据库按钮。

    提示

    在屏幕底部,如果你看到消息警告:你的系统上没有安装 Perl 模块 DBI 和 DBD::Pg,点击链接并按照 Webmin 的说明安装缺失的 Perl 模块。

  5. 进入系统 | 启动与关机,并验证初始化脚本postgresql是否设置为开机启动。如果没有,选中它的复选框,并点击立即启动并开机启动按钮。

工作原理...

Webmin 帮助你从发行版的仓库中找到并安装postgresql-server软件包。该软件包安装数据库服务器、客户端以及一个初始化脚本,用于在系统启动时启动服务器。

在 Postgres 用于管理数据库之前,必须创建一个新的集群。PostgreSQL 集群是由单一服务器管理的一组数据库。创建集群涉及创建一个目录,在其中存储数据库文件,并用一些标准数据库填充它。名为template1的标准数据库起着特殊的作用,因为集群中的所有新数据库将通过复制该模板来创建。

如果你的软件包安装脚本没有为你初始化数据库集群,可以通过点击初始化数据库按钮请求 Webmin 来完成此操作。这将运行初始化脚本的以下子命令:

 /etc/rc.d/init.d/postgresql initdb

另见

  • 如果你想允许其他计算机访问你的数据库,请查看食谱允许通过网络访问 PostgreSQL

定位 PostgreSQL 服务器配置文件

PostgreSQL 服务器的主配置文件通常名为postgresql.conf,默认情况下存储在数据库集群的数据目录中。不同的系统发行版会将该配置文件移动到数据目录外部并放置在其他位置,例如/etc/目录。在本教程中,我们将演示如何查找postgresql.conf并修改它以调整服务器配置。Webmin 不会帮助你修改 PostgreSQL 的基本设置,因此你需要手动编辑配置文件。

准备工作

确保已经安装并运行了 PostgreSQL 服务器,并且在开始之前你能够通过 Webmin 连接到它。关于此的详细信息,请参考安装 PostgreSQL 数据库服务器

如何操作...

按照以下步骤定位系统中 PostgreSQL 的主配置文件:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击默认数据库的图标,postgres

  3. 点击执行 SQL按钮。

  4. 在提供的文本框中输入以下 SQL 命令:

    SHOW config_file;
    
  5. 点击执行按钮,你将看到 SQL 命令的输出,其中提供了主服务器配置文件的完整路径,如下图所示:如何操作...

工作原理...

当初始化脚本启动 PostgreSQL 服务器时,它可能会指定数据库集群数据目录的位置或服务器主配置文件的位置(通常叫做postgresql.conf)。默认情况下,主配置文件存储在数据目录内部,但软件包维护者通常将其移到不同的位置(例如/etc/),以便保持系统配置文件的整洁。SQL 命令SHOW config_file;可以用来检查主配置文件的位置。

还有更多...

其他配置文件的位置和其他设置的值也可以使用 SQL SHOW命令显示。

确定其他配置文件和数据文件的位置

使用以下命令检查其他配置文件的位置:

设置 命令
主配置文件(postgresql.conf SHOW config_file;
数据目录 SHOW data_directory;
基于主机的访问配置文件(pg_hba.conf SHOW hba_file;
身份映射文件(pg_ident.conf SHOW ident_file;
Unix 域套接字创建目录 SHOW unix_socket_directory;

检查其他设置的值

你也可以通过发出以下命令来显示所有设置的值:

SHOW all;

允许通过网络访问 PostgreSQL

访问 PostgreSQL 数据库的程序(称为客户端)可能与服务器运行在同一台机器上。在这种情况下,客户端和服务器将通过 Unix 域套接字进行高效通信,Unix 域套接字是一种通过文件系统(如文件或目录)访问的进程间通信通道。对套接字的访问受文件系统权限控制。

其他客户端程序可能只能通过 TCP 网络套接字进行通信。这些客户端可以通过回环接口和127.0.0.1的 IP 地址连接到本地服务器。

然而,如果客户端程序位于不同于服务器的机器上,则它们之间的通信必须通过网络使用 TCP 协议进行。对于 PostgreSQL,有多种方式可以设置网络连接。最有效但最不安全的方法是使用客户端与服务器之间的直接未加密连接。这种方法的缺点是未加密的信息可能会在网络传输过程中被窃听或篡改。由于数据库系统通常设计为尽可能高效,因此这种通信方式被广泛使用,但只能在安全的网络内部部署。在本教程中,我们将描述如何启用这种通信方式。

提示

为了使 PostgreSQL 服务器的网络访问更加安全,您可以选择使用 SSL 加密传输的信息。这可以防止窃听和中间人攻击,但会暴露 PostgreSQL 服务器的网络端口,可能会受到暴力破解密码和其他攻击的威胁。

如果您确实需要安全性,例如通过互联网访问您的数据库服务器,您可能应该选择第三种方式:通过加密的 SSH 隧道发送 PostgreSQL 流量。这是上述传输方法中效率最低的一种,但它带来的安全问题最少。有关更多信息,请查看教程通过 SSH 隧道访问 PostgreSQL 服务器

准备工作

在本教程中,我们将准备您的 PostgreSQL 服务器以接受传入的网络连接。为了测试连接,我们需要访问两台连接到同一网络的计算机:服务器和客户端机器。在开始之前,请记下服务器和客户端的 IP 或域名。

如何操作...

本教程中的步骤将分为五个部分:

  • 首先,我们将指示 PostgreSQL 在标准端口(5432)上监听传入的网络连接。

  • 接下来,我们将创建一个名为dbuser的数据库用户。

  • 然后,我们将创建一个名为testtdb的数据库。

  • 我们将允许远程访问数据库。

  • 最后,我们将通过从辅助客户端机器连接到我们的服务器来测试设置。

执行以下步骤,指示 PostgreSQL 服务器监听网络连接:

  1. 按照配方《通过防火墙允许访问服务》中的步骤,在第三章《保护您的系统》中,允许 TCP 流量通过防火墙进入 5432 端口。

  2. 查找 PostgreSQL 主服务器配置文件(postgresql.conf)的位置。有关详细说明,请参阅配方《定位 PostgreSQL 服务器配置文件》。

  3. postgresql.conf文件中,找到包含listen_addresses指令的行。该行可能被注释掉(以#字符开头)。将该行更改为以下内容:

    listen_addresses = '*'
    

    提示

    在服务器上编辑文件的最有效方式是使用 Vim 或 Nano 等编辑器在终端会话中进行(例如,通过 SSH)。但是,要对配置文件进行小的更改时,您无需离开 Webmin。请查看第六章《管理系统中的文件》配方中的在服务器上编辑文件部分。

  4. 在进行配置更改后,我们必须重启服务器。导航到服务器 | PostgreSQL 数据库服务器,点击停止 PostgreSQL 服务器按钮,然后点击启动 PostgreSQL 服务器按钮。

现在,您的 PostgreSQL 服务器将监听端口 5432 上的传入网络连接。

执行以下步骤以创建新用户:

  1. 导航到服务器 | PostgreSQL 数据库服务器 | PostgreSQL 用户

  2. 点击创建新用户链接。

  3. 用户名设置为dbuser,并在密码字段中设置一个强密码。

  4. 可以创建数据库?可以创建用户?的问题选择

  5. 有效期至设置为永久如何操作...

  6. 点击创建按钮。

执行以下步骤以创建数据库:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击创建新数据库链接。

  3. 数据库名称设置为testdb

  4. 所有者用户设置为dbuser

  5. 模板数据库设置为template1如何操作...

  6. 点击创建按钮。

执行以下步骤以授予用户远程访问数据库的权限:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击允许的主机图标。

  3. 点击创建新允许的主机链接。

  4. 主机地址设置为单一主机,并输入客户端计算机的 IP 地址(例如,10.10.10.100)。

    提示

    如果客户端可以从多个 IP 连接,您可以通过提供网络和子网掩码或 CIDR 长度来指定子网。例如,要允许10.10.10.*子网中的所有计算机访问,您可以指定网络为10.10.10.0,并选择子网掩码255.255.255.0或 CIDR 长度24

  5. 需要 SSL 连接?设置为

    提示

    不使用 SSL 可以减少一些性能开销,但只有在完全信任的网络上才能这样做。

  6. 数据库设置为testdb

  7. 用户设置为列出用户并输入dbuser

  8. 身份验证模式设置为MD5 加密密码如何操作...

  9. 点击创建按钮。

  10. 我们需要重新启动服务器一次,以加载新的访问配置。导航到服务器 | PostgreSQL 数据库服务器,点击停止 PostgreSQL 服务器按钮,然后点击启动 PostgreSQL 服务器按钮。

    提示

    在繁忙的生产系统中,不必要地重启数据库服务器是一个不好的主意,尽管这是重新加载所有设置的可靠方法。在更改访问设置后,实际上不需要重启服务器。您可以改为发送一个SIGHUP信号。该信号指示 Postgres 重新加载其配置。在配备有pg_ctl程序的系统上,可以通过发出以下命令来实现:

    $ sudo pg_ctl reload
    
    

    在具有pg_ctlcluster命令的系统上,您需要指定服务器版本和集群名称,例如:

    $ sudo pg_ctlcluster 9.1 main reload
    
    

为了测试连接,尝试从我们指定的 IP 的客户端机器连接到您的数据库服务器。如果您的另一台机器上安装了 PostgreSQL 命令行客户端,您可以在终端中输入以下命令来测试连接。但请将postgresql-host替换为您的 Postgres 服务器的 IP 或域名,如下所示:

$ psql -h postgresql-host -U dbuser testdb
testdb=# \q

如果连接成功,您应该会看到 PostgreSQL 提示符(testdb=#)。输入\q并按Enter退出。

它是如何工作的...

为了启用对 PostgreSQL 数据库服务器的网络访问,我们需要修改两个配置文件。我们手动编辑了主配置文件(postgresql.conf),指示服务器监听所有网络接口上的传入网络连接。第二个文件通过 Webmin 的界面进行了编辑,是基于主机的身份验证配置文件(pg_hba.conf)。该文件指示服务器允许哪些用户从哪些网络主机连接,并要求他们如何进行身份验证。

Webmin 将以下行添加到pg_hba.conf

hostssl testdb dbuser 10.10.10.100 255.255.255.255 md5

前一行指示服务器接受来自 IP 地址10.10.10.100dbuser用户对testdb数据库的 SSL 连接。要求用户提供一个 MD5 加密的密码进行身份验证。

pg_hba.conf中的另一行可能如下所示:

local    all    postgres    peer

这一行指示服务器接受通过 Unix 套接字进行的本地连接。这些连接使用peer身份验证方法,它检查运行连接客户端程序的系统账户的用户名。如果系统用户名与 Postgres 账户名匹配,则该连接被视为已通过身份验证。在peer身份验证中不会执行密码检查。前一行代码将允许系统账户postgres访问所有数据库。

另见

  • 为了使 PostgreSQL 数据库的远程访问和管理更加安全,你可以通过 SSH 隧道化连接。有关说明,请查看配方 通过 SSH 隧道访问 PostgreSQL 服务器

通过 SSH 隧道访问 PostgreSQL 服务器

如果你的服务器正在互联网上托管一个网站,并且在同一台机器上运行数据库系统,那么禁用数据库的远程网络访问是更安全的。另一方面,你可能仍然希望远程管理你的数据库。你可以通过将 PostgreSQL 流量通过 SSH 连接进行隧道化来实现这一点。

注意

数据库系统的一个重要方面是它能够多快地查找并返回你请求的数据。通过 SSH 隧道传输流量将为这种通信增加显著的开销。这个解决方案非常适合间歇性的管理任务,但不适合作为直接连接到数据库系统的替代方案。

准备工作

在通过 SSH 隧道访问 PostgreSQL 服务器之前,你需要确保在 pg_hba.conf 文件中存在一个允许的主机条目。该条目应该允许来自回送 IP 127.0.0.1 的用户使用 MD5 加密的密码进行身份验证。有关更多信息,请查看配方 允许通过网络访问 PostgreSQL。在 pg_hba.conf 文件中的适当条目如下所示:

# IPv4 local connections:
host    all    all    127.0.0.1/32    md5

你想连接的服务器必须同时运行 PostgreSQL 服务器和 SSH 服务器。远程客户端机器必须安装 SSH 客户端和 PostgreSQL 客户端软件。请记录下服务器的 IP 地址或域名(postgresql-host)、SSH 用户名(ssh-user)、PostgreSQL 用户(postgresql-user)和数据库名称(database-name)。在下面的步骤中用它们替换相应内容。

如何执行此操作...

为了创建一个 PostgreSQL 的 SSH 隧道,请按照以下步骤操作:

  1. 在客户端机器上执行以下命令:

    $ ssh -N -L 15000:localhost:5432 ssh-user@postgresql-host
    
    

    这将在客户端机器的 15000 端口与服务器的 5432 端口之间创建一个隧道。你现在可以通过连接到客户端计算机的本地 15000 端口来访问远程数据库。

  2. 在客户端系统上执行以下命令以测试连接:

    $ psql -h 127.0.0.1 -p 15000 -U postgresql-user database-name
    
    

它是如何工作的...

SSH 客户端充当你机器上运行的 PostgreSQL 客户端和远程服务器之间通信的中介。它在客户端机器上打开 15000 端口,并监听传入连接。所有到达 15000 端口的数据包都会被加密,并通过 SSH 转发到服务器。在服务器端,SSH 接收这些数据包,解密后将它们发送到 5432 端口。答案会沿相同的通道反向发送回来。

另请参阅

  • 有许多工具可以让你连接和控制 PostgreSQL 数据库。Webmin 提供了多种工具来执行大多数常见任务,相关配方在本章中有描述。

  • 一个更强大的基于 Web 的 PostgreSQL 解决方案是 phpPgAdmin。它在食谱中有所讨论,安装 phpPgAdmin

  • 关于 SSH 隧道的更多信息,请参考食谱,通过 SSH 隧道安全连接到 Webmin,第三章,保护您的系统

创建新数据库

通过 Webmin 界面创建 PostgreSQL 数据库非常快捷简便。

如何操作...

按照以下步骤创建数据库:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击创建新数据库链接。

  3. 输入数据库名称,例如new_db

  4. 所有者下拉菜单中选择将拥有数据库管理权限的用户。

  5. 字符集编码数据库文件路径保持为默认

  6. 模板数据库设置为template1

  7. 点击创建按钮。

工作原理...

Webmin 会根据你提供的信息,通过连接 PostgreSQL 服务器并执行以下命令来创建一个新数据库:

CREATE DATABASE new_db WITH OWNER="dbuser" TEMPLATE = template1;

Postgres 通过复制所选模板来创建新数据库。数据库template1默认安装,用作新创建数据库的默认设置源。如果你希望新数据库具有不同的设置,例如字符集和排序规则,你可以对模板数据库进行这些更改。

创建数据库的另一种方式是以用户postgres执行createdb命令,例如:

postgres@postgresql-host:~$ createdb --owner dbuser new_db

另见

  • 如果你有初始数据库结构或内容,可以通过 SQL 命令文件将它们上传到服务器。有关更多信息,请查看食谱,执行自定义 SQL 命令

创建用户并授予权限

通过 Webmin 创建 PostgreSQL 用户非常简单。用户可以被指定为新创建数据库的所有者,并拥有完全访问和管理权限。用户也可以被授予特定数据库表的有限权限。

如何操作...

在本食谱中,我们将创建一个名为dbuser的新用户,并在名为testdb的数据库中的表dbtable上授予选定的权限。

按照以下步骤创建用户:

  1. 导航到服务器 | PostgreSQL 数据库服务器 | PostgreSQL 用户

  2. 点击创建新用户链接。

  3. 用户名设置为dbuser,并在密码字段中设置强密码。

  4. 可以创建数据库吗?可以创建用户吗?问题选择

  5. 有效期至设置为永久

  6. 点击创建按钮。

按照以下步骤在数据库表上授予用户权限:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击已授予权限图标。

  3. 点击要修改权限的数据库对象名称(例如,表名dbtable)。

  4. 用户下拉菜单中选择用户dbuser

  5. 勾选你希望授予的权限旁边的复选框:如何操作...

  6. 点击 保存 按钮。

它是如何工作的...

Webmin 通过连接到 PostgreSQL 服务器并执行以下命令来创建一个新的数据库用户:

CREATE USER 'dbuser' WITH PASSWORD '***' NOCREATEDB NOCREATEUSER;

创建数据库用户的另一种方法是以 postgres 用户身份执行 createuser 命令,例如:

postgres@postgresql-host:~$ createuser dbuser
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n

权限通过 GRANT 命令分配给用户,例如:

GRANT SELECT,UPDATE,INSERT,DELETE ON "public"."dbtable" to 'dbuser';

PostgreSQL 手册提供了以下权限定义:

权限 定义
SELECT 允许从指定表的任何列执行 SELECT 操作。
UPDATE 允许对指定表的任何列执行 UPDATE 操作。
INSERT 允许在指定表中插入新行。
DELETE 允许从指定表中删除一行。
RULE 允许在表上创建规则。
REFERENCES 要创建外键约束,必须在引用表和被引用表上都拥有此权限。
TRIGGER 允许在指定表上创建触发器。

还有更多...

PostgreSQL 并不容易授予整个数据库的权限。为了授予名为 dbuser 的用户访问 public schema 中所有表的权限,可以执行以下命令:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO 'dbuser';

注意

PostgreSQL 数据库可能会被划分为 schemas。每个 schema 包含一组独立于其他 schema 的表,并且可能使用不同的用户权限。默认情况下,每个数据库仅包含一个名为 public 的 schema,所有表都分配给它。

插入新对象也需要对序列对象的访问权限,可以按如下方式授予:

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;

不幸的是,当你向数据库添加新表或添加另一个 schema 时,你将不得不重新执行这些命令。另一种选择是通过使用 ALTER DEFAULT PRIVILEGES 命令设置对象的默认权限:

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON TABLES TO 'dbuser';
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON SEQUENCES TO 'dbuser';

另见

创建数据库备份

Webmin 可以帮助你备份 PostgreSQL 数据库。只需几次点击,你就可以备份任何数据库。Webmin 还可以帮助你设置 cron 作业,定期自动创建备份。

准备工作

在开始之前,创建一个目录来存储本地备份文件。你可以将这些文件保存在根目录的 /backups/root/backups 或你觉得方便的任何位置。

备份目录应由postgres用户拥有,并且仅限该用户访问。有关更多信息,请查看第六章,管理文件,其中包含“更改文件所有权和权限”的相关内容。

要获取有关备份的一般背景信息,请参考第七章,备份系统

如何操作...

按照以下步骤创建数据库备份:

  1. 转到服务器 | PostgreSQL 数据库服务器

  2. 点击表示您想要备份的数据库的图标。

  3. 点击备份按钮。

  4. 备份文件路径设置为/backups/database-name.sql

  5. 备份文件格式设置为纯 SQL 文本

    注意

    备份将作为一系列 SQL 语句以纯文本格式存储。如果您正在导出一个大型数据库,请使用压缩的自定义归档格式。

  6. 要备份的表设置为所有表

  7. 点击立即备份按钮。

它是如何工作的...

Webmin 执行pg_dump命令,输出一系列 SQL 命令,这些命令用于重新创建整个数据库。该命令以具有数据库管理员访问权限的用户身份运行。在大多数系统中,该用户被称为postgres

数据库转储将保存到指定的输出文件中。如果您想在终端中执行相同的备份操作,您可以运行如下命令:

postgres@postgresql-host:~$ pg_dump -U postgres -f /backups/database-name.sql database-name

还有更多...

Webmin 是一个非常强大的备份工具。以下是一些其他容易访问的功能。

自动备份所有数据库

Webmin 可以帮助您自动备份服务器托管的部分或所有数据库。这些备份将由 cron 按常规计划执行。

  1. 转到服务器 | PostgreSQL 数据库服务器

  2. 点击备份数据库按钮。

  3. 备份到目录设置为您的备份目录的位置,例如/backups

  4. 备份文件格式设置为自定义归档

    注意

    自定义归档格式经过压缩以节省磁盘空间。它也非常灵活,允许在恢复阶段手动选择归档项目。

  5. 打开备份计划部分。

  6. 启用定期备份?设置为是,在下面选择的时间;设置简单计划并选择每天(午夜时分)

    注意

    请注意,系统中可能有许多任务被安排在午夜启动,因此如果系统资源有限,您可以选择其他时间。通过标记任务要执行的分钟、小时和日期,选择更复杂的计划。

  7. 点击保存按钮。

将数据库表导出为 CSV

Webmin 可以将您数据库的单个表导出为 CSV 文件,该文件可以被 Excel、Calc 或 Gnumeric 等电子表格程序打开:

  1. 转到服务器 | PostgreSQL 数据库服务器

  2. 点击数据库的图标,然后点击您想要导出的表的图标。

  3. 点击导出为 CSV按钮。

  4. 文件格式设置为带引号的 CSV

  5. 在 CSV 中包含列名?设置为

  6. 导出目标设置为在浏览器中显示

  7. 点击立即导出按钮。

另见

  • 你可以使用网络文件共享协议(如 NFS 或 CIFS)轻松地将备份存储到远程主机。首先,你需要在远程服务器上创建一个网络卷,然后将该卷挂载到你的服务器上。然后,你可以像操作本地目录一样,轻松地将数据备份到远程系统的目录中。有关如何使用 NFS 或 CIFS 设置网络文件共享的说明,请查看第六章,管理系统中的文件

  • 另一个将数据库备份副本远程存储的方法是通过 SSH 协议将备份目录发送到远程服务器。有关更多信息,请查看第七章,备份到远程主机部分。

执行自定义 SQL 命令

Webmin 提供了一个简单的界面与您的 Postgres 数据库服务器交互,允许你执行任意 SQL 命令。当你想快速查找数据库中的某些内容或对多行数据执行批量更新时,这是一个非常有用的功能。

如何操作...

执行以下步骤以执行自定义 SQL 命令:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击代表你希望使用的数据库的图标。

  3. 点击执行 SQL按钮。

  4. 在文本框中输入 SQL 命令,例如:

    CREATE TEMPORARY TABLE IF NOT EXISTS films (
        title varchar(40)
    );
    INSERT INTO films(title) VALUES ('Bananas'), ('Yojimbo');
    SELECT * FROM films;
    

    如何操作...

  5. 点击执行按钮。

你将看到由SELECT命令返回的数据的可排序显示。展示的数据来自第一个命令创建的临时films表。临时表在创建它们的客户端断开连接时不会被存储,因此你以后在数据库中看不到这个表。

它是如何工作的...

Webmin 仅将 SQL 命令传递给数据库服务器。如果命令返回错误,将在屏幕上显示。如果命令返回数据行,Webmin 会将其转换为 HTML 页面并在屏幕上显示。请注意,Webmin 是以管理员用户(postgres)身份运行的,因此在执行命令时要小心。

还有更多...

Webmin 还允许你执行保存在文件中的 SQL 脚本。这些脚本可以用于从纯 SQL 文本备份恢复数据库。

从文件执行 SQL 脚本

执行以下步骤从文件执行 SQL 脚本:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击代表你希望使用的数据库的图标。

  3. 点击执行 SQL按钮。

  4. 选择从文件运行 SQL选项卡。

  5. 如果你已将文件上传到服务器,选择从本地文件并在文本框中输入文件的位置。否则,选择从上传的文件并从你的磁盘中选择一个文件。

  6. 点击执行按钮。

另见

  • 你可以将经常执行的命令保存在 Webmin 中的一个易于使用的控制面板里。有关更多信息,请查看 第四章 控制你的系统 中的食谱,创建一个面板来执行你经常执行的数据库命令

  • 如果你发现需要一个更全面的 Web 基于 PostgreSQL 的管理工具,可以考虑安装 phpPgAdmin。该过程在 安装 phpPgAdmin 食谱中有详细描述。

从备份恢复数据库

Postgres 数据库的备份是通过 pg_dump 命令创建的,该命令可以输出多种格式。默认情况下,备份会作为普通的 SQL 脚本文件创建,但压缩的自定义 PostgreSQL 格式更加高效。Webmin 帮助你以这两种格式以及 TAR 格式创建备份。

恢复数据库的方法将取决于备份时选择的文件格式。如果你选择了普通的 SQL 文本格式,只需运行备份脚本即可恢复数据库。有关更多信息,请查看食谱,执行自定义 SQL 命令

如果你选择了自定义存档或 TAR 文件格式,你应该使用本食谱中描述的过程。

如何操作……

按照以下步骤从备份恢复数据库:

  1. 导航到 服务器 | PostgreSQL 数据库服务器

  2. 点击代表你希望恢复的数据库图标。

  3. 点击 恢复 按钮。

  4. 选择 从上传的文件恢复,点击 浏览,然后从你的计算机中选择文件。

    提示

    如果备份文件大于几 MB,最好先将文件上传到服务器,然后再执行恢复操作。有关更多信息,请查看 第六章 管理你的系统上的文件 中的食谱,上传文件到服务器

  5. 只恢复数据,不恢复表? 设置为

  6. 恢复前删除表? 设置为

  7. 恢复的表 设置为 备份文件中的所有表

  8. 点击 恢复 按钮。

它是如何工作的……

Webmin 将你的文件上传到服务器,然后执行 pg_restore 命令,将备份的内容加载到数据库中。如果你希望在终端中恢复备份,可以运行类似以下的命令:

postgres@postgresql-host:~$ pg_restore -c -d database-name backup-file.post

命令行选项如下所示:

  • -c:此选项会在重新创建数据库对象之前删除它们。

  • -d:此选项指定你希望恢复的数据库。

还有更多……

Webmin 可以从 CSV 文件中将数据导入到数据库表中,CSV 文件可以通过 Excel、Calc 或 Gnumeric 等电子表格程序创建。

按照以下步骤从格式正确的 CSV 文件中恢复数据库表:

  1. 导航到 服务器 | PostgreSQL 数据库服务器

  2. 点击代表你希望导入数据的数据库图标。

  3. 点击 执行 SQL 按钮。

  4. 选择 导入文本文件 标签。

  5. 如果你将文件上传到服务器,请选择 从本地文件 并在文本框中输入文件的位置。否则,选择 从上传文件 并从磁盘中选择一个文件。

  6. 导入数据的表 下拉菜单中选择一个表。

  7. 首先删除表中的数据 设置为

  8. 忽略重复行 设置为

  9. 文件格式 设置为 带引号的 CVS

    提示

    当从你的电子表格程序导出数据时,你必须选择相同的格式。如果遇到问题,尝试其他格式。

  10. 点击 执行 按钮。

你将看到一个信息屏幕,描述成功导入了多少行或遇到了哪些错误。

编辑数据库结构

Webmin 允许你通过一个易于使用的界面快速修改 PostgreSQL 数据库中表的结构。在本节中,我们将演示如何执行以下任务:

  • 在数据库中创建一个表

  • 向数据库表中添加一个字段

  • 创建一个索引

  • 删除一个索引

  • 删除一个字段

  • 删除数据库中的表

准备工作

为了演示目的,我们将使用名为 testdb 的数据库。你可以通过 Webmin 按照本节中的步骤创建一个同名的数据库,创建一个新数据库

如何操作...

testdb 数据库中,我们将创建一个名为 people 的表,并向该表添加一个名为 name 的字段。然后,我们将更改字段的名称,添加一个唯一索引,最后从数据库中删除该索引、字段和表。

执行以下步骤以在数据库中创建一个表:

  1. 导航到 服务器 | PostgreSQL 数据库服务器

  2. 点击代表 testdb 数据库的图标。

  3. 点击 创建表 按钮。

  4. 指定 people表名

  5. 提供将作为该表主键的字段定义。填写以下字段定义:

    • 字段名称 中输入 id

    • 数据类型 中输入 serial

    • 勾选 主键唯一 复选框。

    • 取消勾选 数组允许空值 复选框:

    如何操作...

  6. 点击 创建 按钮。

执行以下步骤以向数据库表中添加一个字段:

  1. 导航到 服务器 | PostgreSQL 数据库服务器

  2. 点击代表 testdb 数据库的图标。

  3. 点击代表 people 表的图标。

  4. 从类型下拉菜单中选择 varchar 并点击 添加字段类型 按钮。

  5. 填写以下字段定义:

    • 字段名称name

    • 类型宽度80

    • 数组字段

  6. 点击 创建 按钮。

执行以下步骤以创建一个索引:

  1. 导航到 服务器 | PostgreSQL 数据库服务器

  2. 点击代表 testdb 数据库的图标。

  3. 点击代表 people 表的图标。

  4. 点击 创建索引 按钮。

  5. 索引名称 设置为 unique_name

  6. 索引中的字段 列表中选择字段 name

  7. 索引类型 设置为 唯一

  8. 点击创建按钮。

执行以下步骤以删除一个索引:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击代表testdb数据库的图标。

  3. 点击代表unique_name索引的图标。

  4. 点击删除按钮。

执行以下步骤以删除一个字段:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击代表testdb数据库的图标。

  3. 点击代表people表的图标。

  4. name字段旁边勾选复选框。

  5. 点击删除选定字段按钮。

执行以下步骤以从数据库中删除一个表:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击代表testdb数据库的图标。

  3. 点击代表people表的图标。

  4. 点击删除表按钮,并在随后的屏幕中确认。

它是如何工作的...

Webmin 为适当的CREATEDROPALTER TABLE SQL 命令准备语法,并作为postgres用户在你的 PostgreSQL 服务器上执行这些命令。

另见

  • 如果你发现需要一个更完整的基于网页的 PostgreSQL 管理工具,可以考虑安装 phpPgAdmin。安装过程在《安装 phpPgAdmin》一节中有描述。

编辑数据库中的记录

Webmin 允许你通过简单的界面快速编辑 PostgreSQL 数据库中的数据。在本食谱中,我们将演示如何在数据库表中添加、编辑和删除记录。

准备中

在本食谱中,我们将使用基于testdb数据库和在食谱《编辑数据库结构》中创建的people表的示例。

如何操作...

我们将向testdb数据库的people表中添加一条记录;我们将编辑相同的记录,最后删除它,展示如何在 Webmin 中执行这些操作。

执行以下步骤以向数据库表中添加一行:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击代表testdb数据库的图标。

  3. 点击代表people表的图标。

  4. 点击查看数据按钮。

  5. 点击添加行按钮。

  6. 填写数字id并在文本框中输入name

  7. 点击保存按钮。

执行以下步骤以编辑一行:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击代表testdb数据库的图标。

  3. 点击代表people表的图标。

  4. 点击查看数据按钮。

  5. 在你想要编辑的记录旁边勾选复选框。

  6. 点击编辑选定行按钮。

  7. 更改文本框中的name值。

  8. 点击保存按钮。

执行以下步骤以删除一行:

  1. 导航到服务器 | PostgreSQL 数据库服务器

  2. 点击代表testdb数据库的图标。

  3. 点击代表people表的图标。

  4. 点击查看数据按钮。

  5. 在你想要编辑的记录旁边勾选复选框。

  6. 点击删除选定行按钮。

它是如何工作的...

Webmin 准备了适当的语法,用于执行 INSERTUPDATEDELETE SQL 命令,并作为 postgres 用户在 PostgreSQL 服务器上执行这些命令。

另请参见

  • 如果您发现需要一个功能更全的、基于 Web 的 PostgreSQL 管理工具,请考虑安装 phpPgAdmin。有关详细信息,请参见《安装 phpPgAdmin》食谱。

安装 phpPgAdmin

phpPgAdmin 是一个用于 PostgreSQL 的数据库管理工具。它是一个基于 Web 的应用程序,类似于 Webmin,但专门用于 PostgreSQL 服务器的管理任务。它易于使用,可以成为数据库用户和管理员的有力工具。

注意

系统软件包已配置为在 Apache 上运行 phpPgAdmin。Apache Web 服务器和 PHP 被安装为包依赖项。如果您尚未使用 Apache 和 PHP,这可能会暴露数据库服务器的潜在攻击面。在安装 phpPgAdmin 并保持其更新时,请考虑安全性问题。

如何操作...

执行以下步骤来安装 phpPgAdmin:

  1. 安装名为 phpPgAdmin(或 phppgadmin,具体取决于您的系统)的软件包。有关更多信息,请参见食谱《安装软件包》中的第一章,设置系统

    提示

    在某些系统中,您可能需要添加额外的仓库来安装该软件包。例如,如果您使用的是来自 RedHat 系列的 Linux 发行版(如 RHEL、CentOS、Fedora 等),则需要添加 企业 Linux 的附加软件包EPEL)仓库。有关设置 EPEL 的信息,请参见食谱《通过 FTP 给用户提供访问权限》中的第六章,管理系统中的文件

  2. 由于 phpPgAdmin 运行在 Apache 之上,您需要确保该服务器已经安装在您的系统上并且可以通过浏览器访问。请按照食谱《在系统上安装 Apache》中的步骤,从第八章,运行 Apache Web 服务器,使 Apache 启动并正常运行。

  3. 请访问以下 URL,但将 webmin-host 替换为您的服务器的 IP 或域名:http://webmin-host/phppgadminhttp://webmin-host/phpPgAdmin(具体取决于发行版)。

    提示

    在某些系统中,phpPgAdmin 默认仅允许来自本地主机的连接。如果你希望更改此行为,请转到服务器 | Apache Web 服务器 | 默认服务器,选择 phpPgAdmin 目录的每目录选项,并更改其访问控制设置。更多信息请参见食谱《设置目录、文件和位置的选项》中的第八章,运行 Apache Web 服务器

    有关在系统分发中设置 phpPgAdmin 可能需要的其他步骤的信息可以在软件包文档文件中找到。请参阅第一章的阅读已安装软件的文档部分,设置您的系统

  4. 您现在可以使用 PostgreSQL 帐户的用户名和密码登录。

根据 phpPgAdmin 配置的方式定义,它将通过 Unix 套接字或 TCP 网络套接字连接到您的 Postgres 服务器。在config.inc.php中的以下行决定如何建立连接:

$conf['servers'][0]['host'] = 'localhost';

如果服务器的主机值设置为'localhost',则通过网络套接字进行连接。如果该值设置为空字符串'',则通过 Unix 套接字进行连接。

您的 Postgres 服务器必须设置为处理所选类型的连接并允许用户使用密码进行身份验证。有关更多信息,请参阅允许通过网络访问 PostgreSQL部分。

提示

如果您运行基于 RedHat 的系统并启用了安全增强 LinuxSELinux),您可能需要设置以下标志以允许 Apache 连接到数据库:

$ sudo setsebool -P httpd_can_network_connect_db 1

工作原理...

phpPgAdmin 是用 PHP 编写的应用程序。phpPgAdmin 的主配置文件名为config.inc.php,通常安装在/etc/目录内。不同分发版的示例位置列在以下表格中。应用程序的代码本身以 PHP 脚本文件形式存储在名为phpPgAdmin的目录中。

由于 phpPgAdmin 由 Apache 提供支持,安装包包含一个应用程序特定的配置文件,该文件将由 Web 服务器加载。此文件告知 Apache 在磁盘上存储 phpPgAdmin 的位置以及应在 Web 上提供其哪些目录:

文件 操作系统 / 发行版 位置
phpPgAdmin 配置 Debian /etc/phppgadmin/config.inc.php
CentOS /etc/phpPgAdmin/config.inc.php
OpenSUSE /etc/phpPgAdmin/config.inc.php
phpPgAdmin 文件 Debian /usr/share/phppgadmin
CentOS /usr/share/phpPgAdmin
OpenSUSE /srv/www/htdocs/phpPgAdmin
phpPgAdmin 的 Apache 配置文件 Debian /etc/apache2/conf.d/phppgadmin
CentOS /etc/httpd/conf.d/phpPgAdmin.conf
OpenSUSE /etc/apache2/conf.d/phpPgAdmin.conf

无论包维护者决定如何准备它,您都可以通过转到服务器 | Apache Web 服务器 | 默认服务器并选择 phpPgAdmin 目录的每目录选项来调整 phpPgAdmin 的 Apache 配置。

第十一章. 运行 Web 应用程序

在本章中,我们将涵盖以下内容:

  • 使用 CGI 生成动态页面

  • 安装 PHP

  • 更改 PHP 配置设置

  • 调试时显示 PHP 错误

  • 在 PHP 中记录日志

  • 在您的服务器上安装 WordPress

  • 在您的服务器上安装 Drupal

  • 使用 mod_wsgi 安装基于 Django 的应用程序

介绍

互联网网站大致可以分为两类:静态网站和动态网站。当 Web 服务器托管静态网站时,其角色非常有限。服务器等待传入的请求,将每个请求映射到磁盘上的文件,并将文件的内容作为响应发送。此类网站的所有页面必须提前准备好,并且在访问之间不会自动更改。此类网站的功能看起来可能有限,但它们确实有许多优点。由于服务器不进行任何计算工作,静态网站可以非常快速,并且可以处理大量请求。此类网站也容易被搜索引擎索引。静态网站并不意味着它不能具有互动性。JavaScript 组件允许浏览器为用户提供图形界面,用户可以通过这个界面与我们的网站互动。然而,如果用户提供我们希望存储的信息,我们将需要一个动态组件来处理传入的数据。

在动态网站上,传入的请求不会直接映射到磁盘上的文件;相反,它们会交给程序处理,每个请求都会生成一个响应。处理通常涉及与数据库交互以查找或存储信息;响应是即时生成的,并且每次可能不同。动态网站是现代互联网的一个重要组成部分,而 Apache 是一个可以托管大多数可用动态技术的服务器。

在第八章中,运行 Apache Web 服务器,我们展示了 Webmin 如何帮助您设置 Web 服务器来托管静态网站。在本章中,我们将深入探讨与各种动态网站解决方案相关的话题。我们将从 CGI 开始,这是通过使用任何语言编写的程序来提供动态网站的经典方法。为了说明这一点,我们将演示如何设置一个由 Bash 脚本驱动的简单动态网站。接下来,我们将展示如何托管更高效的特定语言技术。本章的大部分内容都集中在 PHP 语言上,但最后的示例演示了如何使用 Apache 模块 mod_wsgi 托管用 Python 编写的应用程序。

使用 CGI 生成动态页面

自万维网(World Wide Web)最早期以来,使用一种标准方法叫做 公共网关接口CGI)生成动态网页是可能的。通过使用 CGI,Apache Web 服务器可以通过执行安装在同一台机器上的任何程序来生成动态内容,只要该程序生成格式正确的 HTTP 响应文本。这种方法的主要优点是其普适性,因为 CGI 脚本可以用任何编程语言编写。在本食谱中,我们将演示如何用 shell 脚本语言 Bash 编写一个简单的 Hello World 脚本,但相同的原理也适用于任何其他编程语言。

CGI 协议的主要缺点是 Web 服务器必须为每个传入请求启动一个新进程。这个解决方案的扩展性较差,因此仅适用于低流量的网站。使用 CGI 的另一个缺点是该协议非常基础,传入请求的解析必须由您的脚本手动完成。

基本 CGI 已被不需要为每个传入请求启动新进程,而是将一个组件加载到内存中,随时准备处理请求的技术所取代。这些解决方案通常是语言特定的,并且可能作为 Apache 模块提供,例如 mod_perlmod_phpmod_python。本章后续的食谱中会描述其中的一些技术。

本食谱中描述的方法仍然适用于小型任务。如果您有一个 Web 服务器并希望返回一个简单的状态页面,但又不想安装像 PHP 这样的技术所带来的开销(和潜在的安全风险),您可以使用这种基本的方法生成动态网页。

注意

从 Unix 系统的角度来看,CGI 脚本是常规程序,它们具有与 Web 服务器进程相同的权限,可以访问底层机器。如果 CGI 脚本接受用户输入,应格外小心,验证并清理传入的数据。输入处理中的错误常常会成为安全漏洞,并可能被利用。

准备工作

本食谱涉及 Apache Web 服务器的配置。有关安装和配置 Apache 的信息,请参见 第八章,运行 Apache Web 服务器

检查 Apache 正在作为哪个用户和组运行

Apache Web 服务器作为一个特殊用户访问您的系统,通常被称为 apachewww-datawwwrunhttpd 或类似的名称。为了完成本食谱,您需要知道该 Apache 用户的用户名和组名。这可以通过 Webmin 轻松检查,步骤如下:

  1. 导航到 服务器 | Apache Web 服务器 | 全局配置

  2. 点击 用户和组 图标。您将看到以下屏幕:检查 Apache 正在作为哪个用户和组运行

Apache 用户名将在以 Unix 用户身份运行字段中显示,组名将在以 Unix 组身份运行字段中显示。前面截图中的这两个值都设置为www-data。请记下系统的配置。

如何操作...

本教程将分为两部分。首先,我们将创建一个 CGI 脚本,然后配置 Apache 以显示它生成的网页。

按照以下步骤创建一个兼容 CGI 的 Shell 脚本:

  1. 创建一个目录来存放你的 Web 可访问 CGI 脚本,例如,在/usr/lib/cgi-bin中。

    提示

    将 CGI 脚本存放在DocumentRoot目录中并不推荐,因为该目录通常用于提供常规 HTML 页面。不正确的服务器配置可能会暴露脚本的源代码,运行不应执行的脚本,或使目录可写,这将导致严重的安全漏洞。

  2. 创建一个名为/usr/lib/cgi-bin/hello.sh的 Shell 脚本文件。在该文件中输入以下代码:

    #!/bin/bash
    
    echo "Content-type: text/plain"
    echo "" # End of headers, start of response body
    
    echo "Hello World!"
    echo "The current date is:"
    date
    
    exit 0
    
  3. 将脚本的组所有者设置为 Apache 运行时使用的组名。如果 Apache 在你的系统上以www-data身份运行,你可以通过执行以下命令来完成:

    $ sudo chgrp www-data /usr/lib/cgi-bin/hello.sh
    
    
  4. 允许该文件的组具有读取和执行权限,所有者具有完全访问权限,其他用户则没有权限。你可以通过执行以下命令来完成:

    $ sudo chmod 750 /usr/lib/cgi-bin/hello.sh
    
    

    提示

    有关操作文件、改变所有权和权限的更多信息,请参见第六章 管理系统上的文件中的管理服务器上的文件和目录

按照以下步骤创建 Apache 配置:

  1. 导航到服务器 | Apache Web 服务器

  2. 点击你想要配置的虚拟服务器图标,或者点击默认服务器

  3. 点击CGI 程序图标。

  4. 通过将值设置为/cgi-bin/,将值设置为/usr/lib/cgi-bin/来创建 CGI 目录别名:如何操作...

  5. 点击保存按钮。

  6. 创建每目录、文件或位置选项下,选择目录,并为路径/usr/lib/cgi-bin创建配置。

  7. 点击目录图标,/usr/lib/cgi-bin

  8. 点击文档选项图标。

  9. 目录选项下,选择以下选项,将执行 CGI 程序设置为,并将其他所有选项设置为

  10. 选项文件可以覆盖..下,选择以下选项,并保持所有复选框未选中。参考以下截图:如何操作...

  11. 点击保存按钮。

  12. 点击访问控制图标。

  13. 限制访问下,选择先允许后拒绝,并只设置一条规则,如下所示:动作设置为允许条件设置为所有请求。参考以下截图:如何操作...

  14. 点击保存按钮。

    提示

    如果呈现的数据不应公开,您可能希望限制特定客户端 IP 的访问权限。该位置也可以通过密码保护。

  15. 点击应用更改链接。

要查看结果,请访问网址http://your-server/cgi-bin/hello.sh,其中your-server是您的 Apache 服务器机器的 IP 地址或域名。

您应该能看到一个网页,显示Hello World和当前日期。通过常见网关接口(CGI)由 Apache 执行的您的 Shell 脚本动态生成了这段文本。

它是如何工作的...

当浏览器请求一个与/cgi-bin/hello.sh路径匹配的网址时,Apache 会将其识别为指向脚本/usr/lib/cgi-bin/hello.sh的别名。Apache 准备一个执行环境,其中包括诸如 HTTP 头部和查询字符串等请求参数作为环境变量,并在该环境中执行脚本。请求的主体通过标准输入流传递给脚本。

我们编写的脚本生成了 HTTP 响应,并将其发送回浏览器。响应由两部分组成:头部和响应体。我们只发送一个头部,告知浏览器我们的响应Content-typetext/plain。这告诉浏览器应该将响应显示为文本,而不是下载为文件。然后,我们发送一个空行来结束头部部分,接着发送响应体,内容是“Hello World!”和当前日期。

我们创建的 Apache 配置告知服务器,所有以/cgi-bin/开头的路径请求应被视为/usr/lib/cgi-bin/目录下文件的别名。我们还告知 Apache 执行该目录中的脚本,并允许所有客户端访问。这相当于创建了以下配置片段:

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
  AllowOverride None
  Options ExecCGI
  Order allow,deny
  Allow from all
</Directory>

所有 CGI 脚本必须是可执行的,且 Apache 用户必须有运行它们的权限才能使用它们。为此,我们将文件交给 Apache 所属的组,并为该组分配了读取和执行权限。通过这种方式分配权限允许 Apache 运行脚本,但不能修改它。如果 Apache 用户能够修改 CGI 脚本,受损的服务器可能会被用作控制服务器的手段。

还有更多...

通过 CGI 运行的程序可以输出如前所述的数据,但它们还可以读取传入的头部和提交表单的内容。CGI 协议已标准化,并在RFC3875文档中描述,您可以在tools.ietf.org/html/rfc3875找到该文档。

显示传入请求头部

通过 CGI 协议描述的传入 HTTP 请求头部以及许多其他有用的信息都可以作为环境变量提供给脚本。为了显示它们,您可以使用printenv命令,如以下脚本所示:

#!/bin/bash
echo "Content-type: text/plain"
echo "" 
printenv
exit 0

显示传入请求主体

传入的请求体(例如,包含 HTTP POST 表单值)会通过标准输入流传递给脚本。为了显示请求体的内容,你可以在脚本中添加以下代码:

while read LINE; do
    echo ${LINE}  # perform operations on request body
done

另请参阅

我们还可以参考以下章节:

  • 第八章 中的 在系统上安装 Apache 食谱,运行 Apache 网络服务器

  • 第八章 中的 创建虚拟主机 食谱,运行 Apache 网络服务器

  • 第八章 中的 为目录、文件和位置设置选项 食谱,运行 Apache 网络服务器

  • 本章中的 安装 PHP 食谱

  • 本章中的 使用 mod_wsgi 安装基于 Django 的应用程序 食谱

安装 PHP

PHP 目前是 Web 上最流行的编程语言之一。许多最大和最受欢迎的网站都由 PHP 编写的软件提供支持,包括 Facebook、Yahoo!、Wikipedia 和 Wordpress.com。PHP 起初是一组用于设计动态个人主页的简单工具,但它迅速流行起来,并发展成为一种现代的面向对象编程语言。围绕这门语言成长起来的开源社区创建了许多有用的库,并增加了对多平台、数据库等的支持。

PHP 功能强大且易于使用。部署 PHP 应用程序通常只需将源代码文件放置在服务器上的某个目录中。使用 PHP 编程也非常简单——其代码可以直接嵌入到标准 HTML 中。通过抽象 HTTP 协议的细节,PHP 使 Web 编程变得非常简单。例如,表单值可以直接作为数据结构传递给脚本,简单的函数可以读取和写入头信息,内建对 cookies 和用户会话的支持,等等。

PHP 的易用性实际上可能过于出色,它使得许多人能够在不了解其底层协议的情况下进行 Web 开发。如果你找到一个可以在服务器上安装的 PHP 应用程序,请确保阅读其评论,以确保它不会带来严重的安全或稳定性问题。

本食谱将演示如何安装 PHP,然后编写并部署一个简单的 Hello World 脚本。

准备工作

本食谱涉及配置 Apache 网络服务器。有关安装和配置 Apache 的信息,请参阅第八章,运行 Apache 网络服务器

如何操作...

按照以下步骤安装 PHP 并验证其在系统上的工作状态:

  1. 按照 第一章,设置系统 中的 安装软件包 食谱中的说明,安装适合你系统的 PHP 包。该包可能仅被命名为 phpphp5

  2. 进入服务器 | Apache Web 服务器 | 全局配置

  3. 点击配置 Apache 模块图标。

  4. 勾选php5模块旁边的复选框,然后点击启用选定模块按钮。

    提示

    配置 Apache 模块屏幕可能在你的系统中不存在。如果你是通过包安装 PHP,那么很可能模块已经为你启用了。按照本教程的其余部分进行测试。

  5. 进入服务器 | Apache Web 服务器

  6. 点击你希望配置的虚拟服务器的图标,或者点击默认服务器。

  7. 点击文档选项图标并注意服务器的文档根目录在哪里。

  8. 在文档根目录中创建一个名为hello.php的文件。

  9. hello.php文件中输入以下代码:

    <?php
        echo "Hello World!";
    ?>
    

要查看结果,访问 URLhttp://your-server/hello.php,其中your-server是你的 Apache 服务器机器的 IP 地址或域名。你应该看到一个显示Hello World!的网页,这是由 PHP 生成的。

提示

如果你看到 PHP 代码而不是 Hello World!,你需要手动启用 PHP 模块。查看它是如何工作的部分,了解你需要在 Apache 配置文件中添加的指令,并阅读你包的文档获取相关指导。

它是如何工作的……

几乎所有的服务器操作系统发行版都提供从其仓库中安装 PHP 包。安装 PHP 有几种不同的方式,建议安装标准系统包,因为这样可以确保其针对你的 Apache 版本进行了优化,并且会被包维护者保持最新。

安装包不仅将 PHP 可执行文件和文档放在你的磁盘上,还会修改 Apache Web 服务器的配置。引入的更改包括以下内容:

  • 一行代码,当 Apache 启动时加载 PHP 解释器模块,如下所示:

    LoadModule php5_module /path/to/libphp5.so
    
  • 指示 Apache 将 PHP 文件传递给解释器的行,如下所示:

    SetHandler application/x-httpd-php
    

    AddHandler php5-script .php
    
  • 使用index.php文件作为目录索引的指令:

    DirectoryIndex index.html index.php
    

另见

我们还可以参考以下章节。

  • 第八章中的在系统上安装 Apache教程,运行 Apache Web 服务器

  • 第八章中的创建虚拟主机教程,运行 Apache Web 服务器

  • 第八章中的为目录、文件和位置设置选项教程,运行 Apache Web 服务器

  • 本章中的更改 PHP 配置设置教程

  • 本章中的查看 PHP 错误日志教程

更改 PHP 配置设置

PHP 解释器允许你指定众多设置的值,这些设置决定了 PHP 应用程序在系统上的行为。这些配置影响错误的记录或显示方式、输入数据的处理方式、分配给解释器的资源以及与 PHP 捆绑的扩展模块的设置。

PHP 的配置文件通常被称为php.ini,其位置取决于你的操作系统发行版和 PHP 版本。php.ini文件的常见位置包括:/etc//etc/php5/apache2//usr/local/etc/php.ini文件包含主设置值,但一些设置可能会被 PHP 脚本或 Apache 配置在目录级别覆盖。

在本教程中,我们将演示如何检查当前使用的配置设置的值以及如何修改它们。

准备就绪

假设你已经安装了 Apache 和 PHP,请准备一个通过 Web 服务器公开并准备好提供 PHP 脚本的目录。我们将在本教程中将该目录称为DocumentRoot目录。

如何操作...

本部分将检查当前定义的设置,然后我们将继续修改这些设置。

按照以下步骤检查当前的 PHP 设置:

  1. 在你的 Web 服务器的DocumentRoot目录中创建一个名为phpinfo.php的文件。

  2. phpinfo.php文件中输入以下代码:

    <?php
        phpinfo();
    ?>
    
  3. 转到phpinfo.php文件的 URL:http://your-server/phpinfo.php

  4. 记下加载的配置文件的位置。

    注意

    这告诉我们主 PHP 配置文件(php.ini)的位置。

  5. 记下memory_limit值。

    注意

    请注意,有两列。它们指定了该设置的本地值和主值。主值在php.ini中指定,但本地值是当前使用的。如果本地值被覆盖,它可能与主值不同。请参见本教程的更多内容部分。

按照以下步骤更改主 PHP 设置:

  1. 查找全局 PHP 配置文件(php.ini)的位置,方法如前所述。

  2. 转到其他 | PHP 配置

  3. 点击与全局 PHP 配置文件对应的行中的管理

  4. 点击资源限制

  5. 最大内存分配更改为260M如何操作...

  6. 点击保存

  7. 转到服务器 | Apache Webserver

  8. 点击应用更改链接。

  9. 再次转到 URL,http://your-server/phpinfo.php

检查memory_limit值。其主值现在应该已更改为260M

提示

phpinfo.php文件保留在服务器上不是一个好主意,因为它不必要地向公众暴露关于你系统的信息。使用完后请删除该文件。

其工作原理...

Apache 每次启动时都会加载全局 PHP 配置(php.ini)文件。在此示例中,我们通过 Webmin 修改了该文件,特别是更改了决定 PHP 解释器可以使用多少内存的那一行,修改为以下内容:

memory_limit = 260M

修改文件后,我们进入 Webmin 界面,通过重启 Apache 来应用配置更改。

还有更多...

PHP 设置可以在脚本和 Apache 的每目录配置文件中本地设置。

使用 .htaccess 文件修改目录的 PHP 设置

为了通过 .htaccess 文件修改 PHP 设置,我们必须指示 Apache 允许对包含我们 PHP 脚本的目录进行本地选项覆盖。查看第八章中的设置目录、文件和位置的选项示例,了解更多信息。执行以下步骤:

  1. 导航到服务器 | Apache Web 服务器

  2. 点击您希望配置的虚拟服务器的图标或默认服务器。

  3. 点击或创建包含您 PHP 脚本的目录的设置。

  4. 点击文档选项

  5. 选项文件可以覆盖部分,勾选选中的选项并选择目录选项

    提示

    这相当于在 Apache 配置中为该目录添加以下行:

    AllowOverride Options
    
  6. 点击保存按钮。

  7. 点击应用更改链接。

  8. 在相同目录下创建一个名为 .htaccess 的文件。

  9. .htaccess 文件中放置以下指令,将内存限制本地更改为 32MB:

    php_value memory_limit 32M
    

    注意

    php_value 指令用于配置接受参数值的设置。布尔参数仅接受开或关的值,使用 php_flag 指令进行设置。有关更多信息,请参见 PHP 在线手册:php.net/manual/configuration.changes.php

使用 phpinfo() 函数验证本地设置的更改,如前所述。

在脚本代码中动态修改 PHP 设置

按照此示例准备一个phpinfo.php文件,并在其中添加以下代码:

<?php
  ini_set('memory_limit', '64M');
  phpinfo();
?>

导航到 phpinfo.php 文件的 URL,验证本地设置的更改。

另请参见

  • 查看第八章中的设置目录、文件和位置的选项示例,了解更多关于在本地更改 Apache 设置的信息,运行 Apache Web 服务器

显示 PHP 错误以进行调试

在编写 PHP 代码或安装下载的应用程序时,你可能会发现自己盯着一块空白的浏览器屏幕,完全没有任何提示为什么它没有按照预期工作。这是由于 PHP 的默认配置,它隐藏了错误信息以防泄露敏感数据。错误信息可能暴露服务器的相关信息,因此在生产环境中这样做是一个好主意,但这也会增加解决问题的难度。在开发过程中,你可以通过以下步骤启用 PHP 的友好错误信息。

如何操作...

按照以下步骤执行此食谱:

  1. 让我们从编写一个会导致错误的 PHP 脚本开始。该脚本可能包含以下破损的代码:

    <?php
        echo "Hello World!";
        syntax!error
    ?>
    
  2. 将脚本保存到服务器上的一个文件中,并导航到该文件在你的 Web 服务器上的公共 URL。如果关闭了错误显示,你应该会看到一块空白屏幕。

  3. 导航到其他 | PHP 配置

  4. 点击管理,对应于全局 PHP 配置文件的那一行。

  5. 点击错误日志

  6. 显示错误信息?设置为

  7. 点击保存

  8. 导航到服务器 | Apache Web 服务器

  9. 点击应用更改链接。

更改设置后,再次导航到你出现问题的脚本的 URL。你现在应该能看到类似这样的错误信息:

解析错误:语法错误,/var/www/index.php 第 3 行出现意外的 '!'

它是如何工作的...

PHP 的display_errors设置决定了解释器是否在屏幕上显示错误信息,或者隐藏这些信息。

在这个食谱中,我们通过启用display_errors配置标志来全局启用 PHP 的错误报告。为此,我们将php.ini中的display_errors行更改为以下内容,并重启了 Apache:

display_errors = Off

你也可以通过在.htaccess文件中添加以下行来为指定的目录本地设置该标志。确保 Apache 允许该目录中的本地覆盖:

php_flag display_errors on

不要使用ini_set函数来开启错误显示,因为某些错误会阻止脚本被解析,导致该设置无法生效。

参见

  • 本章中的更改 PHP 配置设置食谱

  • 本章中的PHP 中的日志记录食谱

PHP 中的日志记录

使用 PHP 编写的应用程序在发生错误时会生成日志消息。这些消息可以根据解释器的配置设置保存到日志文件、传递给 syslog,或者被忽略。忽略错误消息是一个不好的做法,因为它会阻止你发现服务器上发生的问题。

另一方面,将每条消息保存到文件中可能会导致日志增长非常迅速,尤其是在高流量网站上。幸运的是,PHP 允许你非常精确地配置哪些错误会被记录。所有 PHP 错误都有一个级别值;最严重的错误标记为E_ERROR,较轻的错误标记为E_WARNING,再轻的标记为E_NOTICE,依此类推。完整的错误级别列表可以在 PHP 手册中的php.net/errorfunc.constants.php找到。

建议在开发过程中记录所有错误,但在生产环境中,应该记录所有错误,除了E_DEPRECATED(弃用警告)和E_STRICT(代码风格建议)。我们将在本食谱中设置这种日志记录级别。

准备工作

为了完成此食谱,我们需要知道 Apache 正在以哪个用户和组运行。你可以在本章的生成动态页面使用 CGI食谱中的准备工作部分找到获取此信息的说明。

如何操作...

按照以下步骤指示 PHP 记录错误消息:

  1. 创建一个空文件,用于存储你的 PHP 错误日志,存储位置可以自定义,例如,/var/log/php_errors.log

  2. 将文件的所有者更改为 Apache 用户。如果你的 Web 服务器以www-data用户运行,你可以通过执行以下命令来完成:

    $ sudo chown www-data /var/log/php_errors.log
    
    

    注意

    关于操作文件和更改所有权与权限的信息,可以在第六章中的管理服务器上的文件和目录食谱中找到,管理系统中的文件

  3. 确保所有者(Apache)对文件具有写入权限:

    $ sudo chmod u+w /var/log/php_errors.log
    
    
  4. 导航到其他 | PHP 配置

  5. 点击与全局 PHP 配置文件对应行的管理

  6. 点击错误日志

  7. 显示错误消息?设置为

  8. 是否写入错误消息到日志?设置为

  9. 错误类型表达式设置为E_ALL & ~E_DEPRECATED & ~E_STRICT

  10. 错误日志文件设置为其他文件,并在文本框中输入/var/log/php_errors.log,如以下截图所示:如何操作...

  11. 点击保存

  12. 导航到服务器 | Apache Web 服务器

  13. 点击应用更改链接。

从现在开始,你应该能在 PHP 的日志文件中看到错误消息。

如何运作...

为了启用 PHP 错误日志记录,我们在php.ini文件中设置了以下主值:

log_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_log = /var/log/php_errors.log

上述设置启用了 PHP 的错误日志记录(log_errors),并指定了错误应保存到哪个文件(error_log)。

error_reporting指令指定了哪些消息会被保存,哪些会被忽略。该行接受复杂的语法,其中与符号(&)允许您指定不同级别的消息进行记录,波浪符(~)则用于取消某一类消息的记录。这使我们能够记录所有级别的错误(E_ALL),但不记录弃用警告(& ~E_DEPRECATED)或样式建议(& ~E_STRICT)。

请参考本章中的更改 PHP 配置设置配方,了解更多有关更改 PHP 配置的方法。

还有更多...

PHP 还可以将错误消息输出到系统日志(syslog)。如果您希望使用 syslog,请将error_log行更改如下:

error_log = syslog

PHP 错误会输出到名为user的 syslog 设施中,不幸的是,目前无法通过 PHP 配置来更改这一点。

注意

现代的 syslog 实现(如 rsyslog,syslog-ng)可以基于生成日志的命令过滤消息。

请参考第五章中的将 syslog 消息保存到文件配方,监控您的系统,了解更多关于 syslog 的信息。

另见

有关使用系统日志的更多信息,请查看以下配方:

  • 第五章中的查看和搜索系统日志文件配方,监控您的系统

  • 第五章中的添加其他日志文件到 Webmin配方,监控您的系统

  • 第五章中的配置日志文件轮换配方,监控您的系统

在您的服务器上安装 WordPress

WordPress 是一个非常受欢迎的开源博客平台。该软件非常易于使用,且足够灵活,能够满足各种用途,比如运行信息性网站或简单的电子商务商店。WordPress 完全用 PHP 编写,这使得它的安装非常简便。

这个配方整合了前面各章节的内容。我们将展示如何使用本书中提供的配方来设置一个工作中的 Web 服务器,托管一个由 WordPress 博客平台支持的网站。

注意

许多操作系统发行版的包存储库中都提供了 WordPress 的软件包。如果您不打算自定义站点或托管多个不同版本的软件,您可以选择安装该软件包。请注意,WordPress 的更新频率可能比您操作系统包存储库中的软件包更高,这可能会导致您使用不安全的版本。如果您选择此路线,请查看包中的文档以获取更多信息。

如何操作...

本食谱分为多个部分。我们首先通过安装所需的软件包来准备服务器。如果你已在服务器上安装了这些软件,可以跳过这些步骤。然后,我们将为我们的 WordPress 安装创建一个 MySQL 数据库和用户。最后,我们将创建一个 Apache 虚拟主机并安装 WordPress。

请按照以下步骤准备服务器:

  1. 按照第八章中的在系统上安装 Apache食谱安装 Apache Web 服务器,运行 Apache Web 服务器

  2. 按照第九章中的安装 MySQL 数据库服务器食谱安装 MySQL 数据库服务器,运行 MySQL 数据库服务器

  3. 按照本章中的安装 PHP食谱安装 PHP。

    提示

    为了让 PHP 应用程序能够与 MySQL 通信,你需要安装一个额外的 PHP 模块,这个模块在大多数操作系统发行版中以包的形式提供。你可以通过查看phpinfo()函数的输出,检查此模块是否已安装,正如本章中更改 PHP 配置设置食谱所描述的那样。如果你找到名为mysql的信息部分,那么php-mysql模块已安装。

  4. 安装名为php-mysqlphp5-mysql或类似名称的系统包。

    注意

    有关安装软件包的更多信息,请参见第一章中的安装软件包食谱,设置系统

  5. 安装php-gd模块,使 PHP 应用程序能够处理常见格式(如 PNG 和 JPEG)的图形图像。安装名为php-gdphp5-gd或类似名称的系统包。

  6. 确保 Apache 的重写模块(mod_rewrite)已安装并启用。有关更多信息,请查看第八章中的启用 Apache 模块食谱,运行 Apache Web 服务器

创建数据库

我们将创建一个名为wordpress的数据库和用户。你可能应该使用一个更具信息性的名称,特别是如果你计划使用多个 WordPress 实例的话。请按照以下步骤创建数据库:

  1. 创建一个新的 MySQL 数据库和用户,二者均命名为wordpress。该用户应使用强密码,并允许从本地机器(localhost)连接。

  2. 授予从localhost连接的wordpress用户对wordpress数据库的所有权限。

    注意

    关于创建 MySQL 数据库和授予权限的信息,请参见第九章中的创建新数据库创建用户并授予数据库权限食谱,运行 MySQL 数据库服务器

    提示

    如果你正在运行带有安全增强 LinuxSELinux)的系统,你需要通过设置以下标志来允许 Apache 连接到数据库:

    $ sudo setsebool -P httpd_can_network_connect_db 1
    
    

创建虚拟主机并安装 WordPress

为了创建虚拟主机并安装 WordPress,请执行以下步骤:

  1. 请参考第八章中的创建虚拟主机示例,运行 Apache Web 服务器,以便从文档根目录/var/www/blog.example.com提供文件,并设置服务器名称为blog.example.com

  2. 从以下网址下载最新版本的 WordPress,并将归档文件解压到/var/www/blog.example.com目录: wordpress.org/latest.tar.gz

    注意

    当提取完成后,WordPress 的index.php文件应位于以下路径:/var/www/blog.example.com/index.php

  3. 在相同的目录中创建一个 .htaccess 文件,并输入以下重写规则,以启用 WordPress 的干净 URL:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    

    提示

    Apache 的虚拟主机或目录配置必须允许 .htaccess 文件覆盖选项(AllowOverride All)。有关更多信息,请查看第八章中的为特定目录、文件和位置设置选项示例,运行 Apache Web 服务器

  4. 导航到新 WordPress 网站的 URL:http://blog.example.com/

  5. 会出现一个设置屏幕。按照屏幕上的指示输入已创建的数据库名称、用户名和密码,如下图所示:创建虚拟主机并安装 WordPress

  6. WordPress 安装会生成一个配置文件的内容,您应将其保存为/var/www/blog.example.com/wp-config.php

现在,您可以导航到 WordPress 网站的 URL,按照屏幕上的说明完成设置并开始使用网站。

它是如何工作的……

WordPress 使用了本书中介绍的技术。为了为该应用程序设置我们的服务器,我们需要安装 Apache、MySQL 和 PHP。我们还需要安装一些额外的 PHP 模块,以便 WordPress 与数据库通信并操作图像文件。

每个 WordPress 实例都需要访问数据库。表前缀会添加到每个数据库表的名称中,这样可以让多个 WordPress 实例共享一个数据库。我们将前缀保留为默认值wp_。由于我们在运行自己的服务器,我们可以根据需要创建任意数量的数据库;因此,实际上不需要共享数据库。实际上,我们还为这个应用程序创建了一个专用的数据库用户,仅允许访问一个数据库。

我们创建的虚拟主机配置允许我们在一个子域(blog.example.com)上运行 WordPress,从而可以自由地在主域或其他子域上运行其他软件。

我们创建的 .htaccess 文件旨在允许 WordPress 使用干净的 URL。借助这个功能,页面的 URL 可能是 http://blog.example.com/hello-world/,而不是 http://blog.example.com/?p=1

注意

有关干净 URL(在 WordPress 中称为永久链接)的更多信息,请参阅其文档:codex.wordpress.org/Using_Permalinks

我们通过允许 WordPress 为我们创建其主要配置文件(wp-config.php)的内容来完成安装。我们需要将数据库连接详细信息输入到一个表单中,WordPress 会自行准备配置文件。除了存储数据库连接详情外,安装程序还生成了伪随机的加密盐字符串,这有助于保持 WordPress 的安全。盐字符串也会存储在配置文件中,应该保持机密并偶尔更换。

提示

为了确保 WordPress 配置文件的安全,请确保其权限设置正确。该文件必须对 Apache 可读,但对其他人不可读。请查看本章的生成动态页面使用 CGI食谱中的准备工作部分,了解 Apache 用户的名称,并参考第六章中的管理文件和目录食谱,获取有关设置权限的信息。

同时,确保任何该文件的备份副本都存储在安全的地方。

另见

在你的服务器上安装 Drupal

Drupal 是一个强大的开源内容管理系统CMS)。它高度模块化,意味着通过安装额外的插件,可以将其定制为执行几乎任何任务。Drupal 完全用 PHP 编写,这使得它非常容易安装。

本食谱汇集了前面各章的内容。我们将展示如何使用本书中提供的食谱设置一个工作中的 Web 服务器,托管一个由 Drupal CMS 平台驱动的网站。

提示

许多操作系统发行版的包管理库中都提供了 Drupal 的安装包。如果你不打算托管多个不同版本的软件,你可以选择安装这个包。但请注意,Drupal 可能会比操作系统库中的包更新得更频繁,这可能会导致使用不安全的软件版本。如果你选择这种方式,请查阅包中的文档以获取更多信息。

准备工作

要完成本食谱,我们需要了解 Apache 运行的用户和组。你可以在本章的生成动态页面使用 CGI食谱中的准备工作部分找到获取此信息的说明。

如何操作...

本配方分为多个部分。我们首先通过安装所需的软件包来准备服务器。如果你已经在服务器上安装了所述软件,可以跳过这些步骤。接下来,我们将为 Drupal 安装创建一个 MySQL 数据库和用户。最后,我们将创建一个 Apache 虚拟主机并安装 Drupal。

按照以下步骤准备服务器:

  1. 按照第八章中的 在你的系统上安装 Apache 配方安装 Apache Web 服务器,运行 Apache Web 服务器

  2. 通过遵循第九章中的 安装 MySQL 数据库服务器 配方,安装 MySQL 数据库服务器,运行 MySQL 数据库服务器

  3. 通过遵循本章中的 安装 PHP 配方安装 PHP。

  4. 为了让 PHP 应用程序能够与 MySQL 通信,你需要安装一个额外的 PHP 模块,这个模块在大多数操作系统的发行版中都有提供。安装名为 php-mysqlphp5-mysql 或类似名称的系统包。

    注意

    有关安装软件包的更多信息,请参见第一章中的 安装软件包 配方,设置你的系统

  5. 安装 php-gd 模块,允许 PHP 应用程序操作 PNG、JPEG 等常见格式的图形图像。安装名为 php-gdphp5-gd 或类似名称的系统包。

  6. 确保 Apache 的重写模块(mod_rewrite)已安装并启用。更多信息请参见第八章中的 启用 Apache 模块 配方,运行 Apache Web 服务器

创建数据库

我们将创建一个名为 drupal 的数据库和用户。你可能需要使用更具描述性的名称,特别是如果你计划使用多个 Drupal 实例时。请按以下步骤操作:

  1. 创建一个新的 MySQL 数据库和用户,命名为 drupal。用户应使用强密码,并允许从本地机器(localhost)连接。

  2. 授予 drupal 用户从 localhost 连接的所有权限,权限作用于 drupal 数据库。

    注意

    创建 MySQL 数据库并授予权限的详细信息可以在第九章中的 创建新数据库创建用户并授予数据库权限 配方中找到,运行 MySQL 数据库服务器

    提示

    如果你正在使用增强型 Linux 安全SELinux)的系统,你需要通过设置以下标志来允许 Apache 连接到数据库:

    $ sudo setsebool -P httpd_can_network_connect_db 1
    
    

创建虚拟主机并安装 WordPress

按照以下步骤创建虚拟主机并安装 Drupal:

  1. 按照第八章中创建虚拟主机的食谱,创建一个从文档根目录/var/www/cms.example.com提供文件的网站,并设置服务器名称为cms.example.com

  2. 从以下 URL 查找并下载最新版本的 WordPress,并将压缩包提取到/var/www/cms.example.com目录: drupal.org/download

    注意

    当解压完成后,Drupal 的index.php文件应该具有以下路径:/var/www/cms.example.com/index.php

    提示

    Drupal 捆绑了一个.htaccess文件。请确保该文件已正确提取到/var/www/cms.example.com/.htaccess

    Apache 的虚拟主机或目录配置必须允许.htaccess文件覆盖选项(AllowOverride All)。有关更多信息,请参考第八章中为特定目录、文件和位置设置选项的食谱。

  3. 创建一个目录(sites/default/files),Drupal 将在其中存储上传的文件和临时文件。该目录是相对于 Drupal 根目录的,因此在我们这种情况下,它的完整路径是/var/www/cms.example.com/sites/default/files

  4. sites/default/files目录的所有者更改为 Apache 用户,并确保该所有者对该目录具有读写权限。

    提示

    关于操作文件和更改所有权及权限的信息可以在第六章的在服务器上管理文件和目录一节中找到,在你的系统上管理文件

  5. 通过复制默认设置文件sites/default/default.settings.php,在sites/default/settings.php中创建 Drupal 的配置文件。

  6. 临时允许所有用户写入settings.php文件,通过将其权限更改为666

  7. 访问你新 Drupal 站点的 URL:http://cms.example.com/

  8. 一个设置屏幕将会出现。请按照屏幕上的指示,输入已创建的数据库、用户名和密码。

  9. 当安装程序完成修改你的设置文件时,它将通知你现在应该更改权限,移除对settings.php文件的写入访问权限:创建虚拟主机并安装 WordPress

现在,你可以导航到你的 Drupal 站点的 URL,按照屏幕上的指示完成设置并开始使用该站点。

它是如何工作的...

Drupal 使用了本书中描述的技术。为了为应用程序设置我们的服务器,我们需要安装 Apache、MySQL 和 PHP。我们还需要安装一些额外的 PHP 模块,以便 Drupal 与数据库通信并操作图像文件。

在初步服务器设置完成后,我们创建了一个虚拟主机,使我们能够在子域(cms.example.com)上运行 Drupal 网站,从而可以在主域或其他子域上运行其他软件。

在一切准备就绪后,我们将 Drupal 文件复制到域目录,创建了 Drupal 安装所需的文件和文件夹,然后让 Drupal 的安装程序引导我们完成剩下的步骤。Drupal 填充了它的设置文件,包含了连接数据库所需的信息,并初始化了网站。安装完成后,重要的一步是从设置文件中删除写权限。

另见

使用 mod_wsgi 安装基于 Django 的应用程序

Django 是一个多功能的 web 开发框架,使用 Python 编程语言编写。该框架支持快速开发,并鼓励良好的编码实践。使用 Django 编写的应用程序可以通过 mod_wsgi 模块托管在 Apache 上。

本教程将演示如何设置服务器来托管 Django 应用程序。其他支持 mod_wsgi 的 Python 应用程序也可以通过类似方式进行设置。这包括 MoinMoin、PyBlosxom、Trac 等应用程序,以及 CherryPy、Pylons、TurboGears、Pyramid、web.py、Werkzeug、Web2Py 和 Zope 等框架。

如何操作...

按照 第八章,运行 Apache Web 服务器 章节中的 在您的系统上安装 Apache 教程,安装 Apache Web 服务器。

  1. 使用系统包安装 Python 版本 2.7。该包的名称可能是 pythonpython2.7python-2.7 或类似的名称。

    提示

    从 1.5 版本开始,Django 支持 Python 3,安装过程与较新版本相同。您只需要将 Python 2.7 替换为 Python 3,并将 pipmod_wsgi 的软件包替换为 Python 3 版本。

  2. 从系统包安装 pip——Python 包管理器。该包的名称可能是 python-pip 或类似的名称。

    提示

    在某些系统中,您可能需要添加额外的仓库才能安装软件包。例如,如果您使用的是 RedHat 家族的 Linux 发行版(如 RHEL、CentOS、Fedora 等),您应该添加 企业 Linux 的额外软件包EPEL)仓库。关于设置 EPEL 的信息可以在 通过 FTP 给用户访问您的服务器 章节中的 第六章,管理您系统上的文件 章节中找到。

  3. 从系统包安装 mod_wsgi,这是一个使 Apache 能够托管 Python 应用程序的模块。该包的名称可能是 mod_wsgiapache2-mod_wsgilibapache2-mod-wsgi 或类似的名称。

  4. 按照第八章中的启用 Apache 模块食谱,运行 Apache Web 服务器,启用mod_wsgi模块(wsgi)。

  5. 使用pip安装 Django,运行以下命令:

    $ sudo pip install django
    
    

    提示

    你可以修改上述命令来安装特定版本的 Django。例如,要安装 Django 1.6.2,可以使用以下命令:

    $ sudo pip install django==1.6.2
    
    
  6. /srv/webapps/中创建一个 Web 应用目录。

  7. 通过运行以下命令为你的应用创建项目结构。这将在/srv/webapps/hello中创建一个目录来存储你的应用。执行以下命令:

    $ cd /srv/webapps/ && django-admin.py startproject hello 
    
    

    提示

    你可以将 Django 应用上传到另一个目录,而不是在hello中启动新项目。记下应用路径,并在后续步骤中将其替换为/srv/webapps/hello

  8. 为你的应用程序创建静态文件和媒体文件的目录,例如,/srv/webapps/hello/static//srv/webapps/hello/media/

  9. 在 Webmin 中,导航到服务器 | Apache Web 服务器,然后点击创建虚拟主机。你无需指定文档根目录,只需将服务器名称设置为hello.example.com

    提示

    更多关于设置虚拟服务器的信息,可以在第八章中的创建虚拟主机食谱中找到,运行 Apache Web 服务器。此食谱还解释了如何在/etc/hosts中设置模拟 DNS 记录,如果你没有其他方式将子域指向服务器。

  10. 点击新创建的虚拟服务器的图标。

  11. 点击编辑指令图标。

  12. 在文本区域输入以下配置指令并点击保存

    ServerName hello.example.com
    
    WSGIDaemonProcess hello python-path=/srv/webapps/hello/ processes=3 threads=1
    WSGIProcessGroup hello
    WSGIScriptAlias / /srv/webapps/hello/hello/wsgi.py
    
    Alias /favicon.ico /srv/webapps/hello/static/favicon.ico
    Alias /static/ /srv/webapps/hello/static/
    Alias /media/ /srv/webapps/hello/media/
    

    请参考以下截图:

    如何操作...

  13. 点击应用更改链接。

现在,当你访问hello.example.com时,应该能看到由 Apache 提供的 Django 欢迎界面。

提示

如果你使用的是 SELinux,可能会遇到问题,因为/srv/webapps位置对 Apache 不可访问。可以临时禁用 SELinux,看看是否能解决问题,然后参考以下文档页面,了解如何解决此问题:

code.google.com/p/modwsgi/wiki/ApplicationIssues#Secure_Variants_Of_UNIX

它是如何工作的……

Web 服务器网关接口WSGI)是一个低级接口,连接 Web 服务器和用 Python 编写的 Web 应用或框架。Apache 通过一个名为mod_wsgi的模块能够提供此类应用服务。

我们创建的配置指示 Apache 创建多个守护进程(processes=3),这些进程驻留在内存中,随时准备处理来自 Web 服务器的 HTTP 请求。每个进程中启动的进程数和线程数决定了分配给应用程序的系统资源量,进而决定了它可以同时处理多少个请求。这些参数应根据你的具体需求进行调整。

python-path 参数告诉 Python 它可以在哪里找到额外的应用程序模块。我们的应用程序位于 /srv/webapps/hello/,这是 Python 在查找模块时不会自动搜索的标准位置;因此,我们需要明确指定它的位置。

WSGIScriptAlias 指令指示 Apache 将所有访问域名根 URL (/) 的请求交给 Django 处理。Alias 指令则告诉 Apache,像 /static/ 这样的请求应该直接从磁盘提供。你可以结合使用 AliasWSGIScriptAlias 指令,来指定由应用程序提供服务的域名部分,以及由 Apache 直接提供的部分。

另见

第十二章:设置电子邮件服务器

在本章中,我们将涵盖:

  • 设置你的服务器来发送和接收电子邮件

  • 设置安全的 IMAP 访问邮件箱

  • 为用户设置安全的 SMTP 中继

  • 控制邮件队列

  • 在服务器上读取和发送电子邮件

  • 配置电子邮件别名

  • 使用 Procmail 和 SpamAssassin 过滤传入邮件

  • 调试与电子邮件相关的问题

介绍

电子邮件是互联网的标准通信方式。作为一种向世界任何地方即时、免费发送信息的方式,它成为了互联网的第一个杀手级功能,并预示着许多未来的变化。

电子邮件是一种古老的技术,设计于互联网的早期阶段,那个时候互联网还是比较幼稚的。最初,每个邮件服务器都会接受来自任何人的所有消息,并将其转发到任何目的地。电子邮件账户受到密码保护,但这些密码是象征性的——以明文通过未加密的连接发送,而“垃圾邮件”一词当时主要与蒙提·派森的滑稽剧相关。

不幸的是,随着越来越多的人上网,许多恶意用户开始滥用电子邮件系统。电子邮件变成了一种免费的方式,能够发送营销信息并能触及到全球每一个人。这导致了大量不需要的电子邮件信息的爆发,这些邮件通常被称为垃圾邮件,在其高峰时,垃圾邮件占据了超过 95% 的电子邮件流量。如今,随着管理员奋力抵抗垃圾邮件潮,问题正慢慢减轻。在配置得当的系统上,垃圾邮件不再像以前那样是个困扰,但没有一种万无一失的解决方案。如果你决定托管自己的邮件服务器,请注意,你将需要投入大量工作才能让一切正常运行。

提示

你可能决定让别人托管你的域名的邮件。例如,谷歌为企业提供其 Gmail 服务的商业版——Google Apps for Business。许多公司也提供类似的服务。

因为电子邮件是一个复杂的主题,一章书籍只能帮助你入门。如果你遵循这些步骤,你将会得到一个可用但非常基础的电子邮件系统。如果电子邮件对你的企业很重要,你应该继续阅读更多相关资料。开始这里有一个好处,因为我们将展示 Webmin 在管理邮件服务器中的帮助作用。

在本章中,我们将设置 Postfix,这是一个流行的开源邮件传输代理。它的替代品,如 exim 和 sendmail,也由 Webmin 支持,但这里不作介绍。

设置你的服务器来发送和接收电子邮件

为了处理电子邮件,你的服务器需要运行一个叫做邮件传输代理MTA)的服务,它能够:

  • 接收传入的电子邮件并将其放入用户的本地邮件存储区

  • 向其他 MTA 发送电子邮件并交付给远程系统上的用户

MTAs 使用简单邮件传输协议SMTP)交换信息。邮件服务器监听 25 号端口,接受来自互联网上任何地方的传入电子邮件。如果邮件发送至有效的本地地址,它应该被投递到目标邮箱。

当我们服务器的用户决定发送电子邮件时,MTA 会拾取该邮件,检查邮件的目的地地址,并将其转发到与目标域名关联的 MTA。

注意

MTAs 也可以转发电子邮件——将通过 SMTP 接收的邮件转发到其他目的地。这将在本章后面的为用户设置安全的 SMTP 转发中继教程中讨论。

在本教程中,我们将设置 Postfix 邮件传输代理在您的服务器上运行。

准备工作

电子邮件地址基于以下结构:mailbox@fqdn,其中mailbox唯一标识用户或别名,fqdn通过完全限定域名(FQDN)唯一标识邮件系统。您需要为服务器分配一个 FQDN 才能使用电子邮件系统。

提示

为确保服务器分配了 FQDN,请检查您的域名的 DNS A 记录或 MX(邮件交换)记录是否指向邮件服务器的 IP 地址。DNS MX 记录允许您将邮件托管在除基本 A 记录指定的机器之外的机器上。

在本教程中,我们假设您的服务器的 FQDN 是mailserver.example.com,这使得mailserver是其主机名,example.com是其域名。请用您的实际值替换这些。

如何操作...

按照以下步骤在您的服务器上设置 Postfix:

  1. 按照第一章《设置系统》中的安装软件包教程中的说明,为您的系统安装postfix软件包。

    注意

    一个系统在任何时候只能安装一个 MTA。如果您的系统已安装另一个 MTA,您需要卸载它。如果您是通过系统软件包安装的,应该会自动完成此操作。

  2. 要接收邮件,您的服务器需要在 TCP 端口 25 上响应传入的 SMTP 连接。按照第三章《保护系统》中的通过防火墙允许访问服务教程中的步骤,允许传入的 TCP 流量通过防火墙访问端口25

  3. 转到System | Bootup and Shutdown,勾选postfix旁边的框,然后点击Start Now and On Boot按钮。

  4. 转到Servers | Postfix Mail Server | General Options

  5. What domain to use in outbound mail设置为Use domainname

  6. What domains to receive mail for设置为Whole domain

  7. Internet hostname of this mail system设置为mailserver.example.com

  8. Local internet domain name设置为Default。这将邮件域名设置为主机名去掉第一个组件后的部分。在我们的例子中,这将是example.com

  9. 接收邮件的网络接口设置为全部

  10. 点击保存并应用按钮。

  11. 点击停止 Postfix,然后点击启动 Postfix按钮来重启邮件系统。

现在你的系统应该能够发送和接收电子邮件。按照本章后面的调试电子邮件相关问题配方中的步骤,测试服务器发送和接收邮件的能力。

它是如何工作的……

在这个配方中,我们在你的系统上安装了流行的开源 MTA,Postfix。为了接收邮件,我们在防火墙中打开了 25 端口,并确保在系统启动时启动该服务。

接下来,我们继续配置邮件系统的基本设置。Postfix 将设置保存在路径/etc/postfix/main.cf中的文本文件里。Postfix 的默认配置非常接近工作系统所需的配置,因此我们只需要指定我们将处理的邮件域,并指示 Postfix 监听所有网络接口的连接。

我们修改的每个设置的更多信息可以在 Webmin 中找到。只需点击任何表单字段的标签即可获取详细说明。

另见

既然你已经入门了,你应该阅读本章中的所有配方:

  • 特别是,请查看调试电子邮件相关问题配方

  • 要允许用户从你的服务器获取电子邮件,请参考配方,设置安全的 IMAP 访问邮件盒

  • 要允许用户通过你的系统发送电子邮件,请参考配方,为用户设置安全的 SMTP 中继

设置安全 IMAP 访问邮件盒

通过你的 MTA 接收到的邮件会被传递到服务器上的一个队列目录。收件人应从这里提取消息并将其存储在自己的邮箱中。如果用户通过 SSH 连接到你的服务器,他们可以使用终端应用程序如muttalpine,并将邮件存储在他们的主目录中。你还可以提供另一种访问方法,如基于 Apache 和 PHP 运行的 Web 邮件应用程序 Roundcube。Webmin 的伴侣产品 Usermin 也为用户提供基本的邮件功能。有关更多信息,请参见第二章中的安装 Usermin配方,用户管理

提示

你可以在线查找有关这些程序的更多信息,但大多数系统发行版提供了便捷的安装包,使得安装变得非常容易:

Roundcube:www.roundcube.net

Alpine,Pine 的继任者:www.washington.edu/alpine/

Mutt:www.mutt.org

然而,接收电子邮件的标准方法是使用邮件用户代理MUA),更常见的名称是电子邮件客户端或电子邮件阅读器。像 Thunderbird、KMail、Evolution、Apple Mail、Outlook 以及许多其他程序,都是桌面用户使用的客户端。这些程序通过 IMAP、POP3 和 SMTP 协议与您的服务器进行通信。

协议 功能
POP3 用于通过下载整个邮箱来获取服务器上的邮件。
IMAP 用于下载新邮件并管理服务器上的邮件。
SMTP 用于提交邮件以供传递给其他人。

在这个教程中,我们将演示如何通过一个名为 Dovecot 的辅助服务器设置对 Postfix 服务器的 IMAP 访问。我们会确保通过 TLS 加密连接来确保访问的安全。在下一个教程中,为用户设置安全的 SMTP 中继,我们将演示如何设置 SMTP。

注意

POP3 协议正逐渐过时,因此在本教程中,我们将重点介绍 IMAP。如果您需要使用 POP3,按照描述的软件进行启用非常简单。

准备工作

在本教程中,我们将基于设置服务器以发送和接收电子邮件中描述的基本 Postfix MTA 设置进行扩展。在开始此教程之前,请确保您的 Postfix 正常工作。

我们需要知道您 Postfix 邮件队列目录的位置。请按照以下步骤检查:

  1. 进入服务器 | Postfix 邮件服务器 | 常规选项

  2. 记下邮件队列目录的值。

如何操作...

按照以下步骤设置 Dovecot IMAP 服务:

  1. 按照第一章中的安装软件包教程中的说明,安装 Dovecot 版本 2。该软件包应命名为 dovecot,但在某些(基于 Debian 的)系统上,您可能需要安装一些小的子包,如 dovecot-commondovecot-imapd,以及可选的 dovecot-pop3d

  2. 您的服务器需要在 TCP 端口 143 和 993 上响应传入的 IMAP 连接。请按照第三章中通过防火墙允许访问服务教程中的步骤,允许通过防火墙将传入的 TCP 流量发送到端口 143993

  3. 进入系统 | 启动与关机,勾选dovecot旁边的框,然后点击立即启动并开机启动按钮。

  4. 进入服务器 | Dovecot IMAP/POP3 服务器 | 网络与协议

  5. 服务邮件协议中,选择IMAP

  6. 点击保存

  7. 进入服务器 | Dovecot IMAP/POP3 服务器 | 邮件文件

  8. 将邮件位置和读取选项设置为其他 Dovecot位置,并根据您的 Postfix 邮件队列目录的位置输入一个字符串。例如,如果位置是/var/spool/postfix,请输入以下内容:

    mbox:~/mail:INBOX=/var/spool/postfix/%u
    
  9. UIDL 格式设置为其他,并在文本框中输入%08Xu%08Xv

  10. 点击保存

  11. 转到服务器 | Dovecot IMAP/POP3 服务器 | SSL 配置

  12. 是否禁止在非 SSL 模式下使用明文身份验证?设置为

  13. 点击保存

  14. 点击应用配置按钮。

用户现在可以通过 IMAP 连接到您的服务器以接收邮件。通过在电子邮件客户端程序中创建一个帐户并使用以下设置测试配置:

  • IMAP 服务器:您的邮件服务器的主机名

  • 端口143993

  • 要求 SSL

  • 用户名:您的系统用户名

  • 密码:您的系统密码

    提示

    如果连接遇到问题,请在服务器的邮件日志中查找调试信息。如果您看到类似Operation not permitted (egid=500(username), group based on /var/spool/mail/username)的错误信息,则需要更改邮件存储目录中文件的组权限。您可以通过执行以下命令来完成此操作:

    $ sudo find /var/spool/mail -type f -execchmod 0600 '{}' \; -print
    
    

    将遇到的错误信息粘贴到搜索引擎中,查找其他问题的解决方法。

工作原理...

Dovecot 旨在安全且易于配置。在安装过程中,它会生成一个自签名的 SSL 证书,以加密与客户端的通信。这非常重要,因为没有加密,您的系统用户名和密码会以明文形式通过互联网传输,并且可能会被沿途的每个 ISP 读取。电子邮件客户端会抱怨没有受信任的证书颁发机构签署您的证书。您可以购买一个签名证书,并替换掉 Dovecot 生成的自签名证书,从而摆脱这些错误信息。有关更多信息,请查看更多内容部分。

Dovecot 在端口 143 或 993 上监听 IMAP 连接。传统上,端口 143 用于未加密的 IMAP 连接,而端口 993 用于 SSL/TLS 加密连接。Dovecot 允许这两个端口都使用加密;实际上,我们特别指示它拒绝在非 SSL 模式下的身份验证尝试。保持两个端口都开放可以让用户更容易配置他们的电子邮件客户端,因为这些客户端会尝试猜测 IMAP 端口。

更多内容...

专业的电子邮件服务使用商业签名的 SSL 证书。要更换您的证书,请按照以下步骤操作:

  1. 将您购买的证书、私钥以及证书颁发机构的证书上传到服务器上的一个文件夹。

  2. 确保私钥受到保护,并且除了 root 用户外,其他用户无法读取。

  3. 转到服务器 | Dovecot IMAP/POP3 服务器 | SSL 配置

  4. 在标记为SSL 证书文件SSL 私钥文件SSL CA 证书文件的文本字段中指定每个上传文件的路径。

  5. 如果您的密钥是密码保护的,请在密钥文件密码字段中输入密码。

  6. 点击保存按钮。

另见

  • 有关处理 SSL 证书的更多信息,请查看第八章中的设置加密网站与 SSL步骤,运行 Apache Web 服务器

  • 您的用户需要通过 SMTP 协议通过您的服务器发送电子邮件。有关此部分的更多信息,请查看下一个步骤,为用户设置安全的 SMTP 中继

  • 与本章中的每个步骤一样,如果遇到问题,请查看本章中的调试电子邮件相关问题

为用户设置安全的 SMTP 中继

使用邮件客户端程序的用户希望通过 SMTP 协议通过您的服务器发送邮件。由于我们已经设置了 MTA,您的服务器已支持 SMTP 连接,但仅限于接收发往您域的电子邮件。对于发往非您域的匿名提交邮件,应当拒绝。否则,我们将创建一个所谓的开放中继,垃圾邮件发送者将迅速滥用您的服务器。反垃圾邮件过滤器会将您的服务器列入黑名单,其他邮件服务器将停止接受来自您用户的邮件。

为了避免创建一个开放中继,同时允许远程用户向其他域发送邮件,我们需要要求用户认证。我们将允许认证的用户提交发往任何域的邮件,但拒绝匿名提交的外发邮件。

SMTP 协议支持一种名为简单认证与安全层SASL)的认证方式,允许用户在提交电子邮件之前指定用户名和密码。

在这个步骤中,我们将使用 Postfix 和 Dovecot 的组合来为 SMTP 服务器设置 SASL 认证。敏感信息不应通过未加密的连接发送,因此我们还将为 SMTP 连接提供一层 TLS 加密。

准备工作

这个步骤建立在之前步骤的基础上,即设置服务器以发送和接收电子邮件设置安全的 IMAP 访问邮件盒。在开始此步骤之前,确保 Postfix 和 Dovecot 正常工作。

我们需要知道 Postfix 用户名和组名。按照以下步骤检查:

  1. 导航至服务器 | Postfix 邮件服务器 | 常规选项

  2. 记下邮件所有者的值;这就是 Postfix 用户名。

  3. 导航至系统 | 用户和组,并检查此用户的主要组。

如何操作...

按照以下步骤为您的用户设置安全的 SMTP 中继:

  1. 导航至服务器 | Postfix 邮件服务器 | SMTP 认证与加密

  2. 是否要求 SASL SMTP 认证?设置为

  3. 是否禁止通过不安全连接使用 SASL 认证?设置为

  4. 处理不合规的 SMTP 客户端?设置为

  5. SMTP 安全选项下,勾选拒绝匿名登录复选框。

  6. SMTP 中继限制下,勾选以下标记的复选框:

    • 允许来自同一网络的连接

    • 允许已认证的客户端

    • 拒绝发送到其他域的邮件

  7. 启用 TLS 加密? 设置为 如果客户端要求

  8. 您应该使用 Dovecot 服务器所使用的相同 SSL 证书。提供您的 TLS 证书文件TLS 私钥文件,以及可选的 TLS 证书授权文件 路径:操作方法...

  9. 点击 保存并应用

  10. 导航到 服务器 | Postfix 邮件服务器 | 编辑配置文件

  11. 编辑配置文件 下拉菜单中选择 main.cf

  12. 点击 编辑 按钮。

  13. 滚动到配置文件的底部,并添加以下设置:

    smtpd_sasl_type = dovecot
    smtpd_sasl_path = private/auth
    
  14. 点击 保存

  15. 导航到 服务器 | Dovecot IMAP/POP3 服务器 | 编辑配置文件

  16. 编辑配置文件 下拉菜单中选择 10-master.conf

  17. 点击 编辑 按钮。

  18. 查找 auth 服务的配置部分,并取消注释与套接字相关的行。指定 Postfix 用户的用户名和组名。完成后,配置部分应该类似于以下代码:

    service auth
    {
    ...
      # Postfix smtp-auth
      unix_listener /var/spool/postfix/private/auth
      {
        mode = 0660
        user = postfix
        group = postfix
      }
    ...
    }
    

    操作方法...

  19. 点击 保存

  20. 点击 停止 Dovecot 服务器 按钮,然后点击 启动 Dovecot 服务器 按钮以重启守护进程。

用户现在可以通过 SMTP 连接到您的服务器并发送邮件。通过在您的电子邮件客户端程序中创建一个帐户并使用以下设置来测试配置:

  • SMTP 服务器:您的邮件服务器的主机名

  • 端口25

    提示

    有些用户可能在使用 25 端口时遇到问题。请查看 更多内容... 部分,了解如何添加备用 SMTP 端口号 587 的设置说明。

  • 要求 SSL

  • 用户名:您的系统用户名

  • 密码:您的系统密码

    提示

    如果连接有问题,请在服务器的邮件日志中查找调试信息。请参考 使用 Telnet 测试 SMTP 认证 部分以及 调试电子邮件相关问题 方案中的方法,手动测试您的服务器。将遇到的任何错误信息粘贴到搜索引擎中以寻找解决方案。

它是如何工作的...

Dovecot 和 Postgres 一起工作,提供经过身份验证的 SMTP 服务器。Dovecot 提供 SASL 身份验证服务,通过 UNIX 套接字访问。配置文件 10-master.conf 告诉 Dovecot 在启动时要启动哪些服务。我们编辑了此文件,指示 Dovecot 启动 SASL 服务(名为 auth)。我们指定了套接字的位置(/var/spool/postfix/private/auth)以及哪些用户和组可以连接到它(postfix)。

我们还编辑了 Postfix 的主配置文件 main.cf。我们所做的更改使 Postfix 在中继消息提交时要求通过加密连接进行 SASL 身份验证。我们还告诉 Postfix 使用哪种类型的认证后端(dovecot)以及相对于其邮件队列目录的套接字位置(private/auth)。

更多内容...

一些互联网服务提供商(ISP)会阻止端口 25 上的流量,以防止病毒和蠕虫感染的计算机滥用电子邮件系统。你的服务器可以在备用端口 587 上提供 SMTP 服务。这将允许来自这些 ISP 的用户通过你的服务器发送邮件。

按照以下步骤指示 Postfix 在端口 587 上监听 SMTP 连接:

  1. 导航到服务器 | Postfix 邮件服务器 | 服务器进程

  2. 点击添加新服务器进程

  3. 传输类型设置为互联网

  4. 服务器名称/端口设置为587

  5. 处理命令设置为smtpd

  6. 是否启用?设置为

  7. 监听主机地址设置为任何地址

  8. 是否私有于邮件系统?设置为还有更多...

  9. 点击创建

  10. 导航到服务器 | Postfix 邮件服务器 | 服务器进程

  11. 点击停止 Postfix,然后点击启动 Postfix以重启服务。

另见

要获取关于此设置的更详细信息,请参考 Postfix 和 Dovecot 手册:

控制邮件队列

你的邮件服务器将要发送的消息被放置在邮件队列中。通常,它们不会在队列中停留太久,因为服务器会在消息发送后立即删除它们。然而,如果由于某种原因消息无法发送,它可能会一直滞留在队列中。

检查邮件队列将为你提供关于邮件系统健康状况的重要信息。Webmin 提供了一个方便的图形用户界面,用于查看和控制队列。

准备工作

在本教程中,我们将控制 Postfix MTA 的邮件队列。有关其安装的更多信息,请参考本章中的设置服务器以发送和接收电子邮件教程。

如何操作...

  1. 导航到服务器 | Postfix 邮件服务器 | 邮件队列

  2. 如果当前没有消息排队等待发送,Webmin 会通知你。否则,你将看到类似以下截图的消息列表:如何操作...

  3. 要从队列中删除消息,标记其 ID 旁边的复选框,然后点击删除选定的消息

它是如何工作的...

Webmin 通过发出适当的 Postfix 超级用户(postsuper)或 Postfix 队列控制(postqueue)命令来控制 Postfix 邮件队列。下表列出了 Webmin 允许你执行的命令功能:

命令 功能
删除消息 这会将消息从队列中删除,而不发送它。
重新排队消息 这将把消息移动到一个新的队列文件,并重新启动发送尝试。
保留消息 这会将消息保持并且不会尝试发送它。
解除保留消息 这会解除对消息的保留,并尝试发送它。
刷新队列 这会尝试发送所有排队的消息。
刷新队列 这将更新队列信息。

在服务器上阅读和写邮件

Webmin 提供了一个便捷的界面,允许你以系统中的任何用户身份阅读和写入邮件。这在调试邮件问题时非常有用,例如检查某封邮件是否已经到达了特定的邮箱。当然,记得保持用户隐私。

如何操作...

  1. 导航至 服务器 | 读取用户邮件

  2. 点击你希望访问的用户的邮箱名称。

  3. 你将看到一个类似于任何邮件程序的图形界面,允许你阅读用户的电子邮件:如何操作...

  4. 点击 撰写 按钮,看到一个写作和发送新邮件的界面。

  5. 输入目标地址、邮件主题和正文。

  6. 点击 发送邮件 按钮。

它是如何工作的...

Webmin 提供了一个用 Perl 编写的基本邮件客户端程序。得益于这一功能,Webmin 可以读取和写入用户邮箱中的邮件。

配置电子邮件别名

每个电子邮件地址通常与服务器上单个用户的邮箱相关联。然而,在某些情况下,将来邮转发给多个用户或另一个服务器上的地址是有益的。这可以通过使用邮件别名来实现,Postfix 支持这一功能,而 Webmin 使其管理变得容易。

提示

有一些别名是每个邮件服务器应该定义的。例如,发送到 root 邮箱的邮件应该始终到达一个实际的人。如果你正在运行邮件服务器,你还应该定义名为 postmasterabuse 的别名,供人们报告邮件相关问题。如果你希望读取自动化邮件传输代理(MTA)回复的邮件,可以为 mailer-daemon 定义一个别名。

关于常见邮箱名称的更多信息,可以参考 RFC2142 文档,网址为 tools.ietf.org/html/2142.

Postfix 别名不仅允许你将邮件转发到其他地址,还可以将其内容保存到文件或通过管道发送到其他应用程序。像密码验证代码这类敏感数据通常通过电子邮件发送,因此要注意此类目标地址的安全性。

在这篇教程中,我们演示了使用 Webmin 配置 Postfix 邮件别名是多么简单。

如何操作...

配置电子邮件别名的步骤如下:

  1. 导航至 服务器 | Postfix 邮件服务器 | 邮件别名

  2. 点击 创建新别名

  3. 地址 字段中,输入本地电子邮件地址,省略域名部分,也就是说,对于 mailbox@example.com,只需输入 mailbox

  4. 启用? 设置为

  5. 别名为 设置为 电子邮件地址,并在提供的文本字段中输入完整的电子邮件地址或本地邮箱名称。

  6. 点击 保存

它是如何工作的...

每当 Postfix 遇到传入消息时,它会检查目标地址是否包含在已定义的别名中。大多数系统将别名的主列表存储在名为 /etc/aliases 的文本文件中。由于该文件可能变得非常庞大,因此不会直接使用其文本格式。相反,它会转换为一个索引二进制文件,从而加快查找速度。每次修改别名文件时,Webmin 会执行一个名为 postalias 的命令,它会创建二进制索引。该命令会类似于以下内容,路径根据你的系统进行调整:

/usr/sbin/postalias -c /etc/postfix /etc/aliases 

Postfix 别名可以执行下表中列出的多种不同功能。Webmin 允许你不仅创建所有这些别名,还可以创建一些可能不被你的 MTA 支持的别名。此表列出了定义别名 test(如 test@example.com)的不同方式及其可能的功能:

别名语法 功能
test: user 这将消息转发到另一个本地邮箱。
test: user@remotedomain.com 这将消息转发到远程电子邮件地址。
test: "/path/to/file" 这将传入的消息附加到文件中。
test: "&#124;/usr/local/bin/mailhelper" 这将传入的消息传递给一个程序。
test: user, root, user@remotedomain.com 这将消息转发给一组收件人。
test: :include:/path/to/aliases 这将消息转发到 /path/to/aliases 中列出的目的地。

还有更多...

有许多有趣的方法可以使用邮件别名,例如创建一个基本的邮件列表。用户还可以通过在他们的主目录中创建一个特殊文件来影响邮件的转发方式。

创建一个简单的邮件列表

你可以通过创建一个地址并将其设置为转发邮件到文本文件中定义的地址来创建一个基本的邮件列表。然后,你可以通过编辑该文件来管理订阅。例如,你可以通过以下步骤创建一个邮件列表 students@yourdomain.com

  1. 创建一个文件 /etc/postfix/list-students.txt``。

  2. 在文件中输入所有列表成员的电子邮件地址,每行一个地址。

  3. 导航至服务器 | Postfix 邮件服务器 | 邮件别名

  4. 点击创建新别名链接。

  5. 地址字段中,输入没有域名的邮件列表地址,例如 students.

  6. 启用?设置为

  7. 别名设置为设置为文件中的地址,并在提供的文本框中输入 /etc/postfix/list-students.txt

  8. 点击保存

    提示

    这种类型的邮件列表提供的只是最基本的功能。用户无法管理他们的邮件偏好或退出。也有多个专门应用于运行全功能邮件列表的程序。你可以看看 Mailman (www.list.org) 和 Sympa (www.sympa.org)。

使用 .forward 文件

用户还可以通过在其主目录中放置名为.forward的文件来控制自己的邮件转发偏好。在 Postfix 将邮件投递给用户之前,它会检查该文件是否存在,如果存在,Postfix 会将邮件按照文件中指定的地址进行转发。.forward文件中还可以指定其他类型的别名行为。

另请参见

使用 Procmail 和 SpamAssassin 过滤传入邮件

电子邮件使我们能够向几乎全世界的人发送免费信息。不幸的是,一些人决定滥用这个系统,发送未经请求的大量邮件(垃圾邮件),希望通过广告或欺诈赚取钱财。如此多的人被这一可能性所诱惑,以至于在某一时刻,垃圾邮件占据了超过 95%的电子邮件流量。这会使电子邮件几乎无法使用,但幸运的是,反垃圾邮件过滤器使得这个问题变得更加可控。

垃圾邮件防治是一个庞大而复杂的话题。在本教程中,我们将演示一种基于 Procmail 和 SpamAssassin 程序的有效且基础的技术。如果您的站点处理大量电子邮件,您可能需要更高效的解决方案。

如何操作……

本教程分为两部分。首先,我们指导 Postfix MTA 将传入的邮件交给一个叫做 Procmail 的过滤程序处理。接下来,我们创建一个过滤器,通过 SpamAssassin 处理邮件,并将垃圾邮件发送到单独的邮箱。

首先,我们从在 Postfix 中设置 Procmail 过滤器开始:

  1. 按照第一章《安装软件包》中的安装软件包教程中的说明安装 Procmail。其软件包应简单命名为procmail

  2. 通过发出以下命令来确定procmail二进制文件的位置:

    $ which procmail
    
    

    该命令的输出将给出二进制文件的位置,如下所示:

    /usr/bin/procmail
    
    
  3. 进入服务器 | Postfix 邮件服务器 | 本地投递

  4. 用于替代邮箱投递的外部命令文本框中输入以下命令。如果路径不同,请将/usr/bin/procmail替换为您的实际位置。

    /usr/bin/procmail -a "$EXTENSION"
    
    
  5. 点击保存并应用

现在,让我们在 Procmail 中设置 SpamAssassin 过滤器:

  1. 安装 SpamAssassin,其软件包应简单命名为spamassassin

  2. 通过发出以下命令来确定spamassassin二进制文件的位置:

    $ which spamassassin
    /usr/bin/spamassassin
    
    
  3. 进入服务器 | Procmail 邮件过滤器

  4. 点击添加新过滤器操作链接。

  5. 投递模式设置为传递到程序,并在文本框中输入spamassassin二进制文件的路径。

  6. 勾选动作程序是过滤器等待动作程序完成并检查结果复选框。

  7. 投递锁定文件设置为特定文件,并在文本框中输入spamassassin.lock

  8. 不设置任何动作条件;我们希望将所有邮件都通过 SpamAssassin 处理:如何操作...

  9. 点击 Create

现在让我们创建第二个过滤器,它将把所有垃圾邮件移动到另一个名为 Junk 的文件夹中。

  1. 点击 Add a new filter action 链接。

  2. Delivery mode 设置为 Append to file,并在文本框中输入 $HOME/mail/Junk

  3. Delivery lock file 设置为 Default

  4. Condition type 下,选择 Matches regular expression,并输入 ^X-Spam-Status: Yes如何操作...

  5. 点击 Create

现在,传入邮件应该传递给 SpamAssassin。检测到的垃圾邮件不应投递到用户的常规邮箱,而应存储在用户主目录下的 ~/mail/Junk 文件中。

工作原理...

这个配置试图通过将传入邮件通过两个程序来过滤垃圾邮件。第一个是 Procmail,一个邮件传递代理(MDA)。Postfix 将邮件交给 MDA 进行投递到邮箱。Procmail 的附加功能是通过一系列可配置的过滤器处理邮件。Procmail 过滤器检查邮件的头部或正文,并根据内容决定如何处理邮件。

注意

Procmail 是一种在许多操作系统上默认安装的稳定软件。不幸的是,它已经不再维护,因此未来不会再添加新功能。maildrop 程序常被推荐作为 Procmail 的较新替代品,但 Webmin 当前不支持它。更多信息请访问 www.courier-mta.org/maildrop/

在我们的示例中,我们设置了两个 Procmail 过滤器。第一个没有条件,这意味着它适用于每封邮件,并将邮件交给另一个程序进行垃圾邮件分析。SpamAssassin 检查邮件的每一部分,查找邮件传递过程中涉及的 MTA 的 DNS 记录,并将其与垃圾邮件黑名单及其他垃圾邮件信息源进行比对。它使用所有这些数据进行统计分析和人工智能分析,最终为每封邮件打分。如果分数较高,这封邮件可能会被认为是垃圾邮件。SpamAssassin 会将其报告写入邮件头,并将其返回给 Procmail。

我们的第二个 Procmail 过滤器检查邮件头,查看 SpamAssassin 是否判定该邮件为垃圾邮件(X-Spam-Status: Yes)。这些邮件将不会送达用户的收件箱,而是会被附加到一个名为 Junk(~/mail/Junk)的二级收件箱。

提示

如果您的系统将处理大量邮件,那么每处理一封邮件就调用 SpamAssassin 可能会造成严重的瓶颈。它可能会显著减慢服务器速度并导致问题。有一种方法可以通过将 SpamAssassin 作为后台守护进程运行来优化其性能。请在其手册中查找相关信息。

还有更多...

一旦一切设置好,你应该测试你的反垃圾邮件配置。有一种方法可以触发 SpamAssassin 的高分。只需在一条消息中输入以下字符串,它将被标记为垃圾邮件:

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

你可以在 SpamAssassin 的手册中找到更多关于这种技术的信息,称为未经请求的大宗电子邮件通用测试GTUBE),网址是:spamassassin.apache.org/gtube/

另请参见

  • 在 SpamAssassin 手册中,你可以找到更多关于我们创建的设置的信息,其中包含一组稍微复杂的 Procmail 过滤器,解决了你可能遇到的一些常见错误,网址是:wiki.apache.org/spamassassin/UsedViaProcmail

调试与电子邮件相关的问题

通过直接与 SMTP 进行 Telnet 会话,你将能够了解更多关于你的邮件服务器的信息。同时,你应当监视邮件日志文件,查看在进行测试时出现的任何消息。

在这个教程中,我们涵盖了多种用于测试和调试电子邮件系统的技术。我们将演示如何测试你的系统是否能够:

  • 通过 SMTP 直接提交邮件来接收电子邮件

  • 通过邮件命令发送邮件

  • 认证用户

我们还会提到邮件日志的位置、发送电子邮件的各种方式、调试 SMTP 认证及其他相关话题。继续阅读;这个教程应该能为你找到解决问题的方法。

准备工作

我们将测试位于mailserver.example.com域名的系统的邮件功能。我们的测试将在另一台机器(客户端)上执行。

在开始之前,请确保客户端机器上已安装 Telnet 程序。大多数系统默认安装 Telnet 客户端,其他系统可以通过名为telnet的包进行安装。

提示

在某些系统上,Netcat(nc)程序可能是使用 Telnet 的更好选择。你可以在它的官方网站上了解更多信息:nc110.sourceforge.net

如何操作...

按照以下步骤,使用 Telnet 将电子邮件消息直接提交到你的服务器:

  1. 在客户端机器上,打开终端,输入以下命令启动 Telnet 客户端并连接到mailserver.example.com系统的25端口:

    $ telnet mailserver.example.com 25
    
    

    邮件服务器应该会回应其欢迎横幅。

  2. 输入EHLO命令后,跟上客户端系统的完全合格域名。当你按下Enter键时,服务器应该会返回一系列250消息:

    EHLO localhost.localdomain
    
    

    提示

    如果你的客户端系统本身不是邮件服务器,它可能没有完全合格域名(FQDN)。在这种情况下,使用localhost.localdomain,但请注意,大多数邮件服务器会拒绝来自错误识别发送者的邮件。如果这给你带来问题,请查找 Postfix 手册中的XCLIENT命令。

  3. 输入MAIL FROM命令以指定发件人的电子邮件地址。服务器应对以下命令作出250 OK响应:

    MAIL FROM: user@localhost.localdomain
    
    
  4. 输入RCPT TO命令以指定收件人的电子邮件地址。服务器应对以下命令作出250 OK响应:

    RCPT TO: user@example.com
    
    
  5. 输入DATA命令以开始消息正文。

  6. 可选地,输入电子邮件头部。例如,输入Subject:头部来指定消息主题,如以下命令所示:

    Subject: Test
    
    
  7. 输入一个空行来结束头部部分并开始消息正文。

  8. 输入消息,并通过在单独一行输入一个点(.)来结束。服务器应以250 OK消息响应,并表明消息已排队等待发送。

  9. 输入QUIT以结束 SMTP 会话。

完整的 Telnet 会话可能类似于以下命令。你的命令已高亮显示。

$ telnet mailserver.example.com 25
Trying 10.10.10.200...
Connected to mailserver.example.com.
Escape character is '^]'.
220 mailserver.example.com ESMTP Postfix (Debian/GNU)
EHLO localhost.localdomain
250-mailserver.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: user@localhost.localdomain
250 2.1.0 Ok
RCPT TO: user@example.com
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: Test

This is the message body.
.
250 2.0.0 Ok: queued as DBE6040983
QUIT
221 2.0.0 Bye
Connection closed by foreign host.

它是如何工作的…

Telnet 客户端允许你与服务器建立一个交互式 TCP 连接。当你成功连接到端口25时,SMTP 服务会以代码220和欢迎信息进行响应。你可以输入文本命令,按 Enter 后会将这些命令发送到服务器。服务器的响应会在线显示,你可以继续发送下一个命令。此技术可用于调试通过 TCP 运行的任何基于文本的协议,如 HTTP、FTP、POP 或 IMAP。

简单邮件传输协议(SMTP)就像它的名字一样简单。发送电子邮件所需的唯一命令是EHLOMAIL FROMRCPT TODATA

注意

EHLO命令曾被称为HELO。在当前扩展版协议(ESMTP)中,EHLO取代了HELO。使用EHLO表示你准备使用这个协议版本。

有关消息的其他信息通过信封提供,信封由多个头部组成。每个头部都在单独一行中提供,格式为头部名称、冒号和头部内容。此部分以空行结束。

注意

有关电子邮件格式的更多信息,请参见 RFC 2822:

tools.ietf.org/html/rfc2822

消息正文在发送一个单独的点字符(.)的行时结束。这表示消息提交完毕,服务器会以250 OK和消息已排队等待发送的信息进行回应,或者显示错误消息。消息已排队并不代表它一定会被送达。电子邮件系统将对其进行病毒扫描,分析其是否为垃圾邮件,并可能决定不发送(退回)该消息。在大多数情况下,如果消息无法送达,发件人会收到一封回复电子邮件通知。如果消息被归类为垃圾邮件,可能不会收到此类通知。

使用 Telnet 分析您的电子邮件服务器正在做什么,是查看其他尝试发送邮件给您时可能遇到的错误的好方法。请注意,并非所有的诊断消息都会以 SMTP 响应的形式显示。如果您看到任何错误,应该密切关注服务器的邮件日志,以获取更多的详细信息。

还有更多...

在调试电子邮件系统问题时,您应该使用许多其他工具。以下部分描述了其中的一些工具:

分析邮件日志

您的 Postfix 服务器将详细日志发送到 Syslog 的mail设施。这些消息通常保存在名为/var/log/mail.log/var/log/maillog或类似名称的文件中。有关更多信息,请参阅第五章中关于查看和搜索系统日志文件以及将 Syslog 消息保存到文件的章节,监控您的系统

每个进入您服务器的消息都会分配一个唯一的 ID,这使您可以通过详细的日志追踪它。例如,从root@mailserver.example.com发送到user@other.example.com的单个消息,在被您的服务器接收、排队、投递并删除时,可能会留下如下日志记录。请注意,消息标识符EB0FA2049B出现在每一条记录中。

Jan 11 09:35:27 mailserver postfix/pickup[23061]:EB0FA2049B: uid=0 from=<root@mailserver.example.com>
Jan 11 09:35:27 mailserver postfix/cleanup[23063]:EB0FA2049B: message-id=<1389429314.22675@mailserver.example.com>
Jan 11 09:35:27 mailserver postfix/qmgr[23062]:EB0FA2049B: from=<root@mailserver.example.com>,size=581, nrcpt=1 (queue active)
Jan 11 09:35:33 mailserver postfix/smtp[23065]:EB0FA2049B: to=<user@other.example.com>, relay=other.example.com[10.10.10.200]:25, delay=18,delays=13/0.03/5.1/0.02, dsn=2.0.0,status=sent (250 2.0.0 Ok: queued as 5431B40983)
Jan 11 09:35:33 mailserver postfix/qmgr[23062]:EB0FA2049B: removed

通过 Webmin 测试消息发送

Webmin 提供了一种方便的方式来测试您的邮件服务器是否能够发送电子邮件消息。只需按照以下步骤操作:

  1. 转到服务器 | 读取用户邮件

  2. 点击您希望以其身份发送消息的用户名,例如root

  3. 点击撰写按钮。

  4. 使用图形界面输入电子邮件消息、主题和收件人地址。

  5. 点击发送

从命令行发送邮件

发送电子邮件的一个快捷方式是使用mail命令。您可以手动输入消息正文或通过管道将其传递给mail命令。例如,要向user@example.com发送消息,可以使用以下语法:

$ echo "Message body" | mail -s "Subject" user@example.com

如果在系统中找不到该命令,您可能需要安装一个名为mailmailx的包。

使用 Telnet 测试 SMTP 身份验证

您可以通过 Telnet 会话测试服务器的 SMTP 身份验证。唯一需要注意的地方是使用 Base64 编码您的用户名和密码组合。例如,要编码用户名myusername和密码mypassword,可以使用以下 Perl 命令:

$ perl -MMIME::Base64 -e 'printencode_base64("\000myusername\000mypassword");'

您应该看到以下输出:

AG15dXNlcm5hbWUAbXlwYXNzd29yZA==

注意

Base64 只是一种编码形式;它不是单向哈希或加密。该算法是完全可逆的,例如,可以使用以下命令:

$ perl -MMIME::Base64 -e 'printdecode_base64("AG15dXNlcm5hbWUAbXlwYXNzd29yZA==");
myusernamemypassword

一旦您获得了 Base64 编码的用户名和密码,您就可以在 Telnet SMTP 会话的AUTH命令中使用它,如下所示:

$ telnet mailserver.example.com 25
Trying 10.10.10.200...
Connected to mailserver.example.com.
Escape character is '^]'.
220 mailserver.example.com ESMTP Postfix (Debian/GNU)
EHLO localhost.localdomain
250-mailserver.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN AG15dXNlcm5hbWUAbXlwYXNzd29yZA==
235 2.0.0 Authentication successful

如果一切按照计划进行,您应该看到Authentication successful消息。

另见

  • 查阅 Postfix 手册,获取有关配置和调试的更多信息。特别是,查看www.postfix.org/DEBUG_README.html页面,其中介绍了调试内容。

  • 其他更高级的 Postfix 调试工具包括qshape命令,它将为你提供哪些消息在服务器上卡住的概览,以及XCLIENT功能,它允许你假装是另一个系统的用户。更多信息可以在以下手册页中找到:

  • 此外,查看本章中的控制邮件队列小节。

posted @ 2025-07-05 19:50  绝不原创的飞龙  阅读(99)  评论(0)    收藏  举报