Ubuntu下安装MySQL及简单操作

Ubuntu上安装MySQL非常简单只需要几条命令就可以完成。

sudo apt-get install mysql-server

apt-get isntall mysql-client

sudo apt-get install libmysqlclient-dev

未分类

安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使用如下命令来检查是否安装成功:

sudo netstat -tap | grep mysql

通过上述命令检查之后,如果看到有mysql 的socket处于 listen 状态则表示安装成功。

未分类

登陆mysql数据库可以通过如下命令:

mysql -u root -p

未分类

-u 表示选择登陆的用户名, -p 表示登陆的用户密码,上面命令输入之后会提示输入密码,此时输入密码就可以登录到mysql。

Ubuntu 下为单版本和多版本 PHP 安装扩展

介绍

尽管 PHP 软件源提供了不少 PHP 扩展,但并不是提供所有的扩展,那么如果我们需要安装一个软件源没有提供的扩展应该怎么办呢?

利用 php-dev 就可以很方便的进行自行编译 PHP 扩展了。不过如果有使用 PHP 多版本共存就会更加麻烦一点。

单一PHP

一、安装 php-dev ,如果不是 7.1 需要自己修改一下版本号:

apt install php7.1-dev

二、以安装 Swoole 为例:

pecl install swoole

三、添加配置文件:

cd /etc/php/7.1/fpm/conf.d/
touch swoole.ini
echo "extension=swoole.so" | tee -a swoole.ini

四、重启 php-fpm 即可:

systemctl restart php7.1-fpm

多PHP共存

因为多个 PHP 就不能简单粗暴的使用 pecl 安装了,因为安装好了不知道是给谁用的。这里以 PHP7.1 和 PHP5.6 为例,还是 swoole。

一、安装 php-dev:

apt install php7.1-dev php5.6-dev

二、下载 swoole 源码 ,地址:http://pecl.php.net/package/swoole

cd /root/src
wget http://pecl.php.net/get/swoole-1.9.15.tgz
tar xzf swoole-1.9.15.tgz
cd swoole-1.9.15

三、为 PHP7.1 进行编译

cd /root/src/swoole-1.9.15
/usr/bin/phpize7.1
./configure --with-php-config=/usr/bin/php-config7.1
make && make install

四、为 PHP5.6 进行编译

cd /root/src/swoole-1.9.15
/usr/bin/phpize5.6
./configure --with-php-config=/usr/bin/php-config5.6
make && make install

五、添加 PHP7.1 配置文件

cd /etc/php/7.1/fpm/conf.d/
touch swoole.ini
echo "extension=swoole.so" | tee -a swoole.ini

六、添加 PHP5.6 配置文件

cd /etc/php/5.6/fpm/conf.d/
touch swoole.ini
echo "extension=swoole.so" | tee -a swoole.ini

七、重启 PHP-FPM

systemctl restart php7.1-fpm
systemctl restart php5.6-fpm

Linux下php-fpm进程过多导致内存耗尽问题解决

当个人博客数据库服务经常突然挂断,造成无法访问时我们能做什么?本篇主题就是记录博主针对这一现象时发现问题,分析问题,最后解决问题的过程。

发现问题

最近,发现个人博客的Linux服务器,数据库服务经常挂掉,导致需要重启,才能正常访问,极其恶心,于是决心开始解决问题,解放我的时间和精力(我可不想经常出问题,然后人工重启,费力费时)。

分析问题

发现问题以后,首先使用free -m指令查看当前服务器执行状况:
未分类
可以看到我的服务器内存是2G的,但是目前可用内存只剩下70M,内存使用率高达92%,很有可能是内存使用率过高导致数据库服务挂断。

继续看详细情况,使用top指令:
未分类
然后再看指令输出结果中详细列出的进程情况,重点关注第10列内存使用占比:
未分类
发现CPU使用率不算高,也排除了CPU的问题,另外可以看到数据库服务占用15.2%的内存,内存使用过高时将会挤掉数据库进程(占用内存最高的进程),导致服务挂断,所以我们需要查看详细内存使用情况,是哪些进程耗费了这么多的内存呢?

使用指令:

ps auxw|head -1;ps auxw|sort -rn -k4|head -40

查看消耗内存最多的前40个进程:
未分类
查看第四列内存使用占比,发现除了mysql数据库服务之外,php-fpm服务池开启了太多子进程,占用超过大半内存,问题找到了,我们开始解决问题:设置控制php-fpm进程池进程数量。

解决问题

通过各种搜索手段,发现可以通过配置pm.max_children属性,控制php-fpm子进程数量,首先,打开php-fpm配置文件,执行指令:

vi /etc/php-fpm.d/www.conf

