昨天听一个前同事说他们公司老大让他去研究下关于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
https://www.freebsd.org/doc/handbook/ports-using.html
Nginx 入门学习教程的更多相关文章
-
MyBatis入门学习教程-使用MyBatis对表执行CRUD操作
上一篇MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对use ...
-
Linux入门学习教程:虚拟机体验之KVM篇
本文中可以学习到的命令: 1. aptitude 是apt-get 不会产生垃圾的版本 2. dpkg -L virtualbox 显示属于该包的文件 lsmod | grep kvmfi ...
-
PHP 入门学习教程及进阶(源于知乎网友的智慧)
思过崖历程: 自学的动机.自学的技巧.自学的目标三个方面描述学习PHP的经历 一.自学的动机: 一定要有浓厚的兴趣,兴趣是最后的老师,可以在你迷茫的时候不断地支撑着你走下去. 自学不是为了工作,不是为 ...
-
[译]Nginx入门引导教程
本文为[Beginner's Guide]译文,原文地址:http://nginx.org/en/docs/beginners_guide.html Guide 本教程基础的介绍了 nginx,以及能 ...
-
Julia 入门学习教程
有一门语言,它看起来像 Python ,感觉起来像 Lisp ,运行起来又像 C 一样快速,他就是Julia. 近年来,Julia 语言已然成为编程界的新宠,尤其在科学计算和人工智能领域炙手可热. 据 ...
-
NodeJS入门学习教程
一.概念 1.什么是nodejs Node.js是JavaScript 运行时环境,通俗易懂的讲,Node.js是JavaScript的运行平台 Node.js既不是语言,也不是框架,它是一个平台 2 ...
-
屌丝逆袭--Asp.net快速入门学习教程 第1晚
本人屌丝一名,因工作原因,不能白天学习编程,所以只能做夜猫子学习编程,期待一天能逆袭成一名高帅富的技术大牛(靠,都想到流口水了........囧). 本教程记录本屌丝学习Asp.net的过程,大牛就飞 ...
-
Python入门学习教程:数据库操作,连接MySql数据库
各位志同道合的同仁可以点击上方关注↑↑↑↑↑↑ 本教程致力于程序员快速掌握Python语言编程. 本文章内容是基于上次课程Python教程:Python教程:连接数据库,对数据进行增删改查操作 和py ...
-
gulp入门学习教程(入门学习记录)
前言 最近在通过教学视频学习angularjs,其中有gulp的教学部分,对其的介绍为可以对文件进行合并,压缩,格式化,监听,测试,检查等操作时,看到前三种功能我的心理思想是,网上有很多在线压缩,在线 ...
随机推荐
-
thwen 缓动框架
描述 目前提供一个方法 ele 元素对象 obj 操作 duration 时间 effect 缓动选择 thwenMove(option) 框架支持以下缓动策略 -指数衰减的正弦曲线缓动 -圆形曲线的 ...
-
MVP的PV模式与SC模式
MVC是现今挺被推崇的一种架构模式,而MVP在MVC的基础对视图与模型上再解耦,使结构和各自的功能也有所改变.在去年鄙人也尝试了一下使用MVP做了一个小Demo,作为了MVC的一个变体,MVP还分了两 ...
-
MVC 中的 ispostback
总之呢就是在MVC中试下 ispostback那种效果, 环境就是:登录验证loinger, if (Request.HttpMethod == "POST"){} 没理解透彻 源 ...
-
c#开发Mongo笔记第二篇
写到第二篇不得不说是我之前犯了一个小错误,其实实现子表存储也是很简单的事,先说我想实现什么样的效果吧 就是用户表里有个成绩字段,成绩字段是个子表 其实实现这个功能也很简单,用面向对象的思想很好理解,子 ...
-
Android 编程下去除 ListView 上下边界蓝色或黄色阴影
默认的情况下,在 ListView 滑动到顶部或者是底部的时候,会有黄色或者蓝色的阴影出现.在不同的版本上解决的方法是不同的,在 2.3 版本之前可以在 ListView 的属性中通过设置 andro ...
-
c++ STL:队列queue、优先队列priority queue 的使用
说明:本文全文转载而来,原文链接:http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html C++ Queues(队列) C ...
-
bootstrap 正则表达式
<asp:TextBox runat="server" title="邮箱正确格式:xxx@xxx.xxx" class="form-cont ...
-
poj 3164 Command Network
http://poj.org/problem?id=3164 第一次做最小树形图,看着别人的博客写,还没弄懂具体的什么意思. #include <cstdio> #include < ...
-
sqrt()函数对素数判断的优化
素数是只有1和本身能整除的整数.所以在求素数的时候,要将素数与1到素数本身中间的所有整数都相除,看是否有整除的数,如果有,那肯定不是素数了.但是从算法上考虑,为了减少重复量,开平方后面的数就不用相除了 ...
-
vcf格式文件转化为Excel(csv)格式文件(R语言的write.csv,write.table功能,Excel表的文件导入功能)
最近在整理文件,准备把vcf文件转化为Excel格式,或者CSV格式,网上搜了一堆资料,还真有人专门开发出转化格式的工具:叫vcf2csv(下载地址http://vcf2csv.sourceforge ...