代码虽小,影响甚大。
果创科技CEO*禅宗图片来源于网络
现在起,从微观角度,我们将会着手开始搭建一个小网站;从宏观角度,我们将踏入软件开发这个领域。在这条路上,我们会遇到很多之前未接触过的技术、概念、工具和框架等。在迎来自己参与搭建的千万级高并发大型网站系统前,我们需要做好承受各种问题和压力的心理准备,酝酿持续学习的心态,并有意识地不断投入时间和精力。
好的开始,是成功的一半。如果你是一个初学者,或者是刚入门的新手,我建议是在一开始就选择一个高起点。也许有人会问,选择低起点,选择入门成本低、学习曲线平缓的路径不好吗?这样可以快速上手。没错,确实是这样,但这只是短期的收益。我们还要从长期的发展来考虑。
如果仅是作为对技术的简单尝鲜,以及日后的目标也只是停留在普通的网站维护和开发时,那么低起点是可以的。但是,如果你也和我一样,致力成为专业的软件开发工程师,致力于尽我们最大的努力,开发并交付价值最大化的软件的话,那么你应该选择一个高起点。对于类似Windows图形化界面和集成开发环境XAMPP,正因为它的简单性、易用性,使得我们容易产生依赖、错觉和习惯。
如果解决方案都是别人现成提供的,只会安装使用,那么最多只能算是一名使用者。一旦出了问题就会措手不及、不知所措,因为从没亲自深入解决过遇到的问题。而专家都是能亲自解决各种难题的人,并且专家也会经常帮助他人解决问题。错觉则是指这些大众化的软件容易让人忽略背后的原理、底层实现、数据结构和算法等冰山以下的内容,觉得软件开发是那么简单,殊不知背后还蕴藏着如此庞大的知识体系。有时候,不知道自己不知道是危险的。参加马拉松长跑比赛和百米冲刺赛跑的运动员,都会有意识在比赛前不断地锻炼,他们会选择与之类似的运动难度而不只是在公园内散散步就企图希望能获得好成绩。同样,在软件开发中,我们也要时刻注意要锻炼我们的思维能力,有意识地训练我们的左右脑。当然不能只是通过简单使用一键安装式的软件来刺激我们的大脑,而是要深入细节,深入底层,深入过程,有意识地去学习、掌握和接触大量的技术、知识和信息。
由俭入奢易,由奢入俭难。类似地,大脑从高度集中、活跃状态到放松状态容易,而从放松状态进入活跃状态很难。特别当一个已经长期都习惯放松平衡的状态时,更难。还记得吗?软件开发是一项需要高智力的脑力开发活动。你的思维方式决定了你所编写的代码,也决定了今后做事的方式——不管高效与否。
今天的选择,会在潜移默化下无意识地影响我们今后几年内工作的方式,也会间接制约我们后面所能取得的成就和成果。通俗来说,往往今天的丰富收获,并不在于我们今天做了什么,或者是最近几天做了什么,而在于多年前做了什么,以及这么多年以来我们一直做了什么。
假设多年后的你穿越回到当前,如果你也已经意识到了一个高起点对于专业软件开发工程师的重要性,那么就让我们来开始新的选择吧——选择一个高起点!下面,将会介绍怎样选择操作系统、开发环境和框架。即便你是有经验的开发人员,相信也可以从中获益。
.1服务器系统首选Linux一定要抵制住对Windows服务器系统的诱惑,要抵制住对GUI图形化界面的诱惑。
这里,并不是说Windows系统不好,也不是说CLI就一定要比GUI好。像高考填志愿一样,没有最好,只有更合适。后面我们将学习的网站开发所取用的技术大部分都是开源的,PHP开发语言是开源的,MySQL数据库是开源的,Nginx服务器是开源的,鉴于此,我觉得LNMP“*金组合”再搭配开源的Linux操作系统是非常合理的,而不是Windows商业系统。除此之外,我们在后续搭建企业级网站系统过程中还会用到很多开源的软件、开源的框架和开源的类库,这是一个庞大的开源生态圈。如果硬要在这个开源生态圈内注入一个商业系统,会显得格格不入,也会对文化、技术、架构等产生一定副作用。当然,并不是说Windows系统不好,Windows系统很强大,但在这里适合选择Linux。
另一方面,作为一名专业人士,很有必要熟练掌握命令行终端的操作,也就是对各种shll命令的使用。通过使用命令,我们可以将任务脚本化,即在一个脚本内使用多条命令就可以完成一个任务的操作。这样可以节省每次手动重复操作的时间。更重要的是,脚本化代表的是一种自动化处理的能力,即可以完全脱离人工干预而进行的操作。试想一下,这是对宝贵的人力资源多大的解脱!举个例子,我们需要为每个小区的每位业主发送月度物业费邮件电子账单,假设业主有人。如果是人工来操作的话,需要登录邮箱然后分别编写邮件,找到对应的收件人,然后核实发送,这个过程显然时间漫长并且容易出错。如果换种方式,将这些操作全部都使用命令脚本来实现的话,只需要每个月,花一分钟执行这个命令即可。人力成本大为降低的背后就是效率极大的提升。纵使是这样,如果负责发送邮件通知的那个人,因为忘记或者刚好那天是国家节假日而没发邮件的话,就会产生差错。这时,我们可以将此脚本任务通过Linux的crontab定时任务固化下来。这样,完全不需要任何人干预,电脑就会自动并且非常负责任地帮我们完成任务啦!
千万不要因为Linux的高深莫测就打退堂鼓。Linux本身并不复杂,很多人,特别是初学者觉得它很难。这只是因为Linux设计时面向的人群就不是普通的电脑使用者,而是面向特定领域的专业人士,尤其是面向技术类专业人士。这一过程的转换之所以难,是因为对我们多年来使用操作系统习惯和思维的转换,才会觉得很难。Linux没有提供GUI图形界面,在上面我们不能使用鼠标左右移动,没有良好的人机交互体验。要想在我们的大脑和Linux操作系统之间进行通讯,我们只能使用键盘,敲下指令,回车,等待终端的输出反馈。
这里有一个悖论,看似这样的人机操作,限制了我们的操作速度,限制了我们的可视范围,但恰恰是这样的CLI终端,为我们打开了更广阔的知识大门,打开了思维上的新天地。Linux秉持着简单之美的原则,在屏幕上输出的信息全部都是非常有用的。如果能在一屏内显示完整,决不会给你显示两屏。对于那些非关键性、可显示也可不显示的信息,则通常都不会显示。如果说我们是在和高效的命令行打交道,还不如说是我们正在和开发提供这些命令行的专家在对话,与这些来自世界各地大师级的专家在“沟通”,我们收获的不仅是更高效完成当前任务,从长远角度上看,收获的是向专家级权威人士靠拢的思维方式和见解。当哪天,你能看懂顶级专家编写的代码和论著时,你离专家也就不远了。
但是学习Linux这个过程,特别是刚开始的时候,可以说是步履维艰的。这点我深有体会。我也是刚毕业不久才正式学习和使用Linux操作系统的,当时连一个tar解压打包的命令都要保存下来,每次执行时都要找出来贴上去,然后改改参数再执行,因为对shll命令很陌生,完全记不住。而现在,我已经可以熟练地掌握常用命令的操作,并且对于未曾接触过的命令,也可以快速通过man命令来查看帮助。
选择Linux操作系统,还有一个很大的现实原因就是:当毕业后,你会发现,你所就职的公司,基本上绝大部分的网站系统都是运行在Linux操作系统之上。谁更懂Linux,谁就能更容易解决将要发生的问题,并且更能胜任随时到来的挑战。
服务器系统首选Linux,这是我对全部致力于成为专业开发人士的建议之一。
.自已动手搭建LNMP环境确定了操作系统后,接下来,自然就到了LNMP环境。LNMP是中小型公司,乃至大型公司都会选择的方案。因为这个“*金组合”成熟稳定,并且熟悉的人多。前面也有简单介绍,这里再稍微罗列下:
L表示Linux系列的操作系统,在本书中我们使用的是CntOS。
N表示Nginx,它可以实现均衡负载、反向代理、读写分离、URL重写等一系列功能。
P表示PHP,即网站开发语言,一种解释性脚本编程语言。
M表示MySQL,即开源的关系型数据库,可用于持久化存储数据。
与其他的教程不同,我不建议使用一键式集成开发环境,哪怕你现在是一个小白,我也会建议你一开始就自己动手搭建LNMP环境。
刚开始时,有可能你需要花费几天的时间,才能把整个开发环境搭建起来。但是没关系,不要急,也不要浮躁。要沉下心来,如果现在遇到这点难题就放弃的话,那么我们将会与千万级访问量的大型系统失之交臂。设想一下,如果你日后能在短时间内(例如几分钟内)找出使网站系统崩溃的原因并恢复正常,你需要具备哪些能力?你又需要为之做些什么呢?没错!就是当下,要把这个LNMP环境拿下。
就像医生诊断病人一样,如果他连人体的构造,各器官的位置和作用都不了解的话,他是不可能找得出病理的,更别说开药治病。病人也不会放心把自己的健康甚至生命托付给一无所知的医生。同样的道理,如果我们连LNMP都不了解,公司又怎能放心把网站系统托付给我们来维护和管理呢?这里说的了解,不是指表面上知其然,会使用,还要知其所以然,清楚涉及的安装、配置、优化、错误处理、实现原理等。能在今后和其他人进行技术沟通时,做到一问一答,举一反三。而不是一问三不知。
关于LNMP开发环境的搭建,网上已经有很多教程,大家可以根据自己的情况,结合当前使用的环境进行搭建,这里不再赘述。但我接下来会讲一些非常重要的关键点,讲一些不一样的内容。这些环节通常会容易被人遗忘或忽略,但却又是不可轻视的。至少从很多前来应聘的初级、中级开发工程师的回答上可以看出,他们缺少对这一块的认识。
..1Nginx的站点配置在哪?Nginx的配置,在不同的系统上,因为安装方式不同,所存放的位置也不相同。我们先来简单看下Nginx的配置有哪些,再来看下可以通过什么途径找到这些配置的位置。最后看下配置Nginx的原则。
CntOS上的配置默认情况下,Nginx的默认配置目录是在:/tc/nginx/,并且在这目录下会有一个nginx.conf的默认配置文件,也就是Nginx的配置文件。这里面有比较多重要、关键性的配置。其中,需要注意的是,如果在这份配置里搜索“includ”,你会找到类似这样的配置: