Linux:使用lnav查看日志

通常我们会使用tail -f, more, cat等指令来查看日志文件,今天推荐一款lnav,它具有直接查看压缩文件,高亮显示等优异的功能

Linux:使用lnav查看日志

安装方法:

Read More

Linux小脚本片断

1.在进行服务器优化时要精简开机启动的服务,只需保留必要的几个,如crond, network, rsyslog, sshd这几个服务:

脚本一、

LANG=en
#关闭所有处于on状态的服务
for var in <code>chkconfig --list|grep &quot;3:on&quot;|awk {'print $1'}</code>; do chkconfig --level 3 $var off;done
#启动crond network rsyslog sshd
for var in crond network rsyslog sshd;do chkconfig --level 3 $var on;done

脚本二、

for var in <code>chkconfig --list|grep &quot;3:on&quot;|awk '{print $1}'|grep -vE &quot;crond|network|sshd|rsyslog&quot;</code>;do chkconfig --level 3 $var off;done

2.通常在生产环境会关闭SElinux:

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 
#以上命令重启才会生交,可采用以下命令临时先改成Permissive(通过getenforce查看)
setenforce 0

3.DDoS相关

//查看已经建立连接的
netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r 
//查看发送了SYN包的
netstat -na|grep SYN|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r 

4.开机主引导记录MBR备份

dd if=/dev/sda of=mbr.bin bs=512 count=1
#查看方法
od -xa mbr.bin

网站一键配置

OpenVPN学习笔记

SSL VPN开源软件:OpenVPN(使用OpenSSL协议)
IPSEC VPN开源软件:OpenSwan

PPTP, L2TP, IPSEC, SSH, LVS, TUN(ipip)

OpenVPN实现方案图解

跨机房、跨办公室IPSEC/VPN实现方案图

安装步骤

配置VPN服务器时间同步

为了让VPN连接不会失败,应确保服务器之间时间上的同步

#手动执行
/usr/sbin/ntpdate pool.ntp.org (ntpdate未安装请自行安装)
#设置定时任务自动执行
echo '#sync time' >> /var/spool/cron/root
echo '*/5 * * * * /usr/sbin/ntpdate pool.ntp.org > /dev/null 2>&1' >> /var/spool/cron/root

定时任务可能过crontab -l进行查看

部署安装OpenVPN服务器

#按照个人习惯创建一个软件目录
mkdir -p /home/alan/openvpn
cd /home/alan/openvpn/
#安装lzo压缩模块
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz
tar zxf lzo-2.06.tar.gz
cd lzo-2.06
./configure
make
make install
cd ../
#安装OpenSSL
yum install openssl* -y
#安装OpenVPN 官方下载地址http://www.openvpn.net/release/openvpn-2.2.2.tar.gz
wget http://swupdate.openvpn.org/community/releases/openvpn-2.2.2.tar.gz
tar zxf openvpn-2.2.2.tar.gz
cd openvpn-2.2.2
./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib
make
make install
cd ../

注:想要确定指定是否正确执行,输入echo $?看是否返回0即可

执行 which openvpn,返回如下表示OpenVPN安装成功

/usr/local/sbin/openvpn

常见问题

1.configure: error: OpenSSL Crypto headers not found.
这时由于OpenVPN依赖于OpenSSL,应执行yum install openssl* -y安装OpenSSL完整包

route
tcpdump

Python自动化运维学习笔记

Python基础

# 导入模块
import math
# 导入模块中的某些函数
from math import pow, sin
# 如cStringIO不存在则导入StringIO模块
try:
    from cStringIO import StringIO
except ImportError:
    from StringIO import StringIO
# 试用新版本新特性
from __future__ import ...
# 安装第三方模块
pip install ...

# -*- coding:utf-8 -*-

# Python类的继承
Class SubClass(ParentClassName):
	def __init__(self, args):
		super(SubClass, self).__init__(args)

*args, **kw
装饰器
@classmethod

文件处理

f = open('file.txt', 'r') //写w,追加a 或者用f = open('file.txt', 'r')
c = f.read() //写f.write('....'),读取一行f.readline(),f.tell()查看指针,f.seek(n)指针指向第n位如f.seek(0)
c = split('\n')[n] //读取第n行数据,另一种方法c = f.readlines()然后调用c[n],大文件用xreadlines()
f.close() //关闭文件
f.flush()

Python DB API

https://www.python.org/dev/peps/pep-0249/

MySQL Connector: https://sourceforge.net/projects/mysql-python/
Mac:

brew install mysql-connector-c
pip install mysql-python #Python 3.5使用pip install PyMySQL

运维常用命令

ps, top, lsof, netstat, ifconfig, who, df, kill, free, nice, ionice, iostat, iotop, uptime, pidof, tty, taskset, pmap

psutil

#『安装方法』
wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz --no-check-certificate
tar -xzvf  psutil-2.0.0.tar.gz 
cd psutil-2.0.0
python setup.py install

技巧一:建议安装方法

技巧二:配置Tab方便Python命令行中的操作

参见Python基础知识及常见问题 部分

Shell下查看已使用内存和总内存的方法

IPy

 

SVN学习笔记

安装

yum -y install subversion

通过rpm -qa subversion可确认是否已安装
小帖士:如需保留yum安装包的话只需修改/etc/yum.conf中的keepcache的值即可

#修改
sed -i 's#keepcache=1#keepcache=0#g' /etc/yum.conf
#查看
grep keepcache /etc/yum.conf

配置并启动

创建两个目录,分别用于存储数据和用户、密码

mkdir -p /application/svndata
mkdir -p / application/svnpasswd

使用svnserve来启动SVN服务,相关参数可通过svnserve –help来查看用途

svnserve -d -r /application/svndata/
#查看服务是否启动
ps -ef | grep svn
#通过端口方式来查看服务是否启动
netstat -lnpt | grep 3690
#或者(CentOS 6默认未安装)
lsof -i :3690

svn-netstat

创建版本库

创建版本库使用命令svnadmin

svnadmin create /application/svndata/sadoc

通过tree /application/svndata可以查看到版本库基本的目录结构

/application/svndata/
└── sadoc
    ├── conf
    │   ├── authz
    │   ├── passwd
    │   └── svnserve.conf
    ├── db
    │   ├── current
    │   ├── format
    │   ├── fsfs.conf
    │   ├── fs-type
    │   ├── min-unpacked-rev
    │   ├── rep-cache.db
    │   ├── revprops
    │   │   └── 0
    │   │       └── 0
    │   ├── revs
    │   │   └── 0
    │   │       └── 0
    │   ├── transactions
    │   ├── txn-current
    │   ├── txn-current-lock
    │   ├── txn-protorevs
    │   ├── uuid
    │   └── write-lock
    ├── format
    ├── hooks
    │   ├── post-commit.tmpl
    │   ├── post-lock.tmpl
    │   ├── post-revprop-change.tmpl
    │   ├── post-unlock.tmpl
    │   ├── pre-commit.tmpl
    │   ├── pre-lock.tmpl
    │   ├── pre-revprop-change.tmpl
    │   ├── pre-unlock.tmpl
    │   └── start-commit.tmpl
    ├── locks
    │   ├── db.lock
    │   └── db-logs.lock
    └── README.txt

修改配置文件conf/svnserve.conf(别忘了先做好备份哦)

#修改第12,13行
anon-access = none
auth-access = write
#第20行
password-db = /application/svpasswd/passwd
#第27行
authz-db = /application/svnpasswd/authz

通过diff指令对比备份文件可查看修改的内容

diff svnserve.conf.bak svnserve.conf
12,13c12,13
< # anon-access = read
< # auth-access = write --- > anon-access = none
> auth-access = write
20c20
< # password-db = passwd --- > password-db = /application/svnpasswd/passwd
27c27
< # authz-db = authz --- > authz-db = /application/svnpasswd/authz

修改完配置文件需重启SVN使配置文件生效

pkill svnserve
svnserve -d -r /application/svndata/

使用了pid file的话可以通过如下方法重启

kill -USR1 <code>cat /application/svndata/svn.pid</code>
svnserve -d -r /application/svndata --pid-file=/application/svndata/svn.pid

接下来将conf文件夹下的passwd和authz文件拷贝到/application/svnpasswd目录下

cp passwd authz /application/svnpasswd/

注:为保持安全性可将拷贝到/application/svnpasswd/下的这两个文件设置700的权限

在passwd中配置用户名和密码,按照 user = password一行一个用户的方式添加即可
然后在authz文件中定义组设置权限:
基本格式

[<版本库>:/项目/目录]
@<用户组名> = 权限
<用户名> = 权限

#定义组-[groups]下面
sagroup = alan, david
[sadoc:/]
@sagroup = r
alan = rw

接下来就需要在本地下载SVN客户端,Windows下一般用TortoiseSVN (常用操作有SVN Update(首次为Checkout)和SVN Commit,缺省目录%APPDATA%\Subversion\auth)

Linux下客户端的操作方法

svn co svn://*.*.*.*/sadoc /local/dir/ --username=alan --password=...
svn add filename
snv ci -m "description..."
svn import /local/dir/ svn://*.*.*.*/sadoc -m "description..."

