专栏首页云计算教程系列如何在Debian上使用Cachet
原创

如何在Debian上使用Cachet

介绍

如果有多个业务系统对外提供服务,那么一个状态展示系统可以为客户提供直观的服务状态展示。当出现系统故障或安排更新计划时可以为客户提供一个信息公开的平台,以便作出相应的准备。 经过寻找后,我决定使用一款名为Cachet的开源软件,它支持部署在Linux、Windows与Docker环境中。

它是用PHP编写的,所以如果你已经有LAMPLNMP服务器,则很容易安装。它具有干净的界面,旨提供自适应系统,因此它可以在所有设备上运行。在本教程中,我们将在Debian上设置一个带Cachet的状态页面。我们将使用的软件有:

  • Cachet
  • PHP Composer
  • SQLite作为存储Cachet数据的数据库
  • Nginx用于提供状态页面

请注意,Cachet不会监控你的网站或服务器的停机时间, Cachet只会记录事件,可以通过Web界面或Cachet的API手动更新。

准备

要学习本教程,你需要:

第1步 - 创建Cachet用户

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

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

此命令将在/home/cachet创建一个名为cachet的用户,其中包含一个主目录,其shell将设置为/bin/bash。默认值为/bin/sh,但在提示中未提供足够的信息。

第2步 - 安装PHP依赖项

接下来,我们需要安装Cachet的依赖,这是一些PHP的软件包,其中wget是下载工具和unzip解压缩工具。

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

把下面的这些内容粘贴进去:

