【学习前准备工作 强调几点注意事项】

之前看过序章的朋友 一定还记得大米跟大家提过, 一个最最简单的网站(静态网站)基础框架组成部分是什么?

那就是 NGINX(WEB服务器) + 服务器 + 操作系统(Linux)

这里给大家补充说明几点

第一: 首先 咱们先来说一下Linux这个重头戏的组成部分,Linux因为它的开源以及稳定等等的优质特性,现如今已经基本统一了服务器操作系统的标准,说真的 现在去机房 再想找出一台不是跑着Linux的服务器(跑着其他的系统) 估计挺难的了

在我们的专栏中(包括后续的专栏)全部都是基于Linux给大家搭建环境 并讲解的

所以 本专栏需要大家对Linux 有一定的基础后 再继续阅读
(本专栏中 涉及到的 过于基础的Linux知识 我们就不再额外花篇幅讲解了 )

第二:关于服务器,在序章的时候 跟大家说过 它指的是一台物理服务器 , 所谓的互联网 其实不过就是 由无数无数的物理服务器连接在一起 最终绘制而成的(比较有经验的同学 可能会抬杠了, 谁说都是物理服务器的,现在很多不都是云虚拟机了吗? 问的对,现在确实很多中小企业 都不再购买真正的物理服务器来搭建自己的"互联网产品", 但是 归根到底,云机只不过是针对企业用户或者个人用户来说的, 从技术层面上说, 云机是通过虚拟化技术 在物理服务器上 划分出的区域 本质永远脱离不了 本体的物理服务器)

然而 在我们的专栏学习的过程中,服务器是每个人必须准备的, 然而为了学习而购买一台上万的物理服务器肯定不现实 也没有必要
(因为我们并不是真的要 搭建一个被好几万人访问的网站 )

这里推荐大家 两种方式来 搭建我们的服务器(虚拟机)

第一种 (推荐):在活动折扣期间 购买任意云平台的 最低配置虚拟机两台(学习过程中 最少使用两台 三台最佳 后面会讲解为什么)

这样的做法 是大米比较推荐的,虽然会产生一定的费用(折扣活动期间 最低配的一台云机 一年也不过100-200块钱而已 比较划算 )然而 灵活性非常的高 因为购买的云机 可拥有公网IP地址 可以在任意地点登录使用和维护 这样以来 就对地点不再局限 可以在任意地方进行远程登录

另外 现在大多数云平台的云机 都支持按量付费 也就是说 用的时候才会产生费用 (一天几毛钱到几块钱 看配置高低 和 使用时长了 基本按照小时出账单) 用完后释放 就不会再产生费用, 需要注意的就是 千万别弄高配置 高带宽 那费用成指数上升 就很吓人了 一切就按最低配置来即可 学习足够用了

另外还有一个好处,就是多接触各类云计算平台的使用方法 对以后想从事运维工程师相关工作来说 是一个非常好的锻炼和准备

第二种(免费):这个自然就是 使用我们的笔记本 或者 PC台式机 安装Linux虚拟机

估计大多数人还是会选择这样的方式来安装Linux虚拟机 , 毕竟免费嘛 ^_^

这里 强烈推荐大家使用 virtual box 来安装虚拟机(因为简单 又免费) , Linux镜像选择Centos6/7 即可

关于如何在windows上使用virtual box安装虚拟机,这个非常简单 度娘一搜就一堆 这里就不再跟大家啰嗦了
(唯一有点麻烦的就是 需要提前下载好一个 Centos.ios的镜像文件 这个文件很大 最好常备一份儿)

最稳妥的方式 推荐大家在接有网线的 台式机 或者 笔记本上 安装虚拟机三台, 网络选择"物理桥接即可"
然后每台Linux虚拟机 手动分配固定IP (不要用DHCP自动分配 不然时不时变IP非常讨厌, 所以服务器99%的情况 都是手动分配固定IP)

第三:解释一下什么叫做 静态站点和动态站点

关于什么是静态和动态站点 我们之前跟大家提过两次, 在这里 咱们来解释一下意思

静态网站? 网页都是静止不动的? 只要画面有变动就成动态网站了? 是这个意思吗?

其实不是的哦 -_-

所谓的静态网站 准确的定义 是网站所提供的网页内容对于所有来访的用户都是保持一致 不随用户的互动动作而计算且发生变化 除非是服务器端的静态资源(例如 文字 图片 视频 动画 声音)发生了改变

这里理解起来可能会产生误区,比如 有的学员可能就会问 比如打开一个纯看图片的网站,这算是静态了对吧, 可是当我鼠标点击站内另外一个图片链接的时候,画面就变了唉 这不就是随着我的动作发生改变了吗? 变成动态网站了?

大米给大家的解释是,没错 这里点击另外的图片 确实是画面发生了改变, 但是这并不是动态网站效果 为什么呢?

因为 另外的图片链接原本就存在在站内,只不过是当你点击到了 才看到而已, 这里的动作只是发生了页面跳转 而并不是根据你的动作和输入 经过计算后发生改变

这么解释 估计还可能有同学不是很明白,不用太着急 接下来 咱们看一下动态网站的定义 再返回头来看 就明白多了

那什么是动态网站呢?

最直接简单的例子 就是一个登录欢迎页面

就像上面这张图这样, 大家都见过吧, 网页一上来就先让你输入用户名和密码

输入完成之后(比如:张三 123456) 然后会有一个对应的"程序" 把你输入的账号和密码 携带着去到数据库里查验

看看这个账号是不是存在, 再看看密码是否正确, 如果错误 就返回失败, 如果正确 就返回 一个页面写着 欢迎你 张三

这种就属于动态网站的功能, 因为网站跟用户有交互的动作, 用户会有数据的提交 ,而且根据每个用户输入数据的不同 返回的结果可能都不一样 比如 李四登录成功 就显示 欢迎你 李四, 别人登录成功的话 就会变了

除此之外 动态网站还有两个非常重要的组件 , 那就是 网站后面有程序代码在运行和判断 还有动态网站 必然存在数据库的支持 (静态网站一般没有)

另外 从URL(也就是你输入的网址 也可以进行判断)

静态网站 更多以 .htm .html .xml结尾, 而动态网站 更多以 .php .asp .jsp .cgi (CGI通用网关接口 是最早实现动态网站的技术 大米之前在序章提过的)等等结尾 在动态网页网址中有一个标志性的符号——“?”,如有这样一个动态网页的地址为:
http://www.testdami.com/index.php?id=12345

其实现阶段来看 动态网站和静态网站 基本上已经不是独立存在的了, 绝大多数情况 都是混合再一起的网站 既有静态又有动态

就拿我们平时尝尝访问的几个门户网站来说, 一般都带有新闻首页对吧 上面附带着大量的静态页面内容(文字 图片 等等), 然而与此同时 所有门户网站 都支持 用户注册登录 邮箱 搜索等等动态网站的内容

在我们的专栏的课程中 我们先做出和搭建一个最简单的静态网站为目标 后面会再加入动态网站的内容

提问:既然网站有静态和动态之分 那NGINX是不是都可以支持呢?

回答:NGINX本身只有处理静态WEB的能力 ,处理动态站点的话 NGINX本身不会自己去处理 但是它拥有的模块 (fastcgi->主要用来传递PHP , uwsgi->主要用来传递python web)会识别动态请求 进而把请求传递给后端的其他程式来处理

【开始准备我们学习用的Linux服务器吧】

接下来 咱们就可以着手准备我们的服务器了

大米假设大家到了这个时候 所有的Linux虚拟机都已经安装完毕了哦 ^^

接下来 我们的服务器 需要完成一些环境的配置工作 才可以正常使用的哦

  • 首先是Linux的FQDN设置

首先咱们先确认 我们的虚拟主机拥有 完整主机名(FQDN) 并且可以相互ping通哦

Linux上完整主机名的配置 不光是对于NGINX, 对于其他任何服务来说 都是非常重要的

有些服务 如果检测不到正确主机名的配置 就会不断报错 甚至无法使用

另外 在生产环境中的Linux服务器,完整主机名的配置是硬性要求 因为当服务器数量大了以后,混乱的主机名会给维护带来极大的不便

完善的主机名 最简单的理解 就是 一个主机名+域名 来组成 而并不仅仅只是给机器起个名字这么简单哦 ^^