Linux下修改SVN IP地址(通过svn info可查看详细信息)

svn switch --relocate 原svn地址 新svn地址

SVN下可能过钩子来在提交前、提交后进行一些操作,默认在hooks文件夹下有如下模板,去除后面的.tmpl即可使用
post-commit.tmpl
post-lock.tmpl
post-revprop-change.tmpl
post-unlock.tmpl
pre-commit.tmpl
pre-lock.tmpl
pre-revprop-change.tmpl
pre-unlock.tmpl
start-commit.tmpl

注:从Windows上传的文件转换文本格式用dos2unix指令,钩子文件要加执行权限

以下是一个通过钩子来传送文件的简单示例

REPOS="$1"
REV="$2"
#encoding
export LC_CTYPE="en_US.UTF-8"
export LC_ALL=
#log pth
LOGPATH-"/app/log"
[ ! -d ${LOGPATH} ] && mkdir ${LOGPATH} -p
#update content with svn
SVN update --username alan -- password alanhou /data/www

if [ $? -eq 0 ]
        then
        /usr/bin/rsync -az --delete /data/www /tmp/
fi

其它:

branch, tag, trunk

svnlook

线上更新代码:先上传到临时目录,再执行mv或者使用ln软链接

Jira, Mantis

互联网大型企业代码上线发布架构方案

Linux CentOS内核、I/O优化

资源限制/etc/security/limits.conf

* soft nofile 65535
* hard nofile 65535
* 表示对所有用户有效
soft 指的是当前系统生效的设置
hard 表明系统中所能设定的最大值
nofile 表示所限制的资源是打开文件的最大数目
65535 就是限制的数量

磁盘调度策略

查看IO调度方法
cat /sys/block/devname/queue/scheduler #devname为设备名,如sda等
noop anticipatory deadline [cfq]
noop(No operation电梯式调度策略)
noop实现了一个FIFO队列,它像电梯的工作方法一样对I/O请求进行组织,当有一个新的请求合并到最近的请求之后,以此来保证请求同一介质。NOOP倾向饿死读而利于写,因此noop对于闪存设备、RAM及嵌入式系统是最好的选择。
deadline(截止时间调度策略)
Deadline确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限。这样就防止了写操作因为不能被读取而饿死的现象,deadline对数据库类应用是最好的选择。
anticipatory(AS, 预料I/O调度策略)
本质上与deadline一样,但在最后一次读操作后,要等待6ms,才能继续进行对其它I/O请求进行调度。它会在每个6ms中插入新的I/O操作,而会将一些小写入流合并成一个大写入流,用写入延时换取最大 的写入吞吐量。AS适合于写入较多的环境,比如文件服务器,AS对数据库环境表现很差。
CFQ(Complete Fairness Queueing完全公平排队I/O调度程序)

修改方法: 如 echo deadline > /sys/block/sda/queue/scheduler

文件系统对性能的影响

ext3/ext4系统的挂载参数:/etc/fstab
日志记录方式:data = writeback | ordered | journal
writeback 获得更好的写入性能
ordered 提供性能和防护之间的最佳平衡
noatime, nodiratime 禁止记录文件/目录最近一次访问时间戳以提高系统性能
如在/etc/fstab中加入(ext4系统)

/dev/sda1	/	ext4	noatime,nodiratime,data=writeback 1 1

内核配置 /etc/sysctl.conf

net.core.somaxconn = 262144   用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制
net.core.netdev_max_backlog = 30000  每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.ipv4.tcp_max_syn_backlog = 262144   表示那些尚未收到客户端确认信息的连接(SYN消息)队列的长度,默认为1024,加大队列长度为262144,可以容纳更多等待连接的网络连接数。

 

net.ipv4.tcp_fin_timeout = 10    如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒
net.ipv4.tcp_tw_recycle = 1   开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1    表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接。
net.core.rmem_default = 8388608    接收套接字缓冲区大小的默认值(以字节为单位)
net.core.rmem_max=16777216    接收套接字缓冲区大小的最大值(以字节为单位)
net.core.wmem_default = 8388608    发送套接字缓冲区大小的默认值(以字节为单位)
net.core.wmem_max=16777216    发送套接字缓冲区大小的最大值(以字节为单位)

 

net.ipv4.tcp_keepalive_time = 1200   当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟
net.ipv4.tcp_keepalive_intvl =30 当探测没有确认时,重新发送探测的频度。
net.ipv4.tcp_keepalive_probes =3 在认定连接失效之前,发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以tcp_keepalive_intvl之后决定了,一个连接发送了keepalive之后可以有多少时间没有回应。

 

kernel.shmmax = 4294967295 Linux内核参数中最重要的参数之一,用于定义单个共享内存段的最大值
1.这个参数应该设置的足够大,以便能在一个共享内存段下容纳下整个的Innodb缓冲池的大小。
2.这个值的大小对于64位Linux系统,可取的最大值为物理内存值-1byte,建议值为大于物理内存的一半,一般取值大于Innodb缓冲池的大小即可,可以取物理内存-1byte。
vm.swappiness = 0  内存交换分区,这个参数当内存不足时会对性能产生比较明显的影响。设为0告诉Linux内核除非虚拟内存完全满了,否则不要使用交换分区。
net.ipv4.ip_local_port_range = 1024 65536    用于向外连接的端口范围
net.ipv4.tcp_mem = 786432 1048576 1572864    确定 TCP 栈应该如何反映内存使用,此处分别为3G、4G、6G;每个值的单位都是内存页(通常是 4KB)。第一个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。
net.ipv4.tcp_rmem=4096 87380 16777216    TCP接收缓冲区,3个字段分别是min,default,max。Min:为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下TCP socket都至少会有这么多数量的内存用于接收缓冲。
Default: 为TCP socket预留用于接收缓冲的内存数量,默认情况下该值影响其它协议使用的 net.core.wmem中default的值。该值决定了 在tcp_adv_win_scale、tcp_app_win和tcp_app_win的 默认值情况下,TCP 窗口大小为65535。
Max:为TCP socket预留用于接收缓冲的内存最大值。该值不会影响 net.core.wmem中max的值
net.ipv4.tcp_wmem=4096 65536 16777216    TCP发送缓冲区,3个字段分别是min,default,max。Min:为TCP socket预留用于发送缓冲的内存最小值。每个TCP socket都可以使用它。
Default:为TCP socket预留用于发送缓冲的内存数量,默认情况下该值会影响其它协议使用的net.core.wmem中default的 值,一般要低于net.core.wmem中default的值。
Max:为TCP socket预留用于发送缓冲的内存最大值。该值不会影响net.core.wmem_max

net.ipv4.tcp_max_tw_buckets = 6000    系统在同时所处理的最大timewait sockets 数目。如果超过此数的话,time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制,纯粹为了抵御那些简单的 DoS 攻击,千万不要人为的降低这个限制,不过,如果网络条件需要比默认值更多,则可以提高它(或许还要增加内存)
net.ipv4.tcp_timestamps = 0   时间戳可以避免序列号的卷绕。一个1Gbps 的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
net.ipv4.tcp_window_scaling = 1   支持更大的TCP窗口. 如果TCP窗口最大超过65535(64KB), 必须设置该数值为1。
net.ipv4.tcp_sack = 1    表示是否启用有选择的应答(Selective Acknowledgment),这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用
net.ipv4.tcp_no_metrics_save=1    默认情况下一个tcp连接关闭后,把这个连接曾经有的参数比如慢启动门限snd_sthresh,拥塞窗口snd_cwnd 还有srtt等信息保存到dst_entry中, 只要dst_entry 没有失效,下次新建立相同连接的时候就可以使用保存的参数来初始化这个连接.通常情况下是关闭的。
net.ipv4.tcp_syncookies = 1  当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_max_orphans = 262144    系统中最多有多少个TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。

net.ipv4.tcp_synack_retries = 2    为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量。
net.ipv4.tcp_syn_retries = 2    在内核放弃建立连接之前发送SYN 包的数量

web服务器收到了大量的连接,在启用了iptables的情况下,iptables会把所有的连接都做链接跟踪处理,这样iptables就会有一个链接跟踪表
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=1800   链接跟踪表保存时间,单位:秒
net.ipv4.netfilter.ip_conntrack_max=131070   链接跟踪表最大数目

kernel.sysrq = 0    允许按住Alt + PrtSc键打印内核信息,除非是调试,一般要关闭此功能
kernel.core_uses_pid = 1    控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core
kernel.msgmnb = 65536    每个消息队列的最大字节限制。
kernel.msgmax = 65536    从一个进程发送到另一个进程的消息的最大长度(bytes)。进程间的消息传递是在内核的内存中进行的,不会交换到磁盘上,所以如果增加该值,则将增加操作系统所使用的内存数量。

kernel.shmall = 4294967296    系统上可以使用的共享内存的总量(bytes)
kernel.randomize_va_space = 1    将该值设置为 0 可禁用地址空间布局随机化。DB2 数据服务器依赖特定共享内存对象的固定地址,地址空间布局随机化会导致有些活动发生错误
net.ipv4.ip_forward = 0    0表示禁用 IPv4 包转送
net.ipv4.neigh.default.gc_stale_time=120    ARP参数,检查一次相邻层记录的有效性的周期。当相邻层记录失效时,将在给它发送数据前,再解析一次。缺省值是60秒。
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2

