You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.16.0/mysqld_exporter-0.16.0.linux-amd64.tar.gz
tar xzvf mysqld_exporter-0.16.0.linux-amd64.tar.gz
cd mysqld_exporter-0.16.0.linux-amd64.tar.gz
sudo mv mysqld_exporter /usr/local/bin/
首先登录 MySQL:
mysql -u root -p
然后创建一个新的 MySQL 用户用于收集指标数据:
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'your_password' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
Failed to determine correct type of scrape target." component="scrape manager" scrape_pool=pm2 target="http://localhost:9209/metrics?fallback_scrape_protocol=Prometheus" content_type="" fallback_media_type="" err="non-compliant scrape target sending blank Content-Type and no fallback_scrape_protocol specified for target
本文主要记录了笔者个人全栈项目上线、部署、运维的整个流程实践,仅供参考。话不多说,先上一个效果图:
基本信息
服务器购自阿里云 ECS,操作系统为 Debain 10,项目的技术栈采用的是前端
React
,后端NestJS
,数据库MySQL
,搭建的监控告警系统则是选用的Prometheus
和Grafana
的系列工具环境准备
如果你的服务器中已准备好了相关的镜像或者环境,可以跳过这部分
Git
安装 git:
生成 ssh key 后配置到 Github 中:
ssh-keygen -t ed25519 -C "youremail@email.com"
MySQL
安装
由于 Debain 的 apt 包中没有
mysql-server
,仅支持mariadb-server
,这里选择手动安装的方式。下载 MySQL 5.7,或者前往官网寻找合适的版本:然后解压缩:
重命名目录:
cd /user/local sudo mv mysql-5.7.44-linux-glibc2.12-x86_64 mysql
创建 MySQL 用户和组:
初始化数据库:
cd /usr/local/mysql sudo mkdir mysql-files sudo chmod 750 mysql-files sudo chown -R mysql:mysql ./ sudo bin/mysqld --initialize --user=mysql
此时终端中会显示随机生成的密码:
设置权限和目录:
sudo chown -R root . sudo chown -R mysql data mysql-files
安装启动脚本:
启动 MySQL 服务:
查询 MySQL 服务状态:
修改密码:
远程连接
创建一个新的用户用于远程连接:
授予权限:
刷新权限:
FLUSH PRIVILEGES;
配置 MySQL 允许远程连接,编辑或新建
/etc/mysql/my.cnf
或/etc/my.cnf
:然后重启 MySQL 服务:
NodeJS
安装 nvm 来管理 NodeJS 版本,官方的安装方式对于网络连通性有要求,采用下面的方法:
安装 NodeJS 20:
设置 npm 镜像:
Nginx
安装 Nginx:
服务部署
NodeJS 服务
使用
pm2
来启动 NodeJS 服务:配置文件示例:
pm2 默认使用用户级别的配置和进程管理,如果期望多用户共享 PM2 的状态和实例,可以设置
PM2_HOME
环境变量以实现共享:export PM2_HOME=/home/your_user/.pm2
Nginx
配置 Nginx 转发服务端接口:
cd /etc/nginx/sites-available/ vi api.myhost.com
配置文件中添加:
新建软连接以启动对应配置:
重启 Nginx 应用配置:
配置 Nginx 转发前端静态资源,流程和前面一致,仅 Nginx 配置略有不同:
HTTPS 配置
通过 certbot 申请 SSL 证书,安装对应 pkg:
根据提示完成配置,将自动下载证书,完成 nginx 配置并重启:
证书有效期只有 3 个月,可以通过脚本实现自动续签,参考 certbot-dns-aliyun:
# 安装 certbot-dns-aliyun wget https://cdn.jsdelivr.net/gh/justjavac/certbot-dns-aliyun@main/alidns.sh sudo cp alidns.sh /usr/local/bin sudo chmod +x /usr/local/bin/alidns.sh sudo ln -s /usr/local/bin/alidns.sh /usr/local/bin/alidns rm alidns.sh
测试证书续期:
正式续期时去掉
--dry-run
:设置定时任务:
设置每天凌晨 1 点 1 分执行:
查询 crontab 执行记录:
CD
以
Github Workflow
为例,实现自动化部署。新建.github/workflows/deploy.yml
:新建一个用户用于托管 CD 流程:
给用户设置某个目录的所有权:
切换至对应用户:
在 Github Repo -> Setting -> Sercets and variables -> Actions 中配置你的 SSH 私钥即可实现自动化部署。部分命令需要手动 export 才可以访问到:
服务运维
监控
数据采集
在
NestJS
中通过Prometheus
中间件来收集服务级别的监控指标数据,一个收集 request 请求数的例子:通过 pm2-metrics 来收集 pm2 的进程级别的监控指标数据,默认会在 9209 端口启动:
通过 mysqld-exporter 来收集 MySQL 的数据库级别的监控指标数据:
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.16.0/mysqld_exporter-0.16.0.linux-amd64.tar.gz tar xzvf mysqld_exporter-0.16.0.linux-amd64.tar.gz cd mysqld_exporter-0.16.0.linux-amd64.tar.gz sudo mv mysqld_exporter /usr/local/bin/
首先登录 MySQL:
然后创建一个新的 MySQL 用户用于收集指标数据:
通过
systemctl
的方式来管理mysqld_exporter
服务,创建mysqld_exporter
用户和相关文件:创建配置文件
/etc/mysqld_exporter/.my.cnf
:设置文件权限:
创建
systemd
服务文件,新建/etc/systemd/system/mysqld_exporter.service
文件:启动服务:
数据拉取 & 存储
利用 Prometheus 来收集、处理指标数据。从官网下载对应操作系统的版本:
解压缩:
tar xvfz prometheus-3.0.1.linux-amd64.tar.gz cd prometheus-3.0.1.linux-amd64
编辑
prometheus.yml
配置文件:启动 prometheus 服务:
如果服务有如下报错:
参考 issue 来给
exporter.js
添加 header,然后重启:在
http://{your_ip}:9090
端口的可视化页面Status -> Target Health
中看到 pm2 的 State 为 UP 则表示配置成功,可以在Query -> Graph
中查询进行验证:通过
systemctl
来管理 prometheus 服务,先将二进制文件移动至目录中:创建数据目录和配置目录:
创建
prometheus
用户:创建
systemd
服务文件,新建/etc/systemd/system/prometheus.service
文件:启动服务:
数据可视化
通过
Grafana
消费Prometheus
的监控数据,搭建可视化监控看板。安装Grafana
:服务默认端口是 3000,如果想要修改,需要编辑配置文件:
启动服务:
访问
Grafana
站点进行Dashboard
配置,在DataSource
中导入Prometheus
数据源即可开始使用。日志
日志轮转
pm2
默认日志单文件存储,通过pm2-logrotate
来轮转 pm2 中的 NestJS 日志,减少磁盘消耗# 安装 pm2-logrotate pm2 install pm2-logrotate
使日志按每小时划分:
使用自定义的 logger 来实现 ORM 日志按小时划分:
日志收集 & 分析
通过
Loki
来收集、聚合日志:编辑配置文件
/etc/promtail/config.yml
:重启服务:
检查服务状态:
可视化查询
在
Grafana
的DataSource
中导入Loki
数据源,即可在Logs
中进行可视化查询。一个示例:告警
在
Grafana
看板中可以方便地配置告警规则,并支持多种通知方式:这里以配置网易邮箱的
SMTP
服务进行邮件转发为例,首先访问邮箱在线地址,进入邮箱设置,开启SMTP
并获得授权码,然后编辑服务器中的/etc/grafana/grafana.ini
:然后重启 Grafana 服务即可:
测试邮件能否收到:
总结
随着环境和服务配置的完成,我们还通过引入的持续交付(CD)流程来实现了自动化部署,提高了开发和运维的效率。进一步地,我们通过监控、日志和告警的有效管理,能够实时掌握服务的运行状况并及时处理潜在问题。至此,已经搭建了一套相对完整的服务器环境和服务运维体系。
The text was updated successfully, but these errors were encountered: