Nginx完整学习笔记(CentOS 7)

系统准备

Nginx安装

Read More

CentOS 6 上 Zabbix 3.x安装

安装可通过更新Yum源或通过源码进行安装,这里选择源码安装

访问http://www.zabbix.com/download页面下载最新版的源码安装包,当前最新版本为3.2.6

# 添加用户
groupadd zabbix
useradd -g zabbix zabbix
# 下载安装包
wget http://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/3.2.6/zabbix-3.2.6.tar.gz
tar -xzvf zabbix-3.2.6.tar.gz 
cd zabbix-3.2.6
./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2
# 报错
configure: error: Invalid Net-SNMP directory - unable to find net-snmp-config
#安装
yum install net-snmp-devel -y

没有问题就会出现如下提示

Zabbix安装

# 编译安装
make install
# 拷贝web文件
cp -R frontends/php/ /var/www/zabbix
# 启动服务端
zabbix_server
# 启动客户端
zabbix_agentd

Apache的配置这里略过,接下来需要进行数据库的安装
数据库安装

create database zabbix;
# 可单独为该数据库创建用户,此处略过

回到刚刚的安装目录,可以在database/mysql下看到以下三个sql文件
data.sql
images.sql
schema.sql

# 导入数据
mysql -uroot -p zabbix < database/mysql/schema.sql 
mysql -uroot -p zabbix < database/mysql/images.sql
mysql -uroot -p zabbix < database/mysql/data.sql 

在浏览器中访问配置的域名,按步骤来完成安装
Zabbix安装初始页面Zabbix安装检测页面

出现如上报错,处理方法如下:

vi /etc/php.ini
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = Asia/Shanghai
# 执行 yum list | grep bcmath 查找对应的名称并执行yum安装,如
yum install php-bcmath

接下来进行数据库及相关配置,不再赘述,安装后默认的用户名密码分别为admin和zabbix,在生产环境下请记得修改

Zabbix仪表盘

Zabbix Agent安装

rpm -Uvh http://repo.zabbix.com/zabbix/3.2/rhel/6/x86_64/zabbix-release-3.2-1.el6.noarch.rpm
# rpm -Uvh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
yum -y install zabbix zabbix-agent
# 配置文件
vi /etc/zabbix/zabbix_agentd.conf
#Server=[zabbix server ip]
#Hostname=[ Hostname of client system ]
#启动服务
/etc/init.d/zabbix-agent start
# systemctl start zabbix-agent #CentOS 7
# 设置开机自启动
chkconfig zabbix-agent on
# systemctl enable zabbix-agent

Ubuntu 14.04

wget http://repo.zabbix.com/zabbix/3.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.2-1+trusty_all.deb
sudo dpkg -i zabbix-release_3.2-1+trusty_all.deb
sudo apt-get update
sudo apt-get install zabbix-agent
# 配置文件
vi /etc/zabbix/zabbix_agentd.conf
#Server=[zabbix server ip]
#Hostname=[ Hostname of client system ]
#启动服务
/etc/init.d/zabbix-agent start

Windows Server
http://www.zabbix.com/download下载监控客户端
解压bin下分别放着32位和64位的安装包,conf下放着配置文件,将这两个文件拷贝到C盘的zabbix目录下,修改conf中如下内容

EnableRemoteCommands=1           #允许在本地执行远程命令
LogRemoteCommands=1              #执行远程命令是否保存操作日志
Server = x.x.x.x              #填写zabbix服务器IP地址
Hostname=wintest01               #zabbix_agent客户端计算机名 (被监控主机)

在命令行中执行

C:\zabbix\zabbix_agentd.exe -i -c C:\zabbix\zabbix_agentd.win.conf               #安装zabbix客户端
#正常安装会提示service [Zabbix Agent] installed successfully
C:\ zabbix\ zabbix_agentd.exe -s -c C:\zabbix\zabbix_agentd.win.conf             #启动zabbix服务
#正常启动会提示service [Zabbix Agent] started successfully

注意:要在防火墙中开启10050端口的访问

 

Linux:使用lnav查看日志

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

Linux:使用lnav查看日志

安装方法:

Read More

通过CentOS 7从零开始学习Linux及常见问题

本文将通过CentOS 7来学习Linux的以下常用知识:

  • Linux网络设置
  • SSH常用配置和使用方法
  • Linux常用服务
    • Crontab定时任务
    • NTP时间同步
    • Logrotate日志切割
    • Supervisor进程管理
  • Linux常用命令
  • Linux中的防火墙配置方法
  • 使用Apache配置Web服务器
  • 使用Nginx配置Web服务器
  • MySQL的安装及常用操作
  • Linux中的常见问题
  • Memcached和Redis缓存
  • Git的配置和使用
  • PHP安装及配置
    • Lavarel的安装及配置
    • Yii的安装及配置
    • ThinkPHP的安装及配置
    • phpMyAdmin的安装及配置
    • phpRedisAdmin的安装及配置
  • Java环境搭建
    • Tomcat搭建和启用
    • Maven使用示例
  • Python运行环境配置
  • Zabbix监控系统安装配置
  • VirtualBox 设置共享文件夹

CentOS 7目录结构

Read More

Ubuntu常见问题

关闭防火墙

更新安装源

#安装源地址:http://www.cnblogs.com/ccdc/p/4428555.html
sudo vi /etc/apt/sources.list
cd /etc/apt/
sudo apt-get update
sudo apt-get dist-upgrade

小技巧

vi下sp, vsp打开新文件进行水平或垂直分屏显示

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优化项内容基础上进行整理