以下命令使内核参数生效:
/sbin/sysctl -p 生效

/sbin/sysctl -a | grep net.core.netdev_max_backlog 查看

完整的参数列表:

net.core.netdev_max_backlog = 30000
net.core.somaxconn = 262144
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.ip_local_port_range = 1024 65536
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_no_metrics_save=1
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=1800
net.ipv4.netfilter.ip_conntrack_max=131070

kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.randomize_va_space = 1
kernel.exec-shield = 1
net.ipv4.ip_forward = 0
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2

如果出现error: “net.ipv4.netfilter.ip_conntrack_max” is an unknown key

执行下面的命令加载对应模块:

modprobe ip_conntrack
lsmod |grep conn — if you see entries it means modules have been loaded correctly
sysctl -w — to write the changes you made under /etc/sysctl.conf
sysctl -p — to view the changes and see if it was actually loaded.

还不行,把net.ipv4.netfilter.ip_conntrack_max替换为:

net.nf_conntrack_max = 131070试试看
除了调整内核参数,还需 调整文件数:

linux系统优化完网络必须调高系统允许打开的文件数才能支持大的并发,默认1024是远远不够的。
查看进程占用的文件句柄数; lsof -n |awk ‘{print $2}’|sort|uniq -c |sort -nr|more       其中第一行是打开的文件句柄数量,第二行是进程号

执行Shell命令:
echo ulimit -HSn 65536 >> /etc/rc.local
echo ulimit -HSn 65536 >>/root/.bash_profile

ulimit -HSn 65536

如果要sudo执行时,使用:sudo sh -c “ulimit -HSn 65536 && exec su $LOGNAME”

-H 设置硬资源限制.
-S 设置软资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes
-u <程序数目>  用户最多可开启的程序数目
Windows:
打开注册表编辑器,在运行栏输入:regedit
第一步:启动注册表编辑器HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
第二步:新建
值名称:MaxUserPort
值类型: DWORD
值数据: 65534(用十进制的方法写进去就可以)
有效范围: 5000 – 65534 (十进制)
默认: 0x1388 5000 (十进制)
第三步:新建
值名称:TCPTimedWaitDelay
值类型: DWORD
值数据: 0000001e(也就是30,这个表示TIME_WAIT的秒数)

重启电脑

本文在Linux和windows下内核socket优化项内容基础上进行整理

MariaDB内存溢出导致服务自动停止

最近公司一个网站一个月内出现过几次网站无法访问的问题,都是数据库的问题

Error establishing a database connection

这个网站是构建在CentOS 7上的Wordpress,这本身并没有问题。数据库使用的是默认的MariaDB,查看状态处于停止状态,启动服务则可正常访问。查看历史记录并没有对数据库服务被误停止这样的操作。

而通过journalctl -u mariadb发现了问题

May 23 22:35:38 iZ23l4d00udZ mysqld_safe[9510]: /usr/bin/mysqld_safe: line 183:  9827 Killed                  nohup /usr/libexec/mysqld --basedir=/usr --datadi
May 23 22:35:40 iZ23l4d00udZ mysqld_safe[9510]: 160523 22:35:40 mysqld_safe Number of processes running now: 0
May 23 22:35:40 iZ23l4d00udZ mysqld_safe[9510]: 160523 22:35:40 mysqld_safe mysqld restarted
May 23 22:35:50 iZ23l4d00udZ mysqld_safe[9510]: 160523 22:35:50 mysqld_safe mysqld from pid file /var/lib/mysql/iZ23l4d00udZ.pid ended
May 24 10:29:56 iZ23l4d00udZ systemd[1]: Starting MariaDB database server...
May 24 10:29:56 iZ23l4d00udZ mysqld_safe[9150]: 160524 10:29:56 mysqld_safe Logging to '/var/lib/mysql/iZ23l4d00udZ.err'.
May 24 10:29:56 iZ23l4d00udZ mysqld_safe[9150]: 160524 10:29:56 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
May 24 10:29:59 iZ23l4d00udZ systemd[1]: Started MariaDB database server.

很明显错误日志写入了/var/lib/mysql/iZ23l4d00udZ.err文件,进一步查看

160523 22:35:42 [ERROR] Plugin 'InnoDB' init function returned error.
160523 22:35:42 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
160523 22:35:42 [ERROR] mysqld: Out of memory (Needed 128917504 bytes)
160523 22:35:42 [ERROR] mysqld: Out of memory (Needed 96681984 bytes)
160523 22:35:42 [ERROR] mysqld: Out of memory (Needed 72499200 bytes)
160523 22:35:43 [Note] Plugin 'FEEDBACK' is disabled.
160523 22:35:48 [ERROR] Unknown/unsupported storage engine: InnoDB
160523 22:35:49 [ERROR] Aborting

160523 22:35:50 [Note] /usr/libexec/mysqld: Shutdown complete

160523 22:35:50 mysqld_safe mysqld from pid file /var/lib/mysql/iZ23l4d00udZ.pid ended

可以看出服务由于内存溢出(Out of memory,简称OOM)而被关闭,这可能与配置文件中innodb_buffer_pool_size的配置以及内存本身占用都存在着关系。

Alan目前还没有好的解决方案,所以暂时在crontab中添加了一段每分钟对服务状态进行检查,若出现问题则重新启动数据库服务

* * * * * systemctl status mariadb.service || systemctl start mariadb.service

阿里云ECS Linux服务器如何实现挂载

阿里云上购买服务器可在系统盘之外添加数据盘,但Linux不像Windows那样可以在后台直接挂载,而是需要手动执行挂载操作:

第一、检查阿里云服务器数据盘情况

利用fdisk -l命令,检查当前VPS的数据硬盘情况。

阿里云服务器挂载数据盘

这里我们可以看到有100GB数据盘没有挂载,肯定需要利用起来的。

第二、挂载阿里云数据硬盘

输入”fdisk /dev/xvdb“,然后根据下图的提示,输入n,p,1(Alan在挂载时显示为2-5,因此输入2),回车,回车,wq,保存退出。

阿里云服务器数据盘挂载

完毕之后,我们在输入fdisk -l,已经可以看到数据盘100GB已经被分区。

第三、格式化分区及挂载目录

A – 格式化挂载数据硬盘分区

mkfs.ext3 /dev/xvdb1

B – 创建目录挂载

如果我们安装的是LNMP/AMH一键包,那默认是在HOME目录下;如果是安装WDCP面板,那需要安装在WWW目录下,我们需要先检查是否有对应的目录,没有需要mkdir创建目录。(Alan操作时对应盘为/dev/xvdb2)

echo '/dev/xvdb1  /home ext3    defaults    0  0' >> /etc/fstab

对应上面的home目录是我们确定的路径(请务必在挂载前备份好home目录中的内容),如果是WWW那就需要更换。

第四、执行mount -a挂载

输入mount -a命令,直接挂载,然后df -h检查看看是否成功。

阿里云服务器挂载成功

这样,我们可以看到阿里云服务器ECS已经挂载完毕,我们可以放心的对安装环境包。

fdisk参数详解:

a Toggles a flag indicating if the partition is bootable
b Edits the disklabel used by BSD Unix systems
c Toggles the DOS compatibility flag
d Deletes the partition
l Lists the available partition types
m Displays the command options
n Adds a new partition
o Creates a DOS partition table
p Displays the current partition table
q Quits without saving changes
s Creates a new disklabel for Sun Unix systems
t Changes the partition system ID
u Changes the storage units used
v Verifies the partition table
w Writes the partition table to the disk
x Advanced functions

参考链接:http://www.laozuo.org/5080.html

Linux Shell脚本相关知识

一、Vim相关

vim的配置文件/etc/vimrc

常用设置:

syntax on    高亮显示(syntax off)

set number 添加行号(set nonumber)

set autoindent 自动缩进(也可以是更严格的set cindent)

二、Shell相关

shell文件前通常加入#!/bin/bash,echo -n在输出时不换行

1.Shell命令路径环境变量设置文件

全局:

/etc/profile
/etc/profile.d/*
/etc/bashrc

个人:
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile

在命令行输入set可查看所有的环境变量

定义变量如var1=value1,等号两边不可以加空格,变量名为20个字符以内的数字、字母和下划线组成

相用另一个语句的输出值有两种方式,如:

var1=<code>date</code>
var2=$(date)

stdin输入(<,<<)、stdout输出(>,>>) 关闭>输出set -C,开启set +C或使用>|

stderr错误输出 2>, 2>>

不论正确或错误均输出到文件中 > filename 2> &1 或直接使用 &>

管道命令 |

数学运算:

expr 5 + 4
expr 5 \* 4 #*同时是通配符,需转义

赋值时还可以使用

var1=$[5 * 4] #此处无需转义

Shell运算原生通常仅支持整数,对浮点数的支持存在问题,如需shell处理小数,可以尝试z shell(zsh)

假如不使用z shell,也可以使用管道命令加bc来进行浮点数的计算(如若系统未内置bc请自行安装),如

var1=$(echo "scale=4; 3.44 / 5" | bc) #scale用于设定精确到几位小数

使用bc可还可以用行内赋值的方法,其中EOF为自定义开始结束符,中间包含计算的语句

 variable=$(bc <<EOF
 options
 statements
 expressions
 EOF
 )

shell中可在最后加上echo $?返回执行状态,如0为Successful completion of the command,127为Command not found,也可通过exit指令指定返回码,但是请注意返回码不能超过255

VAR1=${VAR2:-word}如果VAR2变量有值则赋值为VAR2,否则赋值为word,其中的冒号可省略

2.命令行输出带颜色文字

echo -e "\e[1;31m hello \e[33m"

\e为开始和结束,1;表示加粗显示(不加粗可改为0;或直接不写),31m为输出文字颜色,33m为结束输出颜色,m前的数字变化表示不同的颜色,如0m为黑色(不写后面\e这段可以使用$(tput sgr0),有重置终端颜色的作用),如上面的命令执行效果如下:

Shell脚本加粗和彩色显示

3.关联数组申明和赋值

declare -A array
array[index]=…

4.结构化语句
if-then

if command1
then
  commands
elif command2
then
  commands
else
  commands
fi

if command也可以使用if test command或if [ command ]

在shell中作比较可使用eq, ge, gt, le, lt, ne来判断是否等于、大于等于等等,如n1 -lt n2,若n1小于等于n2则返回true

而进行数值比较和运算时通常会使用两个小括号,如if (( val1 ** 2 > val2 )),这里的** 2表示2次方;而进行字符比较或匹配时可使用两个中括号,if [[ $USER == r* ]]
case语句

case variable in
pattern1 | pattern2) commands1;; 
pattern3) commands2;;
*) default commands;;
esac

for语句

for var in list 
do
	commands
done

for语句中的list通常以空格来进行分隔,实际应用中可以通过双引号来标识带空格的词组为一个单元。通过在代码中设置IFS也可暂时更改分隔符,如

IFS=$'\n'

for循环还可以接受for (( a = 1; a < 10; a++ ))这种类似于其它编程语言的格式
while语句

while test command 
do
      other commands
done

until语句

until test commands 
do
        other commands
done

文件目录判断语句

-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
-O filename 如果是文件的所有者,则为真
-G filename 如果与文件同属一个组,则为真
filename1 -nt filename2 如果 filename1比 filename2新,则为真
filename1 -ot filename2 如果 filename1比 filename2旧,则为真

 

脚本名称叫test.sh 入参三个: 1 2 3
运行test.sh 1 2 3后
$*为”1 2 3″(一起被引号包住)
$@为”1″ “2” “3”(分别被包住)
$#为3(参数数量)

Nginx基础知识和常见问题

Nginx的基本支持

yum -y install gcc gcc-c++ autoconf automake

Nginx的常用组件

yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel

安装Nginx

到官网http://nginx.org/下载最新的稳定版本(如nginx-1.10.0),上传到服务器

tar -xzvf nginx-1.10.0.tar.gz && cd nginx-1.10.0
./configure
make
sudo make install

常见问题一、make时出现如下报错:
make: *** No rule to make target build', needed by default’. Stop.
请安装本文开始处的组件(openssl openssl-devel pcre pcre-devel),然后执行
make clean
./configure
此时再执行make就恢复正常了

configue时可以添加参数来修改安装路径等相关内容,可执行./configure –help来查看所有选项。安装的默认目录为/usr/local/nginx/

Nginx的主配置文件为nginx.conf,以下为从网站摘抄的关于该配置文件的详细解释

#使用用户和用户组 user www www;
#user  nobody;
#指定工作进程数,一般根据cpu核数决定,如2核的值为2
worker_processes  2;
#指定错误日志路径,debug,info,notice,warn,error,crit
#crit级别最高,只记录非常严重的错误。
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
#指定文件描述符数量
#每个nginx进程打开文件描述符最大数目 配置要和系统的单进程打开文件数一
#致,linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应
#应该填写65535 nginx调度时分配请求到进程并不是那么的均衡,假如超过会返回502错误。我
#这里写的大一点
worker_rlimit_nofile 51200;
events {
    #使用的网络i/o模型,linux为epoll,FreeBSD为kqueue
    use epoll;
    #允许连接数
    worker_connections  51200;
}
http {
    #设定mime类型
    include       mime.types;
    default_type  application/octet-stream; 
    #设置使用的字符集
    charset  utf-8;
     #设定日志格式
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                  '$status $body_bytes_sent "$http_referer" '
#                  '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;
    #在一个文件描述符与另一个之间拷贝数据,
    #由于这个拷贝过程是在内核状态下完成,
    #sendfile()函数比read(2)和write(2)函数更加高效
    #后者需要从用户空间中传送文件。有时候会影响性能
sendfile        on;
#这个指令指定是否使用socket的TCP_NOPUSH(FreeBSD)或TCP_CORK(linux)选项,这个选项只在使用sendfile时有效。
    #设置这个选项的将导致nginx试图将它的HTTP应答头封装到一个包中。
    #tcp_nopush     on;     #参数的第一个值指定了客户端与服务器长连接的超时时间,超过这个时间,服务器将关闭连接。
    #参数的第二个值(可选)指定了应答头中Keep-Alive: timeout=time的time值,这个值可以使一些浏览器知道什么时候关闭连接,以便服务器不用重复关闭,如果不指定这个参数,nginx不会在应答头中发送Keep-Alive信息。(但这并不是指怎样将一个连接“Keep-Alive”)
    #参数的这两个值可以不相同。
    #keepalive_timeout  0 70;
    keepalive_timeout  65;
    #fastcgi用于php
    #这个参数指定将用多大的缓冲区来读取从FastCGI进程到来应答头。
#默认的缓冲区大小为fastcgi_buffers指令中的每块大小,可以将这个值设置更小。
    #fastcgi_buffer_size 64k;
    #fastcgi_buffers 4 64k;
    #指定是否启用gzip压缩。
    #gzip  on;
    #指定缓存压缩应答的缓冲区数量和大小
    #gzip_buffers 4 16K;
#指定压缩等级,其值从1到9,1为最小化压缩(处理速度快),9为最大化压缩(处理速度慢)。
    #gzip_comp_level 3;
    #使用正则表达式来指定某些不需要gzip压缩的浏览器(将和User-Agents进行匹配)。依赖于PCRE库
    #0.7.63版本以后,你可以为IE5.5和IE6 SP1使用msie6参数来禁止gzip压缩。
    #gzip_disable  "msie6";
    #设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
    #默认值是0,不管页面多大都压缩。
    #建议设置成大于1k的字节数,小于1k可能会越压越大。
    #gzip_min_length 1;
    #Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的 header头。
    #off - 关闭所有的代理结果数据的压缩
    #expired - 启用压缩,如果header头中包含 "Expires" 头信息
    #no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息
    #no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息
    #private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息
    #no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息
    #no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息
    #auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息
    #any - 无条件启用压缩
    #gzip_proxied
    #匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。
    #gzip_types  text/plain application/x-javascript text/css text/html application/xml;
    #启用应答头“Vary: Accept-Encoding”,注意,由于一个bug将导致IE 4-6无法缓存内容。
    #gzip_vary on;
    upstream  backend  {
     server   127.0.0.1:8080     weight=5     max_fails=3  fail_timeout=30s;
    }
    server {
listen       192.168.56.1:80;
        server_name  www.server110.com;
        #charset utf-8;
  log_format  test  '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
         
        #access_log  logs/host.access.log  test;
        location / {
     proxy_pass http://backend;
     proxy_redirect     off;
     #保留用户真实信息
proxy_set_header   Host             $host;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }
 location ~ .*.(gif|jpg|jpeg|png|bmp|swf|js|css)$
  {
   expires      30d;
  }
  #location ~ .(htm|html|asp|php|gif|jpg|jpeg|png|bmp|ico|rar|css|js|
  #zip|java|jar|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$ {
#    root /opt/webapp;
  #   expires 24h;
        #}
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
root   html;
        }
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ .php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ .php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /.ht {
        #    deny  all;
        #}
    }
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;     #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;     #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
    #    ssl_session_timeout  5m;
    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

如何获取Nginx的进程号(pid)?

通过以下命令可直接打印出进程号:

ps -ef | grep "nginx: master process" | grep -v "grep" | awk -F ' ' '{print $2}'

也可以通过nginx.conf配置文件中pid对应文件来查看

通过这个pid我们可以进行关闭进程等操作,如平滑变更Nginx配置可使用kill -HUP 1126(假定pid为1126)

开启Nginx Status

在/etc/nginx/conf.d/default.conf的server配置中加入

    location /nginx_status 
    {
        stub_status on;
        access_log off;
    }

重启nginx(service nginx restart)

在命令行中输入curl http://127.0.0.1/nginx_status会得到类似如下的结果

# curl http://127.0.0.1/nginx_status
Active connections: 2 
server accepts handled requests
 25 25 74 
Reading: 0 Writing: 2 Waiting: 0