主机名:代表的是机器本身 域名:代表的是处在哪个域

例如 server001.study.com. 主机名是 server001 , 域是 study.com

就用Centos6为例子 我们按照如下的方式操作和最终验证即可

如上图中所示 一共有 三个地方需要修改 一个是 /etc/sysconfig/network 当中定义 HOSTNAME
再一个就是 /etc/hosts下面的设置

/etc/hosts 是一个非常重要的 Linux解析配置文件, Linux最早就是依靠它 来完成 机器名和ip地址的转换工作
比如 在上面图中 /etc/hosts文件 定义了咱们三台机器的 机器名和IP地址对应关系

server01.example.com server02.example.com server03.example.com
另外 在每一行的最后还定义了一个短名称 这个叫做别名

这样以来, 三台机器之间 就可以相互使用 完整机器名 或者其别名 来调用了

最后的 hostname -f (-f代表FQDN) 可以正确显示完整主机名 即可

接下来 我们检查Linux内核版本 请保证内核版本在2.6以上
为什么呢? 因为2.6以上版本的Linux内核 才支持epoll

说到这里会有疑问了 epoll又是个啥?(经常配置nginx的同学 一定见过 或者听说过这个词)
其实这里相关的有三个主要词汇 select , poll , epoll

这几个是nginx配置文件中 可选的配置项(events模块 ,后面会讲到)

这里容易有个误区 ,以为这三个选项 是nginx独有的"特性" ,实则不然

select/poll , epoll 其实是Linux内核中 多路复用I/O的 三种方法,跟nginx其实并没有直接的关系

如果要真的完全解释清楚 这三种模式在Linux内核中的实现方法 是相当复杂的

我们在当前可以先简单按照如下 理解即可

首先 这三种模式 都是Linux内核 为了解决处理高并发问题而设计的

随着内核的发展 诞生的先后顺序为 select -> poll -> epoll , epoll可以理解为 poll方法的增强版

其实 这三种方法的本质 都是多路复用 提高内核处理网络连接的工作效率

那多路复用又是个啥?

以一个生活中的例子来解释一下吧(如下一段 取自别处 个人认为很恰当的例子).

假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面.

如果你使用的阻塞IO模型来处理这个问题,那么你就只能一直守候在A号楼门口等待朋友的到来,在这段时间里你不能做别的事情,不难知道,这种方式的效率是低下的.

现在时代变化了,开始使用多路复用IO模型来处理这个问题.你告诉你的朋友来了A号楼找楼管大妈,让她告诉你该怎么走.这里的楼管大妈扮演的就是多路复用IO的角色.

既然 明白了什么是 多路复用 那么我们看下三种方法的区别

select版大妈做的是如下的事情:比如同学甲的朋友来了,select版大妈比较笨,她带着朋友挨个房间进行查询谁是同学甲

而poll和select差不太多, poll只是解决了 select的 FD问题, 但是本质并无大变化 依然无法很好支持高并发(文件描述符的限制 ,感兴趣的同学 可以自己搜索相关文章)

epoll版大妈就比较先进了,她记下了同学甲的信息,比如说他的房间号,那么等同学甲的朋友到来时,只需要告诉该朋友同学甲在哪个房间即可,不用自己亲自带着人满大楼的找人了

理解到这里 目前就够用了

接下来 检查内核版本的方法很简单 如下
符合我们的要求

接下来 咱们在 Linux上 (Centos) 使用yum 安装一些软件, 这些软件都是nginx必备的 我们分别来解释一下
(yum就不用多介绍了吧 Centos/Redhat Linux 最重要的 软件包安装管理工具)

如下安装的这些插件 如果是平时经常配置NGINX的同学一定很常见,但是我们要知其所以然 不能总是跟着网上搜来的安装教程复制几个命令一跑完事

1: gcc编译器的安装

C/C++语言编译器 我们后面的课程中 nginx最终都会采用源代码编译的方式来安装
(Linux下两种安装nginx的方式, yum 和 源代码编译 , yum安装的 直接就可以执行,简单方便 但是无法自由扩展nginx功能, 源代码编译的方式 是把nginx的源代码下载下来,然后我们自己通过编译器 自己按照需求 生成我们需要的nginx ,这个方式麻烦的多 但是 却自由度很高 也是企业中绝大部分的 部署开源软件的方式)

况且 后面也会讲到 自行修改开发nginx模块, 这些都离不开C/C++编译器的哦
(不管是想学好Linux 还是深入Linux上运行的各种开源软件, C语言都是必不可少的)

安装的方式很简单

yum install -y gcc gcc-c++

2: PCRE库的安装

PCRE这个平时应该也挺常见的吧 :) , 其实它的全称是 Perl Compatibel Regular Expressions : Perl兼容正则表达式

意思也就是说 ,如果你的NGINX以后在配置的过程中 需要使用正则表达式 就必须装这个插件(PCRE)
(所谓的正则表达式 就是一种使用各类特殊符号 来达到匹配或者过滤 字符串的目的 是一种通用技能)

类似就是这样的配置 :

 rewrite ^(.*)index\.php\?$ http://10.86.255.119$request_uri;

看着就头晕有点 对不? ^_^ (其实这已经算很简单的 正则了)
确实 正则表达式 不好学 很不容易找规律 而且最关键的是不好记忆 但是又非学不可
(后面我们会有专门的篇幅来学习它)

安装的方式也很简单

yum install -y pcre pcre-devel

3: zlib库的安装

nginx处理HTTP响应的时候,是可以支持gzip先压缩 后传输的方式 进而来减少网络传输量的哦
如果你希望nginx开启这个功能,就得把zlib编译进入nginx中

yum install -y zlib zlib-devel

4: OpenSSL库的安装

HTTPS大家不陌生吧 ,HTTP+SSL形成的更安全的传输协议 , 这个库几乎是默认必须安装的
现在基本上大部分网站 都支持HTTPS 只有一部分接口依然走HTTP , 这也是大势所趋了

yum install -y openssl openssl-devel

上面安装的几个软件包 只不过是完成Web服务器最基本功能所需的,后续 随着我们不断的深入学习,还有可能继续再增加别的软件包扩展 目前先了解清楚 这四个

必要的软件包装好了以后,咱们最后来看一下Linux内核参数的优化

大米先给大家解释一下 为什么要优化内核

我们平时总说 性能调优 性能优化之类的话对吧 其实说白了 就是通过各种参数调整 让服务器的性能达到最大化

一个服务器上其实是存在这么几层的嵌套关系的 从最底层开始 依次是

物理硬件 操作系统 服务软件 程序代码

其实优化的最终目的 是发挥物理硬件的最大效能 因为物理资源是不能随意改变的

至于硬件往上的部分 其实是层层嵌套的关系 一个会制约另一个 就好比 操作系统中的最大连接数没有放开 但是服务软件配置中的放开了 也是没有作用的 所以 这种嵌套关系有点像接在一起的 水龙带 光是一段很宽没用 必须都宽才行

接下来 咱们看下 针对咱们即将安装的Nginx , Linux的内核参数优化 应该掌握些什么

由于默认的Linux内核参数是最通用的场景,不符合咱们一直谈的支持高并发的特性,所以 我们需要做出一些初步的调整 把操作系统 这一层的"水龙头" 放开一些 ^_^

fs.file-max = 100000 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.ip_local_port_range = 1024 61000

内核的参数项目很多,因为我们在这儿不是专门讲Linux内核优化的 所以先拿出几个例子来简单说一下

file-max 进程可以同时打开的最大句柄数 (听说过Linux一切皆文件的说法吧) 这一项直接限制最大并发连接数

tcp_tw_reuse 允许将处于 TIME_WAIT状态的socket重新用于新TCP连接, 平时我们在服务器上 应该能看到大量的 TIME_WAIT状态的链接对不?(netstat -an | grep -i wait) ,这对于处理高并发的服务器来说 意义很大

keepalive_time 这个参数表示 TCP发送keepalive消息的频度 ,默认是2个小时 这太长了。。。 设置的小一些 有利于清理无效的链接

port_range TCP/UDP 连接的端口范围 , 建立一个连接就肯定会消耗掉一个端口 ,如果不把这个值改大了 高并发的时候 连接就无法建立了。。

做好如上的准备后 我从下一篇开始接触NGINX啦~