Linux服务器运维踩坑记录:Git服务搭建与日常管理 这篇文章是我在2021年管理Linux服务器时遇到的各种问题和解决方案的整理,涉及Git服务、Redis、SSH、监控脚本等方面。
CentOS搭建Git服务器 安装Git 1 2 3 4 yum install -y git git --version
创建Git管理账户 1 2 3 4 5 6 adduser git passwd git
创建Git仓库 1 2 3 4 5 6 7 8 9 10 11 su git cd /home/gitmkdir test.git && cd test.gitgit init --bare
设置目录权限 1 2 3 4 chmod -R 777 *git repo-config core.sharedRepository 0777 chgrp -R git *git repo-config --list
Git免密SSH登录配置 服务器端(生成密钥):
1 2 3 4 5 6 7 ssh-keygen -t dsa cp id_dsa.pub authorized_keyschmod 600 id_dsachmod 600 id_dsa.pubchmod 600 authorized_keys
客户端配置:
1 2 3 4 5 6 7 chmod 600 id_dsassh-agent bash ssh-add id_dsa git clone xxx@xxx.com.cn:/data/gitrepo/xxx.git
解决Git Push错误 错误: error unpack failed unable to create temporary object directory
原因: 目录权限问题
解决方案:
1 2 3 4 chmod -R 777 *git repo-config core.sharedRepository 0777 chgrp -R git *git repo-config --list
Push时出现unpacker error:
禁止Git用户Shell登录 步骤一:创建git-shell-commands目录
1 2 su git mkdir /home/git/git-shell-commands
步骤二:修改/etc/passwd文件
1 2 3 4 5 6 7 8 git:x:1000:1000::/home/git:/bin/bash git:x:1000:1000::/home/git:/bin/git-shell
Redis安装与配置 Amazon Linux安装Redis AWS EC2默认没有Redis源,需要下载Fedora的EPEL仓库:
1 2 3 4 5 6 7 8 yum install epel-release sudo amazon-linux-extras install epelyum install redis
Redis服务管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 service redis start service redis stop service redis status ps -ef | grep redis chkconfig redis on
SSH安全配置 AWS EC2使用root登录 创建root密码:
切换到root:
修改sshd配置文件:
1 2 3 4 5 6 vi /etc/ssh/sshd_config PermitRootLogin yes PasswordAuthentication yes UsePAM no
重启SSH服务:
1 sudo /sbin/service sshd restart
限制特定用户SSH登录 允许指定用户:
1 2 3 4 5 vi /etc/ssh/sshd_config AllowUsers aliyun testxxxx
拒绝指定用户:
1 DenyUsers testxxxx aliyun
重启SSH服务:
取消密钥登录 1 2 3 4 5 6 7 vi /etc/ssh/sshd_config sshd restart
服务监控与自动重启 Node.js服务监控脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #!/bin/bash code1=`ps -ef|grep node|wc -l` code2=`netstat -lntup|grep mongod|wc -l` code3=`netstat -lntup|grep nginx|wc -l` my_mail (){ mail_list=("111@qq.com" ) now_date=`date "+%Y-%m-%d %T" ` for i in ${mail_list[@]} do echo -e "服务器服务异常,IP 13.127.1.1,$now_date " | mail -s "服务器服务异常" $i done } my_node (){ cd /data/nodejs/ sudo sh xxx-api.sh sudo sh xxx-service.sh } n=1 count=1 while ((n<4 ))do if [ $code1 -gt 3 ] && [ $code2 -gt 0 ] && [ $code3 -gt 0 ]then n=$(($n +1 )) sleep 2 else count=$(($count +1 )) n=$(($n +1 )) sleep 2 if [ $count -eq 3 ];then my_mail if [ $code1 -lt 3 ];then my_node fi fi fi done
注意事项: 重启脚本中去掉pm2 logs xxxx等输出命令,否则可能遗留node日志进程,导致统计数量不准确。
定时执行监控 1 2 3 4 5 crontab -e * * * * * sh /data/check/check_service.sh > /data/check/check_service.log 2>&1 &
通用服务监控脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #!/bin/bash code1=`netstat -lntup|grep node|wc -l` code2=`netstat -lntup|grep mongod|wc -l` my_mail (){ mail_list=("a@a.com" "b@b.com" ) now_date=`date "+%Y-%m-%d %T" ` for i in ${mail_list[@]} do echo -e "service is down,please check; $now_date " | mail -s "service down" $i done } n=1 count=1 while ((n<4 ))do if [ $code1 -gt 0 ] && [ $code2 -gt 0 ]then n=$(($n +1 )) sleep 2 else count=$(($count +1 )) n=$(($n +1 )) sleep 2 if [ $count -eq 3 ];then my_mail fi fi done
mailx邮件发送配置 安装mailx 1 2 3 4 5 6 7 8 chkconfig postfix off service postfix stop chkconfig sendmail off service sendmail stop yum -y install mailx
配置mail.rc 1 2 3 4 5 6 7 8 9 10 vim /etc/mail.rc set from=your_email@qq.comset smtp=smtps://smtp.qq.com:465set smtp-auth-user=your_email@qq.comset smtp-auth-password=your_auth_codeset smtp-auth=loginset ssl-verify=ignoreset nss-config-dir=/root/.certs
注意: smtp-auth-password处填写QQ邮箱授权码,不是邮箱密码。
请求数字证书 1 2 3 4 5 6 7 8 9 10 mkdir -p /root/.certs/echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs/./ -i qq.crt certutil -L -d /root/.certs
发送测试邮件 1 2 3 4 5 6 echo "邮件正文" | mail -s "邮件主题" xxx@163.comcat file.txt | mail -s "邮件主题" xxx@163.commail -s "邮件主题" xxx@163.com < file.txt
AWS EC2磁盘管理 挂载数据盘 查看数据盘:
分区数据盘:
创建文件系统:
1 2 3 4 5 mkfs -t ext4 /dev/nvme1n1p1 mkfs -t xfs /dev/nvme1n1p1
配置fstab:
1 2 3 4 5 6 7 8 9 10 cp /etc/fstab /etc/fstab.bakecho `blkid /dev/nvme1n1p1 | awk '{print $2}' | sed 's/\"//g' ` \ /data ext4 defaults 0 0 >> /etc/fstab echo `blkid /dev/nvme1n1p1 | awk '{print $2}' | sed 's/\"//g' ` \ /data xfs defaults 0 0 >> /etc/fstab
挂载文件系统:
1 2 mkdir /datamount /dev/nvme1n1p1 /data/
磁盘扩容 扩容分区:
1 2 3 lsblk growpart /dev/nvme1n1 1 lsblk
扩容文件系统:
1 resize2fs /dev/nvme1n1p1
Node.js与PM2管理 解决sudo pm2命令找不到 问题原因: sudo使用secure_path限制命令路径
解决方案:
1 2 3 cd /usr/binln -s /usr/local/bin/node nodeln -s /usr/local/bin/pm2 pm2
PM2定时重启 1 2 pm2 start app.js --node-args="--nouse-idle-notification" --cron '0 0 0 0 0 5'
crontab定时任务 crontab时间格式 1 minute hour day month week command
字段
范围
说明
minute
0-59
分钟
hour
0-23
小时
day
1-31
日期
month
1-12
月份
week
0-7
星期(0和7代表星期日)
特殊字符
符号
含义
*
所有可能的值
,
列表范围,如”1,2,5,7,8,9”
-
整数范围,如”2-6”
/
间隔频率,如”*/10”表示每10分钟
crontab常用命令 1 2 3 4 5 6 7 8 9 10 11 yum install crontabs crontab -l crontab -e tail -f /var/log/cron
实例 1 2 3 4 5 6 7 8 * * * * * sh /data/check/check_service.sh > /dev/null 2>&1 & 0 * * * * sh /data/backup/backup.sh 0 3 * * * sh /data/clean/clean.sh
Nginx配置 worker_connections警告 错误: 1024 worker_connections exceed open file resource limit 256
解决方案:
以上就是我在2021年运维Linux服务器时的一些经验记录,希望能帮到遇到同样问题的朋友。