昨天听一个前同事说他们公司老大让他去研究下关于Nginx 方面的知识,我想了下Nginx 在如今的开发技术栈中应该会很大可能会用到,所以写篇博文记录总结下官网学习教程吧。
花了点时间写了篇Nginx入门学习教程
阅读后你将Get以下技能
- 什么是代理?
- 什么是正向代理?
- 什么是反向代理?
- Nginx与负载均衡有什么联系?
- 如何在centos7 中安装Nginx
1. 什么是Nginx?
我们先看下Nginx官网 的解释:
nginx [engine x]是最初由Igor Sysoev编写的HTTP和反向代理服务器,邮件代理服务器和通用TCP / UDP代理服务器。
- 基本的HTTP服务器功能
- 其他HTTP服务器功能
- 邮件代理服务器功能
- TCP / UDP代理服务器功能
- 体系结构和可扩展性
- 经测试的操作系统和平台
以下是一些成功案例:Dropbox,Netflix,Wordpress.com,FastMail.FM。
商业支持可从 Nginx,Inc. 获得
*对Nginx的解释:
Nginx(发音同engine x)是一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存。
该软件由 Igor Sysoev 创建,并于2004年首次公开发布。[6] 同名公司成立于2011年,以提供支持。[7]
Nginx是一款免费的开源软件,根据类BSD许可证的条款发布。一大部分Web服务器使用Nginx,[8] 通常作为负载均衡器。[9]
某前辈总结:
nginx是一款*的、开源的、高性能的HTTP服务器和反向代理服务器;
同时也是一个IMAP、POP3、SMTP代理服务器;
nginx可以作为一个HTTP服务器进行网站的发布处理,
另外nginx可以作为反向代理进行负载均衡的实现。
看到这里,你可能对这几个问题心存疑惑。
什么是反向代理?什么是代理?Nginx 如何实现负载均衡?
不要急,我们接下来 就一个一个给你解答这几个问题。(当然,如果你有对此其他问题,也非常欢迎你在评论区留言)
1.1 什么是反向代理?
要解释反向代理,我们就不得不先说下什么是代理?
那么什么是代理呢?
举个例子:代理 就如同生活中的专卖店~客人到adidas专卖店买了一双鞋,这个专卖店就是代理,被代理角色就是adidas厂家,目标角色就是用户。
那么什么是反向代理呢?
我们很多人应该都用过淘宝,要知道每天同时连接到淘宝网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;
也就是通过部署多台服务器来解决访问人数限制的问题;淘宝网站中大部分功能也是直接使用nginx进行反向代理实现的,并且通过封装nginx和其他的组件之后起了个高大上的名字:Tengine
然后我们一起看个图:
上图表示的是全国各地的用户在淘宝客户端发出请求,经过了Nginx 反向代理服务器,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理。
此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了。Nginx扮演的就是一个反向代理角色。
总结下:反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息
一般聪明的人会有举一反三的思维,当你听到反向代理,也许就会想有没有正向代理呢?答案是有.
什么是正向代理?
举 个例子:如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ(VPN)进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我
上述这样的代理模式称为正向代理.
正向代理最大的特点: 客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
正向代理和反向代理一起使用就会像下图这样:
1.2 Nginx 如何实现负载均衡?
相信上面的讲述使得你已经明白了代理相关的知识,那么我们继续来看什么是负载均衡?
想要知道什么是负载均衡,我们就得明白两个概念,什么是负载量?什么是均衡?
上面客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量
什么又是均衡呢?
请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则
所以负载均衡就是:将服务器接收到的请求按照规则分发的过程
负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种
硬件负载均衡也称为硬负载,特点:造价昂贵成本较高,数据的稳定性安全性好。
更多的公司考虑到成本原因,会选择使用软件负载均衡,软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。
nginx支持的负载均衡调度算法方式如下:
weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块
url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包
1.3 Nginx 另外一种实现负载均衡的方式
其实关于Nginx 实现负载均衡,除了上面那种模式外,还有一种Nginx处理静态资源实现负载均衡的架构。
我们先来看看原始的企业架构:
这种原始架构的特点:
- 单节点
- 几乎无容灾
- 负载能力低
- 维护简单
所以为了改善这种架构,引入了一种动静分离的模式:
这种架构模式,使用Nginx 来处理所有的html,js,css 静态资源请求,这样Tomcat 压力就会减轻一些,这样操作也能实现一定程度的负载均衡。
关于架构更多的优化,今后我会在分布式相关的课程中讲解,欢迎各位继续关注鄙人博客,有不对之处或者疑问欢迎在评论区留言。
2. Nginx 下载安装
Nginx官网:https://nginx.org/
Github 项目地址:https://github.com/nginx/nginx
打开上面下载地址相信你可以看到下图中的内容:
这里讲解下下载的注意事项。
Mainline version: Mainline 是 Nginx 目前主力在做的版本,可以说是开发版(Youtube看官网视频 推荐开发者使用这个版本)
Stable version: 最新稳定版,生产环境上建议使用的版本
Legacy versions:遗留的老版本的稳定版
Source Code: 源码
Pre-Build Packages: 预编译版本
- Linux packages for stable version 稳定版本预编译版本
- Linux packages for mainline version 开发版本预编译版本
主要的nginx包是用所有不需要附加库来避免额外依赖的模块构建的。 自1.9.11版本以来,nginx支持动态模块,并且以下模块构建为动态模块,并作为单独的软件包提供
nginx-module-geoip
nginx-module-image-filter
nginx-module-njs
nginx-module-perl
nginx-module-xslt
关于各个版本最低操作系统要求列表如下:
RHEL/CentOS:
Version Supported Platforms 6.x x86_64, i386 7.4+ x86_64, ppc64le
Debian:
Version Codename Supported Platforms 8.x jessie x86_64, i386 9.x stretch x86_64, i386
Ubuntu:
Version Codename Supported Platforms 14.04 trusty x86_64, i386, aarch64/arm64 16.04 xenial x86_64, i386, ppc64el, aarch64/arm64 17.10 artful x86_64, i386 18.04 bionic x86_64
SLES:
Version Supported Platforms 12 x86_64
根据不同平台有不同的安装方式, RHEL/CentOS 使用yum 包管理器安装,Debian/Ubuntu 使用apt 包管理器安装
2.1 如何在CentOS 和 Red Hat 安装 NGINX
文档参考:https://nginx.org/en/linux_packages.html
以下内容来自视频和官网文档翻译,想看原版请移步:Nginx 官网出品YouTube视频教程
如果没有Linux 环境的可参考我的博客教程 VMWare Workstation虚拟机 安装Centos7 图文指南
Root用户登陆后在 桌面右键打开终端:
打开终端后这里有个坑,请注意下。
输入命令ls -a 列出显示当前所有文件夹 (ls 列出当前路径文件夹命令,-a 参数表示显示所有隐藏的文件夹-a 是all的简写)
为了要启用Linux软件包的自动更新,请设置RHEL / CentOS发行版的yum存储库,Debian / Ubuntu发行版的apt存储库或SLES的zypper存储库。
我们需要 在 /etc/yum.repos.d/
在这个目录下创建文件 nginx.repo
文件内容格式如下:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/
gpgcheck=0
enabled=1取决于所使用的操作系统版本,将“OS”替换为“rhel”或“centos”,将“OSRELEASE”替换为分别为6.x或7.x版本的“6”或“7”。
我们的是Centos 7就改成下面内容
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
所以我们现在首先需要在打开的终端中输入命令下面创建一个配置文件:
vi etc/yum.repos.d/nginx.repo
但是当你保存的时候你会发现这个错误:
这个是怎么回事呢?网上有人说权限不足,要加上sudo ,但是我试了下结果并不是这样。
通过进行一系列问题排查和思考,终于找到了答案。
遇到这个情况,不要慌,按下Esc,然后再输入命令可以强制退出
:q!
然后输入命令查看当前所有的文件夹
ls -a
相信细心的你已经发现,当前目录下并没有etc 文件夹,所以我们之前执行那个命令执行失败就理所当然了。
知道原因就好办多了,我们执行下面命令,退出当前文件夹
cd ..
Tips: 注意下,cd 后面要有空格哦。
好了,这个问题终于解决了,我们继续执行我们的创建文件命令
vi etc/yum.repos.d/nginx.repo
编辑内容如下:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=
enabled=
编辑完成后想要保存和退出,首先按下Esc 快捷键,然后输入命令:
:wq
到这里我们的文件就创建成功了,关于验证签名这里我就跳过不做了,需要的请移步:https://nginx.org/en/linux_packages.html
然后我们执行更新命令:
yum update
Tips: 运行过程中提示需要Y/N 的,输入Y 回车即可
我们开始使用yum安装Nginx,输入下列命令:
yum install nginx
Tips: 运行过程中提示需要Y/N 的,输入Y 回车即可
出现这个回显结果说明安装完毕。
查看安装nginx 版本,输入命令:
nginx -v
执行成功后看到这样的回显说明安装成功。
查看Nginx 进程
ps -ef | grep nginx
为当前用户创建一个 Nginx服务快捷方式:
systemctl enable nginx
执行成功后有这样的回显
启动Nginx 服务
systemctl start nginx
执行成功后回显:
再次查看nginx进程,输入命令:
ps -ef | grep nginx
执行成功后你应该能看到这个样子:
有时候由于Linux 服务器上防火墙会端口拦截,所以我们需要在防火墙中开放80 端口,方便我们待会在物理机上查看
firewall-cmd --permanent --add-port=/tcp --zone=public
执行成功看到回显
重新加载防火墙配置
firewall-cmd --reload
防火墙配置重新加载成功回看到这个
查看当前IP地址输入命令:
ifconfig
执行成功后可以看到我们的Linux 操作系统IP地址是 192.168.233.129
然后在我们的windows 主机Chrome 浏览器上输入IP地址:
http://192.168.233.129
可以看到结果
停止Nginx服务
systemctl stop nginx
由于我本地没有搭建其他操作系统,所以这里关于其他操作系统的安装教程就不做讲述。
如何在Debian 以及ubuntu 安装Nginx ,请移步官方参考文档 视频教程
Docker 方式安装请移步阮一峰前辈的博文:Nginx 容器教程
Widows,ubuntu安装以及 Mac OS 安装步骤请移步周小董前辈的博文:Nginx安装及配置详解
关于FreeBSD (一种类UNIX操作系统)下的安装:
https://www.freebsd.org/doc/handbook/pkgng-intro.html