[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 = /

保存并关闭文件。

名词解释:

  • [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_flag类似于php_admin_value,我们将禁用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的最新稳定版本是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_开头的设置块:

. . .
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

. . .
DB_DRIVER=sqlite
. . .

注意:如果你正在使用其他数据库(如MySQL或PostgreSQL),则可以检查所有可能的数据库驱动程序名称的Cachet数据库选项

接下来,你需要在MAIL_*后面填写SMTP服务器详细信息:

. . .
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并安装依赖项,不包括用于开发目的的依赖项。根据你的网速,这可能需要一些时间。

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

创建数据库架构并运行迁移。

php artisan migrate

注意:在最新的稳定版本(2.3.11)中,使用SQLite时会出现一个错误,要求你先执行migrate命令。

你会看到这样的输出,当有出现提问时输入yes

**************************************
*     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,备份数据库,运行迁移,并自动生成Cachet用于其所有加密的应用程序密钥(即APP_KEY.env)。

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

完成这个安装:

php artisan app:install

输出将如下所示:

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

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

rm -rf bootstrap/cache/*

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

第6步 - 配置任务队列

Cachet使用队列来安排需要异步运行的任务,例如发送电子邮件。建议的方法是使用Supervisor,一个流程管理器,它提供一致的界面,通过该界面可以监视和控制流程。

首先,确保你退出Cachet用户的会话,切回普通账户。

exit

安装Supervisor 。

sudo apt-get install supervisor

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

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

该文件告诉Supervisor如何运行和管理其进程。

添加以下内容。如果你使用过不同的,请务必更新Cachet的目录和用户名。

[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服务器代理。让我们添加Cachet所需的Nginx配置文件。用nano或其他你喜欢的编辑器打开/etc/nginx/sites-available/cachet.conf

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

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

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;
    ssl_certificate /etc/TencentCloud/ssl/fullchain.pem;
    ssl_certificate_key /etc/TencentCloud/ssl/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:

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

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

root指令告诉Nginx Cachet的根目录在哪里。是应该指向public目录,但因为我们克隆了Cachet 放到了/home/cachet/www/,它最终变成了root /home/cachet/www/public;

. . .
server {
    listen 443;
    server_name  example.com;
​
    root /home/cachet/www/public;
    index index.php;
    . . .
}

指向你的SSL证书存放的位置。

. . .
server {
    . . .
    ssl on;
    ssl_certificate /etc/TencentCloud/ssl/fullchain.pem;
    ssl_certificate_key /etc/TencentCloud/ssl/privkey.pem;
    . . .
}
. . .
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

. . .
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版中修复。

字段应填写如下:

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

单击Next 转到下一步。

状态页面设置

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

注意: Cachet支持多种语言,但是他不是商业项目,这意味着非英语语言中可能存在一些未翻译的字符串。你可以查看支持的语言列表

字段应填写如下:

  • Site Name(站点名称):将显示在仪表板中的名称。
  • Site Domain(站点域名):你为Cachet选择的FQDN。
  • Select your timezone (选择你的时区):根据你位置选择时区。默认选择是选择UTC。
  • Select your language(选择语言):选择Cachet界面将使用的语言。
  • Show support for Cachet(显示对Cachet的支持):如果选择此选项,则会在公共信息中心的页脚中显示Powered by Cachet消息。

单击Next 转到下一步。

管理员帐户设置

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

单击Complete Setup ,保存所有更改。

完成设置

在“ Complete Setup ”页面上,将通知你已成功配置Cachet。你现在可以单击“ Go the dashboard(转到仪表板)”按钮以使用你的管理员凭据登录并访问Cachet的仪表板页面。

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

第9步 - 升级Cachet

使用Git可以在新版本的Cachet出现时非常容易升级。你需要做的就是检查相关标记,然后运行数据库迁移。

注意: 在尝试升级到新版本之前,最好备份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字母开头的所有当前标签。你可能会注意到一些处于测试版或候选发布(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文档。更多Linux教程请前往腾讯云+社区学习更多知识。


参考文献:《How To Create a Status Page with Cachet on Debian 8》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何在Ubuntu 14.04上安装和使用ArangoDB

    ArangoDB是一个NoSQL数据库。它创建于2011年,当时已有许多NoSQL数据库,其目标是成为一个涵盖各种用例的综合数据库解决方案。

    朝朝
  • 如何在Ubuntu 14.04上的Docker容器中运行Nginx

    通过容纳Nginx,我们减少了系统管理员的开销。我们将不再需要通过包管理器管理Nginx或从源代码构建它。Docker容器允许我们在发布新版本的Nginx时简单...

    朝朝
  • 如何在Ubuntu 14.04第1部分上查询Prometheus

    Prometheus是一个开源监控系统和时间序列数据库。Prometheus最重要的一个方面是它的多维数据模型以及随附的查询语言。此查询语言允许您对维度数据进行...

    朝朝
  • 干货 | 微软首席研发经理缪瑾:从多元化的微服务支持看开放的Azure

    嘉宾演讲视频 Guest Video ? 温馨提示 本视频时长15分43秒,建议在wifi下观看 由工业和信息化部指导、中国信息通信研究院主办、云计算开源产业联...

    IT大咖说
  • 前端基础-CSS伪对象

    概念:就是给元素追加一个虚拟标签,由css加载,可以节省html的资源开销,必须有content属性,默认是行元素,可以进行转换。

    cwl_java
  • 简单的java开源图床

    Open source Picture bed 出于自用的目的,又找不到Java写的开源的程序,然后使用开源上传组件 bootstrap-fileinput 用...

    搜云库
  • 企业面试题: px和em的区别

    px表示像素 (计算机屏幕上的一个点:1px = 1/96in),是绝对单位,不会因为其他元素的尺寸变化而变化;

    舒克
  • [开源]基于ffmpeg和libvlc的视频剪辑、播放器

    基本上讲,它的播放功能是基于VLC,剪辑功能是基于FFmpeg,现在的功能还比较简单,当然我的目的也不是想做一个复杂的视频编辑器,那是专业软件的事情,就是想做一...

    hbstream
  • Redis 数据结构使用场景

    一、redis 数据结构使用场景   原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码。目前目标...

    小小科
  • MongoDB:有人敢像我一样说出开源的真实用意吗?

    现在大大小小的公司都在搞开源,在被问到为什么开源某个项目时,负责人要么说是贡献社区与用户,要么以希望借广大开发者之力完善项目为挡箭牌,虽然这些想法都可以是真实也...

    数据和云

扫码关注云+社区

领取腾讯云代金券