浅谈https服务的SSL免费证书申请

摘要:随着这两年SSL证书的普及,使用了SSL证书启用了HTTPS协议的网站越来越多了,最近为了把网站开启全站HTTPS,特意申请了一个免费的SSL证书用了起来。在百度云、阿里云、腾讯云三大国内的云服务平台都有免费一年的SSL证书。

一、阿里云免费SSL证书

阿里云的免费SSL并不难申请,只要注册阿里云帐号,并通过认证就可以申请了。

申请网址https://www.aliyun.com/product/cas?utm_content=se_442415

点击上面的网址,进入阿里云的SSL证书介绍页面,点击“购买”就会有一个“免费型DV SSL”供选择。支持1个域名,且一次性只能购买1年,最后的费用为0。

阿里云的免费SSL证书为Symantec的,且一个阿云帐户最多签发20张免费证书。

二、百度云免费SSL证书

百度云的SSL证书和阿里云一样,也是Symantec – TrustAsia提供的,而且百度云目前为止还没有推出收费的SSL证书,只有免费的。也是支持1个域名,且一次性只能购买一年,最后的费用为0。

百度云免费DV SSL证书申请网址https://cloud.baidu.com/product/cas.html

百度云的免费SSL证书暂不支持证书导出,必须在成功签发后30天内部署使用,否则百度可能会将证书强制删除。

三、腾讯云免费SSL证书

腾讯云免费SSL证书网址:https://www.qcloud.com/product/ssl

腾讯云的也是Symantec品牌的数字证书,一样也是提供一年1个域名的服务,且申请的时候需要域名所有权验证。不过证书颁发的效率很快,差不多20几分钟就能下证书。

参考:腾讯云ssl证书申请指南

四、亚马逊AWS免费SSL证书

需要特别说明一下这个亚马逊是美国的那个亚马逊Amazon(不是我们卖书的那个卓越亚马逊),其实才是真正的巨头企业,亚马逊Amazon的云服务能力和技术在全球都是知名的,最早阿里云其实就是效仿的亚马逊Amazon的云服务。

申请网址:https://aws.amazon.com/cn/free/

之所以把亚马逊AWS的免费SSL证书放在最后,虽然亚马逊AWS在全球具有领先的影响力,但是因为在国内几大巨头的影响下,他还是被夹击的。而且亚马逊AWS的介绍页面很“老外”,虽然网页是中文的,但是内容却里中国上网习惯相差很大。在BAT的免费政策下其实基本上都够用了,所以也就拿它做个备选吧。

最后,很多人可能看到所有的免费SSL证书都是只提供一年的使用期限,会担心一年后怎么办的问题。其实我觉得不用多想,虽然现在确实是SSL证书的推广期,所以各大云服务厂商才推出免费SSL。但是他们并没有说这个政策进行到什么时候,而且每个平台都是支持申请多个免费证书的,到时候只要一年期结束后,继续申请一个新的免费证书就可以了。

 

 

PHP集群session共享

集群的概念没有多复杂,其实就是多台电脑为了同一个目标在一起工作。在Web应用中,就是多个服务器提供一个站点的服务。

搭建PHP集群的第一步就是设置负载均衡。首先我们需要三台主机:

Nginx负载:192.166.5.111
PHP应用1:192.168.5.112
PHP应用2:192.168.5.113

1

先前,在PHP应用所在的主机,我们需要安装Nginx或者apache等这类web服务器,然后再在前面使用Nginx作为负载。Nginx 负载和php应用之间的通信是在应用层的,Nginx负载其实就相当于一个代理。但是,现在情况不同了。Fastcgi技术的应用允许在php应用层可以不用再安装web服务器。现在PHP5.5版本已经将fpm作为内部模块支持了。在这种情况下,Nginx 负载和php应用之间的通信是在传输层的,二者之间使用socket进行通信。当然了,这需要fpm服务的支持。

2

Nginx设置

