如何在Debian8上使用Cachet创建状态页面

来自菜鸟教程
跳转至:导航、​搜索

介绍

Cachet 是一种自托管状态页面,可替代 StatusPage.ioStatus.io 等托管服务。 它可以帮助您传达应用程序的正常运行时间和停机时间,并共享有关任何中断的信息。

它是用 PHP 编写的,因此如果您已经有 LAMP 或 LEMP 服务器,安装起来很容易。 它具有干净的界面,旨在响应迅速,因此可以在所有设备上运行。 在本教程中,我们将在 Debian 上使用 Cachet 设置状态页面。 我们将使用的软件堆栈是:

  • Cachet 用于状态页面本身
  • Composer 管理 Cachet 的 PHP 依赖
  • SQLite 作为存储Cachet数据的数据库
  • Nginx 服务状态页

请注意,Cachet 不会监控您的网站或服务器的停机时间; Cachet 记录事件,可以通过 Web 界面或使用 Cachet 的 API 手动更新。 如果您正在寻找监控解决方案,请查看 Building for Production:Web 应用程序 - 监控 教程。

先决条件

要遵循本教程,您将需要:

  • 按照 Initial Server Setup with Debian 8 教程设置一台 Debian 8 服务器,包括 sudo 非 root 用户。 Cachet 可以使用 512MB 的内存,但 1GB 或更多会提供最佳性能。
  • 具有 A 记录的完全限定域名 (FQDN),将您的域指向服务器的 IPv4 地址。 您可以在 Namecheap 上购买 FQDN 或在 Freenom 上免费获得一个,您可以按照 this hostname tutorial 了解如何设置 DNS 记录的详细信息。
  • 使用 Let's Encrypt 安装和设置 Nginx。 您可以按照 How To Install Nginx on Debian 8 教程安装 Nginx,然后按照 How To Secure Nginx with Let's Encrypt on Debian 8 的前两个步骤设置 Let's Encrypt . 可以跳过其余步骤,因为我们将为 Cachet 创建自己的配置文件。
  • 按照 如何在 Debian 8 上安装和使用 Composer 的步骤 1 和 2 安装 Composer。
  • Git 按照 如何在 Debian 8 上安装 Git 的第 1 步安装,因此您可以从 GitHub 拉取 Cachet 的源代码。
  • SMTP 服务器,因此 Cachet 可以向订阅者发送事件电子邮件,并向在 Cachet 界面中创建的用户发送密码提醒。 例如,您可以 使用 Postfix 作为仅发送 SMTP 服务器,或使用第三方提供商,如 Mailgun

第 1 步 - 创建 Cachet 用户

首先要做的是创建一个单独的用户帐户来运行 Cachet。 这将具有安全性和隔离性的额外好处。

sudo useradd --create-home --shell /bin/bash cachet

此命令将创建一个名为 cachet 的用户,其主目录位于 /home/cachet,其 shell 将设置为 /bin/bash。 默认值为 /bin/sh,但在其提示中没有提供足够的信息。 它将是一个无密码用户,将拥有 Cachet 将使用的组件的专有权限。

现在用户已创建,让我们安装 PHP 依赖项。

第 2 步 — 安装 PHP 依赖项

接下来,我们需要安装 Cachet 的依赖包,它们是一些 PHP 包以及 Composer 用来下载和解压 PHP 库的 wgetunzip

sudo apt-get install \
  php5-fpm php5-curl php5-apcu php5-readline \
  php5-mcrypt php5-apcu php5-cli php5-gd php5-sqlite\
  wget unzip

您可以从 官方 PHP 扩展列表 了解更多关于任何单个包的信息。

现在让我们配置 php-fpm,FastCGI 进程管理器。 Nginx 将使用它来代理对 Cachet 的请求。

首先,创建将托管 php-fpm 需要的 Cachet 信息的文件。 使用 nano 或您喜欢的编辑器打开 /etc/php5/fpm/pool.d/cachet.conf

sudo nano /etc/php5/fpm/pool.d/cachet.conf

粘贴以下内容:

/etc/php5/fpm/pool.d/cachet.conf

[cachet]
user = cachet
group = cachet
listen.owner = www-data
listen.group = www-data
listen = /var/run/php5-fpm-cachet.sock
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
request_terminate_timeout = 120s
pm = ondemand
pm.max_children = 5
pm.process_idle_timeout = 10s
pm.max_requests = 500
chdir = /

保存并关闭文件。

您可以在 如何使用 Nginx 和 Php-fpm 安全地托管多个网站的文章中阅读有关这些设置的更多信息,但以下是此文件中每一行的用途:

  • [cachet] 是池的名称。 每个池必须有一个唯一的名称
  • usergroup 是 Linux 用户和新池将在其下运行的组。 它与我们在步骤 1 中创建的用户相同。
  • listen.ownerlisten.group 定义了监听器的所有权,即 新 php-fpm 池的套接字。 Nginx 必须能够读取此套接字,因此我们使用的是 www-data 用户和组。
  • listen 为每个池指定套接字文件的唯一位置。
  • php_admin_value 允许您设置自定义 PHP 配置值。 在这里,我们使用它禁用可以运行 Linux 命令的功能(exec,passthru,shell_exec,system)。
  • php_admin_flagphp_admin_value 类似,但只是布尔值的开关,即 onoff。 我们将禁用 PHP 函数 allow_url_fopen,它允许 PHP 脚本打开远程文件并可能被攻击者使用。
  • pm 选项允许您配置池的性能。 我们已将其设置为 ondemand,它提供了一个平衡以保持低内存使用,并且是一个合理的默认值。 如果您有足够的内存,则可以将其设置为 static。 如果您有很多 CPU 线程要使用,那么 dynamic 可能是更好的选择。
  • chdir 选项应该是 / 这是文件系统的根。 除非您使用另一个重要选项(chroot),否则不应更改此设置。

重新启动 php-fpm 以使更改生效。

sudo systemctl restart php5-fpm

如果您还没有这样做,请启用 php-fpm 服务,以便它在服务器重新启动时自动启动:

sudo systemctl enable php5-fpm

现在通用的 PHP 包都安装好了,让我们下载 Cachet。

第 3 步 — 下载 Cachet

Cachet 的源代码托管在 GitHub 上。 这使得使用 Git 来下载、安装和——正如我们稍后会看到的——升级它变得很容易。

接下来的几个步骤应该以 cachet 用户的身份进行,所以切换到它。

sudo su - cachet

将 Cachet 的源代码克隆到一个名为 www 的新目录中。

git clone https://github.com/cachethq/Cachet.git www

完成后,导航到 Cachet 源代码所在的新目录。

cd www

从此时起,您就拥有了 Cachet 的所有开发历史,包括 Git 分支和标签。 您可以从 Cachet 的发布页面 中查看最新的稳定版本,但您也可以在此目录中查看 Git 标签。

在发布时,Cachet 的最新稳定版本是 v2.3.11。 使用 Git 检查该版本:

git checkout v2.3.11

接下来,让我们熟悉一下Cachet的配置文件。

第 4 步 — 配置 Cachet

Cachet 需要一个名为 .env 的配置文件,Cachet 必须存在该配置文件才能启动。 在其中,您可以配置 Cachet 用于其设置的环境变量。

让我们复制Cachet附带的配置示例进行备份。

cp .env.example .env

我们将在此处添加两项配置:一项用于配置数据库,另一项用于配置邮件服务器。

对于数据库,我们将使用 SQLite。 它易于配置,不需要安装任何额外的服务器组件。

首先,创建将托管我们的数据库的空文件:

touch ./database/database.sqlite

接下来,使用 nano 或您喜欢的编辑器打开 .env 以配置数据库设置。

nano .env

因为我们将使用 SQLite,所以我们需要删除很多设置。 找到以 DB_ 开头的设置块:

原始 .env

. . .
DB_DRIVER=mysql
DB_HOST=localhost
DB_DATABASE=cachet
DB_USERNAME=homestead
DB_PASSWORD=secret
DB_PORT=null
DB_PREFIX=null
. . .

删除除 DB_DRIVER 行之外的所有内容,并将其从 mysql 更改为 sqlite

更新了 .env

. . .
DB_DRIVER=sqlite
. . .

注意: 如果您使用其他数据库,如 MySQL 或 PostgreSQL,您可以检查 Cachet 的数据库选项 以获取所有可能的数据库驱动程序名称。


接下来,您需要填写 MAIL_* 设置的 SMTP 服务器详细信息:

.env

. . .
MAIL_HOST=smtp.example.com
MAIL_PORT=25
MAIL_USERNAME=smtp_username
MAIL_PASSWORD=smtp_password
MAIL_ADDRESS=notifications@example.com
MAIL_NAME="Status Page"
. . .

在哪里:

  • MAIL_HOST 应该是您的邮件服务器的 URL。
  • MAIL_PORT 应该是邮件服务器监听的端口(通常是 25)。
  • MAIL_USERNAME 应该是 SMTP 帐户设置的用户名(通常是整个电子邮件地址)。
  • MAIL_PASSWORD 应该是 SMTP 帐户设置的密码。
  • MAIL_ADDRESS 应该是向订阅者发送通知的电子邮件地址。
  • MAIL_NAME 是将出现在发送给订阅者的电子邮件中的名称。 请注意,任何带有空格的值都应包含在双引号内。

您可以在 mail.php 源代码来自 Laravel 的相应邮件文档中了解更多关于 Cachet 的邮件驱动程序。

完成文件编辑后,保存并退出。 接下来,您需要设置 Cachet 的数据库。

第 5 步 — 迁移数据库

Cachet 所依赖的 PHP 库由 Composer 处理。 首先,确保您在正确的目录中。

cd /home/cachet/www

然后运行 Composer 并安装依赖项,不包括用于开发目的的依赖项。 根据您的 Internet 连接速度,这可能需要一些时间。

composer install --no-interaction --no-dev -o --no-scripts

创建数据库模式并运行迁移。

php artisan migrate

注意:在最新的稳定版本(2.3.11)中,在使用SQLite时存在一个错误,需要您先运行migrate命令别的。


询问时键入 yes。 你会看到这样的输出:

Output**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > yes

Migration table created successfully.
Migrated: 2015_01_05_201324_CreateComponentGroupsTable
...
Migrated: 2016_06_02_075012_AlterTableMetricsAddOrderColumn
Migrated: 2016_06_05_091615_create_cache_table

