常见开发语言统计及 Web开发性能统计网站
开发编程语言统计趋势
https://www.tiobe.com/tiobe-index/
常见 WEB 开发框架 性能对比 网站
https://www.techempower.com/benchmarks/

可以看到php相关的性能laravel最优雅的夺得性能倒数榜。
常见开发语言统计及 Web开发性能统计网站
开发编程语言统计趋势
https://www.tiobe.com/tiobe-index/
常见 WEB 开发框架 性能对比 网站
https://www.techempower.com/benchmarks/
a. 查看当前系统cat /etc/redhat-release
[root@nginx /]# cat /etc/redhat-release
CentOS release 6.7 (Final)
[root@nginx /]#
b. 查看系统内核uname –r
[root@nginx /]# uname -r
2.6.32-573.el6.x86_64
[root@nginx /]#
c. 安装的Nginx版本,/appliation/nginx/sbin/nginx -V
[root@nginx sbin]# ./nginx -V
nginx version: nginx/1.6.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
TLS SNI support enabled
configure arguments: –user=nginx –group=nginx –prefix=/application/nginx1.6.2 –with-http_stub_status_module –with-http_ssl_module
[root@nginx sbin]#
location 指令的作用是根据用户请求的URI来执行不同的应用,URI就是根据用户请求到的网址URL进行匹配,匹配成功了进行相关的操作。
下面是官网的语法结构:
Syntax: location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
Default: —
Context: server, location
下面会结合官网原文进行解释,以下英文部分均从官网摘抄:
(翻译的不好勿喷)
Sets configuration depending on a request URI.
根据请求的URI进行配置
URI 变量是待匹配的请求字符串,
A location can either be defined by a prefix string, or by a regular expression.
Regular expressions are specified with the preceding “~*” modifier (for case-insensitive matching), or the “~” modifier (for case-sensitive matching)
一个location可以用prefix string(前缀字符串)定义,也可以通过regular expression(正则表达式来定义)
通俗的说也就是:我们可以通过使用不同的前缀,表达不同的含义,对于不同的前缀可以分为两大类:普通location和正则location
符号:”~”表示uri包含正则,并且区分大小写
符号:“~*”表示uri包含正则,但不区分大小写
注意:如果你的uri用正则,则你的正则前面必须添加~或者~*,之前我在这里存在误区,以为可以不加~或者~*
To find location matching a given request, nginx first checks locations defined using the prefix strings (prefix locations). Among them, the location with the longest matching prefix is selected and remembered. Then regular expressions are checked, in the order of their appearance in the configuration file. The search of regular expressions terminates on the first match, and the corresponding configuration is used. If no match with a regular expression is found then the configuration of the prefix location remembered earlier is used.
Nginx服务器会首先会检查多个location中是否有普通的uri匹配,如果有多个匹配,会先记住匹配度最高的那个。然后再检查正则匹配,这里切记正则匹配是有顺序的,从上到下依次匹配,一旦匹配成功,则结束检查,并就会使用这个location块处理此请求。如果正则匹配全部失败,就会使用刚才记录普通uri匹配度最高的那个location块处理此请求。
If the longest matching prefix location has the “^~” modifier then regular expressions are not checked.
当普通匹配的最长前缀匹配有符号“^~”的时候,就不会在匹配正则
直接使用当前匹配的这个location块处理此请求
Also, using the “=” modifier it is possible to define an exact match of URI and location. If an exact match is found, the search terminates. For example, if a “/” request happens frequently, defining “location = /” will speed up the processing of these requests, as search terminates right after the first comparison. Such a location cannot obviously contain nested locations.
使用符号“=”修饰符可以定义一个精确匹配的URI和位置,如果找到了一个精确的匹配,则搜索终止,例如,如果一个”/”请求频繁发生,定义“location =/”将加快这些请求的处理,一旦精确匹配只有就结束,这样的location显然不能包含嵌套location
这里我们说一下location / {} 和location =/ {}的区别:
“location / {}”是普通的最大前缀匹配,任何的uri肯定是以“/”开头,所以location / {} 可以说是默认匹配,当其他都不匹配了,则匹配默认匹配
a. ”=”用于普通uri前,要求精确匹配,如果匹配成功,则停止搜索并用当前location处理此请求
b. ”~” 表示uri包含正则,并且区分大小写
c. “~*”表示uri包含正则,但不区分大小写
d. ”^~”表示在普通uri前要求Nginx服务器找到普通uri匹配度最高的那个location后,立即处理此请求,并不再进行正则匹配
e. ”^~”和“=”都可以阻止继续匹配正则location两者的区别:“^~”依然遵守最大前缀原则,然后“=”是需要严格匹配
这是一个错误的结论,从上面官网的文章中我们可以知道:
先匹配普通uri,然后记住匹配度最高的那个(官网原话:To find location matching a given request, nginx first checks locations defined using the prefix strings (prefix locations). Among them, the location with the longest matching prefix is selected and remembered.)然后匹配正则,如果正则匹配则结束查找,如果正则不匹配,则匹配之前普通匹配中匹配度最高的那个将执行该请求(官网原话:Then regular expressions are checked, in the order of their appearance in the configuration file. The search of regular expressions terminates on the first match, and the corresponding configuration is used. If no match with a regular expression is found then the configuration of the prefix location remembered earlier is used.)
所以:location 的匹配顺序是“先匹配正则,再匹配普通” 这句话肯定是错误的,况且这里并没有包含”^~”和“=”
这也是一种错误的理解,我们根据上述内容可以知道:
如果是普通uri 匹配,这个时候是没有顺序的,但是正则匹配则是有顺序的,是从上到下依次匹配,一旦有匹配成功,则停止后面的匹配。
对www.conf配置如下:
[root@nginx extra]# cat www.conf
server {
listen 80;
server_name www.zhaofan.com;
access_log logs/access_www.log;
root html/www;
location / {
return 401;
}
location = / {
return 402;
}
location /documents/ {
return 403;
}
location ^~ /images/ {
return 404;
}
location ~* \.(gif|jpg|jpeg)$ {
return 500;
}
}
[root@nginx extra]#
注意:
location ~* \.(gif|jpg|jpeg)$ {
return 500;
这个部分$前面不能有空格,否则会提示如下错误:
[root@nginx extra]# ../../sbin/nginx -s reload
nginx: [emerg] invalid location modifier “~*\.(gif|jpg|jpeg)” in /application/nginx1.6.2/conf/extra/www.conf:19
如果$后面没有空格,则会提示如下错误:
[root@nginx extra]# ../../sbin/nginx -s reload
nginx: [emerg] directive “location” has no opening “{” in /application/nginx1.6.2/conf/extra/www.conf:23
这些都是细节问题,一定要注意
可以看出这里是精确匹配
location = / {
return 402;
}
这里可以看出因为都不匹配,所以最后匹配了location / {}
location / {
return 401;
}
这里可以看出是匹配了正则
location ~* \.(gif|jpg|jpeg)$ {
return 500;
}
这里依然是匹配正则
location ~* \.(gif|jpg|jpeg)$ {
return 500;
}
location / {
return 401;
}
location = / {
return 402;
}
location /document/ {
return 403;
}
location ^~ /images/ {
return 404;
}
location ~* \.(gif|jpg|jpeg)$ {
return 500;
}
这里通过配置把实验三和实验四的对比就可以看出来因为普通匹配里有“^~”,并且匹配到了images,所以这个就是不进行正则匹配
location ^~ /images/ {
return 404;
}
配置如下:
location / {
return 401;
}
location = / {
return 402;
}
location = /document/ {
return 403;
}
location ^~ /images/ {
return 404;
}
location /images/1/ {
return 501;
}
location ~* \.(gif|jpg|jpeg)$ {
return 500;
}
还是关注标红的地方,这个时候我们登陆:http://192.168.1.19/images/
结果如下:
从这里可以看出匹配了:
location ^~ /images/ {
return 404;
}
但是如果我们登陆:http://192.168.1.19/images/1/
结果如下;
这里匹配了:
location /images/1/ {
return 501;
}
从这里我们可以看出“^~”遵守最大匹配原则。
配置如下:
location / {
return 401;
}
location = / {
return 402;
}
location = /document/ {
return 403;
}
location ^~ /images/ {
return 404;
}
location /images/1/ {
return 501;
}
location = /images/1/ {
return 502;
}
location ~* \.(gif|jpg|jpeg)$ {
return 500;
}
登陆:http://192.168.1.19/images/1/
结果如下:
但是如果这个时候登陆:http://192.168.1.19/images/1/aaa/
结果如下:
从这里我们可以看出当精确匹配和最长匹配相同时,匹配的是精确匹配。
不在过多的做实验,根据上面的逻辑图应该可以解决碰到的问题了所有的努力都值得期许,每一份梦想都应该灌溉!
在浏览器设置中关闭硬件加速,可以解决此问题。
但是在浏览网页,游戏需要渲染过多动画的时候会巨卡无比。
因为OBS只能捕获相同渲染方式的窗口
所以我们需要让Chrome浏览器默认使用OpenGL进行GPU加速
AppRTC是WebRTC视频通话的服务程序,一般可以将其作为参考实现,搭建AppRTC服务受限于很多条件,并不是太容易。在参考了官方操作和大量的博客之后,根据自己操作实践排除了很多网络博客上的错误方法,终于部署成功了一套环境。测试环境为阿里云的CentOS 7服务器,带公网IP和域名。
部署前,首先要明确的是必要的依赖环境,必须满足以下需求:
如果没有证书,但是有域名的话,可以去申请免费的证书,具体百度 Let’s Encrypt。本博客使用了Caddy服务器,此服务器可自行自动申请其证书,其证书存放在
/var/lib/caddy/acme/acme-v02.api.letsencrypt.org/sites/ |
下,按站点域名存放,假设本次部署使用的 example.com 域名,对应 8.8.8.8,其证书存放在
/var/lib/caddy/acme/acme-v02.api.letsencrypt.org/sites/example.com/ |
下,包含公钥文件 example.com.cert
和私钥文件 example.com.key
文件。
上面的 example.com 和 8.8.8.8 是域名和对应的IP,此处为举例,抹去了我的真实的地址。
除了必要条件外,编译安装相关源码也需要一些编译环境,已知目前最终部署的程序为
因为上面的依赖以及后续使用发现,系统需要安装的依赖环境如下(已经安装了跳过)
yum install python #要求2.7版本 curl -sL https://rpm.nodesource.com/setup_10.x | bash – #安装比较高的10版本 npm -g install grunt-cli #grunt工具 yum install gcc-c++ make #C/C++编译器等 yum install golang #golang编译器 yum install java-1.8.0-openjdk #安装JDK,我选择了1.8版本 yum install libevent-devel #编译coturn需要 yum install git #可以下载Github源码 yum install sqlite-devel #编译coturn需要 |
准确的讲需要安装的是 Google app engine SDK for Python,但是因为众所周知的原因,我们并不能直接访问,但是我从其他地方获知了一个比较老的下载地址,可以离线安装,而且是可以下载的
wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-188.0.1-linux-x86_64.tar.gz |
虽然这个是Google Cloud SDK,但是我发现确实是可以用,并且可以更新,估计是现在进行了整合吧
tar xzvf google-cloud-sdk-188.0.1-linux-x86_64.tar.gz ./google-cloud-sdk/bin/gcloud components update |
这其中因为 AppRTC 是用GAE的Python开发的,依赖Python 2.7
环境。据说现在支持了3.7版本了,因为不能上官网,不确定。
因为coturn是必须依赖的组件,我们优先处理这个,这个软件并不在仓库中,其依赖的libevent的版本与仓库中的一致,并不需要单独编译,因此只需要下载编译这个软件即可
因为这个软件中带了RPM的构建脚本,因此我这里打算进行RPM包的构建,首先安装RPM构建工具
yum install rpm-build |
开始下载源码进行编译构建安装包
wget https://github.com/coturn/coturn/archive/4.5.1.1.tar.gz mkdir -p ~/rpmbuild/SOURCES mv 4.5.1.1.tar.gz -p ~/rpmbuild/SOURCES/turnserver-4.5.1.1.tar.gz rpmbuild -ta ~/rpmbuild/SOURCES/turnserver-4.5.1.1.tar.gz |
等构建成功后,会在 ~/rpmbuild/RPMS/x86_64
目录下发现好几个安装包,只需要安装 turnserver 即可
rpm -ivh ~/rpmbuild/RPMS/x86_64/turnserver-4.5.1.1-0.el7.x86_64.rpm |
如果怕编译麻烦的,可在本站下载编译好的包进行安装
rpm -ivh https://cdn.xilixili.net/linux/turnserver-4.5.1.1-0.el7.x86_64.rpm |
至于配置,我们后面再讲。
Collider是Go开发的服务,依赖websocket,依然不能访问其地址。因此只能下载镜像安装,此处以将Go的环境设置的当前用户目录下的go目录为例说明。另外Collider的代码在AppRTC之中,因此此处就直接下载AppRTC的源码了,后续不需要下载了。
export GOPATH=$HOME/go mkdir -p ~/go/src git clone https://github.com/apprtc/apprtc ln -s `pwd`/apprtc/src/collider/collider $GOPATH/src ln -s `pwd`/apprtc/src/collider/collidermain $GOPATH/src ln -s `pwd`/apprtc/src/collider/collidertest $GOPATH/src mkdir -p $GOPATH/src/golang.org/x cd $GOPATH/src/golang.org/x git clone https://github.com/golang/net.git go get collidermain go install collidermain |
至此,程序编译好并且安装到了 $GOPATH/bin
下面。
注意,下面所有提供网络的服务,要注意防火墙配置,特别是UDP端口,测试平台关闭了防火墙。
首先需要生成签名证书
mkdir /cert openssl req -x509 -newkey rsa:2048 -keyout /cert/turn_server_pkey.pem -out /cert/turn_server_cert.pem -days 99999 -nodes |
然后再生成用户,以 apprtc 为例
turnadmin -k -u apprtc -p apprtc |
执行之后会生成一个key,记住这个key,马上要用到。编辑 /etc/turnserver/turnserver.conf
文件,这个文件大部分的功能都默认是注释的,因此基本找到出处进行修改,大概如下
listening-ip=8.8.8.8 listening-port=3478 relay-ip=8.8.8.8 tls-listening-port=5349 external-ip=8.8.8.8 Verbose fingerprint lt-cred-mech use-auth-secret static-auth-secret=apprtc user=apprtc:0x949534a397bcf2e88470c86ad3749d9c(替换成上面的key) user=apprtc:apprtc cert=/cert/turn_server_cert.pem pkey=/cert/turn_server_pkey.pem |
保存之后,启动服务
systemctl enable turnserver systemctl start turnserver |
注意,很多教程说要配置 TRUN REST API,即自己需要实现个REST API服务,让AppRTC进行查询获取,通过分析和测试,发现第一这个服务必须是POST请求的,具体格式参考标准,第二是并不需要这个API也能正常使用,因此请不要折腾REST API了。
暂时以测试为主,后续可为此程序编写添加个systemd服务。
此服务需要对外提供WSS服务,因此需要证书,将之前的域名证书拷贝过去即可
cd /var/lib/caddy/acme/acme-v02.api.letsencrypt.org/sites/example.com/ cp example.com.cert cert.pem cp example.com.key key.pem chmod 755 /cert/* |
然后通过下面的命令启动服务
./collidermain -port=8089 -tls=true -room-server=”http://example.com:8080″ |
注意,我们设置的这个服务的端口是8089端口,AppRTC默认的HTTP端口是8080,HTTPS端口是8081,但是实际测试中发现AppRTC在使用HTTPS的时,会经常SSL异常,未查明原因。
配置AppRTC的配置文件 ~/apprtc/src/app_engine/constants.py
文件如下(仅列出修改项)
ICE_SERVER_OVERRIDE = [ { “urls”: [ “turn:8.8.8.8:3478?transport=udp”, “turn:8.8.8.8:3478?transport=tcp” ], “username”: “apprtc”, “credential”: “0x949534a397bcf2e88470c86ad3749d9c” #替换成上面的key }, { “urls”: [ “stun:8.8.8.8:3478” ] } ] ICE_SERVER_BASE_URL = ” ICE_SERVER_URL_TEMPLATE = ” ICE_SERVER_API_KEY = os.environ.get(‘ICE_SERVER_API_KEY’) # Dictionary keys in the collider instance info constant. WSS_INSTANCE_HOST_KEY = ‘example.com:8089’ WSS_INSTANCE_NAME_KEY = ‘vm_name’ WSS_INSTANCE_ZONE_KEY = ‘zone’ WSS_INSTANCES = [{ WSS_INSTANCE_HOST_KEY: ‘example.com:8089’, WSS_INSTANCE_NAME_KEY: ‘wsserver-std’, WSS_INSTANCE_ZONE_KEY: ‘us-central1-a’ }] |
上面的配置已经可以保证使用了,且在命令行指定SSL证书后,就能提供服务了,但是由于之前提到了SSL异常问题,即使在切换到HTTP之后并使用nginx代理后,出现了URL不匹配的错误,因此还不能直接使用,为了解决上面的问题,我修改了代码,首先配置 ~/apprtc/src/app_engine/constants.py
修改
REDIRECT_URL = ‘https://example.com:9090’ |
这里假设nginx代理的地址是 example.com:9090
,然后修改该目录下的 apprtc.py
文件,大概在300行左右,修改其中room_link的赋值为
room_link = constants.REDIRECT_URL + ‘/r/’ + room_id |
然后编译代码并运行代码,命令如下
cd ~/apprtc grunt build cd ~ google-cloud-sdk/bin/dev_appserver.py –host example.com ~/apprtc/out/app_engine/ –dev_appserver_log_level debug |
会看到输出显示
Starting module “default” running at: http://example.com:8080 |
也就是意味着服务提供的地址是 http://example.com:8080
如上,使用nginx代理https请求,端口为 9090,直接yum安装
yum install nginx |
配置 /etc/nginx/nginx.conf
文件
#server { # listen 80 default_server; # listen [::]:80 default_server; # server_name _; # root /usr/share/nginx/html; # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # location / { # } # error_page 404 /404.html; # location = /40x.html { # } # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } #} server { listen 9090 ssl default_server; server_name example.com; ssl_certificate “/cert/cert.pem”; ssl_certificate_key “/cert/key.pem”; location /{ proxy_pass http://example.com:8080; proxy_set_header Host $host; } } |
配置默认注释了原来默认配置的80端口的配置,添加了一个9090的代理服务,配置之后启动服务
systemctl enable nginx systemctl start nginx |
通过 https://example.com:9090 访问AppRTC服务
再找另外一个用户同时打开浏览器,输入相同的号码并JOIN,即可实现视频通话。
另外在目录下的~/apprtc/src/web_app/html/params.html
网页中自定义了一些配置参数,可以在URL中自定义WebRTC的参数,比如打开高清摄像头、关闭音频等等,具体参考这个页面即可。
采用默认配置测试后,个人使用感觉效果如下
手机微信也可以的哦。
Intel CS for WebRTC 升级到4.2.1后,需要的软件包进行了更新,安装过程中一些小的细节也需要注意一下。
1.操作系统 :
CentOS* 7.6, Ubuntu 18.04 LTS,本次测试,我使用的Ubuntu 18.04 LTS。
2.手动安装依赖包
node.js 8.15.0,貌似仅支持这个版本。
下载:https://nodejs.org/dist/v8.15.0/node-v8.15.0-linux-x64.tar.gz
解压并安装:
tar -xzvf node-v8.15.0-linux-x64.tar.gz
mv node-v8.15.0-linux-x64 /opt/
ln -s /opt/node-v8.15.0-linux-x64/bin/node /usr/local/bin/node
ln -s /opt/node-v8.15.0-linux-x64/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm
3.下载 Intel CS for WebRTC,需要先登录,如果没有注册,先注册。在页面上点击下载:
或者直接下载:
wget http://registrationcenter-download.intel.com/akdlm/irc_nas/15608/Intel_CS_WebRTC.v4.2.1.zip
4.解压后包括如下文件:
再解压对应的MCU文件,得到Release-v4.2.1的目录。
5.开始安装
cd Release-v4.2.1
bin/init-all.sh –deps –software
我使用的软件编码,如果有Intel硬件编码芯片,可以使用hardware。
在安装的过程中,会提示mongodb的账户等信息,所有提示都直接回车即可。
6.配置对外服务IP
如果服务直接配置了对外服务的IP,请跳过本步;如果使用的虚机有EIP,需要配置对外服务的IP,假设对外服务IP为120.92.100.101(下同)。
vi webrtc_agent/agent.toml
修改:
network_interfaces = []
为:
network_interfaces = [{name = “eth0”, replaced_ip_address = “120.92.100.101”}]
vi portal/portal.toml
修改:
ip_address=””
为:
ip_address=”120.92.100.101”
7.配置UDP通讯端口
如果是虚机,在虚机网络管理中打开UDP的可访问端口,推荐范围2000-9000,同时需要在配置文件中进行配置。
vi webrtc_agent/agent.toml
修改:
# The webrtc port range
maxport = 0 #default: 0
minport = 0 #default: 0
为:
# The webrtc port range
maxport = 9000 #default: 0
minport = 2000 #default: 0
8.打开TCP通讯端口
如果是虚机,在虚机网络管理中打开TCP和UDP的可访问端口,推荐范围2000-9000
9.关闭防火墙(需要管理员权限)
ufw disable
10.启动 Intel CS WebRTC
./bin/start-all.sh
如果没有报错,表示启动功能,并最后看到下面的字样:
1 rooms in this service.
sampleRoom Id: XXXXXXX
11.在手机上,通过Chrome浏览器,使用默认room进行音视频通话
成功后,会看到两个窗口,上面是本地的采集窗口,下面是视频通讯的多窗口
如果没有正常显示,可以通过Chrome浏览器的开发工具查看具体的原因。
12.使用另外一台手机,或者把链接发给你的朋友,使用Chrome浏览器打开链接,就可以进行视音频通话了。
mysql5.7以上版本在常会报关于only_full_group_by的错误,可以在sql_mode中关闭他,网上查找的解决办法通过实践后发现有些不详细,关键地方说的不清楚,有的有些错误,自己解决之后在这里总结一下。
操作系统:Linux
mysql版本:5.7.26
查看
进入mysql 查看mysql版本:select version();
运行SELECT @@GLOBAL.sql_mode;和SELECT @@SESSION.sql_mode;查看sql_model参数,可以看到参数中有ONLY_FULL_GROUP_BY,
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
1
2
临时去除ONLY_FULL_GROUP_BY
因为这种方式从参考资料上来看只是临时去除,所以,我并没有尝试,这里列出解决办法:
set @@GLOBAL.sql_mode=”;
set sql_mode =’STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’;
1
2
修改配置文件去除ONLY_FULL_GROUP_BY
这种方式是我实践的方式,我详细说一下:
打开配置文件mysql.cnf
sudo gedit /etc/mysql/mysql.cnf
1
在[mysqld]中添加代码
sql_mode =’STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’
1
网上有很多资料写到这段代码在[mysql]中也同时添加,另外有些写着添加内容为 “set sql_mode XXXX”经过我在自己机器上验证,发现都是不行的,只能在[mysqld]添加,否则会造成mysql无法连接
验证是否生效
重启mysql
sudo service mysql restart
1
查看参数是否存在
mysql> SELECT @@sql_mode;
+————————————————————————————————————————+
| @@sql_mode |
+————————————————————————————————————————+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+————————————————————————————————————————+
1 row in set (0.00 sec)
mysql> SELECT @@GLOBAL.sql_mode;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect…
Connection id: 2
Current database: *** NONE ***
+————————————————————————————————————————+
| @@GLOBAL.sql_mode |
+————————————————————————————————————————+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+————————————————————————————————————————+
1 row in set (0.00 sec)
mysql> SELECT @@GLOBAL.sql_mode;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect…
Connection id: 2
Current database: *** NONE ***
+————————————————————————————————————————+
| @@GLOBAL.sql_mode |
+————————————————————————————————————————+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+————————————————————————————————————————+
1 row in set (0.00 sec)
今天安装了centos7,也习惯了最小化安装,装完发现ifconfig 这个命令没有。
据说ifconfig命令已经过时了,而且在最小化版本的RHEL 7以及它的克隆版本CentOS 7,Oracle Linux 7和Scientific Linux 7中也找不到该命令。
最小化安装后,可以用 ip addr 命令查看网络信息。
那么习惯ifconfig的用户,则需要yum -y install net-tools即可
HAProxy虽然名字前有HA,但它并不是一款高可用软件,而是一款用于实现负载均衡的软件,可实现四层与七层的负载均衡。
关于haproxy的常用调度算法,可以参考博文:Haproxy支持的调度算法。
haproxy的详细配置过程和配置日志记录,可以参考博文:keepalived+Haproxy搭建高可用Web群集。
这篇博文不谈如何配置haproxy,主要来聊一下它的配置文件说明以及生产环境中的参数调优。
haproxy的配置文件通常分为三个部分:global、defaults和listen。依次为全局配置、默
认配置、应用组件配置。
global配置:
global
log 127.0.0.1 local #配置日志记录,local0为日志设备,默认存放到系统日志
log 127.0.0.1 local1 notice #notice为日志级别,通常有24个级别
#log loghost local0 info
maxconn 4096 #最大连接数
chroot /usr/share/haproxy #该服务自设置的根目录,一般需将此行注释掉
uid 99 #用户UID
gid 99 #用户GID
daemon #守护进程模式
defaults配置项配置默认参数,一般会被应用组件继承,如果在应用组件中没有特别的声明,将安装默认配置参数:
defaults
log global #定义日志为global配置中的日志定义
mode http #模式为http
option httplog #采用http日志格式记录日志
option dontlognull
retries 3 #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
redispatch #当服务器负载很高时,自动结束当前队列处理比较久的连接
maxconn 2000 #最大连接数
contimeout 5000 #连接超时时间
clitimeout 50000 #客户端超时时间
srvtimeout 50000 #服务器超时时间
listen配置项一般配置应用模块参数:
listen appli4-backup 0.0.0.0:10004 #定义一个名为appli4-backup的应用
option httpchk /index.html #检查服务器的index.html文件
option persist #强制将请求发送到已经down掉的服务器,一般禁用此选项。
balance roundrobin #负载均衡调度算法使用轮询算法
server inst1 192.168.114.56:80 check inter 2000 fall 3 #定义在线节点
server inst2 192.168.114.56:81 check inter 2000 fall 3 backup #定义备份节点
#注意:在以上定义备份节点的参数中,
#“check inter 2000”表示haproxy服务器和节点之间的一个心跳频率,
#“fall 3”表示连续三次检测不到心跳频率则认为该节点失效。
#节点配置后带有“ backup”表示该节点只是个备份节点,只有主节点失效该节点才会上。
#去除backup,表示为主节点,和其他主节点共同提供服务。
haproxy的负载均衡参数说明:
每年,我们都会在各种平台上发布深入的性能基准测试,以了解不同版本的PHP如何相互竞争。这次我们再次全力以赴,将22个不同平台/配置的6个不同PHP版本标记为基准;包括WordPress,Drupal,Joomla!,Laravel,Symfony等。我们还测试了流行的电子商务解决方案,例如WooCommerce,Easy Digital Downloads,Magento,Grav CMS和October CMS。
我们一直在鼓励WordPress用户利用最新支持的PHP版本。它们不仅更安全,而且还提供了其他性能改进。我们也不是只在谈论WordPress,这在所有平台上都是如此。今天我们将向您展示PHP 7.4如何帮助我们克服一切挑战! ?
我们在6个不同的PHP版本上测试了22个平台/配置的性能,而#PHP 7.4在17/17(5 N / A)上获得了金牌。 ??
点击鸣叫
社区和Kinsta中PHP的状况
PHP是一种开放源代码的服务器端脚本和编程语言,主要用于网络开发。大部分WordPress核心软件都是用PHP编写的,这使PHP成为WordPress社区非常重要的语言。
只需移至Kinsta,即可将WordPress网站的速度提高200%。
今天免费迁移
有人可能会争辩说PHP已经死了。但是,即使开发人员喜欢声明这一点,PHP仍然比以往更活跃,更快,更好。根据W3Techs的说法,使用服务器端编程语言的所有网站中有超过78.9%使用PHP。那是很多依赖PHP的网站。
但是,社区中的一个大问题是,许多人仍在使用旧的不受支持的PHP版本。根据WordPress统计,仅38.3%的版本在受支持的PHP版本(7.2或更高版本)上运行。这引入了性能和安全性问题。
为什么会这样呢?以下是一些我们通常会看到的常见原因:
为了尝试帮助社区向前发展,Kinsta采用了与PHP相同的寿命终止(EOL)时间表。这有助于确保您的WordPress网站尽可能快且安全。
Kinsta客户如何与普通WordPress社区对抗?我们自己很好奇,所以我们看了一些数字。
Kinsta托管的网站的PHP版本
这是摘要:
我们为发现这些数字感到骄傲和兴奋。这意味着Kinsta客户中PHP的采用率非常高!远远高于一般的WordPress人口。
在Kinsta托管的所有WordPress网站中,高达73.3%运行的是PHP 7.3或更高版本! ?
点击鸣叫
PHP基准测试(2020)
即使不再正式支持PHP 5.6、7.0和7.1,仍然有许多WordPress网站在运行。因此,我们决定测试所有六个不同的PHP版本,以便您可以看到较新的版本可以在性能方面给您带来多少好处。
对于每个测试,我们使用每个平台的最新版本,并以15个并发用户为基准对主页进行一分钟的基准测试。以下是我们测试环境的详细信息。
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 50000
opcache.revalidate_freq = 60
opcache.fast_shutdown = 1
opcache.enable_cli = 1
OPcache通过将预编译的脚本字节码存储在共享内存中来提高PHP性能,从而消除了PHP在每个请求上加载和解析脚本的需求。
这些测试是由Kinsta的WordPress贡献者和Web开发人员Thoriq Firdaus执行的。
我们的测试包括以下22种平台/配置。在某些情况下,由于缺乏对特定PHP版本的支持,我们不得不测试多个版本。单击下面的一个可直接跳至其测试说明和结果。数据以每秒请求数衡量。请求越多越好。
由于每个平台上的演示内容可能会发生很大变化,因此,我们决定测试新的准系统安装的原始性能。
WordPress 5.3
当然,我们测试的第一个平台是我们最喜欢的平台之一:WordPress(我们每天都会生活和呼吸CMS,这可能会有点偏bias)。 WordPress的核心是开源软件,您可以使用它来创建漂亮的网站,博客或应用。实际上,WordPress占Internet上所有网站的35.2%。是的-您访问的网站中,有超过三分之一是由WordPress提供支持的。
我们从WordPress 5.3开始,它是撰写本文时的最新版本。我们使用了新的Twenty Twenty主题,并与15个并发用户对网站进行了基准测试一分钟。
WordPress 5.3 PHP基准测试
嵌入您的网站:
图src: 金斯塔
基准结果
PHP 7.4是赢家,被证明比PHP 7.3快一点。而且,如果将PHP 7.4与PHP 5.6进行比较,它每秒可处理的请求(事务)数量是3倍以上!
WordPress 5.3 + WooCommerce 3.5.2
WooCommerce是为WordPress构建的完全可自定义的开源电子商务平台。到目前为止,它也是WordPress社区中最受欢迎的电子商务解决方案之一,目前为互联网上所有电子商务网站中的14%以上的网站提供支持。
在下一个测试中,我们将WordPress和WooCommerce一起安装。我们利用了免费的Storefront eCommerce主题(2.5.3)。
WordPress 5.3 + WooCommerce PHP基准测试
嵌入您的网站:
图src: 金斯塔
基准结果
在运行WooCommerce时,PHP 7.4远远超过了PHP 7.3。
WordPress 5.3 +简易数字下载2.9.20
由Pippin Williamson创建的Easy Digital Downloads(EDD)是一个免费的WordPress电子商务插件,主要致力于帮助创作者和开发者销售数字产品。
在了解了WooCommerce的表现之后,我们随后将WordPress和Easy Digital Downloads一起安装了。我们利用了免费的主题主题(1.0.7)。
WordPress 5.3 + Easy Digital下载PHP基准
嵌入您的网站:
图src: 金斯塔
基准结果
PHP 7.4也是使用WordPress和Easy Digital Downloads最快的。
当涉及WordPress,WooCommerce和Easy Digital Downloads时,事实证明,PHP 7.4的整体速度略快!
Drupal 8.8.0
Drupal是一个开源CMS,因其模块化系统和强大的开发人员社区而广受欢迎。它最初于2000年推出,根据W3Techs的说法,该网站为内容管理系统市场中3.0%的份额提供了1.7%的支持。
对于Drupal基准,我们使用了免费的Umami默认主题(8.8.0)。
Drupal PHP基准
嵌入您的网站:
图src: 金斯塔
基准结果
当运行Drupal时,PHP 7.3在性能上有了很大的提高。与以前的PHP版本相比,这是一个更大的飞跃。
Joomla! 3.9.13
Joomla!是用于发布Web内容的免费开源CMS,最初于2005年8月17日发布。它基于模型-视图-控制器Web应用程序框架构建,根据W3Techs的统计,互联网上所有网站的使用率为2.6%。
对于Joomla!基准,我们利用了Joomla!中包含的免费Protostar(1.0)模板! 3.x发行包。
Joomla! PHP基准
嵌入您的网站:
图src: 金斯塔
基准结果
在Joomla上!我们可以看到整体表现有些差。从PHP 5.6到7.0+的性能有了巨大的提高。并快速前进到PHP 7.4,无疑是Joomla的赢家!
Magento 2(CE)2.2.10 + 2.3.3
Magento是使用PHP编写的流行的开源电子商务平台,于2008年3月31日发布。截至2018年,Magento现在是Adobe公司。据W3Techs称,它为互联网上所有网站的0.8%提供支持。
对于Magento 2基准,我们使用了免费的Luma主题。由于2.2.10仅支持PHP 7.2,所以我们使用了两个版本。对于其他测试,我们使用2.3.3。
Magento 2 PHP基准测试
嵌入您的网站:
图src: 金斯塔
基准结果
Magento 2 PHP基准测试的差异不大。但是好消息是,Magento的最新版本以及受支持的最新PHP版本(7.3)是最快的。
Grav CMS 1.6.19
Grav是易于使用但功能强大的开源CMS,不需要数据库。有时也称为平面文件CMS。
对于Grav CMS基准,我们使用了免费的Clean Blog框架包。
Grav CMS PHP基准
嵌入您的网站:
图src: 金斯塔
基准结果
通过Grav CMS,我们可以看到最新版本的PHP 7.4是冠军。
也很高兴看到这些较小的内容管理系统不再支持旧版本的PHP。尽管这是不那么大的一个优点。不幸的是,当涉及到具有很大市场份额的WordPress和其他平台时,由于兼容性问题,事情进展缓慢。
十月CMS 1.0.458
October CMS是基于Laravel PHP框架的免费,开源,自托管和模块化CMS平台。它最初于2014年5月15日发布。
对于十月CMS基准,我们使用了免费的Clean Blog主题。
十月CMS PHP基准测试
嵌入您的网站:
图src: 金斯塔
基准结果
PHP 7.3是赢家,即使只是一点点。 PHP 7.4一旦受支持,也很有可能会进行改进。
Laravel 5.8.35 + 6.7.0
Laravel是一个非常流行的开源PHP框架,用于开发Web应用程序。它是由泰勒·奥特威尔(Taylor Otwell)创建的,于2011年6月发布。
对于Laravel基准测试,我们使用了普通的HTML主题。
Laravel PHP基准测试
嵌入您的网站:
图src: 金斯塔
基准结果
在这两个版本上,PHP 7.4都是明显的赢家。但是,有趣的是,带有PHP 7.4的Laravel 5.8.35似乎比Laravel 6.7.0快。
Symfony 4.4.2 + 5.0.1
Symfony是一组可重用的PHP组件和一个PHP框架,用于构建Web应用程序,API,微服务和Web服务。它于2005年10月22日发布。
对于Symfony基准,我们将Symfony演示版与MySQL配合使用(默认为SQLite)。
Symfony PHP基准
嵌入您的网站:
图src: 金斯塔
基准结果
我们可以看到Symfony版本4.4.2和PHP 7.4是最快的。
CodeIgniter 3.1.11 + 4.0-rc.3
CodeIgniter是一个功能强大的PHP框架,占地面积很小,是为需要简单优雅的工具箱来创建功能齐全的Web应用程序的开发人员而构建的。
CodeIgniter PHP基准测试
嵌入您的网站:
图src: 金斯塔
基准结果
与Laravel和Symfony一样,运行CodeIgniter时PHP 7.4是最快的。有趣的是CodeIgniter 3.1.11的速度明显快于4.0-rc.3。但是,请记住,它是一个候选发布版本。
CakePHP 3.8.7 + 4.0.0
CakePHP是一个开放源代码的Web快速开发框架,它使构建Web应用程序更简单,更快并且需要更少的代码。它于2005年4月发布。
CakePHP基准
嵌入您的网站:
图src: 金斯塔
基准结果
对于CakePHP,运行PHP 7.4的3.8.7版本是赢家。
PyroCMS 3.7
PyroCMS是一个开源软件,从本质上讲是Laravel的扩展,它使您可以更快地在框架上构建网站和应用程序。
对于PyroCMS基准测试,我们使用了免费的入门主题。
PyroCMS PHP基准
嵌入您的网站:
图src: 金斯塔
基准结果
由于PyroCMS尚未使用PHP 7.4,因此PHP 7.3在这里赢得了少量测试。
Pagekit 1.0.17
Pagekit是由YOOtheme创建的开源模块化,轻量级CMS。它为您提供了创建漂亮网站的工具。它于2016年春季发布。
Pagekit PHP基准测试
嵌入您的网站:
图src: 金斯塔
基准结果
使用Pagekit进行测试时,PHP 7.4赢得了金牌。
螺栓CMS 3.7.0
Bolt CMS,即Bolt,是一种开源内容管理工具,力求尽可能简单明了。它基于Silex和Symfony组件,使用Twig和SQLite,MySQL或PostgreSQL。
对于Bolt CMS基准测试,我们使用了免费的Bolt Base 2018主题。
Bolt CMS PHP基准测试
嵌入您的网站:
图src: 金斯塔
基准结果
当使用Bolt CMS进行测试时,PHP 7.4赢得了金牌。看到自PHP 5.6以来的性能改进也令人惊奇。
Craft CMS 3.4.0-beta.4
Craft CMS是面向开发人员,设计师和Web专业人员的重点内容管理系统,融合了灵活性,强大功能和客户易用性。
Craft CMS PHP基准
嵌入您的网站:
图src: 金斯塔
基准结果
PHP 7.4在使用Craft CMS进行测试时获得了金牌。
ExpressionEngine 5.3.0
ExpressionEngine是一个灵活的,功能丰富的内容管理平台,它使世界各地成千上万的个人和组织可以轻松地管理其网站。
对于ExpressionEngine基准,我们使用了默认主题。
ExpressionEngine PHP基准
嵌入您的网站:
图src: 金斯塔
基准结果
用ExpressionEngine进行测试时,PHP 7.4赢得了金牌。
在Kinsta更新到PHP 7.4
如果上述结果无法说服您,我们不确定会怎样!只是一个善意的提醒。如果您是Kinsta客户端,则可以使用PHP 7.2、7.3和7.4。如果您希望获得性能方面的改进,则只需在MyKinsta仪表板中单击即可轻松更改为较新版本。
更改为PHP 7.4
如果您担心它与第三方插件不兼容(可能会发生),这正是我们拥有临时站点的原因。 ?您可以进行测试,而不必担心破坏生产现场。
从基准结果中总结
从上面的测试中可以清楚地看到,在所有平台的性能方面,PHP 7.4处于领先地位。
我们在6个不同的PHP版本上测试了22个平台/配置的性能,而#PHP 7.4在17/17(5 N / A)上大获全胜! ?
点击鸣叫
我们对PHP 7.4感到非常兴奋,希望您也是如此!我们很想听听您对基准测试的想法,甚至是您升级后的经验。将它们放在评论中。
1.5K分享
修改swap大小操作需要root权限,
这条命令从硬盘里分出一个 4×4G 大小的空间,挂在swapfile上。
1
2
3
4
5
6
构建swap格式于/usr/swap/swapfile 上
1
2
1
以上操作在重启系统后swap空间将会失去swapfile ,将swapfile 加入到/etc/fstab
条目将可以使得系统在init进程中调用swapon -a 来自动挂载swapfile ,这样每次机器重启后swapfile
都处于有效的swap空间。
在/etc/fstab文件中加入下面这样一行:
/usr/swap/swapfile swap swap defaults 0 0
1
2
删除: