MySQL视图查看及权限说明

查看视图是指查看数据库中,已经存在的视图的定义 必须要有SHOW VIEW的权限
查看视图有三种方式:
DESCRIBE语句
使用DESCRIBE语句,查看视图
MySQL中,使用DESCRIBE可以查看视图的字段信息,其中,包括字段名、字段类型等信息
语法格式:

DESCRIBE 视图名; 
或者
DESC 视图名;
root@sso_db_69 17:58:  [escdb]> desc oa_org;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id          | varchar(36)  | NO   |     | NULL    |       |
| name        | varchar(255) | NO   |     | NULL    |       |
| fullName    | varchar(255) | YES  |     | NULL    |       |
| resource_id | varchar(255) | YES  |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+
4 rows in set (0.01 sec)





---阅读剩余部分---

MySQL:Incorrect integer value: '' for column 'id' at row 1警告信息

MySQL5.x在insert into插入时,如果不带id写成为空如下:

INSERT INTO `server` VALUE ('',
'SSO系统',
'sso-db',
'192.168.6.37',
'/',
'运行',
'生产',
'4',
'8',
'100',
'CentOS Linux release 7.5',
'IDC机房',
'zuul',
'8000',
'/',
'王二小',
'2018-06-30',
server_update = NOW(),
'test11111111111111111111'
);

就会警告如下:

Warning Code : 1366
Incorrect integer value: '' for column 'id' at row 1

MySQL5的都会遇到这样的问题,插入空字符要使用NULL,改成如下:

INSERT INTO `server` VALUE (NULL,
'SSO系统',
'sso-db',
'192.168.6.37',
'/',
'运行',
'生产',
'4',
'8',
'100',
'CentOS Linux release 7.5',
'IDC机房',
'zuul',
'8000',
'/',
'王二小',
'2018-06-30',
server_update = NOW(),
'test11111111111111111111'
);

即可插入成功,同时也无警告信息。

php的session过期时间

PHP从4.0中加入了对Session的支持,方便了我们开发,Session储存在服务器端,根据客户端 提供的SessionID来得到这个用户的文件,然后读取文件,取得变量的值,SessionID可以使用客户端的Cookie或者Http1.1协议的 Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录。

先来看看在php.ini中session怎么设置,打开 php.ini,查找Session设置部分中以下一项,代码如下:

session.save_path = "N;/path"
session.save_path = "C:/Temp"  #此处以你自己设定的路径为准

这项设置提供给我们可以给session存放目录进行多级散列,其中“N”表示要设置的目录级数,后面的“/path”表示session文件存放的根目录路径,比如我们设置为下面的格式,代码如下:

session.save_path = "2;C:/Temp"

上面的设置表示我们把php的session文件进行两级目录存储,每一级目录分别是0-9和a-z共36个字母数字为目录名,这样存放session的目录可以达到36*36个,共1332个文件夹,相信作为单台服务器来说,这是完全够用了,如果说您的系统架构设计为多台服务器共享session数据,可以把目录级增加到3级或者更多。

session.gc_maxlifetime = 1440 #(PHP5默认24分钟)
session.gc_probability = 1
session.gc_divisor = 1000   #garbage collection 有个概率的,1/1000就是session 1000次才有一次被回收。

将session.gc_divisor = 0,这样就能明显的看到SESSION过期的效果了.

session有过期的机制:
session.gc_maxlifetime 原来session 过期是一个小概率的事件,分别使用session.gc_probability和session.gc_divisor 来确定运行session 中gc 的概率 session.gc_probability和session.gc_divisor的默认值分别为 1和100。分别为分子和分母 所以session中gc的概率运行机会为1% 。如果修改这两个值,则会降低php的效率。

概率是gc_probability/gc_divisor

session.gc_probability = 1
session.gc_divisor = 100

注意1:假设这种情况gc_maxlifetime=120,如果某个session文件最后修改时间是120秒之前,那么在下一次回收(1/100的概率)发生前,这个session仍然是有效的。

注意2:如果你的session使用session.save_path中使用别的地方保存session,session回收机制有可能不会自动处理过期session文件。这时需要定时手动(或者crontab)的删除过期的session:

cd /path/to/sessions; find -cmin +24 | xargs rm

PHP中的session永不过期

不修改程序是最好的方法了,因为如果修改程序,测试部一定非常郁闷,那么只能修改系统环境配置,其实很 简单,打开php.ini设置文件,修改三行如下:

1、session.use_cookies

把这个的值设置为1,利用cookie来传递sessionid

2、session.cookie_lifetime

这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就作废……就是因为这个所以PHP的 session不能永久使用! 那么我们把它设置为一个我们认为很大的数字吧,999999999怎么样,可以的!就这样。

3、session.gc_maxlifetime

这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除! 那么我们也把它设置为99999999。

就这样一切ok了,当然你不相信的话就测试一下看看——设置一个session值过个10天半个月的回来看看,如果你的电脑没有断电或者宕机,你仍然可以看见这个sessionid。

via: http://php.net/manual/zh/session.configuration.php#ini.session.gc-divisor

Nginx记录请求分发日志及后端负载的IP

