Archive for the 'SERVER' Category

APP创业项目-密码加密

用户名和密码是用户登录系统的身份凭证,用户注册时向服务器提交用户名和密码,服务器写入数据库后,用户登录时提交相同的用户名和密码,如果两者能够跟数据库中的某一条记录匹配,则身份认证通过,建立会话。用户名和密码数据的安全至关重要。本文主要讨论密码的加密问题。

为什么要对密码加密?

首先,将密码明文写入数据库是一件没有道德的事情。很多用户习惯于在各个网络平台使用同一个用户名和密码,如果系统记录了用户的密码明文,那么开发人员就可以直接看到用户的密码,如果用户注册时还留下了邮箱,且用户的邮箱使用了相同的密码,那么开发人员就可以进入用户的邮箱随意浏览了。

其次,一旦网站被攻击,数据库泄露,攻击者将获取到所有用户的密码,这是一件非常可怕的事情,这类事情CSDN博客网站就发生过。

将密码加密后写入数据库,网站开发人员和窃取了数据的黑客都无法知道密码明文,只能依赖密码破解,这一定程度上保障用户的安全。那么,如何加密密码才尽可能安全?下面讨论密码加密相关的几个概念。 继续阅读 [ APP创业项目-密码加密 ]

APP创业项目-用户身份认证架构

一个互联网项目通常会标配一个用户模块,主要实现用户注册、登录、忘记密码、密码加密、session创建与销毁。随着第三方认证的流行,还需要实现微信、QQ、微博等第三方账号登录及其账号绑定。另外,需要解决APP用户的持久登录问题,多应用服务器身份共享问题,APP内嵌H5应用的身份注入问题等。

首先我们聊以下几个顶层设计的问题。

用户中心是做成一个模块还是一个独立服务?

首先,我们打开百度、淘宝、京东、QQ等互联网产品,你会发现他们都提供了多种多样的独立服务(网站),例如百度有:贴吧、知道、百度云、音乐随心听、糯米团购、外卖等等,京东作为一个主营电商的网站也划分为若干独立的服务:首页www.jd.com、商品列表list.jd.com、商品详情item.jd.com、订单order.jd.com、个人中心home.jd.com等等。每个公司的各种服务都共用同一个身份认证系统:百度登录对话框、淘宝https://login.taobao.com、京东https://passport.jd.com、QQ登录对话框。可见大公司常见的模式是将用户中心做成一个独立服务。

共用一个身份认证服务有什么好处呢?

假如不使用同一个身份认证服务,各自开发各自的身份认证模块,那么各网站服务之间用户无法共通,从一个网站跳到另一个网站需要重新登录,对用户来说很繁琐。

数据共通能够帮助产品团队更好地了解用户,例如用户使用百度搜索“美人鱼”想看下周星驰导演的这部电影的影评,但是除了周星驰导演的《美人鱼》之外,美人鱼还有别的实体,如伊丽莎白·艾伦导演的《美人鱼》,周杰伦的歌《美人鱼》,如果用户多次点击了周星驰的《美人鱼》的相关网页,那用户可能是这部电影的潜在消费者,如果用户随后进入百度的糯米网(包含电影票销售服务),则可以在首页显示《美人鱼》的片花和优惠信息。因此,打通了各服务之间的用户,可以整合各服务的数据去了解用户(即用户画像)。

京东作为一个电商网站,并不像百度,产品那么多样化,为什么也要把首页、商品列表、商品详情、订单等等这些功能模块分到不同的子域名上,由https://passport.jd.com负责认证呢?

一个大型网站项目,通常由很多开发人员分成小组进行开发,各小组既要解耦又要相互合作。解耦的位置可以在模块化代码层面,也可以在网站架构层面。这里将他们称为:代码模块化解耦、多网站架构解耦。

代码模块化解耦要求各小组基于一个基础核心代码,使用同一个语言在同一个框架下各自编写模块,各模块处理好包管理和命名空间,最终合并代码形成一个独立站点。所有代码运行于同一个服务器环境,运维相对简单。但是这部分代码被各个网站平台共用,代码维护将十分困难。

多网站架构解耦要求各小组共用身份认证服务,其他开发细节不再关心,理论上可自由发挥,甚至可以采用不同的语言、框架和服务器,相比代码模块化更加灵活;在服务器负载均衡上也可以更加灵活,可以针对访问频繁的功能部署更多的服务器以提升速度,针对冷门的功能部署较少的服务器以减少开支。