找到pm.max_children字段,发现其值过大:
未分类
如图,pm.max_children值为50,每一个进程占用1%-2.5%的内存,加起来就耗费大半内存了,所以我们需要将其值调小,博主这里将其设置为25,同时,检查以下两个属性:

  1. pm.max_spare_servers: 该值表示保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
  2. pm.min_spare_servers: 保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程;
    这两个值均不能不能大于pm.max_children值,通常设置pm.max_spare_servers值为pm.max_children值的60%-80%。

最后,重启php-fpm

systemctl restart php-fpm

再次查看内存使用情况, 使用内存降低很多:
未分类
之后经过多次观察内存使用情况,发现此次改进后,服务器内存资源消耗得到很大缓解。

linux 下安装 lua 及 lua-cjson

安装 lua

yum -y install libtermcap-devel ncurses-devel libevent-devel readline-devel
wget -c https://www.lua.org/ftp/lua-5.1.4.tar.gz
tar xvzf lua-5.1.4.tar.gz
cd lua-5.1.4
make linux install

安装 lua-cjson

wget -c https://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz
tar zxvf lua-cjson-2.1.0.tar.gz
cd lua-cjson-2.1.0/
make 
make install

crontab mysqldump 定时任务 备份 及 创建文件 大小 为 0 解决方案+分析

今天现网Mysql数据库要求开始做备份,于是决定把mysqldump命令写到脚本里,然后做到crontab里让它每天定时执行。
系统:RHEL6.5,Mysql5.5

路径:/tmp/tmp
mysqldump写到test.sh,:wq保存后,赋予执行权限:

mysqldump -A -uroot -pyourpassword > /tmp/tmp/mysqlallbak.sql
chmod a+x test.sh

接下来手工执行一下

./test.sh
[root@neoska tmp]# ll
total 648
-rw-r--r-- 1 root root   662849 Nov 29 10:20 mysqlallbak.sql

有sql文件生成,文件大小不为0,一切正常,美滋滋。

接下来删掉那个sql文件,做定时任务,把脚本加入定时执行,设10点22

crontab -e
22 10 * * * /tmp/tmp/test.sh

时间一到,马上到tmp下查看

[root@neoska tmp]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 29 10:22 mysqlallbak.sql

文件确实有,可大小为0,打开看就是个空文件。

检查步骤:

1.打开脚本仔细检查,看是不是语句里忘写mysql登陆密码。
2.脚本检查无误,crontab -e仔细检查定时任务是否有误。
3.crontab检查无误,开始怀疑crontab本身有问题。百度了一下,大多数解决方案是,mysqldump命令写成绝对路径即可。
于是

[root@neoska tmp]# find / -name mysqldump
/usr/local/mysql/bin/mysqldump

打开脚本,把mysqldump换成/usr/local/mysql/bin/mysqldump,重新crontab测试,果然奏效了。
4.用绝对路径写了脚本,测了几次,没问题。但手工执行成功,定时任务挂掉,百思不得其解,遂继续百度之。
原来crontab运行时,使用自己的环境变量,相当于独立的环境。
其自动运行的环境配置写在/etc/crontab。
于是打开看看

[root@neoska tmp]# vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

!有个PATH长的好像系统环境变量PATH!
这个path里,没有步骤3中mysqldump的路径,因此肯定是crontab的环境找不到mysqldump指令,自然也不能执行成功。
原因弄明白了,问题就好解决了。

  • 方案1
    采用软链接方式,将mysqldump软链接到crontab配置文件中PATH后面的任意一个下,如/usr/bin:
 ln -s /usr/local/mysql/bin/mysqldump /usr/bin/mysqldump

回去编辑脚本,把mysqldump的绝对路径删掉,保存重新crontab测试,成功。

  • 方案2
    修改/etc/crontab的内容,在PATH最后面加上:/Your_project_path(注意冒号别掉了)(此处就是mysqldump的存放路径/usr/local/mysql/bin/)保存退出。
    没有软链接的情况下,测试成功。

总结

crontab运行采用独立环境,PATH变量可在/etc/crontab文件中编辑。不只是mysql或mysqldump,所有自定义的命令,都可采用这两种方法,让crontab能够找到该指令,这样就不会出现crontab定时脚本不能执行的现象。
另外,一些需要更改环境变量才能执行的项目,可以在脚本开头写上source /etc/profile或者JAVA_HOME=XXXXX/export XXXXX(使用指定jdk等),来指定该脚本需要的环境变量。

参考资料

Linux中crontab的坑爹环境变量问题
http://blog.csdn.net/dancen/article/details/24355287
corantab 不能自动执行的一些问题-环境变量
http://xiachaofeng.iteye.com/blog/1405184
mysqldump参数之-A -B
http://blog.csdn.net/u010587433/article/details/47417051

附录

完整脚本

