如果有多个业务系统对外提供服务,那么一个状态展示系统可以为客户提供直观的服务状态展示。当出现系统故障或安排更新计划时可以为客户提供一个信息公开的平台,以便作出相应的准备。 经过寻找后,我决定使用一款名为Cachet的开源软件,它支持部署在Linux、Windows与Docker环境中。
它是用PHP编写的,所以如果你已经有LAMP或LNMP服务器,则很容易安装。它具有干净的界面,旨提供自适应系统,因此它可以在所有设备上运行。在本教程中,我们将在Debian上设置一个带Cachet的状态页面。我们将使用的软件有:
请注意,Cachet不会监控你的网站或服务器的停机时间, Cachet只会记录事件,可以通过Web界面或Cachet的API手动更新。
要学习本教程,你需要:
sudo
命令的非root账号的Debian服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器。首先要做的是创建一个单独的用户帐户来运行Cachet。这将带更好的来安全性和隔离性。
sudo useradd --create-home --shell /bin/bash cachet
此命令将在/home/cachet
创建一个名为cachet的用户,其中包含一个主目录,其shell将设置为/bin/bash
。默认值为/bin/sh
,但在提示中未提供足够的信息。
接下来,我们需要安装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]
是池的名称。每个池必须具有唯一的名称user
和group
是Linux用户以及将在其下运行新池的组。它与我们在步骤1中创建的用户相同。listen.owner
合listen.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。
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的配置文件。
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的数据库。
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的任务队列。
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服务器。
我们将使用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的设置页面。让我们来看看吧。
Cachet的其余部分是通过浏览器中的GUI完成的。它涉及设置站点名称和时区以及创建管理员帐户。有三个步骤(设置环境,状态页面和管理员帐户),你可以随后在Cachet的设置仪表板中更改配置。
第一个配置步骤是环境设置。
注意:我们使用的
Cachet
版本有一个错误,即如果您已经在.env
中设置了电子邮件设置,则环境设置页面中也不显示电子邮件设置。 这将在2.4版中修复。
字段应填写如下:
单击Next 转到下一步。
在本节中,你将设置站点名称,站点域名,时区和语言。
注意: Cachet支持多种语言,但是他不是商业项目,这意味着非英语语言中可能存在一些未翻译的字符串。你可以查看支持的语言列表。
字段应填写如下:
单击Next 转到下一步。
最后,设置管理员帐户。选择你的用户名,然后输入有效的电子邮件地址和强密码。
单击Complete Setup ,保存所有更改。
在“ Complete Setup ”页面上,将通知你已成功配置Cachet。你现在可以单击“ Go the dashboard(转到仪表板)”按钮以使用你的管理员凭据登录并访问Cachet的仪表板页面。
Cachet现已完全设置并正常运行。最后一步介绍了将来如何升级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》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。