不管是代码模块化解耦还是多网站架构解耦,只要涉及到多应用服务器架构,实现独立的身份认证服务都是一个最佳的选择。

我们知道不同子域名通常意味着不同的网站,不同的网站应该放置到不同的服务器,那么他们之间不可以使用本地文件系统存储session,因为这将导致各网站之间无法共享session。如何解决这个问题呢? 继续阅读 [ APP创业项目-用户身份认证架构 ]

APP创业项目-基于阿里云的服务器架构

阿里云、AWS等各类云计算平台使得互联网创业成本大大降低,不仅仅是服务器硬件成本,更重要的是硬件运维成本。每多购置一台服务器,就多增加一份维护压力,而优秀的服务器运维人员是很难得的,因为这种技术在大学里面没有相关专业,仅凭经验摸索。阿里云不仅仅提供了云服务器硬件资源,更是有一群优秀的运维人员提供技术支持。回想2005年以前的互联网创业,购置服务器、托管服务器、运维服务器,每个服务器都要有一个备份服务器进行容灾,这门槛让很多创业团队难以跨越。如今,我们可以花费很少的成本,拥有一套大互联网公司级别的服务器架构。本文讨论一个APP创业项目如何基于阿里云架构服务器。

一个APP项目可能需要如下服务器:

应用服务器、数据库服务器、文件服务器(CDN加速)、图片处理服务器、LOG服务器、内存服务器、全文检索服务器、负载均衡器、NoSQL服务器(MongoDB)、消息队列服务器等。 继续阅读 [ APP创业项目-基于阿里云的服务器架构 ]

APP创业项目-后端语言选择

对于刚创业的团队,资金和人才配备没有成型的大公司充分,因此在技术选型上须充分思考。本文针对后端语言选择问题作出分析,不会涉及到语言优劣问题,笔者认为语言遵循优胜劣汰规则,能够继续生存下来的语言都是好的语言,只是各自适合解决不同的问题。

APP项目的后端语言通常有:JAVA、PHP、Python、Ruby、.NET、JS等。笔者在项目中只接触过JAVA、PHP、Python和JS,对于Ruby和.NET没有实践方面的认知,那么首先排除一下他们俩。据说Ruby以敏捷著称,但是它还是太年轻了,在创业项目上我更愿意选择一个成熟稳健的技术。.NET出自微软,从asp开始微软在WEB后端开发就非常优秀,但是一直不是互联网公司的首选,正如服务器领域Windows一直不是首选一样。NodeJS在JS风靡全栈的潮流下,也成为了很多团队的选择之一,但是不选择它的原因跟Ruby一样。那么就剩下JAVA、PHP和Python了。 继续阅读 [ APP创业项目-后端语言选择 ]

APP创业项目-数据库字段默认值的设计思想

本文讲述我们的常用Not Null和默认值设计规则。数据表中的一些字段不一定都必须有数据,例如一个内容管理系统(CMS)的文章表,有如下的字段:

20160413170323

id是自增的主键;

title和content表示标题和正文,不能为空值;

create_time是当前时间戳;

is_check表示是否审核,默认没有审核;

editor表示编辑人员,可以为空。

这些字段如何去设置它的Not Null和Default值呢? 继续阅读 [ APP创业项目-数据库字段默认值的设计思想 ]

APP创业项目-关系数据库冗余设计的场景

设计关系数据库的时候,表与表之间存在各种关联关系,例如设计一个论坛的数据库,用户与评论之间存在一对多的关系,那么需要评论表中设置用户表的id作为外键。为了使得数据库的读写操作尽可能优化,有时候不单单存储一个外键,需要冗余存储其他信息来提升数据查询的速度。下面说几个用到冗余存储的场景:

1. 存储查询复杂的静态数据
对于评论回复另一条评论,通常在论坛中会引用被回复的评论内容、用户名、时间等信息,如下图汽车之家论坛。在设计评论表时,通常会设置reply_comment_id指向被回复评论对象,这里为了方便理解,我们把被回复的评论称为父评论。20160413144412
如果父评论还有父评论,那么就形成了一个回复链。例如网易新闻的盖楼模式:

20160413144724

这两种模式在数据库存取上有什么差异呢? 继续阅读 [ APP创业项目-关系数据库冗余设计的场景 ]

阿里云ECS服务器使用总结(与aws比较)

阿里云ECS提供按需购买和包月购买两种。本文讨论包月购买的情况。包月购买时,我们可以选择相应的配置:CPU、内存、硬盘、带宽。

价格分析

CPU,约48元1核
内存,18元512MB
硬盘最便宜,3毛钱1G
带宽,25块钱1M(实际1Mbps约等于140KBps),建议选择峰值带宽按流量付费

其中,香港最贵,北京、深圳、杭州、青岛次之,经常性会有特价优惠。

相比较亚马逊aws,US West (Northern California) Region的一个Linux t1.micro(已经升级为t2.micro)实例,每月费用18.60美元(约116元),配置1G内存、1核CPU、数据传输另算。这种配置在阿里云的包月价格为68元,比aws每月便宜了大约48元。但是aws有预留实例可以购买(即一次性购买1年)可以很大幅度的优惠,优惠后的价格与阿里云相当。
继续阅读 [ 阿里云ECS服务器使用总结(与aws比较) ]

virtualmin 中的 mod_fcgid: read data timeout in 31 seconds 解决方法

在Linux 服务器上部署了Virtualmin虚拟主机管理系统,近日有个别网站出现http500错误,查看ErrorLog发现 mod_fcgid: read data timeout in 31 seconds 这个Error。看来是PHP脚本或者其他CGI脚本运行超时了。解决方法如下:
Services – Configure website – Edit Directives
设置:
IPCCommTimeout 31
默认31秒,将31改为300,或者更大即可。
继续阅读 [ virtualmin 中的 mod_fcgid: read data timeout in 31 seconds 解决方法 ]

Apache2 mod_deflate 开启网页Gzip压缩

利用mod_deflate 对网页文本文件进行Gzip压缩后再返回数据,能够有效提升数据传输量,提升访问速度,但是进行Gzip压缩需要消耗一定CPU资源。
默认Apache2已经加载mod_deflate.so模块
LoadModule deflate_module modules/mod_deflate.so
如果没有在httpd.conf中添加此句

随后,我们需要进行一些配置

<IfModule mod_deflate.c>
#打开Gzip
    SetOutputFilter DEFLATE
#对text/html text/css text/xhtml等文本文件进行压缩
    AddOutputFilterByType DEFLATE text/*
#对js 等script文件进行压缩
    AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript
#对php数据进行压缩
    AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
#对gif jpg png不进行压缩
    SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
#对 zip exe 等文件不压缩
    SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
#对mov MP3文件不压缩
    SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
#处理浏览器兼容问题
    BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.x
    BrowserMatch ^Mozilla/4.0[678] no-gzip # Netscape 4.06-4.08
    BrowserMatch bMSIE !no-gzip !gzip-only-text/html
</IfModule>

Apache服务器开启客户端缓存mod_expires设置

通过mod_expires控制客户端浏览器缓存文件的类型和时长,有利于提升服务器请求速度,降低服务器的请求次数。默认apache服务器已经加载了mod_expires模块,在httpd.conf中我们可以看到

LoadModule expires_module modules/mod_expires.so

如果没有,可以便秘mod_expires.c文件获得,并配置加载。

但是apache并没有默认配置该模块,我们需要做配置,通常的配置样例如下:

<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresDefault A600
    ExpiresByType image/x-icon A2592000
    ExpiresByType application/x-javascript A604800
    ExpiresByType text/css A604800
    ExpiresByType image/gif A2592000
    ExpiresByType image/png A2592000
    ExpiresByType image/jpeg A2592000
    ExpiresByType text/plain A86400
    ExpiresByType application/x-shockwave-flash A2592000
    ExpiresByType video/x-flv A2592000
    ExpiresByType application/pdf A2592000
    ExpiresByType text/html A600
</IfModule>

其中的参数具体了解 Apache Module mod_expires

我们通常会写到的配置语句如下:
“access plus 1 month”
“access plus 4 weeks”
“now plus 30 days”
“modification plus 5 hours 3 minutes”
A2592000
M604800
access、now及A 三种写法的意义相同,指过期时间从访问时开始计算。
modification及M 的意义相同,指过期时间是以被访问文件的最后修改时间开始计算。