前端nginx接收到请求之后, 需把请求分发到后端WEB服务集群,需要记录分发日志, 来分析后端每台WEB服务器处理的请求数目,日志里面需要记录客户端IP、每个URL请求是哪个后端处理的,nginx配置文件如下:

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
              '$connection $upstream_addr '
              'upstream_response_time $upstream_response_time request_time $request_time ';
    access_log  logs/access.log  main;

参数说明:

$server_name:虚拟主机名称。
$remote_addr:远程客户端的IP地址,请求者IP。
-:空白,用一个“-”占位符替代,历史原因导致还存在。
$remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白。
[$time_local]:访问的时间与时区,比如07/Jun/2016:08:54:27 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。
$request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求
$status:记录请求返回的http状态码,比如成功是200。
$uptream_status:upstream状态,比如成功是200.
$body_bytes_sent:发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。
$http_referer:记录从哪个页面链接访问过来的。
$http_user_agent:客户端浏览器信息
$http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
$ssl_protocol:SSL协议版本,比如TLSv1。
$ssl_cipher:交换数据中的算法,比如RC4-SHA。
$upstream_addr:upstream的地址,即真正提供服务的主机地址。
$request_time:整个请求的总时间。
$upstream_response_time:请求过程中,upstream的响应时间。

---阅读剩余部分---

RHEL/CentOS.x服务器CPU相关信息查看

可以使用lscpu快速查看:
lscpu命令参数

-a, –all: 包含上线和下线的cpu的数量,此选项只能与选项e或-p一起指定 
-b, –online: 只显示出上线的cpu数量,此选项只能与选项e或者-p一起指定 
-c, –offline: 只显示出离线的cpu数量,此选项只能与选项e或者-p一起指定 
 -e, –extended [=list]: 以人性化的格式显示cpu信息,如果list参数省略,输出所有可用数据的列,在指定了list参数时,选项的字符串、等号(=)和列表必须不包含任何空格或其他空白。比如:’-e=cpu,node’ or ’–extended=cpu,node’ 
-h, –help:帮助 
-p, –parse [=list]: 优化命令输出,便于分析.如果省略list,则命令的输出与早期版本的lscpu兼容,兼容格式以两个逗号用于分隔cpu缓存列,如果没有发现cpu缓存,则省略缓存列,如果使用list参数,则缓存列以冒号(:)分隔。在指定了list参数时,选项的字符串、等号(=)和列表必须不包含空格或者其它空白。比如:’-e=cpu,node’ or ’–extended=cpu,node’ 
-s, –sysroot directory: 为一个Linux实例收集CPU数据,而不是发出lscpu命令的实例。指定的目录是要检查Linux实例的系统根 
-x, –hex:使用十六进制来表示cpu集合,默认情况是打印列表格式的集合(例如:0,1)

---阅读剩余部分---

Keepalived 2.0.9 + Redis5.0部署redis主从高可用

项目需要部署搭建redis主从高可用环境,对外使用VIP提供服务,以下是实现步骤:
Keepalived 实现VRRP(虚拟路由冗余)协议,从路由级别实现VIP切换,可以完全避免类似heartbeat脑裂问题,可以很好的实现主从、主备、互备方案。
实现切换逻辑如下:A和B两台机器

1)A 、B机器依次启动,A机作为主、B机为从。
2)主A挂掉,B接管业务并作为主。
3)A机起来,作为从SLAVEOF B。
4)B机挂掉,A机再切回主。

在Keepalived 有两个角色:Master(一个)、Backup(多个),如果设置一个为Master,但Master挂了后再起来,必然再次业务又一次切换,这对于有状态服务是不可接受的。解决方案就是两台机器都设置为Backup,而且优先级高的Backup设置为nopreemt 不抢占主。
服务器环境:




---阅读剩余部分---

WARNING: The TCP backlog setting of 511 ......报错解决

安装好redis后,如果系统没有调优,启动的时候会报错:

WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
警告:TCP backlog的值设定是511,这是无法启动的,因为/proc/sys/net/core/somaxconn的设定值是128,比你的511要低。

解决方法:

echo 2048 > /proc/sys/net/core/somaxconn
echo 'net.core.somaxconn=1024' >> /etc/sysctl.conf
sysctl -p

在重启redis服务即可,log里面无报错了·
net.core.somaxconn参数说明:

net.core.somaxconn是linux中的一个kernel参数,表示socket监听(listen)的backlog上限。
backlog是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。
而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。
当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。
所以说net.core.somaxconn限制了接收新 TCP 连接侦听队列的大小。
对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。
大多数环境这个值建议增加到 2048 或者更多。

CentOS6/7中禁用Transparent Huge Pages(大页)

RHEL6/CentOS6版本开始引入了Transparent Huge Pages(THP),从CentOS7版本开始,该特性默认就会启用。尽管THP的本意是为提升内存的性能,不过某些数据库厂商还是建议直接关闭THP(Oracle、MariaDB、MongoDB、Redis等),否则可能会导致性能出现下降,
查看THP的启用状态:

[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

这个状态就说明都是启用.
禁用THP立即生效:

echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag

写入启动项,下次重启时生效:

chmod +x /etc/rc.d/rc.local
vim /etc/rc.d/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
 echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
 fi
 if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
 echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
 fi

最后重启系统,以后再检查THP应该就是被禁用了

[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
 always madvise [never]
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/defrag 
 always madvise [never]

Zabbix housekeeper processes more than 75% busy

收到Zabbix housekeeper processes more than 75% busy 报警,
问题原因
为了防止数据库持续增大,zabbix有个自动删除历史数据的机制,就是housekeeper,而mysql数据库删数据的时候,性能会降低,就会报这个错误,
解决方法如下:
调整HousekeepingFrequency参数,设置为3小时执行一次

vim /usr/local/zabbix/etc/zabbix_server.conf
HousekeepingFrequency=3            #间隔时间
MaxHousekeeperDelete=3000       #最大删除量

重新启动zabbix_server生效:

/etc/init.d/zabbix_server restart

查看log发现删除时已经带上了最大3000行

tail -f /tmp/zabbix_server.log
 10622:20181109:162644.037 resuming Zabbix agent checks on host "ETS-DB": connection restored
 10005:20181109:162646.629 slow query: 6.579011 sec, "delete from history_uint where itemid=40531 limit 3000"
 10005:20181109:162659.356 slow query: 4.364114 sec, "delete from history_uint where itemid=40399 limit 3000"
 10024:20181109:162701.359 item "dbnode1:uptime" became not supported: Unsupported item key.
 10033:20181109:162713.585 item "OA-DB:uptime" became not supported: Unsupported item key.
 10676:20181109:162718.903 cannot send list of active checks to "192.168.255.148": host [PingAn-Bank] not found
 10005:20181109:162722.824 slow query: 23.467607 sec, "delete from history_uint where itemid=40510 limit 3000"
 10680:20181109:162724.601 cannot send list of active checks to "192.168.255.132": host [WINN5F1QHDELEP] not found
 10038:20181109:162735.390 item "dbnode1_zs:uptime" became supported
 10005:20181109:162745.124 slow query: 22.299782 sec, "delete from history_uint where itemid=40515 limit 3000"
 10025:20181109:162757.104 item "dbnode1_zs:uptime" became not supported: Unsupported item key.
 10005:20181109:162806.766 slow query: 21.642425 sec, "delete from history_uint where itemid=40505 limit 3000"
 10005:20181109:162812.225 slow query: 5.458863 sec, "delete from history_uint where itemid=40511 limit 3000"
 10016:20181109:162817.036 item "dbnode1_zs:uptime" became supported
 10005:20181109:162818.444 slow query: 6.217885 sec, "delete from history_uint where itemid=40516 limit 3000"
 10005:20181109:162824.287 slow query: 5.843189 sec, "delete from history_uint where itemid=40506 limit 3000"

平滑升级Nginx到最新版本

Nginx目前爆出在HTTP/2 和 MP4 模块中存在安全漏洞,容易被DOS攻击。
8cf51541726528.jpg

Nginx官方于11月6日发布了新版本,用于修复影响 1.15.6, 1.14.1 之前版本的多个安全问题,被发现的安全问题有一种这样的情况 —— 允许潜在的攻击者触发拒绝服务(DoS)状态并访问敏感的信息,见官方公告:http://nginx.org/en/security_advisories.html
低版本升级到目前最新版nginx-1.14.1方法步骤如下:
1、查看原来安装nginx的版本以及编译的参数:

[root@xshell ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) 
built with OpenSSL 1.0.2o  27 Mar 2018
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/data/lnmp1.5-full/src/openssl-1.0.2o

2、下载nginx最新稳定版本

wget http://nginx.org/download/nginx-1.14.1.tar.gz

3、解压ningx压缩包并编译make

tar xvf nginx-1.14.1.tar.gz
cd nginx-1.14.1
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/data/lnmp1.5-full/src/openssl-1.0.2o
make

4、make编译完后会在安装目录下生成一个objs目录且在该目录下有一个nginx执行文件

[root@xshell nginx-1.14.1]# ll
total 756
-rw-r--r-- 1 www  www  287441 Nov  6 21:52 CHANGES
-rw-r--r-- 1 www  www  438114 Nov  6 21:52 CHANGES.ru
-rw-r--r-- 1 www  www    1397 Nov  6 21:52 LICENSE
-rw-r--r-- 1 root root    376 Nov  9 10:56 Makefile
-rw-r--r-- 1 www  www      49 Nov  6 21:52 README
drwxr-xr-x 6 www  www    4096 Nov  9 10:55 auto
drwxr-xr-x 2 www  www    4096 Nov  9 10:55 conf
-rwxr-xr-x 1 www  www    2502 Nov  6 21:52 configure
drwxr-xr-x 4 www  www    4096 Nov  9 10:55 contrib
drwxr-xr-x 2 www  www    4096 Nov  9 10:55 html
drwxr-xr-x 2 www  www    4096 Nov  9 10:55 man
drwxr-xr-x 3 root root   4096 Nov  9 11:00 objs
drwxr-xr-x 9 www  www    4096 Nov  9 10:55 src
[root@xshell nginx-1.14.1]# ll objs/
total 10348
-rw-r--r-- 1 root root    52252 Nov  9 10:56 Makefile
-rw-r--r-- 1 root root    17763 Nov  9 10:55 autoconf.err
-rwxr-xr-x 1 root root 10394568 Nov  9 11:00 nginx
-rw-r--r-- 1 root root     5341 Nov  9 11:00 nginx.8
-rw-r--r-- 1 root root     7555 Nov  9 10:56 ngx_auto_config.h
-rw-r--r-- 1 root root      657 Nov  9 10:55 ngx_auto_headers.h
-rw-r--r-- 1 root root     8401 Nov  9 10:55 ngx_modules.c
-rw-r--r-- 1 root root    89712 Nov  9 11:00 ngx_modules.o
drwxr-xr-x 9 root root     4096 Nov  9 10:55 src

5、备份老的nginx文件,复制新文件

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak
cp objs/nginx /usr/local/nginx/sbin/

6、检测配置文件是否正常

/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

7、使用make upgrade替换老的nginx进程

make upgrade
/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
sleep 1
test -f /usr/local/nginx/logs/nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

8、执行/usr/local/nginx2/sbin/nginx -V查看nginx最新的版本及编译的参数

/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.14.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) 
built with OpenSSL 1.0.2o  27 Mar 2018
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=/data/lnmp1.5-full/src/openssl-1.0.2o

9、重新reload服务

/usr/local/nginx/sbin/nginx -s reload

至此平滑升级完成

CentOS安装VMware Tools

vmtools有以下功能:

正常执行虚拟机的电源操作。
在执行各种电源操作期间在客户机操作系统中运行 VMware 提供的脚本或用户配置的脚本。
在客户机操作系统中运行应用程序、命令和文件系统操作,以增强客户机自动化。
针对客户机用户操作进行身份验证。
定期从客户机收集网络、磁盘和内存使用情况信息。
生成从客户机操作系统到主机的检测信号,以便 VMware High Availability 可以确定客户机操作系统的可用性。
在客户机操作系统与主机或客户端桌面之间同步时钟。
使客户机文件系统进入静默状态,以便主机可以捕获与文件系统一致的客户机快照。
在使客户机文件系统进入静默状态时,运行 pre-freeze-script.bat 和 post-thaw-script.bat。
打开虚拟机电源后立即自定义客户机操作系统。
在 VMware Workstation 和 VMware Fusion 上,在主机文件系统与客户机文件系统之间启用“共享文件夹”。
支持在客户机操作系统与主机或客户端桌面之间复制和粘贴文本、图形和文件。
没有安装vmtools的虚拟机,通过vsphere client查看虚拟机信息时,是看不到虚拟机IP地址与hostname.

VMware Tools安装步骤:
1、登录vsphere控制台在要安装的虚机上,更改配置,将光驱设置为客户端设备。
1.png
2、右键客户机操作系统--安装VMware Tools
3、ssh登陆要安装的虚机,挂载vmtools镜像

mkdir /root/cdrom
mount /dev/cdrom /root/cdrom

4、解压

cd /root/cdrom
tar zvxf VMwareTools-10.2.1-8267844.tar.gz -C /root/

5、开始安装:

yum install perl -y  #安装perl包
cd /root/cdrom/VMwareTools
./vmware-install.pl 
# 询问是否继续安装,默认为否
open-vm-tools packages are available from the OS vendor and VMware recommends 
using open-vm-tools packages. See http://kb.vmware.com/kb/2073803 for more 
information.
Do you still want to proceed with this installation? [no] yes
 
# 安装路径,默认即可
Creating a new VMware Tools installer database using the tar4 format.
 
Installing VMware Tools.
 
In which directory do you want to install the binary files? 
[/usr/bin] 
 
# 自动启动文件路径,默认即可
What is the directory that contains the init directories (rc0.d/ to rc6.d/)? 
[/etc/rc.d] 
 
# init文件夹路径,默认即可
What is the directory that contains the init scripts? 
[/etc/rc.d/init.d] 
 
# sbin文件夹路径,默认即可
In which directory do you want to install the daemon files? 
[/usr/sbin] 
 
# vmware-tools库目录路径,默认即可
In which directory do you want to install the library files? 
[/usr/lib/vmware-tools] 
 
# vmware-tools库目录不存在,需要创建,默认即可
The path "/usr/lib/vmware-tools" does not exist currently. This program is 
going to create it, including needed parent directories. Is this what you want?
[yes] 
 
# agent library文件夹路径,默认即可
In which directory do you want to install the common agent library files? 
[/usr/lib] 
 
# agent transient文件夹路径,默认即可
In which directory do you want to install the common agent transient files? 
[/var/lib] 
 
# 帮助文档路径,默认即可
In which directory do you want to install the documentation files? 
[/usr/share/doc/vmware-tools] 
 
# 帮助文档文件夹并不存在,需要创建,默认即可
The path "/usr/share/doc/vmware-tools" does not exist currently. This program 
is going to create it, including needed parent directories. Is this what you 
want? [yes] 
 
# 执行configure脚本,默认即可
Before running VMware Tools for the first time, you need to configure it by 
invoking the following command: "/usr/bin/vmware-config-tools.pl". Do you want 
this program to invoke the command for you now? [yes] 
 
# 是否启用文件文件夹共享,esxi环境无法使用,默认即可
The VMware Host-Guest Filesystem allows for shared folders between the host OS 
and the guest OS in a Fusion or Workstation virtual environment.  Do you wish 
to enable this feature? [no] 
 
# vmblock,不支持esxi环境,默认即可
The vmblock enables dragging or copying files between host and guest in a 
Fusion or Workstation virtual environment.  Do you wish to enable this feature?
[no] 
 
# 是否启用VMware automatic kernel modules,默认即可
Would you like to enable VMware automatic kernel modules?
[yes] 
 
# 是否启用vgauth,默认即可
Do you want to enable Guest Authentication (vgauth)? Enabling vgauth is needed 
if you want to enable Common Agent (caf). [yes] 
 
# 是否启用Common Agent,默认即可
Do you want to enable Common Agent (caf)? [no] 
No X install found.

开始安装:

Creating a new initrd boot image for the kernel.
Generating the key and certificate files.
Successfully generated the key and certificate files.
manageSELinux install: The 'semanage' utility was not found.
There was an error configuring the SELinux security context for VMware Tools.  
Please make certain that SELinux is configured correctly.
 
The configuration of VMware Tools 10.2.1 build-8267844 for Linux for this 
running kernel completed successfully.
 
You must restart your X session before any mouse or graphics changes take 
effect.
 
To enable advanced X features (e.g., guest resolution fit, drag and drop, and 
file and text copy/paste), you will need to do one (or more) of the following:
1. Manually start /usr/bin/vmware-user
2. Log out and log back into your desktop session
3. Restart your X session.
 
Enjoy,
 
--the VMware team
 
Found VMware Tools CDROM mounted at /root/cdrom. Ejecting device /dev/sr0 ...

安装完成后会自动卸载cdrom.
6、删除安装包:

rm /root/cdrom /root/VMwareTools -rf

7、查看vmtools服务状态:

systemctl status vmware-tools

参考文档:
https://www.vmware.com/files/cn/pdf/vmware-tools-installation-configuration.pdf
https://ngx.hk/2018/08/22/vmware-tools%E7%AE%80%E4%BB%8B%E4%B8%8E%E5%AE%89%E8%A3%85.html

CentOS 7.5快速安装ss服务

gfw
1、安装epel源:

yum install epel-release -y

2、更新当前系统:

yum update -y

3、安装升级pip

yum install python-pip -y
pip install -U pip

4、pip安装shadowsocks

pip install shadowsocks

5、创建配置文件:

cat <<EOF>> /etc/shadowsocks.json
{
    "server":"VPS IP",
    "local_address":"127.0.0.1",
    "local_port":8888,
    "port_password":{
         "9991":"PASSWORD",    #根据需要增减
         "9992":"PASSWORD"
    },
    "timeout":600,
    "method":"aes-256-cfb",
    "fast_open": false
}
EOF

参数说明:

server:主机名或服务器IP(IPv4/IPv6)。
server_port:服务器端口号。
local_port:本地端口号。
port_password:用于加密传输的端口和密码。
timeout:连接超时(以秒为单位)。
method:加密方法,“bf-cfb”,“aes-256-cfb”,“des-cfb”,“rc4”等。默认为表,不安全。建议使用“aes-256-cfb”。
auth:一次性认证,设置为true以启用一次性认证功能。
fast_open:true 或 false。Linux 内核在3.7+,可以开启 fast_open 以降低延迟。

6、启动服务并加入开机启动项:

/usr/bin/python2 /usr/bin/ssserver -c /etc/shadowsocks.json >> /data/ss.log 2>&1 &
echo "/usr/bin/python2 /usr/bin/ssserver -c /etc/shadowsocks.json >> /data/ss.log 2>&1 &" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local 

至此,安装完成,直接在ShadowsocksR客户端配置相关IP和端口密码、加密算法即可。

Docker环境下安装部署Redis5.0挂载外部配置和数据

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
docker-redis.png
本文记录docker下安装部署redis5.0的过程:
os版本centos7.5
先更新 yum 软件管理器,然后再安装 Docker

[root@localhost /] yum -y update
[root@localhost /] yum install -y docker

验证安装,查看 Docker 版本信息

[root@localhost /] docker -v
Docker version 1.13.1, build 8633870/1.13.1
You have new mail in /var/spool/mail/root

启动、停止、重启docker服务、加入开机启动

systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl enable docker

安装redis5.0镜像

[root@sso-nginx-b ~]# systemctl start docker
[root@sso-nginx-b ~]# docker pull redis:5.0
Trying to pull repository docker.io/library/redis ... 
5.0: Pulling from docker.io/library/redis
f17d81b4b692: Pull complete 
b32474098757: Pull complete 
8980cabe8bc2: Pull complete 
2719bdbf9516: Pull complete 
f306130d78e3: Pull complete 
3e09204f8155: Pull complete 
Digest: sha256:481678b4b5ea1cb4e8d38ed6677b2da9b9e057cf7e1b6c988ba96651c6f6eff3
Status: Downloaded newer image for docker.io/redis:5.0

创建redis运行目录及文件

mkdir -p /data/docker/redis
touch /data/docker/redis/redis.conf

redis.conf文件内容如下:

bind 172.17.0.2 127.0.0.1
#bind 0.0.0.0
protected-mode yes
port 6380
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no   #如果daemonize yes无法启动容器
supervised no
pidfile /data/docker/redis/6380.pid
loglevel notice
logfile "6380.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

创建redis实例:

docker run -d --privileged=true --restart=always -p 6380:6380 -v /data/docker/redis/redis.conf:/etc/redis/redis.conf -v /data/docker/redis:/data --name redistest1 redis:5.0 redis-server /etc/redis/redis.conf --appendonly yes

实例说明如下:

--privileged=true 容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
--restart=always 开机启动容器
-p 6380:6380 映射宿主机6380端口到docker端口6380
-v /data/docker/redis/redis.conf:/etc/redis/redis.conf   映射配置文件
-v /data/docker/redis:/data  映射数据目录地址
--name redistest1 redis:5.0 redis-server /etc/redis/redis.conf   #docker名字 redis实例名 配置文件
--appendonly yes:开启持久化

查看redistest1容器的IP地址:

docker inspect redistest1 | grep -i address
            "LinkLocalIPv6Address": "",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "GlobalIPv6Address": "",
            "IPAddress": "172.17.0.2",
            "MacAddress": "02:42:ac:11:00:02",
                    "IPAddress": "172.17.0.2",
                    "GlobalIPv6Address": "",
                    "MacAddress": "02:42:ac:11:00:02"

将/data/docker/redis/redis.conf里面的bind地址修改为

bind 172.17.0.2 127.0.0.1

重启redistest1容器:

docker restart redistest1

进入redis控制台:

redis-cli -h 172.17.0.2 -p 6380  #172.17.0.2是redistest1容器的IP地址,也可以用宿主机IP地址进入

启动另外一个redis实例:

docker run -d --privileged=true --restart=always -p 6381:6381 -v /data/docker/redis-6381/redis.conf:/etc/redis/redis.conf -v /data/docker/redis-6381:/data --name redistest2 redis:5.0 redis-server /etc/redis/redis.conf --appendonly yes

至此,docker上安装部署redis完毕.

Windows修改端口连接数范围及快速释放time_wait

查看当前端口范围:(win10/win2008/win2012默认是一致的)

C:\Users\Administrator>netsh int ipv4 show dynamicportrange tcp

协议 tcp 动态端口范围
---------------------------------
启动端口        : 49152
端口数          : 16384

C:\Users\Administrator>netsh int ipv4 show dynamicportrange udp

协议 udp 动态端口范围
---------------------------------
启动端口        : 49152
端口数          : 16384

C:\Users\Administrator>netsh int ipv6 show dynamicport tcp

协议 tcp 动态端口范围
---------------------------------
启动端口        : 49152
端口数          : 16384

C:\Users\Administrator>netsh int ipv6 show dynamicport udp

协议 udp 动态端口范围
---------------------------------
启动端口        : 49152
端口数          : 16384

调整此范围:
netsh int < ipv4 | ipv6 > 设置动态 < tcp | udp > 开始数数 = =范围

netsh int ipv4 set dynamicport tcp start=2000 num=63000
netsh int ipv4 set dynamicport udp start=2000 num=63000
netsh int ipv6 set dynamicport tcp start=2000 num=63000
netsh int ipv6 set dynamicport udp start=2000 num=63000

time_wait超时时间调整

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
“MaxUserPort”=dword:0000fffe
“TcpTimeWaitDelay”=dword:0000005 (缩短为5秒)

重启生效。
via: https://support.microsoft.com/zh-cn/help/929851/the-default-dynamic-port-range-for-tcp-ip-has-changed-in-windows-vista
http://www.361way.com/win-dynamic-port-timewait/5255.html

MySQL5.7.5X在线调整innodb_buffer_pool_size参数

MySQL5.7.5以前,调整innodb_buffer_pool_size需要重启mysql进程才可以生效,建议业务低峰时间执行,在MySQL 5.7.5版本后,innodb_buffer_pool_size参数的值可以动态的设置,可以通过innodb_buffer_pool_chunk_size参数配置块的大小,Innodb_buffer_pool_resize_status状态变量记录了从调整操作的状态。

innodb_buffer_pool_size参数表示缓冲池字节大小,InnoDB缓存表和索引数据的内存区域。mysql默认的值是128M。最大值与你的CPU体系结构有关,在32位操作系统,最大值是 4294967295 (2^32-1) ,在64 位操作系统,最大值为18446744073709551615 (2^64-1)。在32位操作系统中,CPU和操作系统实用的最大大小低于设置的最大值。

innodb_log_file_size表示在一个日志组每个日志文件的字节大小。日志文件的总大小(innodb_log_file_size* innodb_log_files_in_group)不能超过最高值512GB。例如一对255 GB的日志文件,已经接近了极限,不能超过它。默认值是48M。比较合适的值的范围是从1MB到1 / N个的缓冲池大小,其中N是该组中的日志文件的数量。该值越大,缓冲池中必要的检查点刷新活动就会越少,节省磁盘I/ O。但是越大的日志文件,mysql的崩溃恢复就越慢,尽管在mysql5.5之后改进了恢复性能和日志文件恢复的代价,一般2G左右就可以了;

在线调整innodb_buffer_pool_size方法如下:
当前大小为128M

show variables like '%innodb_buffer_pool_size%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
row in set (0.03 sec)

select 134217728/1024/1024;  
+---------------------+
| 134217728/1024/1024 |
+---------------------+
|        128.00000000 |
+---------------------+
row in set (0.00 sec)

动态调整为512M

set global innodb_buffer_pool_size = 512*1024*1024;
Query OK, 0 rows affected (0.18 sec)

show variables like '%innodb_buffer_pool_size%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 536870912 |
+-------------------------+-----------+
row in set (0.02 sec)

select 536870912/1024/1024;
+---------------------+
| 536870912/1024/1024 |
+---------------------+
|        512.00000000 |
+---------------------+
1 row in set (0.00 sec)

调整时,内部会把数据页移动到一个新的位置,单位是块。如果想提升移动速度,则需要调整
innodb_buffer_pool_chunk_size的参数大小,默认是128M
innodb_buffer_pool_size/innodb_buffer_pool_instances = innodb_buffer_pool_chunk_size的参数大小,默认是128M
调整完以后在my.cnf的mysqld部分增加

innodb_buffer_pool_size = 536870912

以防止重启后仍然生效。

Siege安装与使用 并发性能压力测试工具

siege 是Linux/Unix下的一个WEB系统的压力性能测试工具,官网地址https://www.joedog.org/siege-home
目前最新版本是siege-4.0.4
下载编译安装:

wget http://download.joedog.org/siege/siege-4.0.4.tar.gz
tar xvf siege-4.0.4.tar.gz
./configure
make
make install
[root@hongsin-monitor data]# siege -V
SIEGE 4.0.4

Copyright (C) 2017 by Jeffrey Fulmer, et al.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.

参数说明:
可以使用"siege -h"命令来查看帮助信息:

[root@hongsin-monitor data]# siege -h
SIEGE 4.0.4
Usage: siege [options]
       siege [options] URL
       siege -g URL
Options:
  -V, --version             VERSION, prints the version number.
  -h, --help                HELP, prints this section.
  -C, --config              CONFIGURATION, show the current config.
  -v, --verbose             VERBOSE, prints notification to screen. 要不要显示过程。
  -q, --quiet               QUIET turns verbose off and suppresses output.
  -g, --get                 GET, pull down HTTP headers and display the
                            transaction. Great for application debugging.
  -p, --print               PRINT, like GET only it prints the entire page.
  -c, --concurrent=NUM      CONCURRENT users, default is 10
  -r, --reps=NUM            REPS, number of times to run the test.
  -t, --time=NUMm           TIMED testing where "m" is modifier S, M, or H
                            ex: --time=1H, one hour test.
  -d, --delay=NUM           Time DELAY, random delay before each requst
  -b, --benchmark           BENCHMARK: no delays between requests.
  -i, --internet            INTERNET user simulation, hits URLs randomly.
  -f, --file=FILE           FILE, select a specific URLS FILE.
  -R, --rc=FILE             RC, specify an siegerc file
  -l, --log[=FILE]          LOG to FILE. If FILE is not specified, the
                            default is used: PREFIX/var/siege.log
  -m, --mark="text"         MARK, mark the log file with a string.
                            between .001 and NUM. (NOT COUNTED IN STATS)
  -H, --header="text"       Add a header to request (can be many)
  -A, --user-agent="text"   Sets User-Agent in request
  -T, --content-type="text" Sets Content-Type in request
      --no-parser           NO PARSER, turn off the HTML page parser
      --no-follow           NO FOLLOW, do not follow HTTP redirects

1088183-20180124190620881-1013084004.png
使用说明:
(1) 直接请求URL:

siege -c 200 -r 100 http://www.xxx.com

参数说明: -c 是并发量,并发数为200人 -r 是重复次数, 重复100次

(2) 随机选取urls.txt中列出所有的网址

在当前目录下创建一个名为"urls-demo.txt"的文件。 文件里边填写URL地址,可以有多条,每行一条,比如:

# URLs:
http://www.sogou.com/web?query=php&from=wang_yong_tao
https://www.baidu.com/

执行

siege -c 5 -r 10 -f urls-demo.txt $ siege -c 5 -r 10 -f /tmp/urls-demo.txt

参数说明: -c 是并发量,并发数为5人 -r 是重复次数, 重复10次 -f 指定使用文件,urls-demo.txt就是一个文本文件,每行都是一个url,会从里面随机访问的

Siege从Siege-V2.06起支持POST和GET两种请求方式。 如果想模拟POST请求,可以在urls-demo.txt中安装一下格式填写URL:

# URL (POST):
http://xxx.com/index.php POST UserId=XXX&StartIndex=0&OS=Android&Sign=cff6wyt505wyt4c
http://xxx.com/articles.php POST UserId=XXX&StartIndex=0&OS=iOS&Sign=cff63w5905wyt4c

使用示例:

// 请求http://www.xxx.com,并发人数为10,重复5次,每次请求间隔3秒
$ siege --concurrent=10 --reps=5 --delay=3 http://www.xxx.com
$ siege -c 10 -r 5 -d 3 http://www.xxx.com

发送POST请求
新建参数文件

vim uncollect.json
{
    "token":"c23f5fac69190de92a50973803409811",
    "type":0,
    "uni_id":"1acbb47a1d4f7b1f29cca86de70c84b4"
}

压力测试语句

siege -c 10 -r 30 --H "Content-Type:application/json" "http://47.104.18.17:9005/api/v1.0/user/collect?appName=leqv&version=99&build=1.0.0&os=ios&channel=appstore  POST < ./uncollect.json"

以上语句的意思就是:加一个headers头的 Content-Type:application/json 然后POST发送uncollect.json中的数据

Siege输出结果说明

Transactions:   siege对服务器的访问次数。如果页面发生了redirect,那么siege会将跳转过的请求算成是另一个transaction
Availability:   socket连接的成功率。算法是,如果页面发生了timeout,4xx,5xx,那么该请求算是失败请求,成功率就等于(所有请求-失败请求) / 总请求数
Elapsed time:   所有请求耗费的时间
Data transferred: 所有请求传输的数据量,包括请求的headers和content。所以这个数值可能比server端统计的数值要大一点
Response time: 平均响应时间
Transaction rate: Transactions / Elapsed time
Throughput: 每秒平均传输的数据量
Concurrency: 平均并发的请求数
Successful transactions: 所有status code < 400的transactions数量
Failed transactions: 所有status code >= 400的transactions数量
Longest transaction: 最耗时的请求时间
Shortest transaction: 最短单个请求时间

模拟移动站点(移动端:Android、iOS)访问进行压测
需要发送相应的user-agent,服务器就会根据这个值判断浏览器是移动版还是桌面版,在这里用iphone的user-agent模拟iPhone5对百度站点进行访问。

siege -c1 -r1 -A"Apple-iPhone5C2/1001.525" http://www.baidu.com
siege -c1 -r1 -A"Apple-iPhone5C2/1001.525" http://www.baidu.com
[alert] Zip encoding disabled; siege requires zlib support to enable it
** SIEGE 4.0.4
** Preparing 1 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200     0.09 secs:    2925 bytes ==> GET  /
HTTP/1.1 200     0.07 secs:    2340 bytes ==> GET  /static/index/u.png

Transactions:                   2 hits
Availability:              100.00 %
Elapsed time:                0.16 secs
Data transferred:            0.01 MB
Response time:                0.08 secs
Transaction rate:           12.50 trans/sec
Throughput:                0.03 MB/sec
Concurrency:                1.00
Successful transactions:           2
Failed transactions:               0
Longest transaction:            0.09
Shortest transaction:            0.07
1、发送post请求时,url格式为:http://www.xxxx.com/ POST p1=v1&p2=v2
2、如果url中含有空格和中文,要先进行url编码,否则siege发送的请求url不准确
3、siege -C 可以查看相关的配置参数,可以自行修改,比如是否显示log,超时时间

Chrome浏览器对于POST页面执行history.back返回或表单数据丢失的解决办法

PHP页面POST数据页面时,都会都POST的数据进行校验,如果不符合的数据或是空项我们都会给出提示,并返回前一个页面。但是经常发现有用户提出,会出现返回后当前页面所填写的内容都丢失了,或是出现页面无法显示的问题。

确认重新提交表单 此网页需要使用您之前输入的数据才能正常显示。您可以重新发送这些数据,不过,这么做会重复执行此网页之前执行过的所有操作。
按“重新加载”按钮,重新提交加载该网页所需的数据。
ERR_CACHE_MISS

如下图:
post-page.png

原因:
是因为使用session_start()的问题,我们可以这样处理,在你的 Session_start 函数后加入 header("Cache-control:private");
"private" 则表示该响应是专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中。
注意在本行之前你的PHP程序不能有任何输出。
解决方法如下:

session_start();//开启session功能,此前不能有任何输出
header("Cache-control:private"); //开启网页表单缓存,一定要放在Session_start 函数后

在此测试,问题解决。
via: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ

MySQL报错“Illegal mix of collations for operation 'like'”错误代码: 1271

在使用LIKE对日期或者时间字段进行模糊查询的时候,MySQL5.7X会报错误:

错误代码: 1271
Illegal mix of collations for operation 'like'

解决方法:在 MySQL5.5以上版本, 必需改成like binary '%中文%' ;
若字段 Type 是 time,date,datetime 在 select 時若使用 like '%中文%' 会出现 Illegal mix of collations for operation 'like'在写程序时要对每个字段进行搜索,在执行时可能就会出现时间字段 like '%中文%' 这种语法,
低版本MySQL是不会出现错误的。

最新

分类

归档

评论

  • Liang: 贴下编译参数和步骤,...
  • shao3911: 您好,为什么我在编译...
  • aliang: 先看是yum安装还是...
  • aliang: 将原来的nginx安...
  • yen: 3、如果要回滚的话,...
  • yen: 刚好需要升级ngin...
  • 文雨: 一些新的method...
  • aliang: 默认不屏蔽估计开发团...
  • 山野愚人居: PHP既然允许直接使...
  • aliang: 最下面有github地址·

其它