
老男孩一枚
暂时未有相关通用技术能力~
阿里云技能认证
详细说明
我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
Linux安全之SYN攻击原理及处理 TCP自从1974年被发明出来之后,历经30多年发展,目前成为最重要的互联网基础协议,但TCP协议中也存在一些缺陷。 SYN攻击就是利用TCP协议的缺陷,来导致系统服务停止正常的响应。 SYN攻击原理 TCP在传递数据前需要经过三次握手,SYN攻击的原理就是向服务器发送SYN数据包,并伪造源IP地址。 服务器在收到SYN数据包时,会将连接加入backlog队列,并向源IP发送SYN-ACK数据包,并等待ACK数据包,以完成三次握手建立连接。 由于源IP地址是伪造的不存在主机IP,所以服务器无法收到ACK数据包,并会不断重发,同时backlog队列被不断被攻击的SYN连接占满,导致无法处理正常的连接。 SYN攻击处理 针对SYN攻击的几个环节,提出相应的处理方法: 方式1:减少SYN-ACK数据包的重发次数(默认是5次): sysctl -w net.ipv4.tcp_synack_retries=3 sysctl -w net.ipv4.tcp_syn_retries=3 方式2:使用SYN Cookie技术: sysctl -w net.ipv4.tcp_syncookies=1 方式3:增加backlog队列(默认是1024): sysctl -w net.ipv4.tcp_max_syn_backlog=2048 方式4:限制SYN并发数: iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT --limit 1/s SYN攻击模拟 可以用之前介绍的hping工具来模拟SYN攻击,参见《Linux常用网络工具:hping高级主机扫描》; 还有一款synkill也可以用来模拟SYN攻击。 使用DDoS deflate脚本自动屏蔽攻击ip DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本。它通过netstat监测跟踪创建大量网络连接的IP地址,在检测到某个结点超过预设的限制时,该程序会通过APF或IPTABLES禁止或阻挡这些IP.DDoS deflate其实是一个Shell脚本,使用netstat和iptables工具,对那些链接数过多的IP进行封锁,能有效防止通用的恶意扫描器,但它并不是真正有效的DDoS防御工具。 DDoS deflate工作过程描述:同一个IP链接到服务器的连接数到达设置的伐值后,所有超过伐值的IP将被屏蔽,同时把屏蔽的IP写入ignore.ip.list文件中,与此同时会在tmp中生成一个脚本文件,这个脚本文件马上被执行,但是一运行就遇到sleep预设的秒,当睡眠了这么多的时间后,解除被屏蔽的IP,同时把之前写入ignore.ip.list文件中的这个被封锁的IP删除,然后删除临时生成的文件。一个事实:如果被屏蔽的IP手工解屏蔽,那么如果这个IP继续产生攻击,那么脚本将不会再次屏蔽它(因为加入到了ignore.ip.list),直到在预设的时间之后才能起作用,加入到了ignore.ip.list中的IP是检测的时候忽略的IP。可以把IP写入到这个文件以避免这些IP被堵塞,已经堵塞了的IP也会加入到ignore.ip.list中,但堵塞了预定时间后会从它之中删除。 如何确认是否受到DDOS攻击?[root@test3-237 ~]# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n 1 Address 1 servers) 2 103.10.86.5 4 117.36.231.253 4 19.62.46.24 6 29.140.22.18 8 220.181.161.131 2911 167.215.42.88 每个IP几个、十几个或几十个连接数都还算比较正常,如果像上面成百上千肯定就不正常了。比如上面的167.215.42.88,这个ip的连接有2911个!这个看起来就很像是被攻击了! 下面就说下通过DDoS deflate脚本来自动屏蔽DDOS攻击的ip1)下载DDoS deflate安装脚本,并执行安装。[root@test3-237 ~]# wget http://www.inetbase.com/scripts/ddos/install.sh[root@test3-237 ~]# chmod 0700 install.sh[root@test3-237 ~]# ./install.sh --------------------------------------------------------------------------卸载DDos default的操作如下:# wget http://www.inetbase.com/scripts/ddos/uninstall.ddos# chmod 0700 uninstall.ddos# ./uninstall.ddos-------------------------------------------------------------------------- 2)配置DDoS deflate下面是DDoS deflate的默认配置位于/usr/local/ddos/ddos.conf ,内容如下:[root@test3-237 ~]# cat /usr/local/ddos/ddos.conf##### Paths of the script and other filesPROGDIR="/usr/local/ddos"PROG="/usr/local/ddos/ddos.sh"IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list" //IP地址白名单CRON="/etc/cron.d/ddos.cron" //定时执行程序APF="/etc/apf/apf"IPT="/sbin/iptables" ##### frequency in minutes for running the script##### Caution: Every time this setting is changed, run the script with --cron##### option so that the new frequency takes effectFREQ=1 //检查时间间隔,默认1分钟。设置检测时间间隔,默认是分钟,由于系统使用crontab功能,最小单位是分钟 ##### How many connections define a bad IP? Indicate that below.NO_OF_CONNECTIONS=150 //最大连接数,超过这个数IP就会被屏蔽,一般默认即可。默认是150,这是一个经验值,如果服务器性能比较高,可以设置200以上,以避免误杀 ##### APF_BAN=1 (Make sure your APF version is atleast 0.96)##### APF_BAN=0 (Uses iptables for banning ips instead of APF)APF_BAN=0 //使用APF还是iptables屏蔽IP。推荐使用iptables,将APF_BAN的值改为0即可。设置为1表示使用APF,如果使用APF则需要先安装,centos中默认就没有安装 ##### KILL=0 (Bad IPs are'nt banned, good for interactive execution of script)##### KILL=1 (Recommended setting)KILL=1 //是否屏蔽IP,默认即可 ##### An email is sent to the following address when an IP is banned.##### Blank would suppress sending of mailsEMAIL_TO="root" //当IP被屏蔽时给指定邮箱发送邮件,推荐使用,换成自己的邮箱即可。如果不希望发送邮件,设置为空,即EMAIL_TO="" ##### Number of seconds the banned ip should remain in blacklist.BAN_PERIOD=600 //禁用IP时间(锁定ip的时间),默认600秒,可根据情况调整 需要注意的是:DDos default安装完成后在/usr/local/ddos目录下产生了ddos.conf、ddos.sh、ignore.ip.list和LICENSE这四个文件,其中:ddos.conf是配置文件,ddos.sh是一个Shell文件,ignore.ip.list是存放忽略IP的文件,LICENSE是版权声明文件,安装完成后还在/etc/cron.d/下生产了ddos.cron文件,内容如下: [root@test3-237 ~]# cat /etc/cron.d/ddos.cronSHELL=/bin/sh0-59/1 * * * * root /usr/local/ddos/ddos.sh >/dev/null 2>&1 意思是每隔一分钟执行一下/usr/local/ddos/ddos.sh,这个脚本是关键!这个cron任务是依赖ddos.conf文件中的NO_OF_CONNECTIONS变量产生的,如果修改了此值,可以通过运行如下命令更新(实际也是在安装是运行了如下命令):[root@test3-237 ~]# /usr/local/ddos/ddos.sh -cStopping crond: [ OK ]Starting crond: [ OK ]Stopping crond: [ OK ]Starting crond: [ OK ] 或者[root@test3-237 ~]# /usr/local/ddos/ddos.sh --cronStopping crond: [ OK ]Starting crond: [ OK ]Stopping crond: [ OK ]Starting crond: [ OK ] 3)DDos default选项# /usr/local/ddos/ddos.sh -h #查看选项# /usr/local/ddos/ddos.sh -k n #杀掉连接数大于n的连接。n默认为配置文件的NO_OF_CONNECTIONS 比如: [root@test3-237 ~]# /usr/local/ddos/ddos.sh -k 150 2 103.110.186.75 1 servers) 1 Address# /usr/local/ddos/ddos.sh -c #按照配置文件创建一个执行计划。使得ddos.conf文件配置后生效 CC攻击 cc攻击主要攻击页面,模拟很多用户来不断的访问网站,导致系统资源被大量占用,那么在Linux系统中,我们要如何知道自己是否被cc攻击了呢? 查看所有80端口的连接数 netstat -nat|grep -i “80”|wc -l 对连接的IP按连接数量进行排序 netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n 查看TCP连接状态 netstat -nat |awk ‘{print $6}’|sort|uniq -c|sort -rn netstat -n | awk ‘/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}’ netstat -n | awk ‘/^tcp/ {++state[$NF]}; END {for(key in state) print key,“\t”,state[key]}’ netstat -n | awk ‘/^tcp/ {++arr[$NF]};END {for(k in arr) print k,“\t”,arr[k]}’ netstat -n |awk ‘/^tcp/ {print $NF}’|sort|uniq -c|sort -rn netstat -ant | awk ‘{print $NF}’ | grep -v ‘[a-z]’ | sort | uniq -c 查看80端口连接数最多的20个IP netstat -anlp|grep 80|grep tcp|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -nr|head -n20 netstat -ant |awk ‘/:80/{split($5,ip,“:”);++A[ip[1]]}END{for(i in A) print A,i}’ |sort -rn|head -n20 用tcpdump嗅探80端口的访问看看谁最高 tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F“。” ‘{print $1“。”$2“。”$3“。”$4}’ | sort | uniq -c | sort -nr |head -20 查找较多time_wait连接 netstat -n|grep TIME_WAIT|awk ‘{print $5}’|sort|uniq -c|sort -rn|head -n20 查找较多的SYN连接 netstat -an | grep SYN | awk ‘{print $5}’ | awk -F: ‘{print $1}’ | sort | uniq -c | sort -nr | more 封单个IP的命令是: iptables -I INPUT -s 211.1.0.0 -j DROP 封IP段的命令是: iptables -I INPUT -s 211.1.0.0/16 -j DROP iptables -I INPUT -s 211.2.0.0/16 -j DROP iptables -I INPUT -s 211.3.0.0/16 -j DROP 封整个段的命令是: iptables -I INPUT -s 211.0.0.0/8 -j DROP 封几个段的命令是: iptables -I INPUT -s 61.37.80.0/24 -j DROP iptables -I INPUT -s 61.37.81.0/24 -j DROP 想在服务器启动自运行的话有三个方法: 1、把它加到/etc/rc.local中 2、iptables-save 》/etc/sysconfig/iptables可以把你当前的iptables规则放到/etc/sysconfig/iptables中,系统启动iptables时自动执 行。 3、service iptables save 也可以把你当前的iptables规则放/etc/sysconfig/iptables中,系统启动iptables时自动执行。 后两种更好此,一般iptables服务会在network服务之前启来,更安全。 解封的话: iptables -D INPUT -s IP地址 -j REJECT iptables -F 全清掉了
数据包先经过PREOUTING,由该链确定数据包的走向: 1、目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①--->②; 2、若满足PREROUTING的nat表上的转发规则,则发送给FORWARD,然后再经过POSTROUTING发送出去,流程为: ①--->③--->④--->⑥ 主机发送数据包时,流程则是⑤--->⑥ iptables安装配置 linux一般默认都已经安装iptables,只需要开启服务即可 1 service iptables start iptables规则书写 基本语法:iptables [-t 表] [操作命令] [链][规则匹配器][-j 目标动作] 表 说明 支持的链 raw 一般是为了不再让iptables对数据包进行跟踪,提高性能 PREROUTING、OUTPUT mangle 对数据包进行修改 五个链都可以 nat 进行地址转换 PREROUTING、OUTPUT、POSTROUTING filter(默认) 对包进行过滤 INPUT、FORWARD、OUTPUT 常用操作命令 说明 -A 在指定链尾部添加规则 -D 删除匹配的规则 -R 替换匹配的规则 -I 在指定位置插入规则 例:iptables -I INPUT 1 --dport 80 -j ACCEPT (将规则插入到filter表INPUT链中的第一位上) -L/S 列出指定链或所有链的规则 -F 删除指定链或所有链的规则 -N 创建用户自定义链 例:iptables -N allowed -X 删除指定的用户自定义链 -P 为指定链设置默认规则策略,对自定义链不起作 用 例:iptables -P OUTPUT DROP -Z 将指定链或所有链的计数器清零 -E 更改自定义链的名称 例:iptables -E allowed disallowed -n ip地址和端口号以数字方式显示 例:iptables -Ln 常见规则匹配器 说明 -p tcp|udp|icmp|all 匹配协议,all会匹配所有协议 -s addr[/mask] 匹配源地址 -d addr[/mask] 匹配目标地址 --sport port1[:port2] 匹配源端口(可指定连续的端口) --dport port1[:port2] 匹配目的端口(可指定连续的端口) -o interface 匹配出口网卡,只适用FORWARD、POSTROUTING、OUTPUT。 例:iptables -A FORWARD -o eth0 -i interface 匹配入口网卡,只使用PREROUTING、INPUT、FORWARD。 --icmp-type 匹配icmp类型(使用iptables -p icmp -h可查看可用的ICMP类型) --tcp-flags mask comp 匹配TCP标记,mask表示检查范围,comp表示匹配mask中的哪些标记。 例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT (表示匹配SYN和ACK标记的数据包) 目标动作 说明 ACCEPT 允许数据包通过 DROP 丢弃数据包 REJECT 丢弃数据包,并且将拒绝信息发送给发送方 SNAT 源地址转换(在nat表上) 例:iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1 DNAT 目标地址转换(在nat表上) 例:iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102 REDIRECT 目标端口转换(在nat表上) 例:iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80 MARK 将数据包打上标记 例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60 注意要点: 1、目标地址转换一般在PREROUTING链上操作 2、源地址转换一般在POSTROUTING链上操作 保存和恢复iptables规则 使用iptables-save可以保存到特定文件中 1 iptables-save >/etc/sysconfig/iptables_save 使用iptables-restore可以恢复规则 1 iptables-restore</etc/sysconfig/iptables_save iptables的进阶使用 1、limit限制流量: -m limit --limit-burst 15 #设置一开始匹配的最���数据包数量 -m limit --limit 1000/s #设置最大平均匹配速率 -m limit --limit 5/m --limit-burst 15 #表示一开始能匹配的数据包数量为15个,每匹配到一个, limit-burst的值减1,所以匹配到15个时,该值为0,以后每过 12s,limit-burst的值会加1,表示又能匹配1个数据包 例子: 1 2 iptables -A INPUT -i eth0 -m limit --limit 5/m --limit-burst 15 -j ACCEPT iptables -A INPUT -i eth0 -j DROP 注意要点: 1、--limit-burst的值要比--limit的大 2、limit本身没有丢弃数据包的功能,因此,需要第二条规则一起才能实现限速的功能 2、time :在特定时间内匹配 -m time 说明 --monthdays day1[,day2] 在每个月的特定天匹配 --timestart hh:mm:ss 在每天的指定时间开始匹配 --timestop hh:mm:ss 在每天的指定时间停止匹配 --weekdays day1[,day2] 在每个星期的指定工作日匹配,值可以是1-7 例子: 1 2 iptables -A INPUT -i eth0 -m time --weekdays 1,2,3,4 -jACCEPT iptables -A INPUT -i eth0 -j DROP 3、ttl:匹配符合规则的ttl值的数据包 参数 说明 --ttl-eq 100 匹配TTL值为100的数据包 --ttl-gt 100 匹配TTL值大于100的数据包 --ttl-lt 100 匹配TTL值小于100的数据包 例子: 1 iptables -A OUTPUT -m ttl --ttl-eq 100 -j ACCEPT 4、multiport:匹配离散的多个端口 参数 说明 --sports port1[,port2,port3] 匹配源端口 --dports port1[,port2,port3] 匹配目的端口 --ports port1[,port2,port3] 匹配源端口或目的端口 例子: 1 iptables -A INPUT -m multiport --sports 22,80,8080 -j DROP 5、state:匹配指定的状态数据包 参数 说明 --state value value可以为NEW、RELATED(有关联的)、ESTABLISHED、INVALID(未知连接) 例子: 1 iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT 6、mark:匹配带有指定mark值的数据包 参数 说明 --mark value 匹配mark标记为value的数据包 例子: 1 iptables -t mangle -A INPUT -m mark --mark 1 -j DROP 7、mac:匹配特定的mac地址 例子: 1 iptables -A FORWARD -m mac --mac-source 00:0C:24:FA:19:80 -j DROP
加任务: crontab -e 0 */1 * * * command 0 */2 * * * command 查询任务是否加了: crontab -l 0 */1 * * * command 0 */2 * * * command 基本格式 :* * * * * command分 时 日 月 周 命令 第1列表示分钟1~59 每分钟用*或者 */1表示第2列表示小时0~23(0表示0点)第3列表示日期1~31第4列表示月份1~12第5列标识号星期0~6(0表示星期天)第6列要运行的命令 crontab文件的一些例子: 30 21 * * * /usr/local/etc/rc.d/lighttpd restart上面的例子表示每晚的21:30重启apache。 45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart上面的例子表示每月1、10、22日的4 : 45重启apache。 10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart上面的例子表示每周六、周日的1 : 10重启apache。 0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。 0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart上面的例子表示每星期六的11 : 00 pm重启apache。 * */1 * * * /usr/local/etc/rc.d/lighttpd restart每一小时重启apache * 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart晚上11点到早上7点之间,每隔一小时重启apache 0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart每月的4号与每周一到周三的11点重启apache 0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart一月一号的4点重启apache
nginx 安装前准备 安装编译环境 yum -y install gcc gcc-c++ wget yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel yum -y install automake autoconf libtool libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed # 创建 nginx 用户useradd nginx -s /sbin/nologin -M #下载安装包 wget http://nginx.org/download/nginx-1.10.3.tar.gz #解压tar -zxf nginx-1.10.3.tar.gz cd nginx-1.10.3 #配置安装参数 ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/local/sbin/nginx \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx.pid \ --lock-path=/var/run/nginx.lock \ --http-client-body-temp-path=/var/cache/nginx/client_temp \ --http-proxy-temp-path=/var/cache/nginx/proxy_temp \ --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \ --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \ --http-scgi-temp-path=/var/cache/nginx/scgi_temp \ --user=nginx \ --group=nginx \ --with-pcre \ --with-http_v2_module \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-http_auth_request_module \ --with-mail \ --with-mail_ssl_module \ --with-file-aio \ --with-ipv6 \ --with-http_v2_module \ --with-threads \ --with-stream \ --with-stream_ssl_module #安装make make install ln -s /usr/local/nginx /etc/nginx # 使用 nginx -V 可以查看编译是的参数[root@crazy-acong ~]# /etc/nginx/sbin/nginx -Vnginx version: nginx/1.10.3built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013TLS SNI support enabled# 检查配置文件语法,可以防止因配置错误导致网站重启或重新加载配置等对用户的影响[root@crazy-acong nginx-1.10.3]# nginx -tnginx: the configuration file /etc/nginx/conf/nginx.conf syntax is oknginx: configuration file /etc/nginx/conf/nginx.conf test is successful 启动nginx /usr/local/sbin/nginx 用ps aux来查看nginx是否启动 ps aux|grep nginx 然后配置服务 vim /usr/lib/systemd/system/nginx.service 按i输入以下内容 [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/var/run/nginx.pid ExecStartPre=/usr/local/sbin/nginx -t -c /etc/nginx/conf/nginx.conf ExecStart=/usr/local/sbin/nginx -c /etc/nginx/conf/nginx.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=trusys [Install] WantedBy=multi-user.target 编辑好后保存 然后开启开机启动 systemctl enable nginx.service 用命令关掉nginx pkill -9 nginx 后面可以用systemctl来操作nginx.service systemctl start nginx.service 然后php装好后更改配置 编辑/etc/nginx/nginx.conf 安装php 下载对应的版本 http://mirrors.sohu.com/ yum -y install libxml2yum -y install libxml2-devel yum -y install opensslyum -y install openssl-develyum -y install curlyum -y install curl-develyum -y install libjpegyum -y install libjpeg-develyum -y install libpngyum -y install libpng-develyum -y install freetypeyum -y install freetype-develyum -y install pcreyum -y install pcre-develyum -y install libxsltyum -y install libxslt-develyum -y install bzip2yum -y install bzip2-devel ./configure \ --prefix=/usr/local/php \ --with-curl \ --with-freetype-dir \ --with-gd \ --with-gettext \ --with-iconv-dir \ --with-kerberos \ --with-libdir=lib64 \ --with-libxml-dir \ --with-mysqli \ --with-openssl \ --with-pcre-regex \ --with-pdo-mysql \ --with-pdo-sqlite \ --with-pear \ --with-png-dir \ --with-jpeg-dir \ --with-xmlrpc \ --with-xsl \ --with-zlib \ --with-bz2 \ --with-mhash \ --enable-fpm \ --enable-bcmath \ --enable-libxml \ --enable-inline-optimization \ --enable-gd-native-ttf \ --enable-mbregex \ -enable-mbstring \ --enable-pcntl \ --enable-shmop \ --enable-soap \ --enable-sockets \ --enable-sysvsem \ --enable-sysvshm \ --enable-xml \ --enable-zip \ --enable-opcache #5.5 以上版本 实际上这里的配置项比上述还多,可以使用 ./configure --help 命令查看所有选项,这里注意在php7中--with-mysql原生支持已经不存在了,操作都变成mysqli或者pdo了;以上这些选项在正常的php开发中完全够用了,后期如果需要,可以选择手动开启相应的模块 然后执行编译: make 编译时间可能会有点长,编译完成之后,执行安装: make install php的默认安装位置上面已经指定为/usr/local/php,接下来配置相应的文件: cp php.ini-development /usr/local/php/lib/php.inicp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.confcp sapi/fpm/php-fpm /usr/local/bin 然后设置php.ini,使用: vim /usr/local/php/lib/php.ini 打开php配置文件找到cgi.fix_pathinfo配置项,这一项默认被注释并且值为1,根据官方文档的说明,这里为了当文件不存在时,阻止Nginx将请求发送到后端的PHP-FPM模块,从而避免恶意脚本注入的攻击,所以此项应该去掉注释并设置为0 设置完毕保存并退出 另外注意一个地方就是php.ini配置文件的位置可以在编译前配置参数中设置,编译参数可以写成:--with-config-file-path=/usr/local/php 这样的话php就回去指定的目录下读取php.ini配置文件,如果不加这个参数默认位置就是php安装目录下的lib目录,具体也可以在phpinfo()输出界面查看,如果php.ini放到其他位置,php读取不到,那么所有的配置修改后都是不生效的,这点要注意 如果此时随便在一个位置添加,那么接下来启动php-fpm的时候,会报目录找不到的错误,所以不要在php-fpm.conf中添加用户和组,这个时候翻到php-fpm.conf最后一行会发现如下内容(如果编译时添加--prefix选项以下位置会自动补全,默认是下面是空的,要注意): 这里引入了php-fpm.d目录下所有的conf配置文件,但是NONE需要修改为我们的实际目录:/usr/local 默认情况下etc/php-fpm.d/下有一个名为www.conf.defalut的配置用户的文件,执行下面命令复制一个新文件并且打开: cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.confvim /usr/local/php/etc/php-fpm.d/www.conf 默认user和group的设置为nobody,将其改为www-data 修改完成之后,保存并退出,然后执行以下命令启动php-fpm服务: /usr/local/bin/php-fpm 修改完成之后,保存并退出,然后执行以下命令启动php-fpm服务: /usr/local/bin/php-fpm 启动完毕之后,php-fpm服务默认使用9000端口,使用 netstat -tln | grep 9000 可以查看端口使用情况: 9000端口正常使用,说明php-fpm服务启动成功 然后执行 vim /usr/local/nginx/conf/nginx.conf 编辑nginx配置文件,具体路径根据实际的nginx.conf配置文件位置编辑,下面主要修改nginx的server {}配置块中的内容,修改location块,追加index.php让nginx服务器默认支持index.php为首页: 然后配置.php请求被传送到后端的php-fpm模块,默认情况下php配置块是被注释的,此时去掉注释并修改为以下内容: 这里面很多都是默认的,root是配置php程序放置的根目录,主要修改的就是fastcgi_param中的/scripts为$document_root 修改完上面的,回到nginx.conf第一行,默认是#user nobody; 这里要去掉注释改为user nginx;或者user nginx nginx;表示nginx服务器的权限为nginx 修改完这些保存并退出,然后重启nginx: /usr/local/nginx/nginx -s stop/usr/local/nginx/nginx 安装mysql http://mirrors.sohu.com/这也可以下载 yum -y install perl-Module-Install.noarch :http://www.mysql.com/downloads/,页面最上面是企业版,一般个人或者企业使用社区版就足够了,页面拉到最下方可以看到下载入口: 点击链接进入,然后选择第一项进入: 这里默认是5.7.11的版本,我们选择5.6的下载链接进入: 进入后,默认版本就是5.6.19,对于版本这里选择Linux - Generic,也就是通用的二进制版本 然后上面都是RPM的包,我们拉到页面最下方根据操作系统位数选择.tar.gz的包,这里选择64位的mysql-5.6.29-linux-glibc2.5-x86_64.tar.gz 释放归档文件: tar -xvzf mysql-5.6.29-linux-glibc2.5-x86_64.tar.gz 建立mysql目录并移动至安装目录: mkdir /usr/local/mysqlmv mysql-5.6.29-linux-glibc2.5-x86_64/* /usr/local/mysql/cd /usr/local/mysql/要注意,因为系统可能默认存在/etc/my.cnf 所以一般需要执行 cp support-files/my-small.cnf /etc/my.cnf 覆盖原有的my.cnf,并且在里面[mysqld]下面添加basedir为我们要安装的mysql目录 vim /etc/my.cnf [mysqld] basedir=/usr/local/mysql 接下来创建mysql用户和用户组: groupadd mysqluseradd -r -g mysql -s /sbin/nologin -M mysql 修改当前目录权限为mysql权限: chown -R mysql:mysql . 执行安装: ./scripts/mysql_install_db --user=mysql 上一步安装失败,提示FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db:Data::Dumper的话,那么原因是缺少perl-module,那么执行命令: yum -y install perl-Module-Install.noarch 安装perl-module模块,需要下载安装98个包,这个要耐心等待一会,等待perl-module安装成功之后,再继续执行上一步安装 然后建立mariadb的日志目录,否则下一步会报错,使用命令: mkdir /var/log/mysql 然后执行mysql安全启动脚本: bin/mysqld_safe --user=mysql & 执行后,再按一下回车回到命令行,没报错则启动成功 最后将mysql添加到系统服务: 1、将服务文件拷贝到init.d下,并重命名为mysql cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld 2、赋予可执行权限 chmod +x /etc/init.d/mysqld 3、添加服务 chkconfig --add mysqld 4、显示服务列表 chkconfig --list 如果看到mysql的服务,并且3,4,5都是on的话则成功,如果是off,则键入 chkconfig --level 345 mysql on service mysqld start #就可以启动mysql ln -s /usr/local/mysql/bin/mysql /usr/local/sbin mysql -uroot -p 进入mysql交互界面,如果这里出现mysql.sock错误的提示,继续编辑/etc/my.cnf文件,修改其中的socket属性为:/tmp/mysql.sock即可,或者注释默认即可,保存并退出;另一种方法推荐在/tmp下做软链接,将my.cnf配置文件中配置的socket位置链到提示错误的mysql.sock位置,命令是: ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock ;解决之后再次进入mysql交互界面就可以了 输入 quit 可以退出交互界面,mysql初始密码为空,可以使用mysqladmin为mysql服务器设置一个密码: bin/mysqladmin -u root password 'Aa7410852' mysql -uroot -p 回车后继续输入密码即可登录mysql 如果后续需要修改密码,因为mysql数据库密码是存放在mysql的一个数据库中的user表中,那么可以通过SQL语句实现,首先登录mysql数据库在mysql提示符中进行如下操作即可修改密码: mysql> USE mysql;mysql> UPDATE user SET Password=PASSWORD('newpass') WHERE User = 'root';mysql> FLUSH PRIVILEGES; 通过以上3步即可修改为你想要的密码,并且下次立即生效,现在数据库在本地就可以正常使用了, 后来可以把mysql添加至环境变量中,便于直接输入mysql进入,不用加路径了,这个是可选的,根据自己的需要即可 现在还要注意一个问题,虽然通过命令行可以进入了,但是我们从其他主机编写的程序是无法连接到这台服务器的,在生产环境中这样肯定是不行的,所以我们要对所有主机开放授权,这样才可以正常访问,首先我们登录mysql,然后执行下面命令可以给所有主机开放root用户的授权: mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'setpassword' WITH GRANT OPTION;mysql> FLUSH PRIVILEGES; 第一行指令的%代表所有主机来源,setpassword可以设置和本地mysql不同的密码,当然一般情况下相同即可,执行完上面的指令后mysql就可以从外网立即连接了,到这里mysql基本的安装配置就完成了
一、安装python3.6 1. 安装依赖环境 # yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel 2.下载Python3 https://www.python.org/downloads/ 1 # wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz 3.安装python3 我个人习惯安装在/usr/local/python3(具体安装位置看个人喜好) 创建目录: 1 # mkdir -p /usr/local/python3 解压下载好的Python-3.x.x.tgz包(具体包名因你下载的Python具体版本不不同⽽而不不同,如:我下载的是Python3.6.1.那我这里就是Python-3.6.1.tgz) 1 # tar -zxvf Python-3.6.1.tgz 4.进入解压后的目录,编译安装。 1 2 # cd Python-3.6.1 # ./configure --prefix=/usr/local/python3 make 1 # make make install 1 make install 或者 make && make install 5.建立python3的软链 1 # ln -s /usr/local/python3/bin/python3 /usr/bin/python3 6.并将/usr/local/python3/bin加入PATH 1 2 3 4 5 6 7 8 9 # vim ~/.bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin:/usr/local/python3/bin export PATH 按ESC,输入:wq回车退出。 修改完记得执行行下面的命令,让上一步的修改生效: 1 # source ~/.bash_profile 检查Python3及pip3是否正常可用: 1 2 3 4 # python3 -V Python 3.6.1 # pip3 -V pip 9.0.1 from /usr/local/python3/lib/python3.6/site-packages (python 3.6)
将链接apachectl 复制到系统启动目录下并命名为httpd [root@localhost bin]# cp /usr/local/httpd/bin/apachectl /etc/rc.d/init.d/httpd 1 2 到此,其实已经可以使用service httpd start等命令,但在linux服务列表还没有注册 使用chkconfig来注册apache服务,并其可以在linux的服务列表中看到(chkconfig –list) 在init.d的httpd链接文件中第2行添加如下注释,并wq保存退出 [root@localhost bin]# vim /etc/rc.d/init.d/httpd 1 意义如下 35:在3级别和5级别(级别见文末TIPS)启动httpd 61:启动顺序为61号,S61 61:关闭顺序为61号,K61 当进行chkconfig --add httpd操作时,如果没有指定level那么就会来这个注释中取值 1 2 3 4 5 6 将httpd配置自启并加入linux服务监控 [root@localhost bin]# chkconfig --add httpd 1 2 此时,就可以在rc.d下的相应的3和5目录下看到S61httpd,并在0、1、2、4、6目录看到K61httpd了
查看nginx编译参数:/usr/local/nginx/sbin/nginx -V 查看apache编译参数:cat /usr/local/apache2/build/config.nice 查看mysql编译参数:cat /usr/local/mysql/bin/mysqlbug | grep CONFIGURE_LINE 查看php编译参数:/usr/local/php/bin/php -i | grep configure
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。 awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。 使用方法 awk '{pattern + action}' {filenames} 尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。 awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。 通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。 调用awk 有三种方式调用awk 1.命令行方式 awk [-F field-separator] 'commands' input-file(s) 其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。 2.shell脚本方式 将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。 相当于shell脚本首行的:#!/bin/sh 可以换成:#!/bin/awk 3.将所有的awk命令插入一个单独文件,然后调用: awk -f awk-script-file input-file(s) 其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。 本章重点介绍命令行方式。 入门实例 假设last -n 5的输出如下 [root@www ~]# last -n 5 <==仅取出前五行 root pts/1 192.168.1.100 Tue Feb 10 11:21 still logged in root pts/1 192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41) root pts/1 192.168.1.100 Mon Feb 9 11:41 - 18:30 (06:48) dmtsai pts/1 192.168.1.100 Mon Feb 9 11:41 - 11:41 (00:00) root tty1 Fri Sep 5 14:09 - 14:10 (00:01) 如果只是显示最近登录的5个帐号 #last -n 5 | awk '{print $1}' root root root dmtsai root awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。 如果只是显示/etc/passwd的账户 #cat /etc/passwd |awk -F ':' '{print $1}' root daemon bin sys 这种是awk+action的示例,每行都会执行action{print $1}。 -F指定域分隔符为':'。 如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割 #cat /etc/passwd |awk -F ':' '{print $1"\t"$7}' root /bin/bash daemon /bin/sh bin /bin/sh sys /bin/sh 如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。 cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}' name,shell root,/bin/bash daemon,/bin/sh bin,/bin/sh sys,/bin/sh .... blue,/bin/nosh awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。 搜索/etc/passwd有root关键字的所有行 #awk -F: '/root/' /etc/passwd root:x:0:0:root:/root:/bin/bash 这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。 搜索支持正则,例如找root开头的: awk -F: '/^root/' /etc/passwd 搜索/etc/passwd有root关键字的所有行,并显示对应的shell # awk -F: '/root/{print $7}' /etc/passwd /bin/bash 这里指定了action{print $7} awk内置变量 awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。 ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行 -F选项 NF 浏览记录的域的个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符 此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。 统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容: #awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh 使用printf替代print,可以让代码更加简洁,易读 awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd print和printf awk中同时提供了print和printf两种打印输出的函数。 其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。 printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。 awk编程 变量和赋值 除了awk的内置变量,awk还可以自定义变量。 下面统计/etc/passwd的账户人数 awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd root:x:0:0:root:/root:/bin/bash ...... user count is 40 count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。 这里没有初始化count,虽然默认是0,但是妥当的做法还是初始化为0: awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd [start]user count is 0 root:x:0:0:root:/root:/bin/bash ... [end]user count is 40 统计某个文件夹下的文件占用的字节数 ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}' [end]size is 8657198 如果以M为单位显示: ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}' [end]size is 8.25889 M 注意,统计不包括文件夹的子目录。 条件语句 awk中的条件语句是从C语言中借鉴来的,见如下声明方式: if (expression) { statement; statement; ... ... } if (expression) { statement; } else { statement2; } if (expression) { statement1; } else if (expression1) { statement2; } else { statement3; } 统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹): ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}' [end]size is 8.22339 M 循环语句 awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。 数组 因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。 显示/etc/passwd的账户 awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd 0 root 1 daemon 2 bin 3 sys 4 sync 5 games ...... 这里使用for循环遍历数组 awk编程的内容极多,这里只罗列简单常用的用法,更多请参考 http://www.gnu.org/software/gawk/manual/gawk.html
redis 的介绍 Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务器。 PS:此次安装为redis储存字符串的形式,储存用户会话session。 #redis 官网:https://redis.io/#redis 中文官网:http://www.redis.cn/#我们选择最新稳定版本redis-3.2.9.tar.gz 安装规划 软件包保存位置:/usr/local/src软件包编译位置:/usr/local/src/redis-x-x/软件安装位置:/usr/local/redis/软件命令位置:/usr/local/redis/bin软件日志保存位置:/usr/local/reids/redis.log软件配置文件位置:/usr/local/redis/etc/redis.conf 软件pid文件位置:/var/run/redis.pid软件启动服务位置:/etc/init.d/redis软件认证需要密码 Redis 的安装 redis的准备工作,安装依赖包 Centos系列: yum repolistyum -y install gcc gcc-c++ make gmake cmake zlib tcl Ubuntu系列: agt-get updateAgt-get install gcc gcc-c++ make zlib tcl 下载包,安装redis cd /usr/local/src \\进入软件包目录(规范化)wget http://download.redis.io/releases/redis-3.2.9.tar.gz \\下载软件包tar -xzf redis-3.2.9.tar.gz \\#解压并进入redis目录cd redis-3.2.9 \\解压并进入redis目录#运行测试./runtest#预编译 编译安装makemake test#进入src目录安装cd srcmake PREFIX=/usr/local/redis installPS:redis的编译安装过程漫长,在此处我们把redis编译安装到了"/usr/local/redis"目录了,默认情况下bin命令都是在"/usr/bin"下面直接可以调用redis的命令。指的安装路径后我们需要在后期添加系统环境变量。 Redis配置文件 创建redis的配置文件目录,拷贝配置文件redis.conf mkdir -p /usr/local/redis/etccp /usr/local/src/redis-3.2.9/redis.conf /usr/local/redis/etc/redis.conf 修改配置文件 vim /usr/local/redis/etc/redis.conf cat /usr/local/redis/etc/redis.conf |grep -v "^$" |grep -v "# bind 0.0.0.0 \\修改内容=======对外监听protected-mode yesport 6379 \\修改端口号=====按照需求tcp-backlog 511timeout 0tcp-keepalive 300daemonize yes \\守护进程模式打开,添加系统服务用的supervised nopidfile /var/run/redis.pid \\pid的位置loglevel verbose \\日志启动级别logfile /usr/local/redis/redis.log \\日志保存位置databases 16 \\reids 数据库个数save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbdir ./slave-serve-stale-data yesslave-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noslave-priority 100 requirepass mima \\访问身份验证=================密码 maxmemory 256m \\最大内存设置 maxmemory-policy volatile-ttl \\redis最大内存丢弃规则appendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yeslua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yesclient-output-buffer-limit normal 0 0 0 配置文件修改内容: port 6379 修改端口号bind 0.0.0.0 修改绑定IP(按需求)timeout 0 修改连接超时时间loglevel verbose 日志三种类型debug、verbose、notice、warnlogfile /var/log/redis.log 日志目录*****maxmemory 256m redis的内存大小***maxmemory-policy volatile-ttl 内存丢弃策略requirepass 密码 redis认证规则**(按需求) PS:注意配置日志和pid等的位置,要和启动脚本关联。密码也要和启动脚本关联。 创建修改系统启动配置文件 创建系统服务启动文件 启动文件的模板:/usr/local/src/redis-3.2.9/utils/redis_init_script cp /usr/local/src/redis-3.2.9/utils/redis_init_script /etc/init.d/redischmod 755 /etc/init.d/redis 修改系统启动脚本 #!/bin/sh#Configurations injected by install_server below....EXEC=/usr/local/redis/bin/redis-server ######服务命令启动#####CLIEXEC=/usr/local/redis/bin/redis-cli ####客户端命令路径###PIDFILE=/var/run/redis.pid ###pid文件所在位置#####要和配置文件一致CONF="/usr/local/redis/etc/redis.conf" ####redis配置文件的路径##REDISPORT="6379" #####启动端口##################### SysV Init Information# chkconfig: - 58 74 #####添加内容,注释但有意义####### description: redis_6379 is the redis daemon.### BEGIN INIT INFO# Provides: redis_6379 #####启动端口##################### Required-Start: $network $local_fs $remote_fs# Required-Stop: $network $local_fs $remote_fs# Default-Start: 2 3 4 5# Default-Stop: 0 1 6# Should-Start: $syslog $named# Should-Stop: $syslog $named# Short-Description: start and stop redis_6379# Description: Redis daemon### END INIT INFO case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT -a mima shutdown \\###修改内容,添加-a密码验证的项目###while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;;status) PID=$(cat $PIDFILE) if [ ! -x /proc/${PID} ] then echo 'Redis is not running' else echo "Redis is running ($PID)" fi ;; restart) $0 stop $0 start ;; *) echo "Please use start, stop, restart or status as first argument" ;;esac PS:看过《Linux就该这样学》的人都知道系统启动文件怎么写,什么格式,在这里我们就不在解释了。 redis 启动脚本添加认证两个方法 方法一: 方法二: 将启动脚本添加到系统服务 chkconfig --add redis #添加系统服务chkconfig redis on #设置开机自启service redis startservice redis statusservice redis stopservice redis restart Ubuntu系统没有chkconfig PS:chkconfig 在ubuntu系统中有可能不太容易安装,可以使用update-rc.d 命令来进行使用。 update-rc.d redisd defaults 80 80root@linuxprobe:/etc/redis# update-rc.d redisd defaults 80 80 Adding system startup for /etc/init.d/redisd .../etc/rc0.d/K80redisd -> ../init.d/redisd/etc/rc1.d/K80redisd -> ../init.d/redisd/etc/rc6.d/K80redisd -> ../init.d/redisd/etc/rc2.d/S80redisd -> ../init.d/redisd/etc/rc3.d/S80redisd -> ../init.d/redisd/etc/rc4.d/S80redisd -> ../init.d/redisd/etc/rc5.d/S80redisd -> ../init.d/redisd 2345 启动 0 1 6 关闭 如果在启动脚本里没有添加认证字段: 启动文件的一致性 经过以上的操作后,我们的redis安装大致完成了,但是还有一些配置没有处理,比如我们的环境变量,我们的压测调优。更多精彩请看下期分解!!!!
名称:cp 功能: 复制文件或目录 说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息. 语法 cp(选项)(参数) 选项 -a 或 --archive 此参数的效果和同时指定"-dpR"参数相同 -b 或 --backup 删除、覆盖目的文件先备份,备份的文件或目录亦建立为符号链接,并指向源文件或目录链接的源文件或目录。假如没有加上这个参数,在复制过程中若遇到符号链接,则会直接复制源文件或目录 -f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在 -i 或 --interactive 覆盖文件之前先询问用户 -l 或 --link 对源文件建立硬链接,而非复制文件 -p 或 --preserve 保留源文件或目录的属性,包括所有者、所属组、权限与时间 -P 或 --parents 保留源文件或目录的路径,此路径可以是绝对路径或相对路径,且目的目录必须已经丰在 -r 递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理 -R 或 --recursive 递归处理,将指定目录下的文件及子目录一并处理 -s 或 --symbolic-link 对源文件建立符号链接,而非复制文件 -S <备份字尾字符串> 或 --suffix=<备份字尾字符串> 用"-b"参数备份目的文件后,备份文件的字尾会被加上一个备份字符串。默认的备份字尾符串是符号"~" -u 或 --update 使用这项参数之后,只会在源文件的修改时间(Modification Time)较目的文件更新时,或是名称相互对应的目的文件并不存在,才复制文件 -v 或 --verbose 显示执行过程 -V <备份方式> 或 --version-control=<备份方式> 指定当备份文件时,备份文件名的命名方式,有以下3种: numbered或t, 将使用备份编号,会在字尾加上~1~字符串,其数字编号依次递增 simple或never 将使用简单备份,默认的备份字尾字符串是~, 也可通过-S来指定 existing或nil将使用当前方式,程序会先检查是否存在着备份编号,若有则采用备份编号,若无则采用简单备份 -x 或 --one-file-system 复制的文件或目录存放的文件系统,必须与cp指令执行时所处的文件系统相同,否则不复制,亦不处理位于其他分区的文件 --help 显示在线帮助 --sparse=<使用时机> 设置保存希疏文件的时机 --version 显示版本 示例 复制文件,只有源文件较目的文件的修改时间新时,才复制文件 cp -u -v file1 file2 将文件file1复制成文件file2 cp file1 file2 采用交互方式将文件file1复制成文件file2 cp -i file1 file2 .将文件file1复制成file2,因为目的文件已经存在,所以指定使用强制复制的模式 cp -f file1 file2 将目录dir1复制成目录dir2 cp -R file1 file2 同时将文件file1、file2、file3与目录dir1复制到dir2 cp -R file1 file2 file3 dir1 dir2 复制时保留文件属性 cp -p a.txt tmp/ 复制时保留文件的目录结构 cp -P /var/tmp/a.txt ./temp/ 复制时产生备份文件 cp -b a.txt tmp/ 复制时产生备份文件,尾标 ~1~格式 cp -b -V t a.txt /tmp 指定备份文件尾标 cp -b -S _bak a.txt /tmp
如果只对经常改动的目录进行同步,也可以忽略这个问题,如果每次改动的目录多较大,那么就要用到inotify了,Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13起,加入了对Inotify的支持,通过Inotify可以监控文件系统中的添加、删除、修改、移动等各种事件,但inotify只提供了C语言接口,不方便调用,所以我们需要先安装inotify-tools 系统环境 CentOS_5.7-x86_64 更新源服务器:192.168.9.227 目的服务器:192.168.9.226 192.168.9.228 ... 目的服务器配置 192.168.9.226 192.168.9.228(rsync服务端): 检查rsync是否安装 rpm -qa|grep rsync 如果没有发装,执以下命令进行安装 yum -y install rsync 定义rsync配置文件/etc/rsyncd.conf 192.168.9.226: cat >> /etc/rsyncd.conf << EOFuid = nobody gid = nobody use chroot = no max connections = 100 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/log/rsyncd.log [web1] path = /data/www1/ ignore errors read only = no list = no hosts allow = 192.168.9.0/255.255.255.0 auth users = www1 secrets file = /etc/www1.pwd EOF 192.168.9.228: cat >> /etc/rsyncd.conf << EOFuid = nobody gid = nobody use chroot = no max connections = 100 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/log/rsyncd.log [web2] path = /data/www2/ ignore errors read only = no list = no hosts allow = 192.168.9.0/255.255.255.0 auth users = www2 secrets file = /etc/www2.pwd EOF rsyncd.conf配置文件详解 uid = nobody //运行RSYNC守护进程的用户gid = nobody //运行RSYNC守护进程的组use chroot = 0 //不使用chrootmax connections = 0 // 最大连接数,0为不限制port = 873 //默认端口873下面这些文件是安装完RSYNC服务后自动生成的文件pid file = /var/run/rsyncd.pid //pid文件的存放位置lock file = /var/run/rsync.lock //锁文件的存放位置.指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock.log file = /var/log/rsyncd.log //日志记录文件的存放位置Timeout = 300 通过该选项可以覆盖客户指定的IP超时时间.通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端.超时单位为秒钟,0表示没有超时定义,这也是默认值.对于匿名rsync服务器来说,一个理想的数字是600.Log format = %t %a %m %f %b 通过该选项用户在使用transfer logging可以自己定制日志文件的字段.其格式是一个包含格式定义符的字符串,可以使用的格式定义符如下所示:%h 远程主机名%a 远程IP地址%l 文件长度字符数%p 该次rsync会话的进程id%o 操作类型:" send" 或" recv"%f 文件名%P 模块路径%m 模块名%t 当前时间%u 认证的用户名(匿名时是null)%b 实际传输的字节数%c 当发送文件时,该字段记录该文件的校验码默认log格式为:" %o %h [%a] %m (%u) %f %l" ,一般来说,在每行的头上会添加" %t [%p] " .在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件.#transfer logging = yes使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中.syslog facility = local3 指定rsync发送日志消息给syslog时的消息级别,常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7.默认值是daemon.模块参数 [web1] //这里是认证的模块名,在client端需要指定path = /data/www1/ //需要做镜像的目录,不可缺少!comment = backup web //这个模块的注释信息ignore errors //可以忽略一些无关的IO错误read only = yes //该选项设定是否允许客户上载文件.如果为true那么任何上载请求都会失败,如果为false并且服务器目录读写权限允许那么上载是允许的.默认值为true.list = no //不允许列文件auth users = bak //认证的用户名,如果没有这行则表明是匿名,此用户与系统无关 该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块.这里的用户和系统用户没有任何关系.如果" auth users" 被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议.用户的名和密码以明文方式存放在" secrets file" 选项指定的文件中.默认情况下无需密码就可以连接模块(也就是匿名方式).secrets file = /etc/www1.pwd //密码和用户名对比表,密码文件自己生成 该选项指定一个包含定义用户名:密码对的文件.只有在" auth users" 被定义时,该文件才有作用.文件每行包含一个username:passwd对.一般来说密码最好不要超过8个字符.没有默认的secures file名,需要限式指定一个(例如:/etc/www1.pwd).注意:该文件的权限一定要是600,否则客户端将不能连接服务器.hosts allow = 192.168.9.0/255.255.255.0 //允许主机或网段该选项指定哪些IP的客户允许连接该模块.客户模式定义可以是以下形式:单个IP地址,例如:192.168.9.227整个网段,例如:192.168.9.0/24,也可以是192.168.9.0/255.255.255.0多个IP或网段需要用空格隔开,“*”则表示所有,默认是允许所有主机连接.hosts deny = 0.0.0.0/0 //禁止主机 建立认证文件/etc/www1.pwd 此文件须与配置文件中指定文件名保持一致 此处格式为:username:password,安全问题,并不建议实际使用中使用root用户 192.168.9.226: echo "www1:741852" >> /etc/www1.pwd 192.168.9.228: echo "www2:951753" >> /etc/www2.pwd 并且我们需要设置此文件的权限为600 chmod 600 /etc/www1.pwdchmod 600 /etc/www2.pwdchmod 600 /etc/rsyncd.conf 建立motd文件(可有可无) rsyncd.motd记录了rsync服务的欢迎信息,你可以在其中输入任何文本信息,如: echo "Welcome to use the rsync services!" >> /var/rsyncd.motd 启动rsync /usr/bin/rsync --daemonecho "/usr/bin/rsync --daemon" >> /etc/rc.local 更新源服务器配置 192.168.9.227 (rsync客户端) inotify 可以监视的文件系统事件包括 IN_ACCESS,即文件被访问IN_MODIFY,文件被 writeIN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等IN_CLOSE_WRITE,可写文件被 closeIN_CLOSE_NOWRITE,不可写文件被 closeIN_OPEN,文件被 openIN_MOVED_FROM,文件被移走,如 mvIN_MOVED_TO,文件被移来,如 mv、cpIN_CREATE,创建新文件IN_DELETE,文件被删除,如 rmIN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己IN_UNMOUNT,宿主文件系统被 umountIN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO) 注:上面所说的文件也包括目录。 安装inotify-tools 在安装inotify-tools前请先确认你的linux内核是否打到了2.6.13,并且在编译时开启了CONFIG_INOTIFY选项,也可以通过以下命令检测 ls /proc/sys/fs/inotify 如果有 max_queued_events,max_user_instances,max_user_watches 三项就说明支持 wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gztar xvf inotify-tools-3.14.tar.gzcd inotify-tools-3.14./configuremake;make install 编写rsync监控脚本 vi /root/rsync.sh#!/bin/bashhost1=192.168.9.226host2=192.168.9.228src=/data/www/des1=web1des2=web2user1=www1user2=www2/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' \-e modify,delete,create,attrib \${src} \| while read filedorsync -vzrtopg --delete --progress ${src} ${user1}@${host1}::${des1} --password-file=/etc/www1.pwd &&rsync -vzrtopg --delete --progress ${src} ${user2}@${host2}::${des2} --password-file=/etc/www2.pwd &&echo "${files} was rsynced" >> /tmp/rsync.log 2>&1echo "---------------------------------------------------------------------------"done -m, 即--monitor,表示始终保持事件监听状态。-r, 即--recursive,表示递归查询目录。-q, 即--quiet,表示打印出监控事件。-e, 即--event,通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、attrib等--timefmt:指定时间的输出格式--format:指定变化文件的详细信息 建立认证文件 (rsync客户端认证文件只用加入密码) echo "741852" >> /etc/www1.pwdecho "951753" >> /etc/www2.pwdchmod 600 /etc/www1.pwdchmod 600 /etc/www2.pwd/bin/sh -n /root/rsync.sh //语法检查chmod +x /root/rsync.shnohup sh /root/rsync.sh &echo "nohup sh /root/rsync.sh &" >> /etc/rc.local 同步测试 在更新源服务器上新建一个文件,运行以下的命令,看文件是否可以正常同步,看有无报错信息 rsync -vzrtopg --delete --progress /data/www1/ www1@192.168.9.226::web1 --password-file=/etc/www1.pwd 将要更新的文件提交到更新源服务器中,这样就通过inotify+rsync批量的将更新文件同步到所有的目的服务器中,相当方便快捷.
许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份、删除相关数据,甚至被迫重新规划分区并重装操作系统,以满足应用系统的需要。 LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上、文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性。RHEL5默认安装的分区格式就是LVM逻辑卷的格式,需要注意的是/boot分区不能基于LVM创建,必须独立出来。 LVM的配置过程也很简单,并不是很难,为此,我画了一张图文并茂的解析图,解析了LVM创建的整个过程。更详细的理论知识还请参看一些教程或者去Google哦! 实验环境: 首先从空的硬盘sdb上创建两个分区sdb1 1G,sdb2 2G. 为接下来做LVM做准备. 为了后期便于维护管理,记得给分区加上标示,这样即使你不在的情况下,别人看到标示了就不会轻易动这块区域了. LVM的标识是8e,设置完成后记得按w保存 一、创建逻辑卷 将新创建的两个分区/dev/sdb1 /dev/sdb2转化成物理卷,主要是添加LVM属性信息并划分PE存储单元. 创建卷组 vgdata ,并将刚才创建好的两个物理卷加入该卷组.可以看出默认PE大小为4MB,PE是卷组的最小存储单元.可以通过 –s参数修改大小。 从物理卷vgdata上面分割500M给新的逻辑卷lvdata1. 使用mkfs.ext4命令在逻辑卷lvdata1上创建ext4文件系统. 将创建好的文件系统/data1挂载到/data1上.(创建好之后,会在/dev/mapper/生成一个软连接名字为”卷组-逻辑卷”) 便于以后服务器重启自动挂载,需要将创建好的文件系统挂载信息添加到/etc/fstab里面.UUID可以通过 blkid命令查询. 为了查看/etc/fstab是否设置正确,可以先卸载逻辑卷data1,然后使用mount –a 使内核重新读取/etc/fstab,看是否能够自动挂载. 二、逻辑卷lvdata1不够用了,如何扩展。 给逻辑卷增加空间并不会影响以前空间的使用,所以无需卸载文件系统,直接通过命令lvextend –L +500M /dev/vgdata/lvdata1或者lvextend –l 2.5G /dev/vgdata/lvdata1 给lvdata1增加500M空间(lvdata1目前是2G空间)设置完成之后,记得使用resize2fs命令来同步文件系统。 三、当卷组不够用的情况下,如何扩大卷组 重新从第二块硬盘上创建一个分区sdb3,具体操作步骤省略。并将创建好的分区加入到已经存在的卷组vgdata中。通过pvs命令查看是否成功。 四、当硬盘空间不够用的情况下,如果减少逻辑卷的空间释放给其他逻辑卷使用。 减少逻辑卷空间,步骤如下 1、 先卸载逻辑卷data1 2、 然后通过e2fsck命令检测逻辑卷上空余的空间。 3、 使用resize2fs将文件系统减少到700M。 4、 再使用lvreduce命令将逻辑卷减少到700M。 注意:文件系统大小和逻辑卷大小一定要保持一致才行。如果逻辑卷大于文件系统,由于部分区域未格式化成文件系统会造成空间的浪费。如果逻辑卷小于文件系统,哪数据就出问题了。 完成之后,就可以通过mount命令挂载重新使用了。 五、如果某一块磁盘或者分区故障了如何将数据快速转移到相同的卷组其他的空间去。 1、通过pvmove命令转移空间数据 2、通过vgreduce命令将即将坏的磁盘或者分区从卷组vgdata里面移除除去。 3、通过pvremove命令将即将坏的磁盘或者分区从系统中删除掉。 4、手工拆除硬盘或者通过一些工具修复分区。 六、删除整个逻辑卷 1、先通过umount命令卸载掉逻辑卷lvdata1 2、修改/etc/fstab里面逻辑卷的挂载信息,否则系统有可能启动不起来。 3、通过lvremove 删除逻辑卷lvdata1 4、通过vgremove 删除卷组vgdata 5、通过pvremove 将物理卷转化成普通分区。 删除完了,别忘了修改分区的id标识。修改成普通Linux分区即可。 总结:LVM逻辑卷是Linux里面一个很棒的空间使用机制,因为分区在没有格式化的情况下是没有办法加大或者放小的。通过LVM可以将你的磁盘空间做到灵活自如。
查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xargs grep -ri "IBM" -l 1.正则表达式 (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/、*、?等)组成。 (2)基本元字符集及其含义 ^ :只匹配行首。 如^a 匹配以a开头的行abc,a2e,a12,aaa,...... $ :只匹配行尾。 如^a 匹配以a结尾的行bca,12a,aaa,....... * :匹配0个或多个此单字符。 如(a)* 匹配 空,a,aa,aaa,.... [] :只匹配[]内字符。可以是一个单字符,也可以是字符序列,用","将里面要匹配的不同字符串分开。也可以使用-来表示[]内字符序列的范围,如[1-5]表示[12345] \ :只用来屏蔽一个元字符的特殊含义。 如\*,\',\",\|,\+,\^,\. 等 .:(点)只匹配任意单字符。 pattern\{n\}:只用来匹配前面pattern出现的次数.n为次数。如a\{2\}匹配aa. pattern\{n,\}:含义同上,但次数最少为n.如a\{2,\}匹配aa,aaa,aaaa,..... pattern\{n,m\}:含义同上,但次数在n和m之间。如a\{2,4\}匹配aa,aaa,aaaa三个 (3)举例说明: ^$ :匹配空行 ^.$ :匹配包含一个字符的行 \*\.pas :匹配以*.pas结尾的所有字符或文件 [0123456789]或[0-9] :假定要匹配任意一个数字 [a-z] :任意小写字母 [A-Za-z] :任意大小写字母 [S,s] :匹配大小写S [0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} :匹配IP地址 [0-9]\{3\}三个0-9组成的字符串;\. :匹配点(注意这里点是特殊的字符,所以要用"\"来屏蔽其含义) 2.find介绍 (1)查找具有某些特征文件的命令,可遍历当前目录甚至于整个文件系统来查看某些文件或目录,其遍历大的文件系统时一般放在后台执行。 (2)find命令的一般形式 find pathname -options [-print -exec -ok] -pathname :find命令所查找的目录路径。如用"."来表示当前的目录,用/来表示系统根目录 -print :find命令将匹配的文件输出到标准输出 -exec: find命令对匹配的文件执行该参数所给出的shell命令,相应的命令形式为 'command'{} \; (注意{}和\之间的空格) -ok 和 -exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 options有如下几种: -name :按照文件名查找文件 -perm :按照文件权限来查找文件 -user :按照文件属主来查找文件 -group :按照文件所属的组来查找文件 -mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime 和-ctime选项,但它们都和-mtime选项相似。 -size n[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计。 -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在 -newer file1 !file2查找更改时间比文件file1新但比文件file2旧的文件 -depth 先查找指定目录有无匹配文件,若无则再在子目录中查找 -type 查找某一类型的文件,如 b :块设备文件 d:目录 e:字符设备文件 p;管道文件 l:符号链接文件 f:普通文件 (3)find命令举例 find -name "*.txt" -print 查找txt结尾的文件并输出到屏幕上 find /cmd ".sh" -print 查找/cmd目录下所有sh文件,并输出 find . -perm 755 -print 查找当前目录下权限为755的文件,并输出 find `pwd` -user root -print 查找当前目录下属主为root的文件,并输出 find ./ -group sunwill -print 查找当前目录下所属主是sunwill的文件 find /var -mtime -5 -print 查找/var目录下更改时间为5天内的所有文件 find /var -mtime +5 -print 查找/var目录下更改时间为5天以前的所有文件 find /var -newer "myfile1" ! -newer "myfile2" -print 查找/var目录下比myfile1新,但是比myfile2旧的所有文件。 find /var -type d -print 查找/var目录下所有目录 find /var -type l -print 查找/var目录下所有的符号链接文件。 find . -size +1000000c -print 查找当前目录下大于1000000字节的文件 find / -name "con.file" -depth -print 查找根目录下有无"con.file",若无则在其子目录中查找 find . -type f -exec ls -l {} \; 查找当前目录下是否有普通文件,若有则执行ls -l (4)xargs命令 在 使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec。不幸的是,有些系统对能够传递给exec的命 令长度有限制,这样find命令运行几分钟之后就算出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs的用处所在,特别是与 find命令一起使用,exec会发起多个进程,而xargs会多个,只有一个 find ./ -perm -7 -print | xargs chmod o-w 查找权限为7的文件并传递给chmod处理 3.grep介绍 (1)grep 的一般格式为 grep [options] 基本正则表达式 [文件] 字符串参数最好采用是双引号括,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串 -c:只输出匹配行的记数 -i:不区分大小写(只适用于单个字符) -h:查询多个文件时不显示文件名 -H:只显示文件名 -l:查询多文件时只输出包含匹配字符的文件名 -n:只显示匹配行及其行号 -s:不显示不存在或无匹配文本的错误信息。 -v:显示不包含匹配文本的所有行。 (2)举例说明: grep ^[^210] myfile 匹配myfile中以非2、1、0开头的行 grep "[5-8][6-9][0-3]" myfile 匹配myfile中第一位为5|6|7|8,第二位6|7|8|9,第三位为0|1|2|3的三个字符的行 grep "4\{2,4\}" myfile 匹配myfile中含有44,444或4444的行 grep "\?" myfile匹配myfile中含有任意字符的行 (3)grep命令类名 [[:upper:]] 表示[A-Z] [[:alnum:]] 表示[0-9a-zA-Z] [[:lower:]] 表示[a-z] [[:space:]] 表示空格或者tab键 [[:digit:]] 表示[0-9] [[:alpha:]] 表示[a-zA-Z] 如:grep "5[[:digit:]][[:digit:]]" myfile 匹配myfile中含有5开头接下去两位都是数字的行。 4.awk介绍 可以从文件或字符串中基于指定规则浏览和抽取信息,是一种自解释的变成语言。 (1)awk命令行方式 awk [-F filed-spearator] 'command' input-files awk脚本:所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。awk脚本是由各种操作和模式组成。 模式部分决定动作语句何时触发及触发事件。(BEGIN,END) 动作对数据进行处理,放在{}内指明(print) (2)分隔符、域和记录 awk执行时,其浏览域标记为$1,$2,...$n.这种方法成为域标识。$0为所有域。 (3)举例说明: awk '{print $0}' test.txt |tee test.out 输出test.txt中所有行$0表示所有域 awk -F : '{print $1} test.txt |tee test.out' 同上。。只是分隔符为":" awk 'BEGIN {print "IPDate\n"}{print $1 "\t" $4} END{print "end-of-report"}' test.txt 开始时打印“IPDate”结束时打印“end-of-report”中间打印主体信息,比如总共匹配三条信息,则输出如下: IPDate 1 first 2 second 3 third end-of-report (4)匹配操作符 ~ 匹配,!~ 不匹配 cat test.txt |awk '$0~/210.34.0.13/' 匹配test.txt中为210.34.0.13的行 awk '$0!~/210.34.0.13' test.txt 匹配test.txt中不是210.34.0.13的行 awk '{if($1=="210.34.0.13") print $0}' test.txt 匹配 test.txt中第一个域为210.34.0.13的行。5.sed介绍 sed不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。 sed是一种很重要的文本过滤工具,使用一行命令或者使用管道与grep与awk相结合。是一种非交互性文本流编辑。 (1)调用sed的三种方式 使用sed命令行格式为:sed [options] sed命令 输入文件 使用sed脚本文件格式为:sed[options] -f sed脚本文件 输入文件 sed脚本文件[options] 输入文件 --不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中接受输入,一般是键盘或重定向结果。 (2)sed 命令的options如下 -n:不打印 -c:下一命令是编辑命令 -f:如果正在调用sed脚本文件 (3)sed在文件中查询文本的方式 --使用行号,可以是一个简单的数字,或是一个行号的范围 --使用正则表达式 (4)读取文本的方式 x x为一行号 x,y 表示行号范围从x到y /pattern/ 查询包含模式的行 /pattern/pattern/ 查询包含两个模式的行 pattern/,x 在给定的行号上查询包含模式的行 x,/pattern/ 通过行号和模式查询匹配行 x,y! 查询不包含指定行号x和y的行 (5)基本sed编辑命令 p 打印匹配行 d 删除匹配行 = 显示文件行号 a\ 在定位行号后附加新文本信息 i\ 在定位行号后插入新文本信息 c\ 用新文本替换定位文本 s 使用替换模式替换相应模式 r 从另一个文件中读文件 w 写文本到一个文件 q 第一个模式匹配完成后推出或立即退出 l 显示与八禁止ASCII代码等价的控制字符 {} 在定位行执行的命令组 n 从另一个文件中读文本下一行,并附加在下一行 g 将模式2粘贴到/pattern n/ y 传送字符 (6)举例说明: sed -n '2p' test.txt 打印第二行的信息(注意:-n是不打印不匹配的信息,若没加-n,则打印文件的所有信息而不是匹配信息) sed -n '1,4p' test.txt 打印第一行到第四行的信息 sed -n '/los/p' test.txt模式匹配los,并打印出来 sed -n '2,/los/p' test.txt 从第二行开始。。知道匹配第一个los sed -n '/^$/p' test.txt 匹配空行 sed -n -e '/^$/p' -e '/^$/=' test.txt 打印空行及行号 sed -n '/good/a\morning' test.txt 在匹配到的good后面附加morning sed -n '/good/i\morning' test.txt 在匹配到的good前面插入morning sed -n '/good/c\morning' test.txt 将匹配到的good替换成morning sed '1,2d' test.txt 删除第1和2行 sed 's/good/good morning/g' test.txt 匹配good并替换成goodmorning send 's/good/& hello /p' test.txt 匹配到good就在其后面加上hello send 's/good/ hello &/p' test.txt 匹配到good就在其前面加上hello 6.合并与分割(sort,uniq,join,cut,paste,split) (1)sot命令 sort [options] files 许多不同的域按不同的列顺序排序 -c 测试文件是否已经排序 -m 合并两个排序文件 -u 删除所有同样行 -o 存储sort结果的输出文件名 -t 域分隔符,用非空格或tab开始排序 +n :n 为列号,使用此列号开始排序 -n 指定排序是域上的数字分类项 -r 比较求逆 sort -c test.txt 测试文件是否分类过 sort -u test.txt 排序并合并一样的行 sort -r test.txt 以相反的顺序排列 sort -t "/" +2 test.txt 以"/"分隔,第二个域开始分类 (2)uniq命令 uniq [options ] files 从一个文本文件中去除或禁止重复行 -u 只显示不重复行 -d 只显示有重复数据行,每种重复行只显示其中一行 -c 打印每一重复行出现次数 -f :n为数字,前n个域被忽略 uniq -f 2 test.txt 忽略前2个域 (3)join 命令 join [options] file1 file2 用来将来自两个分类文本文件的行连在一起 -an,n为一数字,用于连接时从文件n中显示不匹配行 -onm ,连接域,n为文件号,m为域号 -jnm,n为文件号,m为域号,使用其他域作连接域 -t ,域分隔符。用来设置非空格或tab键的域分隔符。 (4)split命令 split -output_file_size intput_filename output_filename 用来将大文件分割成小文件。 -b n,每个分割文件的大小n -C n,每个分割文件一行最多n字节 -l n,每个分割文件的行数 -n,同-l n split -10 test.txt 将test.txt分割成10行的小文件 (5)cut 命令 cut -c n1-n2 filename 显示每行从开头算起 n1 到 n2 的文字。 cut -c 3-5 test.txt 显示test.txt中每行从第3到第5个字符 链接自http://blog.sina.com.cn/s/blog_691a84f301015khx.html
DNS缓存可以加快网站IP的解析速度,所以大多数系统都支持DNS缓存。DNS的缓存时间是24小时,也就是每隔24小时DNS缓存将被自动清除。如果某些网站更新了DNS信息,而本机又没到自动清除的时间,这时,我们就要手动清除DNS缓存,最简单的方法如下。 在终端中运行如下命令,以清除DNS缓存: $sudo /etc/init.d/dns-clean start
# cat /etc/resolv.conf # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN 注意看: 1 /etc/resolv.conf 其实是一个Link 它其实指向的是 /run/resolvconf/resolv.conf 3 如果想自己定义 nameserver,那么有以下2个办法: A 在网卡的配置文件/etc/network/interfaces 里面加: dns-nameservers 192.168.3.45 192.168.8.10 dns-search foo.org bar.com 重启网络 sudo service networking restart 或者 sudo /etc/init.d/networking restart 也可以重启网卡 sudo ifconfig eth0 down sudo ifconfig eth0 up B 修改 resolvconf服务的配置文件: /etc/resolvconf/resolv.conf.d/base echo "search test.com" >> /etc/resolvconf/resolv.conf.d/base echo "nameserver 202.106.0.20 " >> /etc/resolvconf/resolv.conf.d/base 这样,在机器重启或 resolvconf 服务重启 都可以保证配置会写到/etc/resolv.conf 里面 重启 resolvconf 服务 service resolvconf restart A比B的优先级更高,,不过可能会断网.
server2008 iis7,出错上面的错误 . 提示的原因可能是net未完整安装导致的. 解决方法: 1、开始->运行cmd命令窗->以管理员身份运行: %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i 或者 "%WINDIR%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe" -iru -enable 2、IIS应用程序池->基本设置->托管管道改为“集成”
postfix疯狂外发垃圾邮件之分析与解决 本周二上班有人反应公司邮箱无法外发邮件,后来登录到服务器查看原因,不看不知道,一看吓一跳,服务器日志疯狂滚动!一看全是被其它邮件服务器拒绝的信息!由于这台服务器以前不是我管,连配置文件都find了好久,最终从十多个main.cf中找到了真正的配置文件...... 下面开始分析问题与解决问题! 分析 localhost# find / -name main.cf ....... /usr/local/etc/postfix/main.cf /usr/opt/software/postfix-2.8.9/conf/main.cf /etc/postfix/main.cf 这么多配置文件也不知道具体是哪个,但根据常理,最有可能的便是/etc/postfix/main.cf了。 打开/etc/postfix/main.cf来看看。 localhost# cat /etc/postfix/main.cf | grep -v # | grep -v ^$ queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix mail_owner = postfix myhostname = mail.example.com mydomain = example.com myorigin = $mydomain unknown_local_recipient_reject_code = 550 debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 sendmail_path = /usr/sbin/sendmail newaliases_path = /usr/bin/newaliases mailq_path = /usr/bin/mailq setgid_group = maildrop html_directory = no manpage_directory = /usr/local/man sample_directory = /etc/postfix message_size_limit = 512000000 virtual_mailbox_limit = 1024000000 readme_directory = /usr/local/share/doc/postfix virtual_mailbox_base = /usr/opt/home/domains virtual_uid_maps = static:1000 virtual_gid_maps = static:1000 virtual_alias_maps = $alias_maps, MySQL:/etc/postfix/mysql_virtual_alias_maps.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf smtpd_sasl_auth_enable = yes broken_sasl_auth_clients = yes smtpd_sasl_local_domain = $myhostname smtpd_sasl_security_options = noanonymous smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, dspam_destination_recipient_limit = 1 mydestination = smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender_access smtpd_client_restrictions = reject_rbl_client cblless.anti-spam.org.cn, reject_rbl_client cdl.anti-spam.org.cn, reject_rbl_client opm.blitzed.org, reject_rbl_client bl.spamcop.NET localhost# vi /etc/postfix/sender_access carr.chee@aol.com REJECT Henry.bny5@hotmail.com REJECT pmck.hsr69@yahoo.com REJECT ........ 由以上配置文件可以看到,我们对发信者的检测仅限于sender_access。仅仅只是拒绝了sender_access中拒绝的用户。而没有其它任何限制。限制条件很宽松。 截取部分日志分析 localhost# tail /var/log/maillog Oct 22 16:36:01 localhost postfix/error[18675]: 42263221CA: to=<altoact@verizon.Net>, relay=none, delay=111421, delays=105070/6348/0/2.6, dsn=4.0.0, status=deferred (delivery temporarily suspended: host relay.verizon.net[206.46.232.11] refused to talk to me: 571 Email from 124.172.224.76 is currently blocked by Verizon Online's anti-spam system. The email sender or Email Service Provider may visit http://www.verizon.net/whitelist and request removal of the block. 121022) Oct 22 16:36:01 localhost postfix/qmgr[32357]: 184F627BF64: from=<lindawatts338@yahoo.com.hk>, size=2338, nrcpt=50 (queue active) Oct 22 16:36:01 localhost postfix/smtp[18300]: 1C34F26235C: to=<andrew.rawson@honeywell.com>, relay=mail2.honeywell.com[199.61.24.28]:25, delay=110287, delays=110274/11/2.4/0, dsn=4.0.0, status=deferred (host mail2.honeywell.com[199.61.24.28] refused to talk to me: 554 mail2.honeywell.com) Oct 22 16:36:01 localhost postfix/smtp[18288]: connect to news-daily.com.inbound15.mxlogicmx.net[208.65.144.12]:25: Connection refused 发现全是一些被defferred的信息。其它邮件服务器已经拒绝我们投递。 那么再用mailq命令来查看一下队列文件。 结果发现mailq刷屏刷得没完没了了。太多缓存的邮件! localhost# mailq -Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient------- 5D1477C0D* 2333 Mon Oct 22 18:36:47 jrobert299@yahoo.com.hk (delivery temporarily suspended: host mx.west.cox.net[68.6.19.3] refused to talk to me: 554 fed1rmimpi210 cox 124.172.224.76 blocked. Error Code: IPBL0100 - Refer to Error Codes section at http://postmaster.cox.net/confluence/display/postmaster/Error+Codes for more information.) n_jhenderson@cox.net 截取其中一个例子来分析,可分为五部分来看。 1,5D1477C0D* 是指缓存邮件的ID 2,2333 是指邮件的大小。 3,jrobert299@yahoo.com.hk 是指发件人。 4,(delivery temporarily suspended: host mx.west.cox.net[68.6.19.3] refused to talk to me: 554 fed1rmimpi210 cox 124.172.224.76 blocked. Error Code: IPBL0100 - Refer to Error Codes section at http://postmaster.cox.net/confluence/display/postmaster/Error+Codes for more information.) 通过第4段信息我们可以得到如下信息: delivery temporarily suspended告诉我们邮件投递被延迟。 host mx.west.cox.net[68.6.19.3] refused to talk to me 告诉我们投递给mx.west.cox.net[68.6.19.3] 的邮件服务器拒收我们的信件。 124.172.224.76 我们邮件服务器的Ip地址。 Error Code: IPBL0100 - Refer to Error Codes section at http://postmaster.cox.net/confluence/display/postmaster/Error+Codes for more information.) 通过http://postmaster.cox.net/confluence/display/postmaster/Error+Codes 上查看更多拒收的原因。 5,n_jhenderson@cox.net 收件人地址! 由上面的日志我们可以知道 1,我们的邮件服务器的发件人地址被伪造了! 2,我们邮件服务器已经被很多其它邮件服务器列入了黑名单 3,收件人并非我们认识的人 结论,这个邮件服务器很可能被入侵,且被当作垃圾邮件的中继者。 那么,谁会是这个入侵者呢?倒底是什么漏洞导致的? 下面来让找到事件的源头。 首先,根据上面的分析,我们知道发件人和收件人都不是邮件服务器所在域的成员。那么我们就得考虑我们的邮件服务器是不是一个开放的中继(open relay)。 验证: [root@mail ~]# telnet mail.example.com 25 Trying 124.172.224.76... Connected to mail.example.com (124.172.224.76). Escape character is '^]'. 220 mail.example.com ESMTP Postfix helo aa@bb.com 250 mail.example.com mail from:aa@bb.com 250 2.1.0 Ok rcpt to:445335413@qq.com 554 5.7.1 <445335413@qq.com>: Relay access denied 可以看到,我们不经过认证发送邮件给qq邮箱并没有成功。所以,这并不是一个open relay的服务器!既然如此,那别人想用我的邮件服务器外发邮件,那么就必需要通过认证才可以。那么让我们用认证的方式登录并偿试伪造发信人地址外发邮件! 先将用户名和密码经过base64编码。 [root@mail ~]# perl -MMIME::Base64 -e "print encode_base64('123456');" MTIzNDU2 [root@mail ~]# perl -MMIME::Base64 -e "print encode_base64('test1@example.com');" dGVzdDFAZXhhbXBsZS5jb20= 验证: [root@mail ~]# telnet mail.example.com 25 Trying 124.172.224.76... Connected to mail.example.com (124.172.224.76). Escape character is '^]'. 220 mail.example.com ESMTP Postfix auth login 334 VXNlcm5hbWU6 dGVzdDFAZXhhbXBsZS5jb20= 334 UGFzc3dvcmQ6 MTIzNDU2 235 2.7.0 Authentication successful mail from:test@yahoo.com 250 2.1.0 Ok rcpt to:445335413@qq.com 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> hello inveracious test! . 250 2.0.0 Ok: queued as 99F4C23F008 quit 221 2.0.0 Bye Connection closed by foreign host. 上面我用认证用户test1@example.com登录后,伪造成test@yahoo.com来发信。结果显示成功!我们再回到服务器端看看有什么日志产生! localhost# tail /var/log/maillog Oct 26 02:54:27 localhost postfix/qmgr[40723]: 99F4C23F008: from=<test@yahoo.com>, size=197, nrcpt=1 (queue active) Oct 26 02:54:27 localhost postfix/smtp[41094]: 99F4C23F008: to=<445335413@qq.com>, relay=mx3.qq.com[119.147.192.199]:25, delay=110, delays=109/0/0.04/0.1, dsn=5.0.0, status=bounced (host mx3.qq.com[119.147.192.199] said: 550 Mail content denied. http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000726 (in reply to end of DATA command)) Oct 26 02:54:27 localhost postfix/cleanup[41089]: 69EA423F027: message-id=<20121025185427.69EA423F027@mail.example.com> Oct 26 02:54:27 localhost postfix/bounce[41095]: 99F4C23F008: sender non-delivery notification: 69EA423F027 Oct 26 02:54:27 localhost postfix/qmgr[40723]: 69EA423F027: from=<>, size=2203, nrcpt=1 (queue active) Oct 26 02:54:27 localhost postfix/qmgr[40723]: 99F4C23F008: removed 日志显示邮件ID为99F4C23F008的邮件,发件人是test@yahoo.com。接收服务器是mx3.qq.com的25端口。状态是被退回。通过http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000726 可以查看到拒绝原因。 经过认证登录后的用户,可以伪造发件人随意外发邮件! 由以上信息我们可以推断,很可能是由于别人盗用了我们的账号,然后利用我们的账号伪造其它发信人,疯狂外发邮件!那么,我们现在需要从三方面着手。 1,找出真正的发件人是哪个合法用户并马上修改密码。 2,阻止邮件继续疯狂外发。 3,禁止认证用户伪造发件人外发邮件。 解决 1,找出可能被盗号的用户! 通过maillog虽然看不到被拒绝邮件到底是谁发出的,但可以看到被拒绝投递的邮件ID.就比如下面两封邮件的ID分别为45C4E130CB 4728312BBA。这时候,我们可以查找到一些收信地址比较可疑的邮件来分析。 localhost# tail /var/log/maillog Oct 22 16:41:38 localhost postfix/error[18801]: 45C4E130CB: to=<blantonlarry@bellsouth.net>, relay=none, delay=101364, delays=95002/6357/0/5.3, dsn=4.0.0, status=deferred (delivery temporarily suspended: host gateway-f1.isp.att.net[204.127.217.16] refused to talk to me: 550-124.172.224.76 blocked by ldap:ou=rblmx,dc=att,dc=net 550 Error - Blocked for abuse. See http://att.net/blocks) Oct 22 16:41:38 localhost postfix/error[18103]: 4728312BBA: to=<bhaitov@yahoo.com>, relay=none, delay=102971, delays=96576/6386/0/9.8, dsn=4.7.1, status=deferred (delivery temporarily suspended: host mta5.am0.yahoodns.net[66.94.237.139] refused to talk to me: 421 4.7.1 [TS03] All messages from 124.172.224.76 will be permanently deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/421-ts03.html) ..... 我们可以通过postcat -q命令来查看指定ID邮件的详细内容。比如我觉得ID为2FDF423FA50的邮件很可疑,那么让我们详细看看邮件: localhost# postcat -q 2FDF423FA50 *** ENVELOPE RECORDS deferred/2/2FDF423FA50 *** message_size: 2428 4714 50 0 2428 message_arrival_time: Wed Oct 24 06:18:07 2012 create_time: Wed Oct 24 06:18:08 2012 named_attribute: log_ident=2FDF423FA50 named_attribute: rewrite_context=remote named_attribute: sasl_method=LOGIN <-----sasl认证通过 named_attribute: sasl_username=info@example.com <-------认证用户名 sender: lindawatts101@yahoo.com.hk <-----伪造的发信者 named_attribute: log_client_name=unknown named_attribute: log_client_address=68.167.29.196 <----登录客户端的ip named_attribute: log_client_port=1464 named_attribute: log_message_origin=unknown[68.167.29.196] named_attribute: log_helo_name=User named_attribute: log_protocol_name=ESMTP named_attribute: client_name=unknown named_attribute: reverse_client_name=h-68-167-29-196.mclnva23.static.covad.net named_attribute: client_address=68.167.29.196 named_attribute: client_port=1464 named_attribute: helo_name=User named_attribute: protocol_name=ESMTP named_attribute: client_address_type=2 named_attribute: dsn_orig_rcpt=rfc822;ajagoodin@yahoo.com original_recipient: ajagoodin@yahoo.com recipient: ajagoodin@yahoo.com <------收件人1 named_attribute: dsn_orig_rcpt=rfc822;ajagostinelli@cox.net original_recipient: ajagostinelli@cox.net <------收件人2 recipient: ajagostinelli@cox.net named_attribute: dsn_orig_rcpt=rfc822;ajagra2001@yahoo.com original_recipient: ajagra2001@yahoo.com <------收件人3 recipient: ajagra2001@yahoo.com ......... 通过上面的这封邮件,我们可以知道,这封邮件是由info@example.com.这个用户来认证登录的。登录者IP 68.167.29.196。该用户将发信人伪造成:lindawatts101@yahoo.com.hk。并且同时发送很多封邮件出去! 如果真存在lindawatts101@yahoo.com.hk这个用户的话,那这个用户信箱估计也被塞满了无数退信邮件. 很显然,上面这封邮件并不是一封正常邮件!通过这封邮件很快就可以确定这个用户的密码很可能是被别人破解了!或者邮件系统有其它漏洞,入侵者亲自建立了该用户用来群发邮件。 搜索/var/spool/postfix/defrred目录下面的ip 68.167.29.196,发现有5600邮件被阻塞着。而且还在不断增加。且用户均为info@example.com。可以确定,IP 68.167.29.196为入侵者。 localhost# cd /var/spool/postfix/defrred localhost# find . -exec grep "68.167.29.196" {} \; | wc -l 5625 登录数据库查看info@example.com这个用户的创建情况。这个在webman管理后台上面是看不到的。 localhost# /usr/opt/local/mysql-5.1.47/bin/mysql -uextmail -pextmail mysql> select * from mailbox where username='info@example.com'\G; *************************** 1. row *************************** username: info@example.com uid: info password: $1$RpyMEokE$CK31uufL9uNk6PjqSorXa1 clearpwd: name: mailhost: maildir: example.com/info/Maildir/ homedir: example.com/info quota: 524288000S netdiskquota: 524288000S domain: example.com uidnumber: 1000 gidnumber: 1000 createdate: 2012-04-25 15:35:54 <-----创建日期 expiredate: 0000-00-00 active: 1 disablepwdchange: 0 disablesmtpd: 0 disablesmtp: 0 disablewebmail: 0 disablenetdisk: 0 disableimap: 1 disablepop3: 0 question: answer: 1 row in set (0.00 sec) mysql> select * from manager; +------------------+------------------------------------+-------+------+------------+-------------+-----------+------------------+---------------------+------------+--------+ | username | password | type | uid | name | question | answer | disablepwdchange | createdate | expiredate | active | +------------------+------------------------------------+-------+------+------------+-------------+-----------+------------------+---------------------+------------+--------+ | root@extmail.org | $1$ZwYBBBz1$mh.Uwro5vqXMwYum0eprq/ | admin | root | Super User | my question | my answer | 0 | 2007-02-14 15:10:04 | 2010-11-08 | 1 | +------------------+------------------------------------+-------+------+------------+-------------+-----------+------------------+---------------------+------------+--------+ 管理员账号只有一个,info@example.com也不是新建的。那应该是Info@example.com的用户密码被破解了。 来看看info@example.com这个用户的登录日志。发现全是由68.167.29.196的主机登录的。 localhost# cat /var/log/maillog | grep info@example.com Oct 24 00:32:10 localhost postfix/smtpd[4202]: 8F005249014: client=unknown[68.167.29.196], sasl_method=LOGIN, sasl_username=info@example.com Oct 24 00:32:16 localhost postfix/smtpd[5029]: 11044249024: client=unknown[68.167.29.196], sasl_method=LOGIN, sasl_username=info@example.com Oct 24 00:32:17 localhost postfix/smtpd[4626]: 930FB249028: client=unknown[68.167.29.196], sasl_method=LOGIN, sasl_username=info@example.com Oct 24 00:32:17 localhost postfix/smtpd[4765]: A890624902B: client=unknown[68.167.29.196], sasl_method=LOGIN, sasl_username=info@example.com 登录extman,将info@example.com这个用户的密码改掉。 我们登录info@example.com来看看用户情况。结果发现有一万多封退信信息,由于这个账号没人用,所以一直未发现这个问题。 2,清除所有缓存垃圾邮件,阻止邮件服务器继续偿试外发! 清除defer和deferred目录下的缓存邮件 我们来瞧瞧邮件缓存目录 localhost# du -sh /var/spool/postfix/* 2.1G /var/spool/postfix/defer 2.7G /var/spool/postfix/deferred 可以看到,被延迟发送的邮件占用了5个g的空间! 清除邮件中的所有队列 localhost# postsuper -d ALL postsuper: Deleted: 292551 messages 共清除了将近30万封缓存的邮件。 如果缓存邮件里面有重要邮件,不能删除所有邮件,那么也可以写一个脚本,只清除所有属于68.167.29.196的缓存邮件。 localhost# vi deldefer.sh #删除defferred中的缓存 cd /var/spool/postfix/deferred/ find . -exec grep 68.167.29.196 {} \; | awk '{print $3}' | cut -d/ -f3 >/tmp/del.txt for i in `cat /tmp/del.txt` do postsuper -d "$i" done rm -rf /tmp/del.txt #删除deffer中的缓存 cd /var/spool/postfix/defer for i in `find .|cut -d/ -f3` do postcat -q $i |grep 68.167.29.196 if [ $? -eq 0 ]; then echo $i >> /tmp/defer.txt postsuper -d $i fi done rm -rf /tmp/defer.txt 脚本说明: 在删除deffer和defferred下面的缓存邮件的脚本是不同的。由于defer下的缓存邮件用cat直接查看是看不到发件人及登录ip等详细信息的,需要用postcat来查看才能显示出详细的信息。所以deffer目录里的清除脚本写法和上面defferred的有些不同。注意:在删除了deferred下面的缓存后,如果不删除defer的缓存,defer下的邮件仍然会被不停的投递出去,直到最后变为deferred之后才会放弃。所以,如果只删除deferred下面的邮件而不删除defer下面的邮件的话,过不了多久,deferred下面又会出现大量邮件,而这个邮件是由defer目录下的缓存引起的。 ------------------------------------------------------- 再次查看缓存目录,容量终于恢复正常值。 localhost# du -sh /var/spool/postfix/* 162K /var/spool/postfix/defer 46K /var/spool/postfix/deferred 删除info@example.com用户邮箱的退信邮件 下面该删除info@example.com用户的所有退信邮件了.通过查看邮件发现所有的垃圾邮件均是今天一天生成的。到服务器端查找并删除今天的所有邮件。 进入到info用户的邮件目录 localhost# cd /usr/opt/home/domains/example.com/info/Maildir/ 可以看到有12779封邮件。 localhost# ls -l cur/ |wc -l 12779 查找今天生成的邮件,共11589封 localhost# find cur/ -ctime -1 | wc -l 11589 删除所有今天的邮件 localhost# find cur/ -ctime -1 -exec rm -f {} \; 删除完毕! 注意find cur/ -ctime -1 -exec rm -f {} \; 中是rm -f !不要写成了rm -rf。否则一执行就把cur目录给删掉了。那么用户以前的邮件也全带着一起删除了! 至此,邮件服务器终于恢复了正常运行。再次用tail -f 来查看日志,不会再出现那恐怖的疯狂刷屏日志了!疯狂的服务器终于恢复了原来的悠闲状态! 3,禁止认证用户假冒发信人外发 修改main.cf配置文件,增加发信人限制功能! localhost# vi main.cf mynetworks = 127.0.0.0/8 smtpd_sender_restrictions = permit_mynetworks, reject_sender_login_mismatch, reject_non_fqdn_sender, reject_authenticated_sender_login_mismatch, reject_unauthenticated_sender_login_mismatch, reject_non_fqdn_recipient, reject_invalid_hostname, reject_unknown_sender_domain, check_sender_access hash:/etc/postfix/sender_access smtpd_sender_login_maps = mysql:/etc/postfix/mysql_virtual_sender_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_maps.cf localhost# postfix reload 在客户端测试效果: 客户端伪造发信人测试,test1@example.com伪造成发件人test@yahoo.com未成功! [root@mail ~]# perl -MMIME::Base64 -e "print encode_base64('123456');" MTIzNDU2 [root@mail ~]# perl -MMIME::Base64 -e "print encode_base64('test1@example.com');" dGVzdDFAZXhhbXBsZS5jb20= [root@mail ~]# telnet mail.example.com 25 Trying 124.172.224.76... Connected to mail.example.com (124.172.224.76). Escape character is '^]'. auth login 220 mail.example.com ESMTP Postfix 334 VXNlcm5hbWU6 dGVzdDFAZXhhbXBsZS5jb20= 334 UGFzc3dvcmQ6 MTIzNDU2 235 2.7.0 Authentication successful mail from:test@yahoo.com 250 2.1.0 Ok rcpt to:445335413@qq.com 553 5.7.1 <test@yahoo.com>: Sender address rejected: not owned by user test1@example.com 客户端用真实的地址发信测试成功 [root@mail ~]# telnet mail.example.com 25 Trying 124.172.224.76... auConnected to mail.example.com (124.172.224.76). Escape character is '^]'. 220 mail.example.com ESMTP Postfix auth login 334 VXNlcm5hbWU6 dGVzdDFAZXhhbXBsZS5jb20= 334 UGFzc3dvcmQ6 MTIzNDU2 235 2.7.0 Authentication successful mail from:test1@example.com 250 2.1.0 Ok rcpt to:445335413@qq.com 250 2.1.5 Ok Ok,测试成功! 关于邮件服务器被yahoo,gmail,hotmail等邮件服务器列入黑名单问题,这个最好是换个ip地址吧。一个个申诉太麻烦了!
对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,但是很多Linux系统初始并没有这两个命令。今天,我们就简单的讲解一下如何安装和使用rz、sz命令。 1.软件安装 (1)编译安装 root 账号登陆后,依次执行以下命令: 1 cd /tmp 2 wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz 3 tar zxvf lrzsz-0.12.20.tar.gz && cd lrzsz-0.12.20 4 ./configure && make && make install 上面安装过程默认把lsz和lrz安装到了/usr/local/bin/目录下,现在我们并不能直接使用,下面创建软链接,并命名为rz/sz: 1 cd /usr/bin 2 ln -s /usr/local/bin/lrz rz 3 ln -s /usr/local/bin/lsz sz (2)yum安装 root 账号登陆后执行以下命令: 1 yum install -y lrzsz 2.使用说明 sz命令发送文件到本地: 1 # sz filename rz命令本地上传文件到服务器: 1 # rz 执行该命令后,在弹出框中选择要上传的文件即可。 说明:打开SecureCRT软件 -> Options -> session options -> X/Y/Zmodem 下可以设置上传和下载的目录。
wget http://down.linuxprobe.com/Tools/cmake-2.8.11.2.tar.gz wget http://down.linuxprobe.com/Tools/Discuz_X3.2_SC_GBK.zip wget http://down.linuxprobe.com/Tools/freetype-2.5.3.tar.gz wget http://down.linuxprobe.com/Tools/jpegsrc.v9a.tar.gz wget http://down.linuxprobe.com/Tools/libgd-2.1.0.tar.gz wget http://down.linuxprobe.com/Tools/libmcrypt-2.5.8.tar.gz wget http://down.linuxprobe.com/Tools/libpng-1.6.12.tar.gz wget http://down.linuxprobe.com/Tools/libvpx-v1.3.0.tar.bz2 wget http://down.linuxprobe.com/Tools/mysql-5.6.19.tar.gz wget http://down.linuxprobe.com/Tools/nginx-1.6.0.tar.gz wget http://down.linuxprobe.com/Tools/openssl-1.0.1h.tar.gz wget http://down.linuxprobe.com/Tools/php-5.5.14.tar.gz wget http://down.linuxprobe.com/Tools/pcre-8.35.tar.gz wget http://down.linuxprobe.com/Tools/t1lib-5.1.2.tar.gz wget http://down.linuxprobe.com/Tools/tiff-4.0.3.tar.gz wget http://down.linuxprobe.com/Tools/yasm-1.2.0.tar.gz wget http://down.linuxprobe.com/Tools/zlib-1.2.8.tar.gzyum install -y apr* autoconf automake bison bzip2 bzip2* compat* cpp curl curl-devel fontconfig fontconfig-devel freetype freetype* freetype-devel gcc gcc-c++ gd gettext gettext-devel glibc kernel kernel-headers keyutils keyutils-libs-devel krb5-devel libcom_err-devel libpng libpng-devel libjpeg* libsepol-devel libselinux-devel libstdc++-devel libtool* libgomp libxml2 libxml2-devel libXpm* libtiff libtiff* make mpfr ncurses* ntp openssl openssl-devel patch pcre-devel perl php-common php-gd policycoreutils telnet t1lib t1lib* nasm nasm* wget zlib-devel [root@linuxprobe ~]# iptables -F [root@linuxprobe ~]# firewall-cmd --permanent --add-service=mysql success [root@linuxprobe ~]# firewall-cmd --permanent --add-service=http success [root@linuxprobe ~]# firewall-cmd --reload success 下载所有需要使用的软件包到/usr/local/src目录(17个文件): [root@linuxprobe ~]# cd /usr/local/src [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/cmake-2.8.11.2.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/Discuz_X3.2_SC_GBK.zip [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/freetype-2.5.3.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/jpegsrc.v9a.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/libgd-2.1.0.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/libmcrypt-2.5.8.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/libpng-1.6.12.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/libvpx-v1.3.0.tar.bz2 [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/mysql-5.6.19.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/nginx-1.6.0.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/openssl-1.0.1h.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/php-5.5.14.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/pcre-8.35.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/t1lib-5.1.2.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/tiff-4.0.3.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/yasm-1.2.0.tar.gz [root@linuxprobe src]# wget http://down.linuxprobe.com/Tools/zlib-1.2.8.tar.gz 安装编译工具及库文件(需要安装的程序比较多,请复制全!): [root@linuxprobe ~]# yum install -y apr* autoconf automake bison bzip2 bzip2* compat* cpp curl curl-devel fontconfig fontconfig-devel freetype freetype* freetype-devel gcc gcc-c++ gd gettext gettext-devel glibc kernel kernel-headers keyutils keyutils-libs-devel krb5-devel libcom_err-devel libpng libpng-devel libjpeg* libsepol-devel libselinux-devel libstdc++-devel libtool* libgomp libxml2 libxml2-devel libXpm* libtiff libtiff* make mpfr ncurses* ntp openssl openssl-devel patch pcre-devel perl php-common php-gd policycoreutils telnet t1lib t1lib* nasm nasm* wget zlib-devel Loaded plugins: langpacks, product-id, subscription-manager This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. ………………省略部分安装过程……………… Installing: apr x86_64 1.4.8-3.el7 rhel7 103 k apr-devel x86_64 1.4.8-3.el7 rhel7 188 k apr-util x86_64 1.5.2-6.el7 rhel7 92 k apr-util-devel x86_64 1.5.2-6.el7 rhel7 76 k autoconf noarch 2.69-11.el7 rhel7 701 k automake noarch 1.13.4-3.el7 rhel7 679 k bison x86_64 2.7-4.el7 rhel7 578 k bzip2-devel x86_64 1.0.6-12.el7 rhel7 218 k compat-dapl x86_64 1:1.2.19-3.el7 rhel7 109 k compat-db-headers noarch 4.7.25-27.el7 rhel7 48 k compat-db47 x86_64 4.7.25-27.el7 rhel7 795 k compat-gcc-44 x86_64 4.4.7-8.el7 rhel7 10 M compat-gcc-44-c++ x86_64 4.4.7-8.el7 rhel7 6.3 M compat-glibc x86_64 1:2.12-4.el7 rhel7 1.2 M compat-glibc-headers x86_64 1:2.12-4.el7 rhel7 452 k compat-libcap1 x86_64 1.10-7.el7 rhel7 19 k compat-libf2c-34 x86_64 3.4.6-32.el7 rhel7 155 k compat-libgfortran-41 x86_64 4.1.2-44.el7 rhel7 142 k compat-libtiff3 x86_64 3.9.4-11.el7 rhel7 135 k compat-openldap x86_64 1:2.3.43-5.el7 rhel7 174 k cpp x86_64 4.8.2-16.el7 rhel7 5.9 M fontconfig-devel x86_64 2.10.95-7.el7 rhel7 128 k freetype-devel x86_64 2.4.11-9.el7 rhel7 355 k gcc x86_64 4.8.2-16.el7 rhel7 16 M gcc-c++ x86_64 4.8.2-16.el7 rhel7 7.1 M gettext-devel x86_64 0.18.2.1-4.el7 rhel7 315 k kernel-headers x86_64 3.10.0-123.el7 rhel7 1.4 M keyutils-libs-devel x86_64 1.5.8-3.el7 rhel7 37 k krb5-devel x86_64 1.11.3-49.el7 rhel7 611 k libXpm-devel x86_64 3.5.10-5.1.el7 rhel7 36 k libcom_err-devel x86_64 1.42.9-4.el7 rhel7 30 k libcurl-devel x86_64 7.29.0-19.el7 rhel7 296 k libjpeg-turbo-devel x86_64 1.2.90-5.el7 rhel7 99 k libpng-devel x86_64 2:1.5.13-5.el7 rhel7 122 k libselinux-devel x86_64 2.2.2-6.el7 rhel7 174 k libsepol-devel x86_64 2.1.9-3.el7 rhel7 71 k libstdc++-devel x86_64 4.8.2-16.el7 rhel7 1.5 M libtiff-devel x86_64 4.0.3-14.el7 rhel7 471 k libtool x86_64 2.4.2-20.el7 rhel7 588 k libtool-ltdl-devel x86_64 2.4.2-20.el7 rhel7 167 k libxml2-devel x86_64 2.9.1-5.el7 rhel7 1.0 M mpfr x86_64 3.1.1-4.el7 rhel7 203 k nasm x86_64 2.10.07-7.el7 rhel7 402 k ncurses-devel x86_64 5.9-13.20130511.el7 rhel7 713 k ncurses-term noarch 5.9-13.20130511.el7 rhel7 543 k ntp x86_64 4.2.6p5-18.el7 rhel7 539 k openssl-devel x86_64 1:1.0.1e-34.el7 rhel7 1.2 M patch x86_64 2.7.1-8.el7 rhel7 110 k pcre-devel x86_64 8.32-12.el7 rhel7 477 k php-common x86_64 5.4.16-21.el7 rhel7 559 k php-gd x86_64 5.4.16-21.el7 rhel7 122 k t1lib x86_64 5.1.2-14.el7 rhel7 166 k telnet x86_64 1:0.17-59.el7 rhel7 63 k zlib-devel x86_64 1.2.7-13.el7 rhel7 49 k Installing for dependencies: cyrus-sasl-devel x86_64 2.1.26-17.el7 rhel7 309 k expat-devel x86_64 2.1.0-8.el7 rhel7 56 k gettext-common-devel noarch 0.18.2.1-4.el7 rhel7 368 k git x86_64 1.8.3.1-4.el7 rhel7 4.3 M glibc-devel x86_64 2.17-55.el7 rhel7 1.0 M glibc-headers x86_64 2.17-55.el7 rhel7 650 k libX11-devel x86_64 1.6.0-2.1.el7 rhel7 979 k libXau-devel x86_64 1.0.8-2.1.el7 rhel7 14 k libdb-devel x86_64 5.3.21-17.el7 rhel7 38 k libmpc x86_64 1.0.1-3.el7 rhel7 51 k libverto-devel x86_64 0.2.5-4.el7 rhel7 12 k libxcb-devel x86_64 1.9-5.el7 rhel7 1.0 M libzip x86_64 0.10.1-8.el7 rhel7 49 k m4 x86_64 1.4.16-9.el7 rhel7 256 k openldap-devel x86_64 2.4.39-3.el7 rhel7 796 k perl-Data-Dumper x86_64 2.145-3.el7 rhel7 47 k perl-Error noarch 1:0.17020-2.el7 rhel7 32 k perl-Git noarch 1.8.3.1-4.el7 rhel7 52 k perl-TermReadKey x86_64 2.30-20.el7 rhel7 31 k perl-Test-Harness noarch 3.28-2.el7 rhel7 302 k perl-Thread-Queue noarch 3.02-2.el7 rhel7 17 k xorg-x11-proto-devel noarch 7.7-8.el7.1 rhel7 281 k xz-devel x86_64 5.1.2-8alpha.el7 rhel7 44 k ………………省略部分安装过程……………… Complete! 安装cmake编译工具(解压与编译过程已省略): [root@linuxprobe ~]# cd /usr/local/src [root@linuxprobe src]# ls zlib-1.2.8.tar.gz libmcrypt-2.5.8.tar.gz pcre-8.35.tar.gz cmake-2.8.11.2.tar.gz libpng-1.6.12.tar.gz php-5.5.14.tar.gz Discuz_X3.2_SC_GBK.zip libvpx-v1.3.0.tar.bz2 t1lib-5.1.2.tar.gz freetype-2.5.3.tar.gz mysql-5.6.19.tar.gz tiff-4.0.3.tar.gz jpegsrc.v9a.tar.gz nginx-1.6.0.tar.gz yasm-1.2.0.tar.gz libgd-2.1.0.tar.gz openssl-1.0.1h.tar.gz [root@linuxprobe src]# tar xzvf cmake-2.8.11.2.tar.gz [root@linuxprobe src]# cd cmake-2.8.11.2/ [root@linuxprobe cmake-2.8.11.2]# ./configure [root@linuxprobe cmake-2.8.11.2]# make [root@linuxprobe cmake-2.8.11.2]# make install 20.2.1 配置Mysql服务 在前面的章节中我们学习了MariaDB数据库管理系统,那么这次实验就学习下如何使用Mysql来管理数据库吧。 创建用于执行mysql服务程序的帐号: [root@linuxprobe cmake-2.8.11.2]# cd .. [root@linuxprobe src]# useradd mysql -s /sbin/nologin 创建数据库程序和文件的目录,并设置目录的所属与所组: [root@linuxprobe src]# mkdir -p /usr/local/mysql/var [root@linuxprobe src]# chown -Rf mysql:mysql /usr/local/mysql 安装Mysql服务程序(解压与编译过程已省略): [root@linuxprobe src]# tar xzvf mysql-5.6.19.tar.gz[root@linuxprobe src]# cd mysql-5.6.19/[root@linuxprobe mysql-5.6.19]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/var -DSYSCONFDIR=/etc[root@linuxprobe mysql-5.6.19]# make[root@linuxprobe mysql-5.6.19]# make install 删除系统默认的配置文件: [root@linuxprobe mysql-5.6.19]# rm -rf /etc/my.cnf 生成系统数据库(生成信息已省略): [root@linuxprobe mysql-5.6.19]# cd /usr/local/mysql[root@linuxprobe mysql]# ./scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var 创建配置文件的软连接文件: [root@linuxprobe mysql]# ln -s my.cnf /etc/my.cnf 将mysqld服务程序添加到开机启动项: [root@linuxprobe mysql]# cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld [root@linuxprobe mysql]# chmod 755 /etc/rc.d/init.d/mysqld [root@linuxprobe mysql]# chkconfig mysqld on 编辑启动项的配置文件: [root@linuxprobe mysql]# vim /etc/rc.d/init.d/mysqld //分别修改第46与47行,basedir为程序安装路径,datadir为数据库存放目录。 basedir=/usr/local/mysql datadir=/usr/local/mysql/var 重启mysqld服务程序: [root@localhost mysql]# service mysqld start Starting MySQL. SUCCESS! 把mysql服务程序命令目录添加到环境变量中(永久生效): [root@linuxprobe mysql]# vim /etc/profile //在配置文件的最下面追加: export PATH=$PATH:/usr/local/mysql/bin [root@linuxprobe mysql]# source /etc/profile ////////////////////////////////////////可不操作////////////////////////////////////////////////////////////////////////////将mysqld服务程序的库文件链接到默认的位置: [root@linuxprobe mysql]# mkdir /var/lib/mysql [root@linuxprobe mysql]# ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql [root@linuxprobe mysql]# ln -s /usr/local/mysql/include/mysql /usr/include/mysql [root@linuxprobe mysql]# ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 初始化mysqld服务程序: [root@linuxprobe mysql]# mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MySQL to secure it, we'll need the current password for the root user. If you've just installed MySQL, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MySQL root user without the proper authorisation. Set root password? [Y/n] y New password: 输入要为root用户设置的数据库密码。 Re-enter new password: 重复再输入一次密码。 Password updated successfully! Reloading privilege tables.. ... Success! By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] y(删除匿名帐号) ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] y(禁止root用户从远程登陆) ... Success! By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] y(删除test数据库并取消对其的访问权限) - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] y(刷新授权表,让初始化后的设定立即生效) ... Success! All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL! Cleaning up... 20.2.2 配置Nginx服务 Nginx是一款相当优秀的用于部署动态网站的服务程序,Nginx最初是为俄罗斯门户站点而设计的网站服务软件,作为一款轻量级的网站服务软件,因其稳定性和丰富的功能而深受信赖,但最最最被认可的是低系统资源、占用内存少且并发能力强,目前国内如新浪、网易、腾讯等门户站均在使用,市场占有份额一直保持在15-16%左右(2015年最新数据)。 Nginx程序的稳定性来自于它采用了分阶段的资源分配技术,使得CPU与内存占用率会非常低,所以使用Nginx程序部署动态网站环境不仅十分的稳定、高效,而且消耗更少的系统资源,丰富的模块功能也几乎与Apache程序数量相同,现在已经完全的支持了proxy、rewrite、mod_fcgi、ssl、vhosts等常用模块。而且还支持了热部署技术,即能够可以7*24不间断提供服务,即便运行数月也无须重启,而且还可以在不暂停服务的情况下直接对Nginx服务程序进行升级。 坦白来讲,虽然Nginx程序的代码质量非常高,代码很规范,技术成熟,模块扩展也很容易,但Nginx依然存在不少问题,比如Nginx是由俄罗斯人创建的,所以在资料文档方面还并不完善,中文教材的质量更是鱼龙混杂,但Nginx近年来增长势头迅猛,预测未来应该能够在轻量级HTTP服务器市场有不错的未来。 安装PCRE(Perl兼容的正则表达式库,解压与编译过程已省略): [root@linuxprobe ~]# cd /usr/local/src [root@linuxprobe src]# mkdir /usr/local/pcre [root@linuxprobe src]# tar xzvf pcre-8.35.tar.gz [root@linuxprobe src]# cd pcre-8.35 [root@linuxprobe pcre-8.35]# ./configure --prefix=/usr/local/pcre [root@linuxprobe pcre-8.35]# make [root@linuxprobe pcre-8.35]# make install 安装openssl服务程序(解压与编译过程已省略): [root@linuxprobe pcre-8.35]# cd /usr/local/src [root@linuxprobe src]# mkdir /usr/local/openssl [root@linuxprobe src]# tar xzvf openssl-1.0.1h.tar.gz [root@linuxprobe src]# cd openssl-1.0.1h [root@linuxprobe openssl-1.0.1h]# ./config --prefix=/usr/local/openssl [root@linuxprobe openssl-1.0.1h]# make [root@linuxprobe openssl-1.0.1h]# make install 把openssl服务程序命令目录添加到环境变量中(永久生效): [root@linuxprobe pcre-8.35]# vim /etc/profile //将配置文件最下面的参数追加参数为: export PATH=$PATH:/usr/local/mysql/bin:/usr/local/openssl/bin [root@linuxprobe pcre-8.35]# source /etc/profile 安装zlib数据压缩函数库(解压与编译过程已省略): [root@linuxprobe pcre-8.35]# cd /usr/local/src [root@linuxprobe src]# mkdir /usr/local/zlib [root@linuxprobe src]# tar xzvf zlib-1.2.8.tar.gz [root@linuxprobe src]# cd zlib-1.2.8 [root@linuxprobe zlib-1.2.8]# ./configure --prefix=/usr/local/zlib [root@linuxprobe zlib-1.2.8]# make [root@linuxprobe zlib-1.2.8]# make install 创建用于执行nginx服务的用户: [root@linuxprobe zlib-1.2.8]# cd .. [root@linuxprobe src]# useradd www -s /sbin/nologin 安装nginx服务程序(openssl,zlib,pcre要写成源码解压路径!!!): [root@linuxprobe src]# tar xzvf nginx-1.6.0.tar.gz [root@linuxprobe src]# cd nginx-1.6.0/ [root@linuxprobe nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --without-http_memcached_module --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-openssl=/usr/local/src/openssl-1.0.1h --with-zlib=/usr/local/src/zlib-1.2.8 --with-pcre=/usr/local/src/pcre-8.35 [root@linuxprobe nginx-1.6.0]# make [root@linuxprobe nginx-1.6.0]# make install 创建nginx程序脚本(将下面的参数直接复制进去即可): [root@linuxprobe nginx-1.6.0]# vim /etc/rc.d/init.d/nginx #!/bin/bash # nginx - this script starts and stops the nginx daemon # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /usr/local/nginx/conf/nginx.conf # pidfile: /usr/local/nginx/logs/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/local/nginx/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx make_dirs() { # make required directories user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -` if [ -z "`grep $user /etc/passwd`" ]; then useradd -M -s /bin/nologin $user fi options=`$nginx -V 2>&1 | grep 'configure arguments:'` for opt in $options; do if [ `echo $opt | grep '.*-temp-path'` ]; then value=`echo $opt | cut -d "=" -f 2` if [ ! -d "$value" ]; then # echo "creating" $value mkdir -p $value && chown -R $user $value fi fi done } start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 make_dirs echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { #configtest || return $? stop sleep 1 start } reload() { #configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac [root@linuxprobe nginx-1.6.0]# chmod 755 /etc/rc.d/init.d/nginx 重启nginx服务程序并添加到开机启动项: [root@linuxprobe nginx-1.6.0]# /etc/rc.d/init.d/nginx restart Restarting nginx (via systemctl): [ OK ] [root@linuxprobe nginx-1.6.0]# chkconfig nginx on 此时可以通过访问IP来判断nginx服务是否顺利运行: 20.2.3 配置php服务 安装yasm汇编器(解压与编译过程已省略): [root@linuxprobe nginx-1.6.0]# cd /usr/local/src [root@linuxprobe src]# tar zxvf yasm-1.2.0.tar.gz [root@linuxprobe src]# cd yasm-1.2.0 [root@linuxprobe yasm-1.2.0]# ./configure [root@linuxprobe yasm-1.2.0]# make [root@linuxprobe yasm-1.2.0]# make install 安装libmcrypt加密算法扩展库(解压与编译过程已省略): [root@linuxprobe yasm-1.2.0]# cd /usr/local/src [root@linuxprobe src]# tar zxvf libmcrypt-2.5.8.tar.gz [root@linuxprobe src]# cd libmcrypt-2.5.8 [root@linuxprobe libmcrypt-2.5.8]# ./configure [root@linuxprobe libmcrypt-2.5.8]# make [root@linuxprobe libmcrypt-2.5.8]# make install 安装libvpx视频编码器(解压与编译过程已省略): [root@linuxprobe libmcrypt-2.5.8]# cd /usr/local/src [root@linuxprobe src]# tar xjvf libvpx-v1.3.0.tar.bz2 [root@linuxprobe src]# cd libvpx-v1.3.0 [root@linuxprobe libvpx-v1.3.0]# ./configure --prefix=/usr/local/libvpx --enable-shared --enable-vp9 [root@linuxprobe libvpx-v1.3.0]# make [root@linuxprobe libvpx-v1.3.0]# make install 安装Tiff标签图像文件格式(解压与编译过程已省略): [root@linuxprobe libvpx-v1.3.0]# cd /usr/local/src [root@linuxprobe src]# tar zxvf tiff-4.0.3.tar.gz [root@linuxprobe src]# cd tiff-4.0.3 [root@linuxprobe tiff-4.0.3]# ./configure --prefix=/usr/local/tiff --enable-shared [root@linuxprobe tiff-4.0.3]# make [root@linuxprobe tiff-4.0.3]# make install 安装libpng图片(png格式)函数库(解压与编译过程已省略): [root@linuxprobe tiff-4.0.3]# cd /usr/local/src [root@linuxprobe src]# tar zxvf libpng-1.6.12.tar.gz [root@linuxprobe src]# cd libpng-1.6.12 [root@linuxprobe libpng-1.6.12]# ./configure --prefix=/usr/local/libpng --enable-shared [root@linuxprobe libpng-1.6.12]# make [root@linuxprobe libpng-1.6.12]# make install 安装freetype字体引擎(解压与编译过程已省略): [root@linuxprobe libpng-1.6.12]# cd /usr/local/src [root@linuxprobe src]# tar zxvf freetype-2.5.3.tar.gz [root@linuxprobe src]# cd freetype-2.5.3 [root@linuxprobe freetype-2.5.3]# ./configure --prefix=/usr/local/freetype --enable-shared [root@linuxprobe freetype-2.5.3]# make [root@linuxprobe freetype-2.5.3]# make install 安装jpeg图片(jpeg格式)函数库(解压与编译过程已省略): [root@linuxprobe freetype-2.5.3]# cd /usr/local/src [root@linuxprobe src]# tar zxvf jpegsrc.v9a.tar.gz [root@linuxprobe src]# cd jpeg-9a [root@linuxprobe jpeg-9a]# ./configure --prefix=/usr/local/jpeg --enable-shared [root@linuxprobe jpeg-9a]# make [root@linuxprobe jpeg-9a]# make install 安装libgd图像处理程序(解压与编译过程已省略): [root@linuxprobe jpeg-9a]# cd /usr/local/src [root@linuxprobe src]# tar zxvf libgd-2.1.0.tar.gz [root@linuxprobe src]# cd libgd-2.1.0 [root@linuxprobe libgd-2.1.0]# ./configure --prefix=/usr/local/libgd --enable-shared --with-jpeg=/usr/local/jpeg --with-png=/usr/local/libpng --with-freetype=/usr/local/freetype --with-fontconfig=/usr/local/freetype --with-xpm=/usr/ --with-tiff=/usr/local/tiff --with-vpx=/usr/local/libvpx [root@linuxprobe libgd-2.1.0]# make [root@linuxprobe libgd-2.1.0]# make install 安装t1lib图片生成函数库(解压与编译过程已省略): [root@linuxprobe cd libgd-2.1.0]# cd /usr/local/src [root@linuxprobe src]# tar zxvf t1lib-5.1.2.tar.gz [root@linuxprobe src]# cd t1lib-5.1.2 [root@linuxprobe t1lib-5.1.2]# ./configure --prefix=/usr/local/t1lib --enable-shared [root@linuxprobe t1lib-5.1.2]# make [root@linuxprobe t1lib-5.1.2]# make install 将函数库文件放至合适的位置: [root@linuxprobe t1lib-5.1.2]# cd /usr/local/src [root@linuxprobe src]# ln -s /usr/lib64/libltdl.so /usr/lib/libltdl.so [root@linuxprobe src]# cp -frp /usr/lib64/libXpm.so* /usr/lib/ 安装php服务程序(命令比较长,请一定要复制完整!!!): [root@linuxprobe src]# tar -zvxf php-5.5.14.tar.gz [root@linuxprobe src]# cd php-5.5.14 [root@linuxprobe php-5.5.14]# export LD_LIBRARY_PATH=/usr/local/libgd/lib [root@linuxprobe php-5.5.14]# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-mysql-sock=/tmp/mysql.sock --with-pdo-mysql=/usr/local/mysql --with-gd --with-png-dir=/usr/local/libpng --with-jpeg-dir=/usr/local/jpeg --with-freetype-dir=/usr/local/freetype --with-xpm-dir=/usr/ --with-vpx-dir=/usr/local/libvpx/ --with-zlib-dir=/usr/local/zlib --with-t1lib=/usr/local/t1lib --with-iconv --enable-libxml --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-opcache --enable-mbregex --enable-fpm --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --enable-session --with-mcrypt --with-curl --enable-ctype [root@linuxprobe php-5.5.14]# make [root@linuxprobe php-5.5.14]# make install 复制php服务程序的配置文件到安装目录: [root@linuxprobe php-5.5.14]# cp php.ini-production /usr/local/php/etc/php.ini 删除默认的php配置文件: [root@linuxprobe php-5.5.14]# rm -rf /etc/php.ini 创建php配置文件的软连接到/etc/目录中: [root@linuxprobe php-5.5.14]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf[root@linuxprobe php-5.5.14]# ln -s /usr/local/php/etc/php-fpm.conf /etc/php-fpm.conf[root@linuxprobe php-5.5.14]# ln -s /usr/local/php/etc/php.ini /etc/php.ini 编辑php服务程序的配置文件: [root@linuxprobe php-5.5.14]# vim /usr/local/php/etc/php-fpm.conf //将第25行参数前面的分号去掉。 pid = run/php-fpm.pid //修改第148和149行,将user与group修改为www。 user = www group = www 添加php-fpm服务程序到开机启动项: [root@linuxprobe php-5.5.14]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm [root@linuxprobe php-5.5.14]# chmod +x /etc/rc.d/init.d/php-fpm [root@linuxprobe php-5.5.14]# chkconfig php-fpm on 为了保障网站的安全性,禁用掉不安全的功能: [root@linuxprobe php-5.5.14]# vim /usr/local/php/etc/php.ini //修改第305行的disable_functions参数,追加参数为: disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,getservbyport,disk_total_space,posix_ctermid,posix_get_last_error,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix_getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname 配置nginx服务程序支持php: [root@linuxprobe php-5.5.14]# vim /usr/local/nginx/conf/nginx.conf //将第2行前面的#号去掉并修改为user www www ; //将第45行参数修改为index index.html index.htm index.php; //将第65-71行前面的#号去掉,修改为: location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } 重启nginx与php-fpm服务程序: [root@linuxprobe php-5.5.14]# systemctl restart nginx [root@linuxprobe php-5.5.14]# systemctl restart php-fpm 20.4 搭建discuz论坛 将discuz论坛数据放至网站目录(解压过程已省略): [root@linuxprobe ~ ]# cd /usr/local/src/ [root@linuxprobe src]# unzip Discuz_X3.2_SC_GBK.zip [root@linuxprobe src]# rm -rf /usr/local/nginx/html/{index.html,50x.html} [root@linuxprobe src]# mv upload/* /usr/local/nginx/html/ [root@linuxprobe src]# chown -Rf www:www /usr/local/nginx/html [root@linuxprobe src]# chmod -Rf 755 /usr/local/nginx/html
CentOS 安装 semanage 命令在服务器上运行:[root@ca1 ~]# yum install policycoreutils-python vim /etc/selinux/config enforcing 强制 permissive 提示 disabled 关闭
if 条件 then 执行语句 else 默认语句 if 条件1 then 执行语句 elif 条件2 then 执行语句 else 默认语句 for 变量 in 取值列表 do 命令 done while 条件测试 do 命令 done case 变量 in 取值1) 命令1 取值2) 命令2 *) 默认命令 esca
VI中的多行删除与复制 方法一: 单行删除,:1(待删除行)d 多行删除 ,:1,10d 方法二: 光标所在行,dd 光标所在行以下的N行,Ndd 方法1: 光标放到第6行, 输入:2yy 光标放到第9行, 输入:p 此方法适合复制少量行文本的情况,复制第6行(包括)下面的2行数据,放到第9行下面。 方法2: 命令行模式下输入 6,9 co 12 复制第6行到第9行之间的内容到第12行后面。 方法3: 有时候不想费劲看多少行或复制大量行时,可以使用标签来替代 光标移到起始行,输入ma 光标移到结束行,输入mb 光标移到粘贴行,输入mc 然后 :'a,'b co 'c 把 co 改成 m 就成剪切了 要删除多行的话,可以用 :5, 9 de VIM常用命令 常用命令 1) 光标命令 k,j,h,l---上下左右光标移动命令,虽然可以在Linux中使用键盘右边的四个光标键, 但是记住这四个命令还有非常有用的,也就是右手在键盘上放置的位置部分 nG ----n为行数,该命令立即使光标跳到指定行。 Ctrl+G-----光标所在位置的行数和列数报告 w,b------使光标向前或向后跳过一个单词 2) 编辑命令 i,a,r -------在光标的前,后,上方插入字符命令(i=insert,a=append,r=replace) cw,dw------ 改变(置换)/删除光标所在处的单词的命令 (c=change,d=delete) x,d$,dd -----删除一个字符,光标所在处到行尾的所有字符,和整行的命令 3) 查找命令 /string, ?string-----从光标所在处向后/向前查找相应的字符串的命令 4)拷贝复制命令 yy,p -----拷贝一行到剪贴板/取出剪贴板中内容的命令 常见问题及应用技巧 1) 在一个新文件中读/etc/passwd中的内容,取出用户名部分 vi file :r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwd :%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分 :3r /etc/passwd 这是在指定的行号后面读入文件内容 另外一种方法删掉文件中所有的空行及以#开始的注释行 #cat squid.conf.default | grep -v '^$' | grep -v '^#' 2) 在打开一个文件编辑后才知道登录的用户对该文件没有写权,不能存盘 vi file :w /tmp/1 既然没法存盘,不想放弃所做的所有修改,先临时存到/tmp/1 :20,59w /tmp/1 或者仅仅把第20到59行之间的内容存盘成文件/tmp/1 3) 用VI编辑一个文件,但需要删除大段大段的内容 vi file Ctrl+G 把光标移到需要删除的行的处按ctrl+G显示行号,再到结尾处再按Ctrl+G. :23,1045d 假定两次行号为23和1045,则把这几间的内容全删除 也可以在开始和结束两行中用ma,mb命令标记后用:'a,'bd删除. 4) 在整个文件或某几行中在行首或行尾加一些字符串 vi file :3,$s/^/some string / 在文件的第一行至最后一行的行首前插入some string :%s/$/ some string/g 在整个文件每一行的行尾添加 some string :%s/string1/string2/g 在整个文件中替换string1成string2 :3,7s/string1/string2/ 仅替换文件中的第三到七行中的string1成string2 Note: s为substitute,%表示所有行,g表示global 5) 同时编辑两个文件,在两个文件中拷贝剪贴文本 vi file1 file2 yy 同时打开两个文件,在文件1的光标所在处拷贝所在行 :n 切换到文件2 (n=next) p 在文件2的光标所在处粘贴所拷贝的行 :N 切换回文件1 6) 替换文件中的路径 :%s#/usr/bin#/bin#g 把文件中所有路径/usr/bin换成/bin 或者用 :%s//usr/bin//bin/g 在'/'前用符号指出'/'是真的单个字符'/' 7) 用 vi 多行注释 如果要给多行程序作注释,一个笨办法就是 插入 # ,然后用 j 跳到下一行用 . 命令,重复上个命令。如果要注释几百行,这样的方法恐怕太愚蠢了。一个聪明的办法是: :.,+499 s/^/#/g 若需全文的行首插入可用以下命令 :%s/^/#/g
软件需要安装VC9、VC10、VC11、VC13、VC14.一个不能少 You must install both 32 and 64bit versions, even if you do not use Wampserver 64 bit.(32位和64位的要全部安装!!!) -- VC9 Packages (Visual C++ 2008 SP1)http://www.microsoft.com/zh-CN/download/details.aspx?id=5582(VC9_x86)http://www.microsoft.com/zh-CN/download/details.aspx?id=2092(VC9_x64) -- VC10 Packages (Visual C++ 2010 SP1)http://www.microsoft.com/zh-CN/download/details.aspx?id=8328(VC10_x86)http://www.microsoft.com/zh-CN/download/details.aspx?id=13523(VC10_x64) -- VC11 Packages (Visual C++ 2012 Update 4) The two files VSU4\vcredist_x86.exe and VSU4\vcredist_x64.exe to be download are on the same page: http://www.microsoft.com/zh-CN/download/details.aspx?id=30679(VC11_只有一个链接,进去自己选吧) -- VC13 Packages] (Visual C++ 2013[) The two files VSU4\vcredist_x86.exe and VSU4\vcredist_x64.exe to be download are on the same page:https://www.microsoft.com/zh-CN/download/details.aspx?id=40784(VC13_只有一个链接,进去自己选吧) -- VC14 Packages (Visual C++ 2015) The two files vcredist_x86.exe and vcredist_x64.exe to be download are on the same page:http://www.microsoft.com/zh-CN/download/details.aspx?id=48145(VC15_只有一个链接,进去自己选吧) 有可能出现的错误: Visual C++ 2015 Redistributable安装失败,错误代码0x80240017 1 到C:\ProgramData\Package Cache\里面找到Windows8.1-KB2999226-x64.msu,并把这个文件拷到任意位置。ProgramData可能是一个隐藏文件夹,你在地址栏直接输入地址就能进入。建议找msu文件时用搜索功能,2 win+X+A进入管理员模式的cmd,进入步骤1中选择的位置,依次执行 wusa.exe Windows8.1-KB2999226-x64.msu /extract:XXXX 和 DISM.exe /Online /Add-Package /PackagePath:XXXX\Windows8.1-KB2999226-x64.cab 注:XXXX就是XXXX 3 重新执行vc_redist.x64.exe,选择修复 WampsServer版本太新,apache不能正常服务 为什么说太新呢?因为今天给别人安装的时候发现运行环境vc2015不能安装上,经百度原来window8上需要自动更新到新版本才能安装vc2015,不然vc2015会出现0x80240017未指定错误 因为vc2015没有安装成功,所以 还会出现dll丢失问题,这个dll就是vc2015里面的 既然一切问题出在vc2015上, 那么只要区分是否需要安装vc2015就行了 WampServer3.0就像上面说得一样,也需要vc14(vc2015) WampServer2.5不需要,而且因为是14年的软件,还不够完善,并没有介绍需要安装什么vc环境 区分方法: window8.1及window8.1以下的统一安装WampServer2.5及一下版本 window10可以安装任意版本 PS:vc运行环境要安装全,报出错误说缺少dll,应该就是vc环境库没有安装全 WampServer2.5的可以安装WampServer3.0的全部vc环境库(除vc2015),这样子应该没什么大问题了
CentOS6.5安装Tab增强版:bash-completion 2654 次阅读作者:智能小宝 来源:互联网 2015-08-20 20:09 我要评论(0) CentOS6.5安装Tab增强版:bash-completion,可补全命令参数; 因为CentOS官方源并不带有bash-completion的包,所以,为了可用yum安装,增加epel的源, 首先,使用wget下载epel的rpm包,使用rpm指令安装,之后运行yum安装,代码如下: [adam@ultraera ~]$$ wget http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm [adam@ultraera ~]$$ sudo rpm -ivh epel-release-6-8.noarch.rpm [adam@ultraera ~]$$ sudo yum clean all [adam@ultraera ~]$$ sudo yum makecache [adam@ultraera ~]$$ sudo yum install -y bash-completion 安装完成之后,注销终端,重新登录即可。
一 nginx 1.安装nginx所需的基本库 pcre 和 httpssl rpm -qa pcre pcre-devel #检查是否有安装 yum install pcre pcre-devel -y #安装库 rpm -qa openssl openssl-devel #检查是否有安装 yum install openssl openssl-devel #安装库, 2.建立www用户和组 groupadd www useradd -s /sbin/nologin -g www -M www # -s/sbin/nologin 表示禁止用户登陆,-g 指定用户组,-M表示不创建用户家目录 3.下载nginx文件 wget http://nginx.org/download/nginx-1.10.1.tar.gz tar xvf nginx-1.10.1.tar.gz 4.开始安装 cd nginx-1.10.1 ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_sub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_sub_module #可以使用 ./configure--help查看相关帮助 make make install /usr/local/nginx/sbin/nginx -t #检查配置文件 一.2 YUM安装nginx 想在 CentOS 系统上安装 Nginx ,你得先去添加一个资源库,像这样: vim /etc/yum.repos.d/nginx.repo 使用 vim 命令去打开 /etc/yum.repos.d/nginx.repo ,如果 nginx.repo 不存在,就会去创建一个这样的文件,打开以后按一下小 i 键,进入编辑模式,然后复制粘贴下面这几行代码,完成以后按 esc 键退出,再输入 :wq (保存并退出) [nginx]name=nginx repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/gpgcheck=0enabled=1 完成以后,我们就可以使用 yum 命令去安装 nginx 了,像这样: yum install nginx 安装好以后测试一下 nginx 服务: service nginx status 应该会返回: nginx is stopped (nginx 已停止) 再测试一下 nginx 的配置文件: nginx -t 应该会返回: nginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful ... syntax is ok,... test is successful,说明配置文件没问题,同时这个结果里你可以找到 nginx 的配置文件 nginx.conf 所在的位置。 操纵 nginx 服务 操纵服务,可以使用使用 service 命令,它可以启动(start),重启(restart),或停止服务(stop),比如要启动 nginx 服务: service nginx start 一.2yum安装nginx 二 安装mysql 二.1 YUM安装 一、安装配置MySQL的yum源 # 安装MySQL的yum源,下面是RHEL6系列mysql5.6的下载地址: wget http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm 下面是RHEL6系列mysql5.7的下载地址: wget http://repo.mysql.com//mysql57-community-release-el6-8.noarch.rpm 安装yum源。 rpm -ivh mysql57-community-release-el6-8.noarch.rpm 清除缓存 yum clean all 下面几个命令可以顺便学习一下 复制代码代码如下: # 安装yum-config-manager yum install yum-utils -y # 禁用MySQL5.6的源 yum-config-manager --disable mysql56-community # 启用MySQL5.7的源 yum-config-manager --enable mysql57-community-dmr # 用下面的命令查看是否配置正确 yum repolist enabled | grep mysql 安装开始 3.yum -y install mysql-community-server 4.启动 service mysqld start 5开启开机自动 chkconfig --list|grep mysql chkconfig --add mysqld chkconfig mysqld on 四、连接MySQL并修改密码 mysqladmin -uroot password 'password' 初始安装没有密码 更改密码 select user,host from mysql.user; 查看用户 drop user ""@""; 删除多出的用户 delete form mysql.user where user="" and host=""; drop无法删除时用这条命令 drop database 表名 删除多的库; grant all on *.* to "test"@"%" identified by "chinaren"; 建立用户 flush privileges; 检查环境插件rpm -qa|grep -E 'gcc|kernel-devel|ncurses-devel|bison|cmake' 需要的组建如下,使用yum方式安装:yum install gcc gcc-c++ kernel-devel ncurses-devel bison cmake 1.建立mysql用户和组 groupadd mysql useradd -s /sbin/nologin -g mysql -M mysql 2.下载 wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.52-linux2.6-x86_64.tar.gz 3.安装 tar xvf mysql-5.5.52-linux2.6-x86_64.tar.gz mv mysql-5.5.52 /usr/local/ #因为下载的是源码包不需要install ln -s /usr/local/mysql-5.5.52 /usr/local/mysql #为了方便做个软连接 Centos下Yum安装PHP5.5,5.6,7.0 默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 yum remove php.x86_64 php-cli.x86_64 php-common.x86_64 php-gd.x86_64 php-ldap.x86_64 php-mbstring.x86_64 php-mcrypt.x86_64 php-mysql.x86_64 php-pdo.x86_64 2.Centos 5.X rpm -Uvh http://mirror.webtatic.com/yum/el5/latest.rpm CentOs 6.x rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm CentOs 7.X rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm 如果想删除上面安装的包,重新安装 rpm -qa | grep webstatic rpm -e 上面搜索到的包即可 3.运行yum install yum install-y php55w.x86_64 php55w-cli.x86_64 php55w-common.x86_64 php55w-gd.x86_64 php55w-ldap.x86_64 php55w-mbstring.x86_64 php55w-mcrypt.x86_64 php55w-mysql.x86_64 php55w-pdo.x86_64 yum install -y php56w.x86_64 php56w-cli.x86_64 php56w-common.x86_64 php56w-gd.x86_64 php56w-ldap.x86_64 php56w-mbstring.x86_64 php56w-mcrypt.x86_64 php56w-mysql.x86_64 php56w-pdo.x86_64 注:如果想升级到5.6把上面的55w换成56w就可以了。 yum install -y php70w.x86_64 php70w-cli.x86_64 php70w-common.x86_64 php70w-gd.x86_64 php70w-ldap.x86_64 php70w-mbstring.x86_64 php70w-mcrypt.x86_64 php70w-mysql.x86_64 php70w-pdo.x86_64 4.安装PHP FPM yum install -y php55w-fpm yum install -y php56w-fpm yum install -y php70w-fpm 注:如果想升级到5.6把上面的55w换成56w就可以了。 后期调试 建立网页用户 www 和组www groupadd www useradd -g www www 修改php-fpm配置 cd /etc/php-fpm.d/ vim www.conf user = www group =www 建立测试站点 mkdir -p /home/www/test 测试站点配置文件 cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/test.conf vim /etc/nginx/conf.d/test.conf root /home/www/wwwroot/test; location ~ \.php$ { root /home/www/wwwroot/test; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include /etc/nginx/fastcgi_params; } service php-fpm restart service nginx restart 建立 <?php phpinfo(); ?>测试成功
zabbix监控系统客户端安装 2012-10-26 14:56:24 分类: 网络与安全 测试使用agentd监听获取数据。 服务端的安装可以查看http://blog.chinaunix.net/space.php?uid=25266990&do=blog&id=3380929 下载 http://www.zabbix.com/downloads/2.0.3/zabbix_agents_2.0.3.linux2_6.i386.tar.gz http://www.zabbix.com/documentation/2.0/manual/installation 安装 1)创建用户 groupadd zabbix useradd -g zabbix zabbix 2)解压即可 tar -zxvf zabbix_agents_2.0.3.linux2_6.i386.tar.gz -C /usr/local/zabbix_agent 3)安装服务 cat >>/etc/services<<eof< span="" style="word-wrap: break-word;"> zabbix-agent 10050/tcp Zabbix Agent zabbix-agent 10050/udp Zabbix Agent zabbix-trapper 10051/tcp Zabbix Trapper zabbix-trapper 10051/udp Zabbix Trapper EOF 4)修改配置文件 vim /usr/local/zabbix_agent/etc/zabbix_agent.conf 修改Zabbix server的ip Server=192.168.10.197 #server端IP地址,请修改 5)启动 /usr/local/agent/sbin/zabbix_agentd -c /usr/local/agent/etc/zabbix_agentd.conf Echo "/usr/local/agent/sbin/zabbix_agentd -c /usr/local/agent/etc/zabbix_agentd.conf" >>/etc/tc.local 6)添加到系统目录 ln -s /usr/local/zabbix_agent/sbin/* /usr/local/sbin/ ln -s /usr/local/zabbix_agent/bin/* /usr/local/bin/ 7)测试,下面的命令需要在server端执行,其中192.168.10.199是agent的ip #/usr/local/zabbix/bin/zabbix_get -s192.168.10.199 -p10050 -k"system.uptime" 1031163 总结: 关于zabbix浏览器端的配置,可以查阅相关资料,个人研究了一番,zabbix非常强大,在监控、图像报表都非常优秀;但是配置却有些复杂,并没有到我想要的结果,后期会使用其他的软件替代。
详解zabbix安装部署(Server端篇) 2012-10-22 10:18:25 分类: 网络与安全 Linux下常用的系统监控软件有Nagios、Cacti、Zabbix、Monit等,这些开源的软件,可以帮助我们更好的管理机器,在第一时间内发现,并警告系统维护人员。 今天开始研究下Zabbix,使用Zabbix的目的,是为了能够更好的监控mysql数据库服务器,并且能够生成图形报表,虽然Nagios也能够生成图形报表,但没有Zabbix这么强大。 首先,我们先来介绍下Zabblx: 一.Zabbix简介 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 zabbix由zabbix server与可选组件zabbix agent两部门组成。 zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视。 zabbix agent需要安装在被监视的目标服务器上,它主要完成对硬件信息或与操作系统有关的内存,CPU等信息的收集。 zabbix的主要特点: - 安装与配置简单,学习成本低 - 支持多语言(包括中文) - 免费开源 - 自动发现服务器与网络设备 - 分布式监视以及WEB集中管理功能 - 可以无agent监视 - 用户安全认证和柔软的授权方式 - 通过WEB界面设置或查看监视结果 - email等通知功能 等等 Zabbix主要功能: - CPU负荷 - 内存使用 - 磁盘使用 - 网络状况 - 端口监视 - 日志监视 官方也提供了安装资料:http://www.zabbix.com/wiki/howto/monitor 二.Zabbix安装 2.1 zabbix WEB环境搭建 zabbix的安装需要LAMP或者LNMP环境。 需要其它的软件包 yum install mysql-devel gcc net-snmp-devel curl-devel perl-DBI php-gd php-mysql php-bcmath php-mbstring php-xm 2.2 zabbix 数据库设置 zabbix数据库可以和zabbix服务器分离,采用用专门的mysql服务器存储数据,此时要给zabbix数据库受相应的权限。 grant all privileges on zabbix.* to zabbix_user@'ip' identified by '123456'; 注:ip为zabbix服务器的IP地址。 登录数据库,创建帐号和设置权限: mysql> use mysql; mysql>create database zabbix character set utf8; mysql>grant all privileges on zabbix.* to zabbix_user@'192.168.10.197' identified by '123456'; 2.3安装zabbix服务 增加zabbix用户和组 #groupadd zabbix#useradd -g zabbix -m 官网下载解压软件包。 下载地址: http://www.zabbix.com/download.php #wget http://fossies.org/unix/misc/zabbix-2.0.3.tar.gz# tar -zxvf zabbix-2.0.3.tar.gz#cd zabbix-2.203导入数据库表 #cd zabbix-2.0.3/database/mysql#mysql -uroot -pmysql zabbix < schema.sql #mysql -uroot -pmysql zabbix < images.sql #mysql -uroot -pmysql zabbix < data.sql 编译安装zabbix ./configure --prefix=/usr/local/zabbix --with-mysql --with-net-snmp --with-libcurl --enable-server --enable-agent --enable-proxy 添加服务端口 vim /etc/services zabbix-agent 10050/tcp # Zabbix Agent zabbix-agent 10050/udp # Zabbix Agent zabbix-trapper 10051/tcp # Zabbix Trapper zabbix-trapper 10051/udp # Zabbix Trapper 添加配置文件 ln -s /usr/local/zabbix/etc/ /etc/zabbix ln -s /usr/local/zabbix/bin/* /usr/bin/ ln -s /usr/local/zabbix/sbin/* /usr/sbin/ cp /root/zabbix-2.4.5/misc/init.d/fedora/core/zabbix_* /etc/init.d chmod 755 /etc/init.d/zabbix_*#修改/etc/init.d目录下的zabbix_server和zabbix_agentd启动文件sed -i "s@BASEDIR=/usr/local@BASEDIR=/usr/local/zabbix@g" /etc/init.d/zabbix_serversed -i "s@BASEDIR=/usr/local@BASEDIR=/usr/local/zabbix@g" /etc/init.d/zabbix_agentd修改server配置文件,添加zabbix数据库密码vim /etc/zabbix/zabbix_server.conf LogFile=/tmp/zabbix_server.log PidFile=/tmp/zabbix_server.pid DBName=zabbix DBUser=zabbix_user DBPassword=123456 #指定zabbix数据库密码 DBSocket=/tmp/mysql.sock #********重要******** ListenIP=192.168.10.197 #服务器IP地址 修改Agentd配置文件,更改HOSTNAME为本机的hostnamevim /etc/zabbix/zabbix_agentd.conf PidFile=/tmp/zabbix_agentd.pid #进程PID LogFile=/tmp/zabbix_agentd.log #日志保存位置 EnableRemoteCommands=1 #允许执行远程命令 Server=192.168.10.197 #agent端的ip Hostname=client1 #必须与zabbix创建的host name相同 chkconfig zabbix_server on chkconfig zabbix_agentd onervice zabbix_server startStarting zabbix_server: [ OK ] service zabbix_agentd startStarting zabbix_agentd: [ OK ] netstat -anp | grep zabbix #检查服务有没有监听端口 ********************************************************************************************************************************** /tmp/log/zabbix_server.log /tmp/log/zabbix_agentd.log 日志文件非常重要,出现问题查日志找原因 ********************************************************************************************************************************** 如图设置hostname 添加web前段php文件# cd zabbix-2.203/frontends/# cp -rf php /home/httpd/zabbix #虚拟主机目录# chown -R zabbix:zabbix zabbixweb前端安装配置修改PHP相关参数vim php.ini max_execution_time = 300 max_input_time = 300 memory_limit = 128M post_max_size = 32M date.timezone = Asia/Shanghai mbstring.func_overload=2 PHP还必须支持一下模块,在php源码包直接编译安装。详细模块需要在安装是会提示。 bcmath.so、gettext.so 在客户端浏览器上面访问zabbix,开始WEB的前端配置,http://ZabbixIP/zabbix,按提示点击下一步 Step1:下一步。 Step2:如果全部OK的话才能进行下一步的安装,如果有错误请返回到server端检查相关的软件包是否安装。 Step3:需要输入mysql数据库帐号密码,如果数据库不在zabbix服务器上面,在Host里面添加数据库服务器的地址,并且要用grant命令给数据库授权。 Step4:输入服务器端 host name or host IP addres; 最后会自动写入配置文件:zabbix.conf.php,配置完成后出现登陆界面,默认的用户名为:admin,密码为:zabbix。 至此,zabbix server端的安装完毕,我们可以通过浏览器来访问。如图: 接下来会介绍关于客户端监控的使用,以及监控模版的新建,自定义监控服务等。
crontab里设定一条: 0 12 28-31 * * sh /tmp/start.sh start.sh 脚本如下: ****************************************************************************** #!/usr/bin/ksh #this script is used to start the xxx in the last day of every month ym=`date +%m" "%Y` if [ `date +%d` = `cal $ym|xargs|awk '{print $NF}'` ] then sh yourscripts fi ********************************************************************************
1.xargs 把结果导向后面程序执行 2.rpm -e --nodeps 删除rpm文件 rpm -qa|grep php |xargs rpm -e --nodeps
yum配置 执行命令下载、安装yum源,当前是针对Centos6并且64位版本的源: [root@T_249 yum.repos.d]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm [root@T_249 yum.repos.d]# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm 编辑[remi.repo]下的enabled选项从0设为1 [root@T_249 yum.repos.d]# sed -i '/enabled/s/=0/=1/g' /etc/yum.repos.d/remi.repo 运行如下命令 [root@T_249 yum.repos.d]# yum clean all [root@T_249 yum.repos.d]# yum makecache 安装php5.4 [root@T_249 yum.repos.d]# yum install php54 php54-php-devel php54-php-mysql* php54-php-gd php54-php-fpm php54-php-mbstring 如果安装php5.5 [root@T_249 yum.repos.d]# yum install php55 php55-php-devel php55-php-mysql* php55-php-gd php55-php-fpm php55-php-mbstring 目前可以安装到php7.0 查看所有支持版本 [root@T_249 yum.repos.d]# yum list php* |grep php-devel php-devel.x86_64 5.3.3-46.el6_6 @updates php54-php-devel.x86_64 5.4.45-2.el6.remi @remi php-devel.x86_64 5.6.15-1.el6.remi remi-php56 php55-php-devel.x86_64 5.5.30-1.el6.remi remi php56-php-devel.x86_64 5.6.16-0.1.RC1.el6.remi remi-test php70-php-devel.x86_64 7.0.0-0.25.RC8.el6.remi remi 运行如下命令[yum update php*],则直接升级到php5.6 安装运行yum报错解决方法: Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again 编辑[epel.repo]下的baseurl前的#号去掉,mirrorlist前添加#号 [root@T_249 yum.repos.d]# sed 's/#baseurl=/baseurl=/g;s/mirrorlist=/#mirrorlist=/g' /etc/yum.repos.d/epel.repo -------------------------------------------------------------------------------------------- 执行下面的命令删除php yum remove php-common 然后像安装那样问你是否继续的,输入yes即可
安装gettext 模块 [root@localhost ~]# cd /usr/src/php-5.3.27/ext/gettext/ [root@localhost gettext]# phpize Configuring for: PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 [root@localhost gettext]# ./configure --with-php-config=/usr/local/bin/php-config [root@localhost gettext]# make [root@localhost gettext]# make install Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20090626/ [root@localhost gettext]# ls modules/ gettext.so 修改php的配置文件php.ini,添加扩展模块 [root@localhost local]# vi /usr/local/lib/php.ini extension=gettext.so ###增加 这一行 bcmath模块安装 [root@localhost bcmath]# phpize Configuring for: PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 [root@localhost bcmath]# ./configure --with-php-config=/usr/local/bin/php-config [root@localhost bcmath]# make [root@localhost bcmath]# make install Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20090626/ [root@localhost bcmath]# ls modules/ bcmath.so 修改php的配置文件php.ini,添加扩展模块 [root@localhost local]# vi /usr/local/lib/php.ini extension= bcmath.so ###增加 这一行 sockets模块安装 [root@localhost ext]# cd sockets/ [root@localhost sockets]# phpize Configuring for: PHP Api Version: 20090626 Zend Module Api No: 20090626 Zend Extension Api No: 220090626 [root@localhost sockets]# ./configure --with-php-config=/usr/local/bin/php-config [root@localhost sockets]# make [root@localhost sockets]# make install Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20090626/ Installing header files: /usr/local/include/php/ [root@localhost sockets]# ls modules/ sockets.so 修改php的配置文件php.ini,添加扩展模块 [root@localhost local]# vi /usr/local/lib/php.ini extension=sockets.so ###增加 这一行 扩展安装完成后重启apache [root@localhost sockets]# /etc/init.d/apache restart 查看php模块发现目前已经出现了三个模块
zabbix在configure时候遇到的问题(CentOS)为你解答: 在CentOS系统中,安装zabbix进行configure时会遇到以下4个主要问题 ./configure --enable-server --enable-agent --with-mysql --with-net-snmp --with-jabber --with-libcurl 1 configure: error: MySQL library not found the problem is not installed mysql-devel #yum install mysql-devel 2 configure: error: Jabber library not found the problem is not installed jabber lib #wget http://iksemel.googlecode.com/files/iksemel-1.4.tar.gz 下载完成后解压、配置、安装: tar zxvf iksemel-1.4.tar.gz cd iksemel-1.4 configure make make install 之后对zabbix进行configure还是会遇到这个问题,那么将jabber目录指定即可:#./configure --enable-server --enable-agent --with-mysql --with-net-snmp --with-jabber=/usr/local/ --with-libcurl 3 configure: error: Not found curl Library #yum install curl-devel (此项未经测试) 4 configure: error : Not found NET-SNMP library yum install net-snmp-devel 看完上面四点是不是一起也遇到相同的问题,那就按上的办法解决吧!
mysql 获取当前时间为select now()[喝小酒的网摘]http://blog.hehehehehe.cn/a/16141.htm运行结果2012-09-05 17:24:15mysql 获取当前时间戳为select unix_timestamp(now()) 运行结果:unix_timestamp(now())1346836984[喝小酒的网摘]http://blog.hehehehehe.cn/a/16141.htm
简单的说明上面的参数的含义: net.ipv4.tcp_syncookies = 1 #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭; net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭; net.ipv4.tcp_tw_recycle = 1 #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭; net.ipv4.tcp_fin_timeout #修改系統默认的 TIMEOUT 时间。 在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的DoS、CC和SYN攻击。 此外,如果你的连接数本身就很多,我们可以再优化一下TCP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置: net.ipv4.tcp_keepalive_time = 1200 net.ipv4.ip_local_port_range = 10000 65000 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 5000 #这几个参数,建议只在流量非常大的服务器上开启,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。 net.ipv4.tcp_keepalive_time = 1200 #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。 net.ipv4.ip_local_port_range = 10000 65000 #表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!) net.ipv4.tcp_max_syn_backlog = 8192 #表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。 net.ipv4.tcp_max_tw_buckets = 6000 #表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默 认为180000,改为6000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT的最大数量,避免Squid服务器被大量的TIME_WAIT拖死。 内核其他TCP参数说明: net.ipv4.tcp_max_syn_backlog = 65536 #记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。 net.core.netdev_max_backlog = 32768 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。 net.core.somaxconn = 32768 #web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 #最大socket读buffer,可参考的优化值:873200 net.core.wmem_max = 16777216 #最大socket写buffer,可参考的优化值:873200 net.ipv4.tcp_timestsmps = 0 #时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。 net.ipv4.tcp_synack_retries = 2 #为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。 net.ipv4.tcp_syn_retries = 2 #在内核放弃建立连接之前发送SYN包的数量。 #net.ipv4.tcp_tw_len = 1 net.ipv4.tcp_tw_reuse = 1 # 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。 net.ipv4.tcp_wmem = 8192 436600 873200 # TCP写buffer,可参考的优化值: 8192 436600 873200 net.ipv4.tcp_rmem = 32768 436600 873200 # TCP读buffer,可参考的优化值: 32768 436600 873200 net.ipv4.tcp_mem = 94500000 91500000 92700000 # 同样有3个值,意思是: net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力。 net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段。 net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket。 上述内存单位是页,而不是字节。可参考的优化值是:786432 1048576 1572864 net.ipv4.tcp_max_orphans = 3276800 #系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。 如果超过这个数字,连接将即刻被复位并打印出警告信息。 这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值, 更应该增加这个值(如果增加了内存之后)。 net.ipv4.tcp_fin_timeout = 30 #如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。
PHP中的“if…else…”语法,如下: <?php if(条件){ //分配服务器干的任务A }else{ //分配服务器干的任务B } ?> 通过条件判断,若返回值为布尔值TRUE,则执行任务A,若返回值为FALSE,则执行任务B。 PHP中的“if…else if…”语法,如下: <?php if(条件一){ //分配服务器干的任务A }else if(条件二){ //分配服务器干的任务B } ?> 通过条件一判断,若返回值为布尔值为TRUE,则执行任务A,若返回值为FALSE,则判断条件二,若返回值为布尔值TRUE,则执行任务B,否则既不执行任务A,也不执行任务B。服务器会继续往下执行其他任务。 PHP中的“if…else if…else…”语法,如下: <?php if(条件一){ //分配服务器干的任务A }else if(条件二){ //分配服务器干的任务B }else{ //分配服务器干的任务C } ?> 通过条件一判断,若返回值为布尔值TRUE,则执行任务A,若返回值为FALSE,则判断条件二,若返回值为布尔值TRUE,则执行任务B,否则既不执行任务A,也不执行任务B,执行任务C PHP中的“switch...case...”语法,如下: <?php switch (条件) { case 条件值一: //任务一 break; case 条件值二: //任务二 break; default: //默认任务 } ?> 首先判断条件,若条件的返回值为条件值一,则执行任务一,若条件返回的值为条件值二,则执行任务二,若条件的返回值既不是条件值一也不是条件值二,则执行默认任务。break的作用是结束switch(后面会有专门举例说明),使用 switch 语句可以避免冗长的 “if..else if..else”代码块。 break的作用是阻止代码进入下一个case 中继续执行。 循环结构就像一圈圈地跑足球场,跑完一圈再跑一圈。也就是说,在符合的条件下,重复执行某项任务。像400米一圈的跑道,跑800米的话就跑2圈,当跑完第一圈接着跑第二圈,第二圈结束已经达到800米,终止跑步。 在PHP中,while循环语句如下: <?php while(条件){ //执行任务 } ?> 首先判断某个条件是否符合(条件返回值是否为TRUE),若符合则执行任务,执行完毕任务,再判断条件是否满足要求,符合则重复执行此任务,否则结束任务 在PHP中循环语句还有另一种:do...while循环语句语法如下: <?php do{ //执行任务 }while(条件) ?> 首先执行任务(上一节的while语句是先判断条件是否成立,再执行任务),执行任务完毕,判断某个条件是否符合(条件返回值是否为TRUE),若符合则再次执行任务,执行完毕任务,继续判定条件 在PHP中还有一种循环语句,for循环语句结构如下: <?php for(初始化;循环条件;递增项){ //执行任务 } ?> for 语句中,“初始化”在循环开始前无条件求值一次,“循环条件”在每次循环开始前求值。如果值为 TRUE,则继续循环,执行循环体语句(执行任务)。如果值为 FALSE,则终止循环。“递增项”在每次循环之后被求值(执行)。其常用于循环执行代码块指定的次数。 在PHP中foreach循环语句,常用于遍历数组,一般有两种使用方式:不取下标、取下标。 (1)只取值,不取下标 <?php foreach (数组 as 值){ //执行的任务 } ?> (2)同时取下标和值 <?php foreach (数组 as 下标 => 值){ //执行的任务 } ?> PHP中结构嵌套之条件嵌套 条件结构嵌套就像回家的路上会遇到多个十字路口。 PHP中结构嵌套之循环嵌套 循环结构嵌套,就是类似于跑多个足球场,例如假设有两个足球场,一个大足球场,一个小足球场,在大足球场跑一圈后,再到小足球场跑几圈,跑完几圈后,再到大足球场中继续跑。在遍历二维数组 PHP中结构嵌套之循环结构与条件结构嵌套 有时候在执行任务时,对于一些特殊的任务还需要进行额外处理,这个时候就会将循环结构与条件结构嵌套使用。 中很常用。
定义常量函数 define(string,value,F|T) string 常量名字(字符串,可以不用$) value 常量的值 F|T 大小写是否敏感,默认false 敏感 一般不动 系统常量 (1)__FILE__ :php程序文件名。它可以帮助我们获取当前文件在服务器的物理位置。 (2)__LINE__ :PHP程序文件行数。它可以告诉我们,当前代码在第几行。 (3)PHP_VERSION:当前解析器的版本号。它可以告诉我们当前PHP解析器的版本号,我们可以提前知道我们的PHP代码是否可被该PHP解析器解析。 (4)PHP_OS:执行当前PHP版本的操作系统名称。它可以告诉我们服务器所用的操作系统名称,我们可以根据该操作系统优化我们的代码。 常量有两种调方法,一.直接使用常量名称,这种比较死,只能获取常量值. 二 使用constant() 判断常量是否被定义; bool defined(string constants_name) 它只有参数constant_name,指的是要获取常量的名称,若存在则返回布尔类型true,否则返回布尔类型false; (注:bool表示函数返回值类型为布尔类型) (“?:”)三元运算符也是一个比较运算符,对于表达式(expr1)?(expr2):(expr3),如果expr1的值为true,则此表达式的值为expr2,否则为expr3 = 字符串连接运算符是为了将两个字符串进行连接,PHP中提供的字符串连接运算符有: (1)连接运算符(“.”):它返回将右参数附加到左参数后面所得的字符串。 (2)连接赋值运算符(“.=”):它将右边参数附加到左边的参数后。 .="string" 等于 $a=$a."string" PHP中提供了一个错误控制运算符“@”,对于一些可能会在运行过程中出错的表达式时,我们不希望出错的时候给客户显示错误信息,这样对用户不友好。于是,可以将@放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉; 如果激活了track_error(这个玩意在php.ini中设置)特性,表达式所产生的任何错误信息都被存放在变量$php_errormsg中,此变量在每次出错时都会被覆盖,所以如果想用它的话必须尽早检查。 需要注意的是:错误控制前缀“@”不会屏蔽解析错误的信息,不能把它放在函数或类的定义之前,也不能用于条件结构例如if和foreach等
解决www用户无权限运行的问题 ------------------------------------------------------------------------------------------------------ 1、设置 sudo 配置文件 可写权限 chmod u+w /etc/sudoers 2、增加 www 用户的 nginx 脚本管理权限 www ALL=(root) NOPASSWD: /etc/init.d/nginx 3、关闭 【强制控制台登录】执行 【非常重要】,注释该行 我的问题就出在这里,开启了这个选项之后。在PHP中怎么调用,都没有执行结果 #Defaults requiretty 4、还原 sudo 配置权限 440 【非常重要】,如果不还原权限。在PHP中怎么调用,都没有执行结果。 chmod u-w /etc/sudoers -------------------------------------------------------------------------------------------------------- 5、调用php $result2 = exec("/usr/bin/sudo /etc/init.d/nginx stop",$result); var_dump($result); var_dump($result2);
PHP加速器eAccelerator安装 [日期:2015-01-06] 来源:Linux社区 作者:pangge [字体:大 中 小] 程序说明 eAccelerator是一个自由开放源码php加速器,优化和动态内容缓存,提高了php脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎为零。 它还有对脚本起优化作用,以加快其执行效率。使您的PHP程序代码执效率能提高1-10倍。eAccelerator本身的开销也是极少的。 1、程序下载 ###服务器上之间下载### [root@web-yv3 ~]# wget https://github.com/eaccelerator/eaccelerator/tarball/master [root@web-yv3 ~]# ll -rw-r--r-- 1 root root 131579 Nov 29 17:34 master #此文件就是下载的eAccelerator的安装包,勿惊勿惊!! ###官网自行下载### http://eaccelerator.net/ eaccelerator-eaccelerator-42067ac.tar.gz 通过rz上传或ftp上传!! 2、编译安装加速器 2.1、解压程序 [root@web-yv3 ~]#tar xf master #常规方式解压 [root@web-yv3 ~]# ls eaccelerator-eaccelerator-42067ac master [root@web-yv3 ~]# cd eaccelerator-eaccelerator-42067ac #已经露出了庐山真面目! linux下安装eaccelerator加速php执行效率 2012年09月03日 ⁄ PHP ⁄ 评论数 1 ⁄ 被围观 7,306次+ 说明:php安装目录:/usr/local/php5php.ini配置文件路径:/usr/local/php5/etc/php.iniNginx安装目录:/usr/local/nginxNginx网站根目录:/usr/local/nginx/html安装篇1、安装编译工具 yum install -y wget make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel kernel keyutils patch perl2、安装eaccelerator cd /usr/local/src #进入软件包存放目录 wget http://acelnmp.googlecode.com/files/eaccelerator-0.9.6.1.tar.bz2 #下载 tar xjf eaccelerator-0.9.6.1.tar.bz2 #解压 cd eaccelerator-0.9.6.1 #进入安装目录 /usr/local/php5/bin/phpize #用phpize生成configure配置文件 ./configure -enable-eaccelerator=shared --with-php-config=/usr/local/php5/bin/php-config #配置 make #编译 make install #安装 安装完成之后,出现下面的界面,记住以下路径,后面会用到 系统运维 www.osyunwei.com 温馨提醒:qihang01原创内容©版权所有,转载请注明出处及原文链接/usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/ #eaccelerator模块路径 mkdir /tmp/eaccelerator #创建目录 chmod 777 /tmp/eaccelerator #设置目录权限为完全控制3、配置php支持eaccelerator vi /usr/local/php5/etc/php.ini #编辑配置文件,在最后一行添加以下内容 [eaccelerator] zend_extension="/usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/eaccelerator.so" eaccelerator.cache_dir="/tmp/eaccelerator" eaccelerator.shm_size="8" eaccelerator.enable="1" eaccelerator.optimizer="1" eaccelerator.check_mtime="1" eaccelerator.debug="0" eaccelerator.filter="" eaccelerator.shm_max="0" eaccelerator.shm_ttl="3600" eaccelerator.shm_prune_period="3600" eaccelerator.shm_only="0" eaccelerator.compress="1" eaccelerator.compress_level="9" eaccelerator.keys ="disk_only" eaccelerator.sessions ="disk_only" eaccelerator.content ="disk_only"备注:如果配置文件中已经有了ZendGuardLoader等配置信息,为了避免冲突,需要把上面的配置信息写在ZendGuardLoader配置之前系统运维 www.osyunwei.com 温馨提醒:qihang01原创内容©版权所有,转载请注明出处及原文链接测试篇1、vi /usr/local/nginx/html/phpinfo.php #编辑 <?php phpinfo(); ?> :wq! #保存退出2、cp /usr/local/src/eaccelerator-0.9.6.1/control.php /usr/local/nginx/html/ #拷贝eaccelerator配置管理文件到网站根目录 vi /usr/local/php5/etc/php.ini #编辑配置文件,在[eaccelerator]配置部分的最后一行添加以下内容 eaccelerator.allowed_admin_path = "/usr/local/nginx/html/" :wq! #保存退出 service php-fpm restart #重启php-fpm service nginx restart #重启nginx3、浏览器打开phpinfo.php 如下图所示,可以看到eaccelerator相关信息4、浏览器打开control.php 输入用户名:admin,密码:eAccelerator,可以看到下面的eaccelerator管理界面系统运维 www.osyunwei.com 温馨提醒:qihang01原创内容©版权所有,转载请注明出处及原文链接备注:用户名和密码可以在control.php中修改 vi /usr/local/nginx/html/control.php #编辑,找到admin部分进行修改即可相关参数说明:extension="/data/webserver/php/lib/php/extensions/no-debug-zts-20060613/eaccelerator.so" #PHP扩展eaccelerator.so的路径eaccelerator.cache_dir="/tmp/eaccelerator" #缓存文件路径,即前面创建的目录eaccelerator.shm_size="8" #eaccelerator可使用的共享内存大小(单位为MB)eaccelerator.enable="1" #1开启eaccelerator加速,0为关闭,默认值为1eaccelerator.optimizer="1" #1打开php代码优化,提高程序执行效率,0为关闭,默认值为1eaccelerator.check_mtime="1" #1开启eaccelerator检查php文件是否修改,并自动重新缓存,0为关闭检查,如果php文件被修改,必须手动删除eaccelerator缓存,才能显示最新修改的php文件,默认值为1eaccelerator.debug="0" #0关闭eaccelerator调试,禁用日志记录,1为打开,默认值为0eaccelerator.filter="" #表示缓存所有的php文件,可以设置只缓存特定的文件,如"phpinfo.php","!phpinfo.php"表示除了phpinfo.php文件不缓存,其他的文件全部缓存,默认值为"" 即缓存全部文件 eaccelerator.shm_max="0" #eaccelerator单用户进程最大内存(单位为字节)使用限制,0为不限制eaccelerator.shm_ttl="0" #共享内存不够时,删除在shm_ttl秒内没有被访问过的文件,默认值为"0",即不删除任何共享内存中的文件eaccelerator.shm_prune_period="0" #共享内存不够时,删除在shm_prune_period秒内没有被访问过的文件,默认值为"0",即不删除任何共享内存中的文件系统运维 www.osyunwei.com 温馨提醒:qihang01原创内容©版权所有,转载请注明出处及原文链接eaccelerator.shm_only="0" #使用磁盘和共享内存来缓存文件,这个参数对会话数据和内容缓存没有效果。默认值为0 eaccelerator.compress="1" #1开启缓存文件压缩,0为关闭,默认值为1 eaccelerator.compress_level="9" #缓存文件压缩级别默认值9,即最大压缩。eaccelerator.keys = "disk_only" #缓存文件只存放在硬盘eaccelerator.sessions = "disk_only"eaccelerator.content = "disk_only"#shm_and_disk 缓存文件共享内存和硬盘(默认值); #shm 缓存文件默认存放在共享内存,如果共享内存已满或大小超过 "eaccelerator.shm_max" 的值,就存到硬盘 #shm_only 缓存文件只存放在共享内存 #none 不缓存数据
git reset revert 回退回滚取消提交返回上一版本 一介布衣 2015-01-07 开发工具 54025 分享到:QQ空间新浪微博腾讯微博人人网微信 总有一天你会遇到下面的问题. (1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚. (2)改完代码测试也没有问题,但是上线发现你的修改影响了之前运行正常的代码报错,必须回滚. 这些开发中很常见的问题,所以git的取消提交,回退甚至返回上一版本都是特别重要的. 大致分为下面2种情况: 1.没有push 这种情况发生在你的本地代码仓库,可能你add ,commit 以后发现代码有点问题,准备取消提交,用到下面命令 reset git reset [--soft | --mixed | --hard 上面常见三种类型 --mixed 会保留源码,只是将git commit和index 信息回退到了某个版本. git reset 默认是 --mixed 模式 git reset --mixed 等价于 git reset --soft 保留源码,只回退到commit 信息到某个版本.不涉及index的回退,如果还需要提交,直接commit即可. --hard 源码也会回退到某个版本,commit和index 都回回退到某个版本.(注意,这种方式是改变本地代码仓库源码) 当然有人在push代码以后,也使用 reset --hard <commit...> 回退代码到某个版本之前,但是这样会有一个问题,你线上的代码没有变,线上commit,index都没有变,当你把本地代码修改完提交的时候你会发现权是冲突..... 所以,这种情况你要使用下面的方式 2.已经push 对于已经把代码push到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致.你要用到下面的命令 revert git revert用于反转提交,执行evert命令时要求工作树必须是干净的. git revert用一个新提交来消除一个历史提交所做的任何修改. revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新.(这里不会像reset造成冲突的问题) revert 使用,需要先找到你想回滚版本唯一的commit标识代码,可以用 git log 或者在adgit搭建的web环境历史提交记录里查看. git revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61 通常,前几位即可 git revert c011eb3 git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit 看似达到的效果是一样的,其实完全不同. 第一: 上面我们说的如果你已经push到线上代码库, reset 删除指定commit以后,你git push可能导致一大堆冲突.但是revert 并不会. 第二: 如果在日后现有分支和历史分支需要合并的时候,reset 恢复部分的代码依然会出现在历史分支里.但是revert 方向提交的commit 并不会出现在历史分支里. 第三: reset 是在正常的commit历史中,删除了指定的commit,这时 HEAD 是向后移动了,而 revert 是在正常的commit历史中再commit一次,只不过是反向提交,他的 HEAD 是一直向前的. reset命令有3种方式: 1:git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息 2:git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可 3:git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容 1 2 3 4 5 6 7 8 9 10 11 12 #回退所有内容到上一个版本 git reset HEAD^ #回退a.py这个文件的版本到上一个版本 git reset HEAD^ a.py #向前回退到第3个版本 git reset –soft HEAD~3 #将本地的状态回退到和远程的一样 git reset –hard origin/master #回退到某个版本 git reset 057d #回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit git revert HEAD
nginx强制使用https访问(http跳转到https) 原文:http://blog.csdn.net/wzy_1988/article/details/8549290 需求简介 基于nginx搭建了一个https访问的虚拟主机,监听的域名是test.com,但是很多用户不清楚https和http的区别,会很容易敲成http://test.com,这时会报出404错误,所以我需要做基于test.com域名的http向https的强制跳转 我总结了三种方式,跟大家共享一下 nginx的rewrite方法 思路 这应该是大家最容易想到的方法,将所有的http请求通过rewrite重写到https上即可 配置 server { listen 192.168.1.111:80; server_name test.com; rewrite ^(.*)$ https://$host$1 permanent; } 搭建此虚拟主机完成后,就可以将http://test.com的请求全部重写到https://test.com上了 nginx的497状态码 error code 497 497 - normal request was sent to HTTPS 解释:当此虚拟站点只允许https访问时,当用http访问时nginx会报出497错误码 思路 利用error_page命令将497状态码的链接重定向到https://test.com这个域名上 配置 server { listen 192.168.1.11:443; #ssl端口 listen 192.168.1.11:80; #用户习惯用http访问,加上80,后面通过497状态码让它自动跳到443端口 server_name test.com; #为一个server{......}开启ssl支持 ssl on; #指定PEM格式的证书文件 ssl_certificate /etc/nginx/test.pem; #指定PEM格式的私钥文件 ssl_certificate_key /etc/nginx/test.key; #让http请求重定向到https请求 error_page 497 https://$host$uri?$args; } index.html刷新网页 思路 上述两种方法均会耗费服务器的资源,我们用curl访问baidu.com试一下,看百度的公司是如何实现baidu.com向www.baidu.com的跳转 可以看到百度很巧妙的利用meta的刷新作用,将baidu.com跳转到www.baidu.com.因此我们可以基于http://test.com的虚拟主机路径下也写一个index.html,内容就是http向https的跳转 index.html <html> <meta http-equiv="refresh" content="0;url=https://test.com/"> </html> nginx虚拟主机配置 server { listen 192.168.1.11:80; server_name test.com; location / { #index.html放在虚拟主机监听的根目录下 root /srv/www/http.test.com/; } #将404的页面重定向到https的首页 error_page 404 https://test.com/; } 后记 上述三种方法均可以实现基于nginx强制将http请求跳转到https请求,大家可以评价一下优劣或者根据实际需求进行选择。
今天在一台centos的vps安装S5,重启crond服务的时候出现:crond: unrecognized service. 查询下是否安装 rpm -qa|grep cron 安装crontab [root@CentOS ~]# yum install vixie-cron [root@CentOS ~]# yum install crontabs 说明: vixie-cron软件包是cron的主程序; crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。 用以下的方法启动、关闭这个cron服务: /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 /sbin/service crond reload //重新载入配置 查看crontab服务状态:service crond status 手动启动crontab服务:service crond start 查看crontab服务是否已设置为开机启动,执行命令:ntsysv 加入开机自动启动:chkconfig –level 35 crond on
git提取出两个版本之间的差异文件并打包 Linux运用 陈杰斌 3年前 (2013-09-11) 22678浏览 3评论 [编辑] 公司的项目原先是使用svn做版本管理,发布项目的时候是采用打包的方式压缩成zip格式的文件,然后用ftp上传。随着开发人员越来越多,需求变化也比较多,经常在开发新功能时要调整线上的问题,在一个分支上进行开发就非常不方便。虽然svn也支持多分支开发,但是操作非常不便,于是就把项目的版本管理切换成了git。 切换成git之后,为了平缓的过度,发布项目的时候还是打算使用打包的方式,然后ftp上传。那么问题就来了:git如何提取出两个提交之间的差异文件呢? 一开始找了git format-patch和git archive都没有找到需要的功能,后来就去查git diff命令,找到了方法。 git diff这个命令能比较两个提交之间的差异,使用–name-only参数可以只显示文件名。例如: $ git diff 608e120 4abe32e --name-only git diff列出两个提交之间差异的文件 这个输出结果非常有意思,就是差异文件的相对地址,不正好是压缩命令的参数吗?于是立马使用压缩命令 $ zip update.zip c/environ.c ... 所有的文件... 就能成功打包了。只是这样的话也太麻烦了吧,幸好linux有提供一个命令xargs能将前一个命令的输出转成另外一个命令的参数,按照这个思路就非常简单了。 $ git diff 608e120 4abe32e --name-only | xargs zip update.zip 结合xargs进行打包 总结 其实这种发布方式并不是非常好,如果线上的环境也能使用版本管理就非常方便了,只是这需要多方面的的配合。从某种意义上来讲,这种打包更新方式只是一种折中的处理方式。 还一个问题是这样的:提交的排序是按照时间来进行的,如果有分支合并进来的,可能分支里的提交时间在上次发布的提交时间之前,这样是否会漏打包到文件呢?答案是不会的,因为合并分支会产生一个新的提交,这个提交一定是在上次发布的提交之后。
10 个很有用的高级 Git 命令 迄今,我已经使用Git很长一段时间了,考虑分享一些不管你是团队开发还是个人项目,都受用的高级git命令。 1. 输出最后一次提交的改变 这个命令,我经常使用它 来发送其他没有使用git的人来检查或者集成所修改的。它会输出最近提交的修改内容到一个zip文件中。 1 git archive -o ../updated.zip HEAD $(git diff --name-only HEAD^) 2. 输出两个提交间的改变 类似的,如果你需要输出某两个提交间的改变时,你可以使用这个。 1 git archive -o ../latest.zip NEW_COMMIT_ID_HERE $(git diff--name-only OLD_COMMIT_ID_HERE NEW_COMMIT_ID_HERE) 3. 克隆 指定的远程分支 如果你渴望只克隆远程仓库的一个指定分支,而不是整个仓库分支,这对你帮助很大。 1 git init 2 git remote add -t BRANCH_NAME_HERE -f origin REMOTE_REPO_URL_PATH_HERE 3 git checkout BRANCH_NAME_HERE 4. 应用 从不相关的本地仓库来的补丁 如果你需要其它一些不相关的本地仓库作为你现在仓库的补丁,这里就是通往那里的捷径。 1 git --git-dir=PATH_TO_OTHER_REPOSITORY_HERE/.git format-patch -k -1 --stdout COMMIT_HASH_ID_HERE| git am -3 -k 5. 检测 你的分支的改变是否为其它分支的一部分 cherry命令让我们检测你的分支的改变是否出现在其它一些分支中。它通过+或者-符号来显示从当前分支与所给的分支之间的改变:是否合并了(merged)。.+ 指示没有出现在所给分支中,反之,- 就表示出现在了所给的分支中了。这里就是如何去检测: 1 git cherry -v OTHER_BRANCH_NAME_HERE 2 #例如: 检测master分支 3 git cherry -v master 6.开始一个无历史的新分支 有时,你需要开始一个新分支,但是又不想把很长很长的历史记录带进来,例如,你想在公众区域(开源)放置你的代码,但是又不想别人知道它的历史记录。 1 git checkout --orphan NEW_BRANCH_NAME_HERE 7. 无切换分支的从其它分支Checkout文件 不想切换分支,但是又想从其它分支中获得你需要的文件: 1 git checkout BRANCH_NAME_HERE -- PATH_TO_FILE_IN_BRANCH_HERE 8.忽略已追踪文件的变动 如果您正在一个团队中工作,而且大家都在同一条branch上面工作,那么您很有可能会经常用到fetch和merge。但是有时候这样会重置您的环境配置文件,如此的话,您就得在每次merge后修改它。使用这一命令,您就能要求git忽视指定文件的变动。这样,下回你再merge的话,这个文件就不会被修改了。 1 git update-index --assume-unchanged PATH_TO_FILE_HERE 9.检查提交的变动是否是release的一部分 name-rev命令能告诉您一个commit相对于最近一次release的位置。使用这条命令,您就可以检查您所做出的改动是否是release的一部分了。 1 git name-rev --name-only COMMIT_HASH_HERE 10.使用rebase推送而非merge 如果您正在团队中工作并且整个团队都在同一条branch上面工作,那么您就得经常地进行fetch/merge或者pull。Git中,分支的合并以所提交的merge来记录,以此表明一条feature分支何时与主分支合并。但是在多团队成员共同工作于一条branch的情形中,常规的merge会导致log中出现多条消息,从而产生混淆。因此,您可以在pull的时候使用rebase,以此来减少无用的merge消息,从而保持历史记录的清晰。 1 git pull --rebase 您也可以将某条branch配置为总是使用rebase推送: 1 git config branch.BRANCH_NAME_HERE.rebase true
git如何回滚远程仓库 2016-04-11 / mtxc 使用git管理项目开发的过程中经常会碰到这种情况:某次提交已经push到了远程仓库,可是突然意识到“天哪,我怎么做了这么蠢的事情”。那么问题来了,怎么将远程代码库回滚呢? 在网上看到大部分人给出的解决方案是先将本地回滚,然后删除远程分支,之后再将本地的分支push到远程仓库,这其实是一种很危险的方案,毕竟直接删除远程分支太狠了,不推荐这样做。。。 关于远程仓库回滚 首先,必须要明白的一件事,任何普通用户不能擅自做有关远程仓库回退的操作,如果你擅自回滚了远程仓库,会对项目团队其他人造成不可预知的影响。如果需要回退版本,先联系项目的仓库管理员,在团队其他人都对自己本地未提交的工作做好备份之后,再进行远程仓库回退操作,操作结束后,团队成员需要重新同步远程仓库后继续自己的工作。 通常回滚远程仓库会有以下三种情形: 1、删除最后一次提交 这种情况是最简单的了,只需要以下两步就可以了 git revert HEAD git push origin master 注意,revert和reset的区别: revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在,而reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。如果还没有理解的话,我们做如下测试: 假设我们有以下三次提交记录: 现在我们使用revert放弃最后一次提交,之后执行git log: git revert HEAD git log 历史记录中还有第三次提交的记录,并且多了一次的提交,但是仓库内容已经回到了第二次提交之后的状态。 现在我们使用reset回到第三次提交,之后执行git log: git reset --hard HEAD^ git log 历史记录中已经没有之前revert生成的提交记录了,现在应该明白了吧。 如果删除远程仓库的最后一次提交的时候不需要保留历史记录的话,可以使用reset,命令如下: git reset --hard HEAD^ git push origin master -f -f 参数是强制提交,因为reset之后本地库落后于远程库一个版本,因此需要强制提交。 2、删除历史某次提交 这种情况需要先用git log命令在历史记录中查找到想要删除的某次提交的commit id,比如下图中圈出来的就是注释为"2"的提交的commit id(由此可见提交的注释很重要,一定要认真写) 然后执行以下命令("commit id"替换为想要删除的提交的"commit id",需要注意最后的^号,意思是commit id的前一次提交): git rebase -i "commit id"^ 执行该条命令之后会打开一个编辑框,内容如下,列出了包含该次提交在内之后的所有提交。 然后在编辑框中删除你想要删除的提交所在行,然后保存退出就好啦,如果有冲突的需要解决冲突。接下来,执行以下命令,将本地仓库提交到远程库就完成了: git push origin master -f 3、修改历史某次提交 这种情况的解决方法类似于第二种情况,只需要在第二条打开编辑框之后,将你想要修改的提交所在行的pick替换成edit然后保存退出,这个时候rebase会停在你要修改的提交,然后做你需要的修改,修改完毕之后,执行以下命令: git add . git commit --amend git rebase --continue 如果你在之前的编辑框修改了n行,也就是说要对n次提交做修改,则需要重复执行以上步骤n次。 需要注意的是,在执行rebase命令对指定提交修改或删除之后,该次提交之后的所有提交的"commit id"都会改变。
linux expect自动登录ssh,ftp (2013-07-11 16:58:34) 转载▼ 标签: 文件 程序 第一次 例子 命令 it 分类: Linux expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚本内容,Expect可以知道程序会提示或反馈什么内容以及 什么是正确的应答。它是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。 shell功能很强大,但是不能实现有交互功能的多机器之前的操作,例如ssh和ftp.而expect可以帮助我们来实现. 一,安装expect yum install expect 其实expect根bash形势上差不多的. 二,实例 1,ssh实现自动登录,并停在登录服务器上 查看复制打印? #!/usr/bin/expect -f set ip [lindex $argv 0 ] //接收第一个参数,并设置IP set password [lindex $argv 1 ] //接收第二个参数,并设置密码 set timeout 10 //设置超时时间 spawn ssh root@$ip //发送ssh请滶 expect { //返回信息匹配 "*yes/no" { send "yes\r"; exp_continue} //第一次ssh连接会提示yes/no,继续 "*password:" { send "$password\r" } //出现密码提示,发送密码 } interact //交互模式,用户会停留在远程服务器上面. 运行结果如下: 查看复制打印? root@ubuntu:/home/zhangy# ./test.exp 192.168.1.130 admin spawn ssh root@192.168.1.130 Last login: Fri Sep 7 10:47:43 2012 from 192.168.1.142 [root@linux ~]# 这个例子有统一的接口,根据IP和密码可以连接到不同的机器.如果你嫌输入IP和密码麻烦,看下面的例子 查看复制打印? #!/usr/bin/expect -f set ip 192.168.1.130 set password admin set timeout 10 spawn ssh root@$ip expect { "*yes/no" { send "yes\r"; exp_continue} "*password:" { send "$password\r" } } interact 运行结果如下: 查看复制打印? root@ubuntu:/home/zhangy# ./web.exp spawn ssh root@192.168.1.130 Last login: Fri Sep 7 12:59:02 2012 from 192.168.1.142 [root@linux ~]# 2,ssh远程登录到服务器,并且执行命令,执行完后并退出 查看复制打印? #!/usr/bin/expect -f set ip 192.168.1.130 set password admin set timeout 10 spawn ssh root@$ip expect { "*yes/no" { send "yes\r"; exp_continue} "*password:" { send "$password\r" } } expect "#*" send "pwd\r" send "exit\r" expect eof 运行结果如下: 查看复制打印? root@ubuntu:/home/zhangy# ./test3.exp spawn ssh root@192.168.1.130 root@192.168.1.130's password: Last login: Fri Sep 7 14:05:07 2012 from 116.246.27.90 [root@localhost ~]# pwd /root [root@localhost ~]# exit logout Connection to 192.168.1.130 closed. 3,远程登录到ftp,并且下载文件 查看复制打印? #!/usr/bin/expect -f set ip [lindex $argv 0 ] set dir [lindex $argv 1 ] set file [lindex $argv 2 ] set timeout 10 spawn ftp $ip expect "Name*" send "zwh\r" expect "Password:*" send "zwh\r" expect "ftp>*" send "lcd $dir\r" expect { "*file" { send_user "local $_dir No such file or directory";send "quit\r" } "*now*" { send "get $dir/$file $dir/$file\r"} } expect { "*Failed" { send_user "remote $file No such file";send "quit\r" } "*OK" { send_user "$file has been download\r";send "quit\r"} } expect eof 运行结果如下: 查看复制打印? root@ubuntu:/home/zhangy# ./test2.exp 192.168.1.130 /var/www/www aaa.html spawn ftp 192.168.1.130 Connected to 192.168.1.130. 220 (vsFTPd 2.0.5) Name (192.168.1.130:root): zwh 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> lcd /var/www/www Local directory now /var/www/www ftp> get /var/www/www/aaa.html /var/www/www/aaa.html local: /var/www/www/aaa.html remote: /var/www/www/aaa.html 200 PORT command successful. Consider using PASV. 150 Opening BINARY mode data connection for /var/www/www/aaa.html (66 bytes). 226 File send OK. 66 bytes received in 0.00 secs (515.6 kB/s) quit aaa.html has been download 221 Goodbye.
2010年4月25日a18ccms 下午遇到一个小问题:文件目录结构如下 /dir0- -/dir1 <—该文件很大,欲排除 -/dir2 <—该文件很大,欲排除 -/dir3 <—目标目录之一 -index.php <—目标文件之一 ………….以下省略N个子目录和子文件…………. 目录下很多子目录,而我需要打包。目标是 /wwwroot 下所有子文件+/dir3 ,于是那些多余的子目录就让我头疼, 怎样在不影响文件结构的情况下打包呢,搜索网上,很多人用下面这个方法: 帮助 1 tar cvzf \home\all.tar.gz dir0 --exclude dir1 --exclude dir2 但是并不好,要是排除的部分是多出,要是子目录过多,语句该要写多久啊,后来又发现网上说可以直接使用排除参数X 新建文件excludefiles在当前目录中,内容为 帮助 1 2 3 4 cat excludefiles dir1 dir2 tar -cvzf \home\all.tar.gz -X excludefile dir1 注意: tar命令里面的目标文件是绝对路径格式,excludefile里面就也必须是绝对路径; tar命令里面的目标文件是相对路径格式,excludefile里面就也必须是相对路径; 后来 搜索找到了自力博客的一样问题的文章 说可以用 AWK 于是去搜索了一下它:Awk学习笔记 发现它提供的语句可以精简,可以这样写: 帮助 1 ls -l | awk '\^-\ {print $8}' | xargs tar cvfz \home\dir0.tar.gz 这个语句很好理解: ls -l 列出所有文件和目录; awk ‘\^-\ {print $8}’ 正则只保留文件行,获得第八列的所有文件名;xargs tar 把上一步得到的名称传参给tar命令。 一切OK,轻松完成打包喽!
#!/bin/bash 1.简单加密,使用echo ""|base64 -i加密,echo""|base64 -d 解密 echo "ygtx100" |base64 -i eWd0eDEwMAo= echo "eWd0eDEwMAo=“|base64 -d ygtx100 2.使用$()把命令执行的结果赋值给变量 pas=$(echo "azkxc1l6ZEwtCg=="|base64 -d) 3.使用管道执行sql语句。mysql -u -p <<EOF mysql -uroot -p${pas} <<EOF drop database glm100; create database glm100; EOF exit;
Shell脚本中执行sql语句操作mysql的5种方法 投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-10-31 我要评论 这篇文章主要介绍了Shell脚本中执行sql语句操作mysql的5种方法,本文讲解了将SQL语句直接嵌入到shell脚本文件中、命令行调用单独的SQL文件、使用管道符调用SQL文件等方法,需要的朋友可以参考下 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本。本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考。对于脚本输出的结果美化,需要进一步完善和调整。以下为具体的示例及其方法。 1、将SQL语句直接嵌入到shell脚本文件中 复制代码 代码如下: --演示环境 [root@SZDB ~]# more /etc/issue CentOS release 5.9 (Final) Kernel \r on an \m root@localhost[(none)]> show variables like 'version'; +---------------+------------+ | Variable_name | Value | +---------------+------------+ | version | 5.6.12-log | +---------------+------------+ [root@SZDB ~]# more shell_call_sql1.sh #!/bin/bash # Define log TIMESTAMP=`date +%Y%m%d%H%M%S` LOG=call_sql_${TIMESTAMP}.log echo "Start execute sql statement at `date`." >>${LOG} # execute sql stat mysql -uroot -p123456 -e " tee /tmp/temp.log drop database if exists tempdb; create database tempdb; use tempdb create table if not exists tb_tmp(id smallint,val varchar(20)); insert into tb_tmp values (1,'jack'),(2,'robin'),(3,'mark'); select * from tb_tmp; notee quit" echo -e "\n">>${LOG} echo "below is output result.">>${LOG} cat /tmp/temp.log>>${LOG} echo "script executed successful.">>${LOG} exit; [root@SZDB ~]# ./shell_call_sql1.sh Logging to file '/tmp/temp.log' +------+-------+ | id | val | +------+-------+ | 1 | jack | | 2 | robin | | 3 | mark | +------+-------+ Outfile disabled. 2、命令行调用单独的SQL文件 复制代码 代码如下: [root@SZDB ~]# more temp.sql tee /tmp/temp.log drop database if exists tempdb; create database tempdb; use tempdb create table if not exists tb_tmp(id smallint,val varchar(20)); insert into tb_tmp values (1,'jack'),(2,'robin'),(3,'mark'); select * from tb_tmp; notee [root@SZDB ~]# mysql -uroot -p123456 -e "source /root/temp.sql" Logging to file '/tmp/temp.log' +------+-------+ | id | val | +------+-------+ | 1 | jack | | 2 | robin | | 3 | mark | +------+-------+ Outfile disabled. 3、使用管道符调用SQL文件 复制代码 代码如下: [root@SZDB ~]# mysql -uroot -p123456 </root/temp.sql Logging to file '/tmp/temp.log' id val 1 jack 2 robin 3 mark Outfile disabled. #使用管道符调用SQL文件以及输出日志 [root@SZDB ~]# mysql -uroot -p123456 </root/temp.sql >/tmp/temp.log [root@SZDB ~]# more /tmp/temp.log Logging to file '/tmp/temp.log' id val 1 jack 2 robin 3 mark Outfile disabled. 4、shell脚本中MySQL提示符下调用SQL 复制代码 代码如下: [root@SZDB ~]# more shell_call_sql2.sh #!/bin/bash mysql -uroot -p123456 <<EOF source /root/temp.sql; select current_date(); delete from tempdb.tb_tmp where id=3; select * from tempdb.tb_tmp where id=2; EOF exit; [root@SZDB ~]# ./shell_call_sql2.sh Logging to file '/tmp/temp.log' id val 1 jack 2 robin 3 mark Outfile disabled. current_date() 2014-10-14 id val 2 robin 5、shell脚本中变量输入与输出 复制代码 代码如下: [root@SZDB ~]# more shell_call_sql3.sh #!/bin/bash cmd="select count(*) from tempdb.tb_tmp" cnt=$(mysql -uroot -p123456 -s -e "${cmd}") echo "Current count is : ${cnt}" exit [root@SZDB ~]# ./shell_call_sql3.sh Warning: Using a password on the command line interface can be insecure. Current count is : 3 [root@SZDB ~]# echo "select count(*) from tempdb.tb_tmp"|mysql -uroot -p123456 -s 3 [root@SZDB ~]# more shell_call_sql4.sh #!/bin/bash id=1 cmd="select count(*) from tempdb.tb_tmp where id=${id}" cnt=$(mysql -uroot -p123456 -s -e "${cmd}") echo "Current count is : ${cnt}" exit [root@SZDB ~]# ./shell_call_sql4.sh Current count is : 1 #以上脚本演示中,作抛砖引玉只用,对于输出的结果不是很规整友好,需要进一步改善和提高。