#创建一个以当天日期为名的文件夹如171129
mkdir -p /home/neoska/backup/data/`date +%Y%m%d`

#写备份文件,-A为备份所有库。其他常用选项:-B database1 database2 ...为指定的多个库,-d为只导出表结构,-h10.11.12.13为备份IP为10.11.12.13的远程数据库。
mysqldump -A -uroot -ppasswd > /home/neoska/backup/data/`date +%Y%m%d`/mysqldumpall.sql

#删掉3天前的备份数据,可自定义周期,若数据太大则应设小点以免磁盘写满。
rm -rf /home/neoska/backup/data/`date +%Y%m%d -d "-3days"`

Ubuntu 的ufw 和iptables 的关系

ufw

Uncomplicated FireWall,不是 Ubuntu FireWall 哦,是 debian 系发行版中为了轻量化配置 iptables 而开发的一款工具。

UFW 和 iptables 一样都是匹配原则,匹配到了则忽略剩下的规则,这点就不废话了。

iptables

我们习惯性的会把 iptables 认为是 Linux 上的防火墙,自从 Linux 内核 2.4 之后就集成进主线内核。实际上准确是说,iptables 是一个通过控制 Linux 内核的 netfilter 模块来管理网络数据包的流动与转送的应用软件,其功能包括不仅仅包括防火墙的控制出入流量,还有端口转发等等。

iptables 内部有表 tables、链 chains、规则 rules 这三种概念。

iptables 的每一个 “表” 都和不同的数据包处理有关、决定数据包是否可以穿越的是 “链”、而一条 “规则” 在链里面则可以决定是否送往下一条链(或其它的动作)

那一个包到达网卡的时候,Linux 的如何处理的呢?

我们提到了 iptables 是可以控制 netfilter 模块的,netfilter 内部分为三个表,分别是 filter, nat, mangle,每个表又有不同的链(Chains),每个链下可以有不同的规则(rules)。

filter

在 filter(过滤)表中,也就是防火墙功能的表,定义了三个链。分别是 INPUT, FORWARD, OUTPUT。也就是对包的入、转发、出进行定义的三个过滤链。对于这个 filter 表的操作和控制也是我们实现防火墙功能的一个重要手段;

nat

在 nat(网络地址转换) 表中,也就是我们用以实现地址转换和端口转发功能的这个表,定义了 PREROUTING, POSTROUTING,OUTPUT 三个链;

mangle

netfilter 的 mangle 表则是一个自定义表,里面包括上面 的 filter 以及 nat 表中的各种 chains,它可以让我们进行一些自定义的操作,同时这个 mangle 表中的 chains 在 netfilter 对包 的处理流程中比较优先。

包在 Linux 中的前世今生

未分类

我们大致可以看出:包首先要由 bridge check 来判断属于链路层还是网络层,之后包都会遇到 NAT 或者 mangle 表的 PREROUTING 链,从这 pre 前缀咱能才出来,这是要在路由之前要过的链。

接着当包通过了 PREROUTING 之后,便到了 decision 这个分支点,这里有一个对目的地址的判断,如果包的目的地是本地, 那么包向上走,走入 INPUT 链处理,然后进入 LOCAL PROCESS,之后再进入对应的 OUTPUT、POSTROUTING;

如果非本地,那么就进入 FORWARD 链进行转发,之后再走 POSTROUTING,我们在这里就不说 FORWARD 链的事了。

我们可以看到,filter 表在包的处理流程中,处于中间的位置,这部分也就是防火墙的主要功能所在。

ufw 怎么和 iptables 一起合作的

在稍微理解了包是怎么走的之后,回到我们iptables -L的时候,我们看 filter 表,可以看到,ufw 在 INPUT、FORWARD、OUTPUT 添加了好些自定义规则,并且添加了好些自己的链和链的规则,还把把 INPUT、FORWARD 默认策略设置成 DROP
当你有这些 ufw 定义的链的时候,是能够匹配到 ufw 链和规则,也就是正常入网的。

当我们执行iptables -F的时候,会发生什么呢?

所有链的规则都被清空了!包括 ufw 的链!并且 INPUT、FORWARD 依旧是 DROP

再想想包的前世今生,OUTPUT 我们发出了 ping,但是却因为 INPUT 的 DROP 而永远无法收到 ICMP echo,只能往出发包而不能接收任何类型的包,毫无疑问自然就断网了。

此时ufw status还会告诉你在运行,但是当你使用ufw disable关闭 ufw 时,INPUT 会被设置成 ACCEPT,自然就恢复网络通信了;

当你使用ufw default allow把默认出网规则设置成 allow 时,INPUT 也会被设置成 ACCEPT,当然网络通信恢复了。

所以童鞋们自此应该理解了刚开始理解动图能够 ping 通和不通的原因吧!

使用 ufw 和 iptables 的警告

最后给大家一个警告,当你使用了 ufw 这类前端时,就最好不要再碰 iptables 了,尤其要慎重使用 iptables – 来清空所有链的规则。在不了解 iptables 的表、链、规则之前,盲目的清空 iptables”规则” 就是耍流氓!

试想,假如你在服务器上ufw enable,那么 INPUT 和 FORWARD 就是 DROP,那么当你iptables -F时,不仅仅是 SSH 的例外规则没了,所有出网的包也都出不去了!此时唯一能做的事情就是去 VNC、或者去机房插鼠标键盘显示器。

假如你是买的服务器,为了安全考虑使用密钥认证,并且把用户名设置成了从 openssl 生成的随机密码,并且你是由 Windows 重装成的 Linux,那么控制台也是没有用的…… 重装或者快照吧。

Linux系统 Crontab命令 安装配置使用详细说明

Crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。通常,crontab储存的指令被守护进程激活。crond 常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
未分类

一、安装

yum -y install vixie-cron
yum -y install crontabs

说明:
vixie-cron 软件包是 cron 的主程序;
crontabs 软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。

二、配置

cron 是 linux 的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:

service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看crontab服务状态

在CentOS系统中加入开机自动启动:

chkconfig –level 345 crond on

列子:

01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

三、Crontab文件的格式:

minute:分,值为0-59
hour:小时,值为1-23
day:天,值为1-31
month:月,值为1-12
weekday:星期,值为0-6(0代表星期天,1代表星期一,以此类推)
username:要执行程序的用户,一般设置为root
command:要执行的程序路径(设置为绝对路径)例如:/home/cunlz.org/cunlz.sh

root身份登录到命令行

输入crontab -e

按下a键进入到编辑模式

输入 执行代码,例如:

0 3 */7 * * /bin/certbot renew –renew-hook “/etc/init.d/nginx reload”

同时按下ctrl+c退出编辑模式

按下shift+: 输入wq 退出 crontab

附:crontab规则详细实例

1、每天6:00执行

0 6 * * * root /home/cunlz.org/cunlz.sh

2、每周六凌晨4:00执行

0 4 * * 6 root /home/cunlz.org/cunlz.sh

3、每周六凌晨4:25执行

25 4 * * 6 root /home/cunlz.org/cunlz.sh

4、每周一到周五的11:41开始,每隔10分钟执行一次

41,51 11 * * 1-5   root /home/cunlz.org/cunlz.sh
1-59/10 12-23 * * 1-5   root /cunlz.org/cunlz.sh

5、在每天的10:31开始,每隔2小时重复一次

31 10-23/2 * * * root   /cunlz.org/cunlz.sh

6、每天15:00执行

0 15 * * *  root /home/cunlz.org/cunlz.sh

linux 防御SYN攻击

一、默认syn配置

sysctl -a | grep _syn
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syn_retries = 5

tcp_max_syn_backlog 是SYN队列的长度,加大SYN队列长度可以容纳更多等待连接的网络连接数。 tcp_syncookies是一个开关,是否打开SYN Cookie 功能,该功能可以防止部分SYN攻击。 tcp_synack_retries和tcp_syn_retries定义SYN 的重试连接次数,将默认的参数减小来控制SYN连接次数的尽量少。

二、修改syn配置

ulimit -HSn 65535
sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_synack_retries=2
sysctl -w net.ipv4.tcp_syn_retries=2

三、添加防火墙规则

#Syn 洪水攻击(--limit 1/s 限制syn并发数每秒1次)
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
#防端口扫描
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
#防洪水ping
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

四、添加开机启动

最后别忘记将二、三、里面的命令写到/etc/rc.d/rc.local

crontab 任务误删恢复

这是一篇简短的记录。

某台服务器某账号的 crontab 任务被清空,原因不明。同时,该服务器上的 crontab 任务备份未开启。故思考如何恢复 crontab 任务。

经查,CentOS 系统的 crontab 任务的日志,打印在 /var/log/cron 之中。考虑过滤日志:

cat /var/log/cron* | grep CMD | awk -F'CMD' '{print $2}' | awk -F'[(|)]' '{print $2}' | sort -u

由此得到系统记录过的 crontab 执行命令,过滤其他账号的命令后即可追回目标账号的 crontab 任务。

此外,考虑备份 crontab;脚本如下:

backup_crontab.sh

#!/usr/bin/env bash

BACKUP_DIRECTORY="${HOME}/crontab_backup"

if [ ! -e "${BACKUP_DIRECTORY}" ]; then
        mkdir -p ${BACKUP_DIRECTORY}
fi

crontab -l > ${BACKUP_DIRECTORY}/$(date '+%Y%m%d').txt