下一个命令 php artisan app:install 备份数据库,运行迁移,并自动生成应用程序密钥(即 .env 中的 APP_KEY 值,Cachet 用于其所有加密。

警告: 在生产环境中安装并开始使用 Cachet 后,切勿更改 .env 文件中的 APP_KEY 值。 这将导致您的所有加密/散列数据丢失。 仅使用一次 php artisan app:install 命令。 因此,最好保留 .env 的备份。


完成安装。

php artisan app:install

输出将如下所示:

OutputClearing settings cache...
Settings cache cleared!
. . .
Clearing cache...
Application cache cleared!
Cache cleared!

作为最后的主动步骤,删除 Cachet 的缓存以避免 500 错误。

rm -rf bootstrap/cache/*

现在数据库已经准备好了,我们可以配置Cachet的任务队列了。

第 6 步 — 配置任务队列

Cachet 使用队列来调度需要异步运行的任务,例如发送电子邮件。 推荐的方法是使用Supervisor,一个提供一致接口的进程管理器,通过它可以监控和控制进程。

首先,确保您退出 cachet 用户的会话并切换回您的 sudo 非 root 用户。

exit

安装主管。

sudo apt-get install supervisor

然后创建包含 Supervisor 需要从 Cachet 获取的信息的文件。 打开 /etc/supervisor/conf.d/cachet.conf

sudo nano /etc/supervisor/conf.d/cachet.conf

这个文件告诉 Supervisor 如何运行和管理它的进程。 您可以在文章 How To Install and Manage Supervisor on Ubuntu 和 Debian VPS 中阅读有关 Supervisor 的更多信息。

并添加以下内容。 如果您使用过不同的一次,请确保更新 Cachet 的目录和用户名。

/etc/supervisor/conf.d/cachet.conf

[program:cachet-queue]
command=php artisan queue:work --daemon --delay=1 --sleep=1 --tries=3
directory=/home/cachet/www/
redirect_stderr=true
autostart=true
autorestart=true
user=cachet

保存并关闭文件,然后重新启动 Supervisor。

sudo systemctl restart supervisor

启用 Supervisor 服务,以便在服务器重新启动时自动启动。

sudo systemctl enable supervisor

数据库和任务队列都准备好了; 下一个要设置的组件是 Web 服务器。

第 7 步 — 配置 Nginx

我们将使用 Nginx 作为与 php-fpm 对话的 Web 服务器代理。 先决条件部分包含有关如何使用 Let's Encrypt 颁发的 TLS 证书设置 Nginx 的教程。

让我们添加 Cachet 所需的 Nginx 配置文件。 使用 nano 或您喜欢的编辑器打开 /etc/nginx/sites-available/cachet.conf

sudo nano /etc/nginx/sites-available/cachet.conf

这是文件的全文,您应该复制并粘贴进去。 确保将 example.com 替换为您的域名。 下面更详细地描述每个部分的功能。

/etc/nginx/sites-available/cachet.conf

server {
    server_name  example.com;
    listen 80;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443;
    server_name  example.com;

    root /home/cachet/www/public;
    index index.php;

    ssl on;
    ## Location of the Let's Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ## From https://cipherli.st/
    ## and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    ## Disable preloading HSTS for now.  You can use the commented out header line that includes
    ## the "preload" directive if you understand the implications.
    #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    ssl_buffer_size 1400;

    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm-cachet.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_keep_conn on;
    }
}

这是该文件的每个部分的作用。

第一个 server 块将所有 HTTP 流量重定向到 HTTPS:

部分 cachet.conf

server {
    server_name example.com;
    listen 80;
    return 301 https://$server_name$request_uri;
}

. . .

第二个 server 块包含有关此设置的特定信息,例如 SSL 详细信息和 php-fpm 配置。

root 指令告诉 Nginx Cachet 的根目录在哪里。 应该指向 public 目录,由于我们在 /home/cachet/www/ 中克隆了 Cachet,它最终变成了 root /home/cachet/www/public;

部分 cachet.conf

. . .
server {
    listen 443;
    server_name  example.com;

    root /home/cachet/www/public;
    index index.php;
    . . .
}

SSL 证书位于 Let's Encrypt 目录中,该目录应以您的域名命名:

部分 cachet.conf

. . .
server {
    . . .
    ssl on;
    ## Location of the Let's Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    . . .
}

其余的 SSL 选项直接取自 Nginx 和 Let's Encrypt 教程

部分 cachet.conf

. . .
server {
    . . .
    ## From https://cipherli.st/
    ## and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    ## Disable preloading HSTS for now.  You can use the commented out header line that includes
    ## the "preload" directive if you understand the implications.
    #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    ssl_buffer_size 1400;

    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    . . .
}

location ~ \.php$ 部分告诉 Nginx 如何提供 PHP 文件。 最重要的部分是指向我们在创建 /etc/php5/fpm/pool.d/cachet.conf 时使用的 Unix 套接字文件。 具体来说,就是/var/run/php5-fpm-cachet.sock

部分 cachet.conf

. . .
server {
    . . .
    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm-cachet.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_keep_conn on;
    }
}

如果您还没有保存并关闭该文件。

现在已经创建了 Nginx 的 Cachet 配置,创建一个指向 sites-enabled 目录的符号链接,因为这是 Nginx 查找并选择要使用的配置文件的地方:

sudo ln -s /etc/nginx/sites-available/cachet.conf /etc/nginx/sites-enabled/cachet.conf

重新启动 Nginx 以使更改生效。

sudo systemctl restart nginx

并启用 Nginx 服务,以便在服务器重新启动时自动启动。

sudo systemctl enable nginx

就是这样! 如果您现在在浏览器中导航到域名,您将看到 Cachet 的设置页面。 让我们来看看它。

第 8 步 — 完成 Cachet 的初始设置

Cachet 的其余设置是通过浏览器中的 GUI 完成的。 它涉及设置站点名称和时区以及创建管理员帐户。 共有三个步骤(设置环境、状态页面和管理员帐户),您以后可以随时在 Cachet 的设置仪表板中更改配置。

环境设置

第一个配置步骤是环境设置。

注意:我们使用的Cachet版本有一个错误,即使您已经在.env中设置了电子邮件设置,即使在环境设置页面中也不会显示电子邮件设置. 这将在 2.4 版中修复。


字段应填写如下:

  • 缓存驱动应该是ACP(u)
  • Session Driver 应该是 ACP(u)
  • Mail Driver 应该是 SMTP
  • Mail Host 应该是您的电子邮件服务器地址。
  • Mail From Address 应该是向订阅者发送通知的电子邮件地址。
  • Mail Username 应该是 SMTP 帐户设置的用户名(通常是您的整个电子邮件地址)。
  • Mail Password 应该是 SMTP 帐户设置的密码。

点击下一步进入下一步。

状态页面设置

在本节中,您将设置站点名称、站点域、时区和语言。

注意: Cachet 支持多种语言,但它是一个社区驱动的项目,这意味着在非英语语言中可能存在一些未翻译的字符串。 您可以查看支持的语言列表,其中还包括翻译内容的百分比。


字段应填写如下:

  • 站点名称: 将出现在仪表板中的名称。
  • 站点域: 您为 Cachet 选择的 FQDN。
  • 选择您的时区: 根据您的受众选择一个时区。 一个好的默认值是选择 UTC。
  • 选择你的语言:选择Cachet的界面将使用的语言。
  • 显示对 Cachet 的支持: 如果选择此选项,则在公共仪表板的页脚处将显示 Powered by Cachet 消息。

点击下一步进入下一步。

管理员帐户设置

最后,设置管理员帐户。 选择您的用户名,然后输入有效的电子邮件地址和强密码。

单击 完成设置 以保存所有更改。

完成设置

在 Complete Setup 页面上,您将被告知 Cachet 已成功配置。 您现在可以单击 进入仪表板 按钮以使用您的管理员凭据登录并访问 Cachet 的仪表板页面。

Cachet 现在已完全设置并正常运行。 最后一步涵盖了将来如何升级 Cachet。

第 9 步 — 升级 Cachet

当新版本的 Cachet 出现时,使用 Git 可以非常轻松地进行升级。 您需要做的就是签出相关标签,然后运行数据库迁移。

注意: 在尝试升级到新版本之前备份 Cachet 及其数据库总是一个好主意。 对于 SQLite,您只需要复制 database/database.sqlite 文件。


首先,切换到 cachet 用户并移动到 Cachet 的安装目录。

sudo su - cachet
cd /home/cachet/www

您可以选择打开维护页面。

php artisan down

从 GitHub 获取最新的 Cachet 代码。

git fetch --all

并列出所有标签。

git tag -l

您将看到所有以字母 v 开头的当前标签。 您可能会注意到一些处于 beta 或 Release Candidate (RC) 状态。 因为这是一个生产服务器,你可以忽略这些。 您也可以访问 Cachet 发布页面 来查看最新的标签是什么。

当您找到要用于升级的标签时,使用 Git 签出该标签。 例如,如果您要升级到 2.4.0 版,您将使用:

git checkout v2.4.0

在继续之前删除 Cachet 的缓存。

rm -rf bootstrap/cache{,t}/*

接下来,升级 Composer 依赖项,这些依赖项通常包含错误修复、性能增强和新功能。

composer install --no-interaction --no-dev -o --no-scripts

最后,运行迁移。

php artisan app:update

如果您打开了维护页面,您现在可以再次启用访问。

php artisan up

新版本的 Cachet 将启动并运行。

结论

您已经使用由 SQLite 支持的 SSL 设置了 Cachet,并且知道如何使用 Git 对其进行维护。 您可以选择其他数据库,例如 MySQL 或 PostgreSQL。 要探索更多 Cachet 的选项,请查看 官方 Cachet 文档