首先对Nginx(192.168.5.111)进行设置,编辑nginx.conf配置文件

http{
         ……
         upstream onmpw_phpApps{
            server 192.168.18.88:9000;
            server 192.168.18.191:9000;
        }
        ……
       Server{
         listen        80;
         server_name   load.onmpw.com   ##这里是域名
         root           /www/onmpw         
         ……
         location ~ \.php$ {
                   root         /www/onmpw   ##这里是PHP应用所在目录
                   fastcgi_pass   onmpw_phpApps;
                   ……
         }
      }
}

以上是对Nginx进行的设置。其中只是包含了关键的部分,其余的和平常我们使用Nginx+PHP作为web服务的时候进行的设置相同。

PHP所在主机设置

这里的设置就比较简单了。

首先编辑php-fpm.conf文件,修改监听的ip和端口,然后启动fpm服务

主机192.168.5.112

Listen = 192.168.5.112:9000   //这里的端口可以自行设置。保存退出
# /usr/local/php/sbin/php-fpm   //开启服务

主机192.168.5.113

Listen = 192.168.5.113:9000
# /usr/local/php/sbin/php-fpm

到这里就对PHP的主机设置完成了。当然了,代码需要在两台主机上各上传一份儿。

好了,经过上面的设置,一个基本的PHP集群就已经搭建完成了。但是有一个问题,这种情况如果只是访问静态资源或者不进行交互的话是没有问题的。如果需要交互,那就涉及到一个session共享的问题。默认情况下PHP是将session存在本地磁盘上的。那这两台主机之间如何共享session呢,接下来我们就来解决这个问题。

PHP主机之间Session共享

之前在网上看到过一种解决方式。由于PHP是将session存储在文件中,那我们可以在Nginx负载主机上面搭建一个分布式文件系统(NFS),让两台PHP主机的session都存放在此文件系统中。以此来达到共享session的目的。

3

我个人比较倾向于将session存储到数据库中。因此这里我介绍的是将session存储到redis中。所以我们需要增加一台Redis服务器

Redis服务器:192.168.5.114

4

PHP默认情况下是不支持对Redis的操作的。所以这里我们需要自己手动安装第三方的扩展,使其支持对Redis的操作。关于如何使PHP支持Redis,我们可以参考《PHP操作Redis的两种方式》

在这里我就认为我们的PHP已经支持Redis了。接下来是将session存储到Redis中,有两种方式:一种是直接修改PHP的配置文件php.ini;另一种是重写session机制。

修改PHP配置文件php.ini将session存储到Redis

使用vim打开php.ini,需要修改的有这两项:session.save_handler和session.save_path。

session.save_handler = Redis

//不需要密码验证
session.save_path = “tcp://192.168.5.114:6379”

//Redis 需要密码验证
session.save_path = “tcp://192.168.5.114:6379?auth=password”

修改完成,保存退出。然后重启php-fpm服务

# kill -INT `cat /usr/local/php/var/run/php-fpm.pid`
# /usr/local/php/sbin/php-fpm

两台PHP主机都做按照以上步骤操作。经过以上步骤,对于session的所有信息都保存到了Redis中。从而实现了session的共享。

通过重写session机制将session存储到Redis

通常,在很多情况下我们是没有权限修改php.ini文件的。这时候我们可以通过重写session机制来修改session信息的存储。

对于重写session,php已经为我们提供了SessionHandlerInterface 接口。我们只要实现这个接口就可以了。关于如何重写session机制,大家可以参考《PHP重写session机制》这篇文章。该类的完整代码在github上,大家有兴趣的和可以点此查看

总结

PHP集群的架构方式有很多种,但是其原理都大同小异。关键是找出最适合自己项目的最佳方案。例如:对于session存储方式的选择,你也可以选择使用memcache或者mysql数据库等。总之最适合自己的就是最优的。希望本文对大家有所帮助。

全文检索引擎Solr的配置

描述:

在Linux环境下实现高速的全文检索

一、当前环境:

CentOS (Linux) 6.5 32 bit

二、所需软件

1、Java的JDK

Java jdk 1.8.0【注意:solr5.x版本必须安装java 1.7及以上版本

2、Solr最新稳定版Solr-5.5.3

3、Tomcat稳定版Tomcat-6.0.47【也可以进入到solr的安装目录下,执行bin/solr start命令即可启动solr自带的服务器jetty

4、IK Analyzer最新稳定版分词器IKAnalyzer2012

 

三、Tomcat安装

1、  安装jdk

http://pblog.applinzi.com/index.php/2015/10/08/linux-jdk/

2、  下载Tomcat

http://mirror.bit.edu.cn/apache/tomcat/tomcat-6/v6.0.47/bin/

(如果找不到请到http://mirror.bit.edu.cn/ 官网点击”apache”进入选择相应版本下载)

 

3、解压tomcat并且放到指定目录下

#tar zxvf apache-tomcat-6.0.47.tar.gz

#mv apache-tomcat-6.0.47/ /usr/local/tomcat

4、启动tomcat

#/usr/local/tomcat/bin/startup.sh

(如果想测试是否安装成功,那么就新建一个test

目录,在下面放一个index.html文件进行测试)

5、关闭tomcat

#/usr/local/tomcat/bin/shutdown.sh

 

四、Solr配置

1、  下载Solr

http://mirror.bit.edu.cn/apache/lucene/solr/

历史版本:http://archive.apache.org/dist/lucene/solr/

2、  解压并且配置Solr

#tar zxvf solr-5.5.3.tgz
a.新建目录

#mkdir /usr/local/tomcat/webapps/solr

将solr-5.5.3/server/solr-webapps/webapp/目录下的所有文件拷贝到tomcat安装目录的webapps下(/usr/local/tomcat/webapps/solr)。 

b. 新建solr索引目录:/home/solr;

c. 把官网下载的solr(本文为:solr-5.5.3.tgz)解压目录中的"solr-5.5.3/server/solr"目录下的所有内容复制到/home/solr中。

3、配置/home/solr

修改tomcat/webapps/solr/WEB-INF/web.xml,,取消注释,配置“env-entry-value”的值为自定义的solr索引目录

<env-entry> 

 <env-entry-name>solr/home</env-entry-name> 
 
 <env-entry-value>/home/solr</env-entry-value> 

 <env-entry-type>java.lang.String</env-entry-type> 

</env-entry>

4、配置日志

将solr目录下server/lib/ext中的jar包copy到tomcat的solr/WEB-INF/lib下。这时候虽然添加jar包,但是没有对应的日志配置,需要将solr-5.5.3/server/resources下的log4j.properties也放到solr/WEB-INF/classes/下,如果没有classes文件夹则新建一个。

LVS与Nginx作负载均衡对比

搭建负载均衡高可用环境相对简单,主要是要理解其中原理。此文描述了两种负载均衡器的优缺点,以便在实际的生产应用中,按需求取舍。
目前,在线上环境中应用较多的负载均衡器硬件有F5 BIG-IP,软件有LVS及Nginx,高可用软件有Heartbeat、Keepalived,成熟的架构有LVS+Keepalived、LVS+Heartbeat及Nginx+Keepalived。

两种负载均衡器的优缺点说明如下:

LVS的优点:

1、抗负载能力强、工作在第4层【传输层】仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;无流量,同时保证了均衡器IO的性能不会受到大流量的影响;在我手里的 lvs,仅仅出过一次问题:在并发最高的一小段时间内均衡器出现丢包现象,据分析为网络问题,即网卡或linux2.4内核的承载能力已到上限,内存和 cpu方面基本无消耗;
2、工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat;
3、应用工作在第4层,所以应用范围比较广,可以对所有应用做负载均衡;包括http、数据库、聊天室等;
4、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。

LVS的缺点:

 1、软件本身不支持正则处理,不能做动静分离,这就凸显了Nginx+Keepalived的优势。
 2、如果网站应用比较庞大,LVS+Keepalived就比较复杂了,特别是后面有Windows Server应用的机器,实施及配置还有维护过程就比较麻烦,相对而言,Nginx+Keepalived就简单多了。

Nginx的优点:

 1、工作在OSI第7层【应用层】,可以针对http应用做一些分流的策略。比如针对域名、目录结构。它的正则比较强大和灵活;相比之下lvs并不具备这样的功能,所以 nginx单凭这点可利用的场合就远多于lvs了;

 2、Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,nginx就能连得通,nginx同时还能区分内外网,如果是同时拥有内外网的节点,就相当于单机拥有了备份线路;lvs就比较依赖于网络环境,这个也是它的优势所在;

 3、Nginx安装和配置比较简单,测试起来比较方便;因为它基本能把错误用日志打印出来。lvs的安装和配置、测试就要花比较长的时间了,因为同上所述,lvs对网络依赖比较大,很多时候不能配置成功都是因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦得多。

 4、可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;

 5、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点;

 6、Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP现在也是非常流行的web环境,大有和LAMP环境分庭抗礼之势,Nginx在处理静态页面、特别是抗高并发方面相对apache有优势;

 7、Nginx现在作为Web反向加速缓存越来越成熟了,速度比传统的Squid服务器更快,有需求的朋友可以考虑用其作为反向代理加速器;

 8、nginx可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。

Nginx的缺点:

 1、服务器的健康状态只支持通过端口来检测,不支持通过url来检测;

 2、Nginx对big request header的支持不是很好,如果client_header_buffer_size设置的比较小,就会返回400bad request页面;

 3、不支持session保持;

 4.nginx配置文件可调整,所以经常要去触碰触碰,触碰多了,人为出问题的几率也就会大。

建议

因为LVS忒牛了,配置也最麻烦了,而Nginx自己就有,而且配置超级简单。所以建议,如果网站访问量不是门户级别的用NGINX就OK了,到了门户级别在用LVS吧。

参考:https://yq.aliyun.com/articles/49042

高并发场景-01

问:现在有这样一个需求,在一秒中有3万的支付订单请求,有什么比较好的解决方案吗?

1. 首先要解决掉数据库的压力,3万qps对应的磁盘 iops 很大,不过现在好的 SSD 能提供很好的 iops, 比如这款: ARK | Intel® SSD DC P3700 Series (800GB, 2.5in PCIe 3.0, 20nm, MLC) 单盘 90000 IOPS,应该能撑住你的数据库,考虑到主备,以及你的sharding需求,3-9 台数据库机器,高内存,高CPU,SSD磁盘应该能抗住

2. 业务逻辑这一层: Java 系,用线程来抗并发的,如果业务逻辑不太复杂,那么基本能做到 100ms 内响应,那么 30000qps, 对应的是 3000并发线程,这部分设计的时候记得保持无状态,单台支撑 300-1000 并发没问题,加上一倍的冗余,那么 6~20 台业务型机器可以抗住。

3. 缓存层: 支付订单一般对缓存需求不高,但缓存层一般都会有,避免把查询压力压到数据库,简单两台缓存,或者缓存平行部署在业务型机器上都可以解决,具体看你的情况了。

4. 接入层: nginx 做LVS就可以了,记得 backlog 配大点就可以了, 3万qps, 假设单个请求的数据在 10KB 左右,那么是 300MB/s,如果是千兆机,每台4网卡,两内两外,加上冗余,我会部署4台入口机,如果是万兆机,两台做主备(心跳或者LVS)即可。

当然,魔鬼在细节,做好机器的监控,慢请求的监控,日志的汇聚与分析。然后逐步推进服务的 SOA 化来降低复杂度。留一台业务机打小流量来做线上测试。优化JVM运行参数,等等,要做的事情还很多。