nginx是一个轻量级,高性能的HTTP和反向代理web服务器。目前金融科技研发部下的相关应用,基本通过接入区(互联网接入区,企业信息化接入区)部署的nginx服务进行反向代理提供服务。
在实际业务运行过程中,需要对nginx服务进行一系列的配置(prometheus监控节点、nginx进程,nginx日志切割,nginx服务自启动),便于日常的维护,日志查询,故障定位,服务高可用。本文将会介绍具体每个环节的配置方法与命令。
prometheus组件下载地址:
Supervisor服务组件网盘下载地址:
链接:https://pan.baidu.com/s/1feAckUPRuBkU77LSQDpalg
提取码:c2vx
nginx组件网盘下载地址:
链接:https://pan.baidu.com/s/1M6GkVDDq9mcDx8rSLHEfCw
提取码:rshh
目录
1.安装 安全数据摆渡客户端(下载工具):
2.安装 nginx及nginx监控探针(未安装nginx服务)
3.nginx上重编译nginx-module--vts模块(已安装nginx服务)
4.安装nginx_exporter
5.安装Supervisor服务(管理并自启动nginx相关服务)
6.配置管理nginx以及nginx_exporter(自启动)
7.日志管理(按日切割以及保留30天)
8.配置prometheus服务端(slave)
9.配置prometheus服务端(master)
10.登陆grafana检查否添加成功
11.配置alert告警分组
nginx监控统一安装脚本:
1.安装 安全数据摆渡客户端(下载工具):
1)安装wget组件:yum -y install wget
2)安装客户端:wget https://X.X.X.X/UniExServices/baseCfg/downloadLinuxClient.html --no-check-certificate
3)解压客户端:unzip downloadLinuxClient.html
4)进入目录:cd /root/linux-client/5.11/
5)修改访问权限:chmod 755 *
###生产环境下各个公司有各自的安全上传文件的通道,此条在通用的环境中忽略。
2.安装 nginx及nginx监控探针(未安装nginx服务)
1)进入安渡客户端目录:cd /root/linux-client/5.11/
2)登录安渡客户端:./MiniFTClient -h X.X.X.X -u user -p passwd
3)进入安渡客户端,下载nginx安装包:get nginx-1.16.1.tar.gz
下载nginx监控探针组件:get nginx-module-vts.tar.gz
下载nginx监控探针:get nginx-vts-exporter.tar.gz
#具体下载的包根据需要的版本而定,例如nginx-1.18.1,对应包名nginx-1.18.1.tar.gz
#额外的组件需要单独下载,比如sticky,命令为get nginx-sticky-module-ng.zip
4)退出安渡客户端:exit #退出后的目录为/root/linux-client/5.11/
#以上步骤为下载nginx相关组件至服务器,仅供参考。
5)移动nginx安装包至标准路径下:mv nginx-1.16.1.tar.gz /usr/local
移动nginx监控探针组件至组件目录:mv nginx-module-vts.tar.gz /mnt
移动nginx监控探针至组件目录:mv nginx-vts-exporter.tar.gz /mnt
#移动sticky安装包至/mnt目录下:mv nginx-sticky-module-ng.zip /mnt
6)进入标准路径:cd /usr/local
7)解压nginx安装包:tar -zxvf nginx-1.16.1.tar.gz
#一般安装默认下载sticky组件,因此需要对sticky也进行解压。
#解压步骤:cd /mnt
#unzip /mnt/nginx-sticky-module-ng.zip
#tar -zxvf nginx-module-vts.tar.gz
8)进入解压后的目录:cd /usr/local/nginx-1.16.1/
9)安装编译工具以及库文件:yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
10)编译:
./configure --user=root --group=root --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --add-module=/mnt/nginx-sticky-module-ng --add-module=/mnt/nginx-module-vts --with-stream --without-http_rewrite_module --with-pcre
11)安装:make && make install
12)检查版本:/usr/local/nginx/sbin/nginx -v
#返回值为:nginx version: nginx/1.16.1
###通用nginx安装操作如下:
默认在/usr/local目录下执行:
- 下载nginx:wget -c https://nginx.org/download/nginx-1.16.1.tar.gz
- 解压nginx:tar -zxvf /usr/local/nginx-1.16.1.tar.gz
- 进入目录:cd /usr/local/nginx-1.16.1
- 下载相关库:yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
- 编译:./configure --user=root --group=root --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-stream --without-http_rewrite_module --with-pcre
- 安装:make && make install
- 检查版本:/usr/local/nginx/sbin/nginx -v
3.nginx上重编译nginx-module--vts模块(已安装nginx服务)
1)进入安渡客户端目录:cd /root/linux-client/5.11/
2)登录安渡客户端:./MiniFTClient -h X.X.X.X -u user -p passwd
3)下载nginx-module--vts模块安装包:get nginx-module-vts.tar.gz
#以上步骤为下载nginx-module-vts组件至服务器,仅供参考。
4)修改nginx-module--vts模块路径:mv nginx-module-vts.tar.gz /usr/local
5)解压nginx-module--vts模块:tar -zxvf nginx-module-vts.tar.gz
6)查看nginx已经安装模块:/usr/local/nginx/sbin/nginx -V
Tengine version: shgine/1.0.0 (nginx/1.15.9)
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-23) (GCC)
built with OpenSSL 1.0.2s 28 May 2019
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=admin --group=admin --with-pcre=../pcre-8.43 --with-pcre-jit --with-openssl-opt=enable-tlsex --with-file-aio --with-threads --with-http_realip_module --with-http_addition_mo ule --with-http_mp4_module --with-http_secure_link_module --with-http_gunzip_module --with-http_auth_request_module --with-http_degradation_module --with-http_slice_module --with-stream --with-stream_ssl_module --with-stream_re lip_module --with-stream_sni --with-stream_ssl_preread_module --with-http_v2_module --with-http_gzip_static_module --with-http_realip_module --with-http_stub_status_module --add-module=../ngx_devel_kit --add-module=../lua-nginx module --add-module=../echo-nginx-module --add-module=../redis2-nginx-module --add-module=../set-misc-nginx-module --add-module=./modules/ngx_http_concat_module --add-module=./modules/ngx_http_reqstat_module --add-module=./modu es/ngx_http_upstream_check_module --add-module=./modules/ngx_http_upstream_consistent_hash_module --add-module=./modules/ngx_http_upstream_dynamic_module --add-module=./modules/ngx_http_upstream_dyups_module --add-module=./modu es/ngx_http_upstream_session_sticky_module --add-module=./modules/ngx_cache_purge-2.3 --with-zlib=../zlib-1.2.8 --with-openssl=../openssl-1.0.2s --with-http_sub_module
上面标黄的部分是已编译安装的参数,下面说明中用(***)表示,每台服务器上编译安装的模块都不一定相同,因此要根据具体的情况进行操作。
7)进入安渡客户端下载相同版本的nginx:get nginx-1.16.1.tar.gz
8)编译时加入需要的模块:
./configure (***)--add-module=/usr/local/nginx-module-vts --add-module=/mnt/nginx-module-vts
9)备份原二进制文件:cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
10)备份nginx.conf配置文件:cp /usr/local/nginx/conf/nginx.conf /root
11)安装:make && make install
4.安装nginx_exporter
1)进入安渡客户端目录:cd /root/linux-client/5.11/
2)登陆安渡客户端:./MiniFTClient -h X.X.X.X -u user -p passwd
3)下载nginx_exporter:get nginx-vts-exporter.tar.gz
4)退出安渡客户端:exit #退出后的目录为/root/linux-client/5.11/
#以上步骤为下载nginx_exporter组件至服务器,仅供参考
5)修改node_expoter路径:mv nginx-vts-exporter.tar.gz /mnt
6)进入组件目录:cd /mnt
7)解压缩:tar -zxvf nginx-vts-exporter.tar.gz #文件名为nginx-vts-exporter
8)赋予可执行权限:chmod 755 nginx-vts-exporter
9)修改nginx.conf文件:vi /usr/local/nginx/conf/nginx.conf
10)配置如下:
http {
vhost_traffic_status_zone;
vhost_traffic_status_filter_by_host on;
server {
80;
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}
}
#监听端口80可以进行修改,与现有业务不冲突即可。建议使用统一的标准
#也可以部署在任意端口下面,只要不与现有业务冲突即可
# vhost_traffic_status_filter_by_host on; 开启此功能,在Nginx配置有多个server_name的情况下,会根据不同的server_name进行流量的统计,否则默认会把流量全部计算到第一个server_name上。
11)启动监听服务:
nohup /mnt/nginx-vts-exporter/nginx-vts-exporter -nginx.scrape_uri=http://localhost:8088/status/format/json &
#不建议先启动服务,等supervisor服务配置好后再进行启动,否则容易报错
5.安装Supervisor服务(管理并自启动nginx相关服务)
介绍:Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。
生产环境由于是封闭的网络,因此使用离线安装的方式。
安装及配置如下:
1)进入安渡客户端目录:cd /root/linux-client/5.11/
2)登陆安渡客户端:./MiniFTClient -h X.X.X.X -u user -p passwd
3)下载Supervisor服务安装包:get supervisor_install_pack.tar.gz
4)退出安渡客户端:exit #退出后的目录为/root/linux-client/5.11/
#以上步骤为下载supervisor组件至服务器,仅供参考。
5)创建程序安装目录:mkdir -p /app/supervisor/
#创建的目录可修改,修改后目录后需要修改安装脚本中的路径。
6)移动安装包至安装目录下:mv supervisor_install_pack.tar.gz /app/supervisor/
7)切换至安装目录下:cd /app/supervisor/
8)解压安装包:tar -zxvf supervisor_install_pack.tar.gz
9)进入安装程序:cd supervisor/ #此时绝对路径为/app/supervisor/supervisor
10)执行安装脚本:sh install_supervisor.sh
11)切换至上层目录:cd /app/supervisor
12)启动supervisor服务:sh run_supervisor.sh
13)检查supervisor服务是否已运行:ps -ef | grep supervisord
14)配置systemctl服务:vi /etc/systemd/system/supervisor.service
15)将下列内容添加至supervisor.service文件内:
[Unit]
Description=supervisor
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /app/supervisor/etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
16)设置开机启动:
systemctl enable supervisor.service
systemctl daemon-reload
17)关闭supervisor进程:pkill -9 supervisor
18)使用systemctl命令启动:systemctl start supervisor.service
19)检查服务:systemctl status supervisor.service
20)关闭NetworkManager:
systemctl stop NetworkManager
systemctl disable NetworkManager
21)查看mac地址:ip addr
ifcfg-ens192
#网卡的名称不同的服务器不尽相同,请根据实际情况选择
23)添加内容:HWADDR=00:50:56:9c:14:09
# supervisor常用管理命令:
# supervisorctl restart all ;重启所有应用
# supervisorctl stop all ;停止所有应用
# supervisorctl start all ;启动所有应用
# supervisorctl status ;查看所有应用
6.配置管理nginx以及nginx_exporter(自启动)
需要给托管的子进程配置相应的配置文件,每个进程的配置文件都可以单独分拆也可以把相关的脚本放一起。目录及文件后缀可以在supervisor.conf配置文件中进行自定义。
1)创建日志文件目录:mkdir -p /data/logs/supervisord/
2)编辑配置文件:vi /app/supervisor/etc/supervisord.conf
3)添加管理nginx进程:
[program:nginx]
directory=/usr/local/nginx/sbin
command=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -g 'daemon off;'
#numprocs=6
autostart=true
autorestart=true
startsecs=1
priority=1
user=root
stopasgroup=true
killasgroup=true
stdout_logfile=/data/logs/supervisord/nginx.log
stderr_logfile=/data/logs/supervisord/nginx.err.log
4)添加管理nginx_exporter进程:
[program:nginx_exporter]
directory=/mnt/nginx-vts-exporter
command=/mnt/nginx-vts-exporter/nginx-vts-exporter -nginx.scrape_uri=http://localhost:80/status/format/json
autostart=true
autorestart=true
startsecs=5
priority=1
user=root
stopasgroup=true
killasgroup=true
stdout_logfile=/data/logs/supervisord/nginx_exporter.log
stderr_logfile=/data/logs/supervisord/nginx_exporter.err.log
7.日志管理(按日切割以及保留30天)
1)编辑日志管理脚本:vi /abc/cut_nginx_log.sh
2)脚本内容如下:
#!/bin/bash
#原nginx日志存放路径
log_files_path="/data/nglog/"
#备份nginx日志存放路径
log_files_backup="/data/backup/"
#nginx切割后存放路径
log_files_dir=${log_files_backup}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/$(date -d "yesterday" +"%d")
#罗列出需要切割的日志名
log_file_list=$(ls -l /data/nglog/ | awk '{print$9}' |awk -F'.' '{print $1}')
#待切割日志名称集合如access.log error.log
log_files_name=(${log_file_list})
#nginx启动脚本路径
nginx_sbin="/usr/local/nginx/sbin/nginx"
#日志保存时间
save_days=30
#创建存放目录
mkdir -p $log_files_dir
log_files_num=${#log_files_name[@]}
#循环切割日志
for((i=0;i<$log_files_num;i++));do
mv ${log_files_path}${log_files_name[i]}.log ${log_files_dir}/${log_files_name[i]}_$(date -d "yesterday" +"%Y%m%d").log
done
#删除超过30天的日志文件
find $log_files_backup -mtime +$save_days -exec rm -rf {} \;
#重启nginx服务,重新生成新的文件
$nginx_sbin -s reload
3)编辑crontab定时服务:crontab –e
4)配置每天凌晨进行日志处理:0 0 * * * sh /abc/cut_nginx_log.sh
8.配置prometheus服务端(slave)
1)登陆prometheus服务端(slave):x.x.x.x(企业信息化)
2)检查服务端与被监控端的网络(端口9913):比如telnet x.x.x.x 9913
3)配置监控组节点信息:vi /usr/local/prometheus/sd_config/nginx.yml
4)在(-targets:)下添加监控节点信息:
可以让光标停留在targets的最后一行,安yyp即可直接复制到下一行再进行修改
5)添加监控组节点信息文件至prometheus服务文件(如果已经添加,无需操作):
vi /usr/local/prometheus/prometheus.yml
在最后一行添加如下信息:
- job_name: 'nginx_tybg'
file_sd_configs:
- files: ['/usr/local/prometheus/sd_config/nginx.yml']
refresh_interval: 5m
6)配置完成后重启prometheus服务:
kill -hup `ps -ef |grep prometheus|grep -v grep|awk '{print $2}'`
7)检查prometheus服务是否重启成功:ps -ef |grep prometheus
9.配置prometheus服务端(master)
1)登陆prometheus服务端(master):x.x.x.x
2)配置prometheus服务文件:
找到slave节点对应的区域,并在列表中添加监控组(如果监控组已经添加,无需操作)
vi /usr/local/prometheus/prometheus.yml
3)完成后重启prometheus服务:
kill -hup `ps -ef |grep prometheus|grep -v grep|awk '{print $2}'`
4)检查prometheus服务是否重启成功:ps -ef |grep prometheus
10.登陆grafana检查否添加成功
1)登入服务器x.x.x.x,访问Grafana服务:http://x.x.x.x:3000
2)选择所有节点(all node),按照监控组(job)搜索,看是否添加成功:
11.配置alert告警分组
1)登入alertmanager服务器x.x.x.x,进入目录/usr/local/alertmanager
2)编辑告警的分区信息:vi /usr/local/alertmanager/robotKey.json
3)文件的内容如下:
文件中的格式为:“告警机器人名”:“企业机器人组key”
告警机器人名取自各个slave服务器下的文件,以slave节点x.x.x.x为例子:
比如cw分组:/usr/local/prometheus/sd_config/node_cw/node_cw.yml
alert:cw #这个地方配置报警机器人的名字
配置好之后重启服务:kill -hup `ps -ef |grep prometheus|grep -v grep|awk '{print $2}'`
之后再回到alertmanager服务器x.x.x.x,添加配置到文件/usr/local/alertmanager/robotKey.json
{
"oa": "cbe2866f-0d35-4064-b761-92321b665cf4",
"sftp": "15bc15f7-be2e-4262-8a31-04cf1d83c557",
"ziyan": "3c2f92ad-57c3-45fc-9c36-31ac5e6a0902",
"zyspecial": "f085fee9-b61e-496d-950c-77008590f960",
"cw": "8af4df90-7b1c-4cd9-838b-196e77790ddc",
"mail": "91bbf9bf-ce6f-4c32-a998-c4242a76061d",
"qywx": "d8ab1d94-cd23-4994-bcd6-c1154cb1c5bc",
"oayq": "dca8487d-ce03-45e3-8fc5-9ab71cc1020f",
"zz": "57fc5b51-b64e-4b8b-bbea-cd45fd9ca945",
"yyzx": "83c108d6-696c-44f3-a9f6-d23acf837b39"
}
- 配置好文件后,查询并关闭alert相关的进程:ps -ef | grep alert
Kill -9 进程号 #关闭下图中框起来的进程,进程号会有所不同根据实际的情况进行关闭。
- 关闭进程后,重新读取robotkey的信息至alertmanager:
nohup python3 /usr/local/alertmanager/send_robot_data.py > /usr/local/alertmanager/logs/send_robot_data.out 2>&1 &
- 信息读取完毕后,重新开启报警监控程序alertmanager:
nohup /usr/local/alertmanager/alertmanager --log.level=debug > /usr/local/alertmanager/logs/alertmanager.out 2>&1 &
- 配置完成后,检验告警机器人是否生效,关闭job组中一台服务器上的node_exporter进程,并等待企业微信告警机器人对告警信息进行反馈,一般在10~30分钟会有报警提示:
关闭nginx_exporter命令为:systemctl stop node_exporter
确认nginx_exporter状态:systemctl status node_exporter
告警机器人截图:
确认好后,恢复相关的节点监控进程:systemctl start node_exporter
nginx监控统一安装脚本:
#安装安渡客户端
yum -y install wget
wget https://X.X.X.X/UniExServices/baseCfg/downloadLinuxClient.html --no-check-certificate
unzip downloadLinuxClient.html
cd linux-client/5.11/
chmod 755 *
#安装nginx及nginx监控探针
#进入安渡客户端目录
cd /root/linux-client/5.11/
./MiniFTClient -h X.X.X.X -u user -p passwd << EOF
get nginx-1.16.1.tar.gz
get nginx-module-vts.tar.gz
get nginx-vts-exporter.tar.gz
get nginx-sticky-module-ng.zip
exit
EOF
mv nginx-1.16.1.tar.gz /usr/local
mv nginx-module-vts.tar.gz /mnt
mv nginx-vts-exporter.tar.gz /mnt
mv nginx-sticky-module-ng.zip /mnt
cd /usr/local
#解压
tar -zxvf nginx-1.16.1.tar.gz
cd /mnt
#解压
unzip /mnt/nginx-sticky-module-ng.zip
tar -zxvf nginx-module-vts.tar.gz
cd /usr/local/nginx-1.16.1/
#安装依赖库
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
#编译
./configure --user=root --group=root --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --add-module=/mnt/nginx-sticky-module-ng --add-module=/mnt/nginx-module-vts --with-stream --without-http_rewrite_module --with-pcre
#安装
make && make install
#检查版本
/usr/local/nginx/sbin/nginx -v
#安装nginx_exporter
cd /root/linux-client/5.11/
mv nginx-vts-exporter.tar.gz /mnt
cd /mnt
tar -zxvf nginx-vts-exporter.tar.gz
chmod 755 nginx-vts-exporter
#切换目录
cd /root/linux-client/5.11/
./MiniFTClient -h X.X.X.X -u user -p passwd << EOF
get supervisor_install_pack.tar.gz
exit
EOF
#安装
mkdir -p /app/supervisor/
mv supervisor_install_pack.tar.gz /app/supervisor/
cd /app/supervisor/
tar -zxvf supervisor_install_pack.tar.gz
cd supervisor/
sh install_supervisor.sh
cd /app/supervisor
sh run_supervisor.sh
#配置systemctl服务
cat >> /etc/systemd/system/supervisor.service << EOF
[Unit]
Description=supervisor
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /app/supervisor/etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
EOF
#配置结束
#supervisor服务自启动
systemctl enable supervisor.service
systemctl daemon-reload
#强制关闭supervisor服务
pkill -9 supervisor
#启动并查看supervisor服务
#systemctl start supervisor.service
#systemctl status supervisor.service
#停止NetworkManager服务:
systemctl stop NetworkManager
systemctl disable NetworkManager
#编辑配置脚本
cat >> /app/supervisor/etc/supervisord.conf << EOF
[program:nginx]
directory=/usr/local/nginx/sbin
command=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -g 'daemon off;'
#numprocs=6
autostart=true
autorestart=true
startsecs=1
priority=1
user=root
stopasgroup=true
killasgroup=true
stdout_logfile=/data/logs/supervisord/nginx.log
stderr_logfile=/data/logs/supervisord/nginx.err.log
[program:nginx_exporter]
directory=/mnt/nginx-vts-exporter
command=/mnt/nginx-vts-exporter/nginx-vts-exporter -nginx.scrape_uri=http://localhost:80/status/format/json
autostart=true
autorestart=true
startsecs=5
priority=1
user=root
stopasgroup=true
killasgroup=true
stdout_logfile=/data/logs/supervisord/nginx_exporter.log
stderr_logfile=/data/logs/supervisord/nginx_exporter.err.log
EOF
#完成配置nginx以及nginx_exporter
#创建日志目录,否则重启服务时会报错
mkdir -p /data/logs/supervisord
#重启服务
systemctl restart supervisor.service