网站链接数居高不下导致服务器卡死的情况排查

最近系统突然出现卡顿的情况,通过终端检查发现一些链接数特别高,但是一直降不下来,中途也尝试过将apache的参数调整但是一直解决不了问题。

为了解决卡住的问题做过几次尝试:

排查1
1.检查服务器硬盘容量是否用完。结果剩余空闲空间占比为80%,正常。
2.检查服务器内存使用量,16G内存使用了15G。调整服务器内存到32G。
3.检查服务器网卡工作模式速度是否正常。结果网卡速度为1000兆,正常。
4.检查防火墙配置及生效策略情况。结果为正常。

排查2:检查Apache配置。
1.检查apache配置中工作模式为 prefork 模式,调整客户端连接数最大值到20000,大约三个小时左右会用满,按这个结果意味着根本原因不在这里。
2.排查apache配置中keepAlive配置,默认是关闭的。我打开配置后,排查并没有好转。理论上所有链接超时后之后应该是会断开的。
3.排查TCP连接情况:watch -n 1 -d “ss|grep http”
通过分析链接数情况,了解大部分应该是门禁设备导致的,印象中之前链接数应该是很低的,为何突然最近出现问题,让我回想起前两天调整过数据库服务器防火墙策略。

排查3:检查apache网站的访问日志和错误日志。
通过排查apache错误日志,发现存在大量的数据库连接报错(此时此刻应该想到前两天防火墙策略调整的时间点刚好契合)。配合前面的门禁设备链接数不下降的问题,确认应该是门禁设备一直尝试提交数据但是数据库服务器没有回应,所以链接数一直增加。

通过排除数据库防火墙导致连接失败的问题,随之tcp连接数超高的问题也解决了。

总结:通过不停地尝试解决,从最基本的配置参数查起,再到错误日志,结合最近网络或者是防火墙的调整,大概能知道问题在哪里。

httpd配置SSL证书

一、申请免费SSL证书

  1. 免费SSL证书网站

沃通:https://www.wosign.com

StartSSL:http://www.startssl.com

亚洲诚信TrustAsia DV SSL证书:https://www.qcloud.com

  1. 证书类型介绍

DV SSL:Domain Validation SSL 的缩写,指只验证网站域名所有权的简易型SSL证书,此类证书仅能起到网站机密信息加密的作用,无法向用户证明网站的真实身份,但优势是能够快速签发,快速建立网站SSL加密。

OV SSL:Organization Validation SSL 的缩写,指需要验证网站所有单位的真实身份的标准型SSL证书,不仅能起到网站机密信息加密的作用,而且能向用户证明网站的真实身份。

EV SSL:Extended Validation SSL 的缩写,指遵循全球统一的严格身份验证标准颁发的SSL证书,是目前业界最高安全级别的SSL证书。最大的特点就是浏览器显示绿色地址栏,通过鲜明醒目的标示,告知用户该网站正受到严密的安全防护、身份可信,值得高度信赖。

 

  1. 证书文件

以下为沃通申请的免费证书通过之后会通过邮件发送下载地址,下载解压会得到四个文件:

cross.crt —交叉根证书

issuer.crt           —CA证书(中级)

xxx.com.crt      —服务器证书

xxx.com.key     —密匙

root.crt             —顶级根证书

83-4

二、配置Httpd服务支持SSL

  1. 安装ssl_mod

#yum install ssl_mod

安装完成之后会httpd 配置目录生成 /etc/httpd/conf.d/ssl.conf 文件

 

  1. 上传证书文件

把证书文件上传到服务器某个目录下,例如:/etc/httpd/conf/ssl.crt/(手动创建)

83-1

  1. 修改配置

#vim /etc/httpd/conf.d/ssl.conf

修改virtualhost部分:

DocumentRoot “/var/www/html”

ServerName www.xxx.com:443

 

以下部分如有注释先取消注释,然后修改文件地址即可

SSLCertificateFile /etc/httpd/conf/ssl.crt/xxx.com.crt

SSLCertificateKeyFile /etc/httpd/conf/ssl.crt/xxx.com.key

SSLCertificateChainFile /etc/httpd/conf/ssl.crt/issuer.crt (非必要)

SSLCACertificateFile /etc/httpd/conf/ssl.crt/root.crt或issuer.crt

 

  1. 配置http跳转到https

修改虚拟主机配置,添加如下内容

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www.xxx.com [NC]

RewriteRule ^(.*) https://www.xxx.com [L]

 

我的服务器配置:

83-2

  1. 重启httpd服务,加载配置文件

    三、配置检查及注意事项

  1. 访问https://www.xxx.com,查看是否正常访问
  2. 访问http://www.xxx.com,查看是否会跳转到https://www.xxx.com
  3. 分别测试不同浏览器访问情况,谷歌浏览器、IE浏览器、火狐浏览器等
  4. SSL状态检查:https://www.trustasia.com/tools/ssl-checker.htm

 

注意:

  1. HTTPS必须开启443端口,如果访问不正常先检查防火墙端口情况;
  2. 备份你的证书文件。

LAMP环境配置

因为经常配置这种类型的环境,所以记录此文来方便参考复制,也通过网页的形式分享给朋友们使用。

名词解释:LAMP = linux + apache + mysql + php

77

注:以下文件中,红色标记的命令为必要执行命令,黑色部分只做提示,可根据需求使用

一、升级linux版本

默认安装的是centos 6.5 64位版本,现在通过yum升级到最新版本。

#yum update

运行以上命令查找并升级到最新版本的CentOS,询问是否升级输入Y回车即可,等待完成之后继续下一步操作。

查看现在运行系统的版本:

#cat /etc/redhat-release

修改主机登录之后的名称:#vim /etc/sysconfig/network (编辑替换hostname部分值)

 

二、安装配置httpd服务

1.安装httpd服务:

#yum –y install httpd

2.运行服务并测试:

#service httpd start (第一次运行会有警告提示,不用关心稍后处理)

3.编辑配置文件:

#vim /etc/httpd/conf/httpd.conf

找到#ServerName www.example.com:80 去掉前面的井号注释,修改成 ServerName 127.0.0.1:80,保存退出。

4.重启httpd服务:

#service httpd restart (正常情况不报任错误)

 

三、安装PHP

1.安装php主程序:

#yum -y install php

2.安装php扩展程序:

#yum –y install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring

3.重启httpd加载新的配置文件(/etc/httpd/conf.d/php.conf):

#service httpd restart

以上步骤安装完成,可以在www目录中放一个phpinfo文件检查是否生效。

 

四、安装Mysql数据库

1.安装mysql

#yum -y install mysql-server

2.安装完成,启动mysql服务:

#service mysqld start

启动的时候会有一些提示信息,提示修改root用户密码等。

3.修改安全配置

77-1

 

#/usr/bin/mysql_secure_installation

提示输入密码,默认密码为空,直接回车就行

询问是否设置root密码,这里需要设置一个符合要求的密码才能继续。

询问是否删除匿名用户,我们选择是Y

询问是否允许root用户远程连接,我们根据自己需求,我们选允许N

询问是否删除测试数据库test,我们选择是Y

询问重新加载权限表,我们选择是Y,因为以上配置加载完成之后会生效。

4.重启数据服务:

#service mysqld restat

5.测试本地登录数据库服务:

#mysql –uroot –p

以上配置完成,整个数据库服务就配置好了,默认情况下,数据库配置文件在/etc/my.cnf文件,数据库表文件存储在/var/lib/mysql中。

 

五、其他配置

  1. 查询各个服务安装的文件布局可以通过命令查询详细:

#rpm –ql httpd

#rpm –ql php

#rpm –ql mysql-server

  1. 配置服务开机启动

默认情况下,httpd和mysqld都需要开机启动设置好了才会起来,php是一个执行文件,本省不需要开机启动。

配置开机启动项目可以通过命令:chkconfig 来执行,检查现有开机启动项目:#chkconfig –list

设置httpd服务开机启动:

#chkconfig httpd on

设置mysqld服务开机启动:

#chkconfig mysqld on

  1. 配置httpd虚拟机主机

默认情况下,网站的根目录为/var/www/html,但是往往一个服务器上会有多个网站,我们需要通过httpd的虚拟主机配置来实现。

修改httpd.conf文件,开启虚拟主机配置支持:#vim /etc/httpd/conf/httpd.conf

打开配置文件后,翻页到最后,找到被注释掉的#NameVirtualHost *:80,把前面的井号去掉保存退出,开启虚拟主机支持。

复制配置文件,给子域名单独配置:

#tail –n 7 /etc/httpd/conf/httpd.conf>/etc/httpd/conf.d/xxx.conf

注意:在httpd服务配置文件中,所有配置文件为 .conf 结尾才能加载生效

以上复制完成之后,再编辑配置文件,把文件里面的注释符号都去掉

#vim /etc/httpd/conf.d/xxx.conf

77-2

修改为类似以上内容,在html目录中建立了一个www目录来做第一个子站点的根目录,其他子域名类似即可。

#service httpd restart (重启加载配置文件)

  1. 开启伪静态支持

#vim /etc/httpd/conf/httpd.conf

找到 AllowOverride None 这行,修改成  AllowOverride All

#service httpd restart (重启加载配置文件)

httpd配置用户访问认证

需求:单用户访问网站的某个目录,需要使用帐号密码来登录才能访问。

一、编辑虚拟主机的配置文件,添加目录级访问限制

<Directory "/var/www/html/demo">
  Options -Indexes FollowSymLinks
  AllowOverride AuthConfig
  Order allow,deny
  Allow from All

  AuthName "Login Notice" —— 认证时显示的提示
  AuthType Basic —— 认证类型
  AuthUserFile /etc/httpd/conf.d/htpasswd —— 用户配置文件
  require valid-user —— 限制为所有合法用户
</Directory>

二、用户认证配置文件
1.创建apache的验证用户

#htpasswd -c /etc/httpd/conf.d/htpasswd testuser 
黑色部分表示认证文件的路径,可以自己选定其他路径

回车后提示输入该用户的密码,输入两遍完成设置,第一次创建用户要用到 -c 参数,以后添加用户,就不用 -c 参数。

2.如果想修改某个用户的密码:

#htpasswd -m /etc/httpd/conf.d/htpasswd testuser

三、测试效果
1.认证页面效果如下

58-1

2.认证失败如下提示:

58-2

httpd配置gzip压缩

以下设置在 /etc/httpd/conf/httpd.conf 文件末尾加入即可。(不同方式安装的httpd可能主配置文件位置不同,请自行查找)

 

一、mod_deflate模块:文件压缩

官方文档:http://httpd.apache.org/docs/2.2/mod/mod_deflate.html

1.检查是否加载模块

LoadModule deflate_module modules/mod_deflate.so

2.设置压缩规则

<IfModule mod_deflate.c>

#开启压缩
SetOutputFilter DEFLATE

#以下文件不压缩,因为用处不大
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary

#压缩所有文本类型的文件
AddOutputFilterByType DEFLATE text/*

#压缩脚本文件
AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript application/x-httpd-php

</IfModule>

 

二、mod_headers模块:过期时间设置

官方文档:http://httpd.apache.org/docs/2.2/mod/mod_headers.html

对指定的文件配置缓存的生存时间,去除mod_headers.so模块前面的注释,以下的86400单位秒,即24小时过期。

#文件缓存时间配置
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf|js|css)$">
Header set Cache-Control "max-age=86400"
</FilesMatch>

 

以上设置完成之后重启httpd服务,重新加载配置。

可以通过http://tool.chinaz.com/Gzips/ 工具检测是否开启gzip压缩。

可以通过谷歌浏览器开发者工具的Network选项来查看设置过期时间是否成功(查看头部请求)。