我们的口号是:人生不设限!


 一、nginx简介

1、什么是nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
Nginx专为性能优化而发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表名能支持高达50,000个并发连接数。
 

2、反向代理

()正向代理
  如果我们把google想象成为一个资源库,则大陆局域网的客户端要访问这个资源库,就需要通过代理服务器来访问,这种代理服务就叫做正向代理。
简单说就是:在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。
  

(2)反向代理

    反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

3、负载均衡

  当请求变多,单体应用不能满足,我们增加服务器的数量,然后将请求分发到不同服务器上解决高并发,就是负载均衡。

4、动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。


二、nginx在linux系统安装

(1)安装 pcre 依赖

#1、自行下载pcre依赖包(https://sourceforge.net/projects/pcre/files/pcre/8.37/) [root@ldk src]# ll
total
drwxr-xr-x. root root Apr debug
drwxr-xr-x. root root Apr kernels
-rw-r--r-- root root Jun : pcre-8.37.tar.gz #2、解压依赖包

[root@ldk src]# tar -xvf pcre-8.37.tar.gz

#3、进入检查

[root@ldk src]# cd pcre-8.37

[root@ldk pcre-8.37]# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p

...

#注意:检查过程中,有些小伙伴的服务器可能会报错(缺少c++环境)

configure: error: You need a C++ compiler for C++ support.

#4、如果报错执行(不报错直接略过本步骤)

[root@ldk pcre-8.37]# yum -y install gcc-c++

#5、安装

[root@ldk pcre-8.37]# make && make install
rm -f pcre_chartables.c
ln -s ./pcre_chartables.c.dist pcre_chartables.c
make all-am
make[1]: Entering directory `/usr/src/pcre-8.37'
CC libpcre_la-pcre_byte_order.lo
CC libpcre_la-pcre_compile.lo
CC libpcre_la-pcre_config.lo
CC libpcre_la-pcre_dfa_exec.lo
CC libpcre_la-pcre_exec.lo
CC libpcre_la-pcre_fullinfo.lo
CC libpcre_la-pcre_get.lo

...

make[3]: Leaving directory `/usr/src/pcre-8.37'
make[2]: Leaving directory `/usr/src/pcre-8.37'
make[1]: Leaving directory `/usr/src/pcre-8.37'
[root@ldk pcre-8.37]#

#查看版本

[root@ldk pcre-8.37]# pcre-config --version
8.37
[root@ldk pcre-8.37]#

(2)安装 openssl、zlib 依赖

[root@ldk pcre-8.37]# yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Package 1:make-3.82-24.el7.x86_64 already installed and latest version
Package zlib-1.2.7-18.el7.x86_64 already installed and latest version
Package gcc-c++-4.8.5-39.el7.x86_64 already installed and latest version
Package 1:openssl-1.0.2k-19.el7.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check
---> Package libtool.x86_64 0:2.4.2-22.el7_3 will be installed

...

Dependency Updated:
e2fsprogs.x86_64 0:1.42.9-17.el7 e2fsprogs-libs.x86_64 0:1.42.9-17.el7 krb5-libs.x86_64 0:1.15.1-46.el7
libcom_err.x86_64 0:1.42.9-17.el7 libselinux.x86_64 0:2.5-15.el7 libselinux-python.x86_64 0:2.5-15.el7
libselinux-utils.x86_64 0:2.5-15.el7 libss.x86_64 0:1.42.9-17.el7

Complete!
[root@ldk pcre-8.37]#

(3)安装Nginx

#下载nginx:https://nginx.org/download/#解压压缩包

[root@ldk nginx]# tar -xvf nginx-1.12.2.tar.gz

#检查配置

[root@ldk nginx]# ./configure

#安装

[root@ldk nginx]# make && make install

#启动测试

[root@ldk /]# cd /usr/local/nginx/sbin/
[root@ldk sbin]# ./nginx

[root@ldk sbin]# ps -ef|grep nginx
root 11280 1 0 23:07 ? 00:00:00 nginx: master process ./nginx
nobody 11281 11280 0 23:07 ? 00:00:00 nginx: worker process
root 11283 3063 0 23:08 pts/0 00:00:00 grep --color=auto nginx
[root@ldk sbin]#


#注意:如果有的小伙伴不能访问,可能是服务器端口没打开

  阿里云服务器参考:https://blog.csdn.net/Abaneo/article/details/72853513

一般就是:
    1、查看开放端口:firewall-cmd --list-all
    2、设置开放端口好:firewall-cmd --add-port=80/tcp --perman
    3、重启防火墙:firewall-cmd --reload

三、nginx常用的命令

1、使用Nginx操作命令前提条件:必须进入Nginx的目录

[root@ldk sbin]# pwd
/usr/local/nginx/sbin
[root@ldk sbin]#

2、查看Ngin版本号

[root@ldk sbin]# ./nginx -v
nginx version: nginx/1.12.

3、启动Nginx

[root@ldk sbin]# ./nginx 

4、关闭Nginx

[root@ldk sbin]# ./nginx -s stop
[root@ldk sbin]# ps -ef|grep nginx
root : pts/ :: grep --color=auto nginx
[root@ldk sbin]#

5、重新加载Nginx

[root@ldk sbin]# ./nginx -s reload
[root@ldk sbin]#

四、nginx的配置文件

1、配置文件位置:

 2、配置文件组成

分别对各个部分做详细解释: 

(1)全局块

  从配置文件开始到events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,

比如 worker_process  1; worker_process 值越大,可以支持的并发处理也越多。

(2)events块

  events 块涉及的指令主要影响 Nginx服务器与用户的网络连接,常用的设置包括开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持最大连接数等。

比如:worker_connections 1024; 标识支持最大连接数为 1024。

这部分的配置对Nginx性能影响较大,在实际应用中灵活配置。

(3)http块

  这部分是Nginx服务器配置中配置修改最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里。

  http块又分为:http全局块和server块。

  ① http 全局块:

    http 全局快配置的指令包括文件引入。MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

  ② server块

    这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机完全一样,该技术的产生就是为了节省互联网硬件成本。

    每个 http块 可以有多个server块,每个server块就相当于一个虚拟机。

    而每个 server块 也分为全局 server块  ,以及可以同时包含多个 location 块。

      1、全局 server 块:最常见的配置是本虚拟机主机的监听配置和本虚拟机主机的名称或IP配置。

      2、location 块:一个server 块可以配置多个 location 块。这块的主要作用是基于Nginx 服务器接收到的请求字符串,对虚拟机主机名称之外的字符串进行匹配符,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里。


五、nginx配置实例(反向代理)

实例1:

1、实现效果:

(1)打开浏览器,在浏览器地址输入服务器nginx地址:xxx.xxx.xxx.xxx,跳转linux系统tomcat主页面。

2、准备工作

(1)在linux系统中安装tomcat,使用默认端口号8080启动,如下图访问所示

3、访问过程

4、具体配置

在nginx进行请求转发配置:

修改前:

修改后:

访问:xxx.xxx.xxx.xxx  发现直接跳转到了tomcat页面,配置成功。

实例二:

1、效果:访问路径中包含edu ,跳转8001端口的tomcat,路径中包含vod ,跳转8002端口的tomcat

2、具体配置:

  这里关于tomcat的配置不再赘述,主要是准备两个不同端口的tomcat,webapps下放置不同的区分页面。

  配置nginx:

3、访问测试:xxxx.xxx.xxx:9001/edu  or  /vod 分别跳转到不同的页面。

4、 location指令说明:

  该指令用于匹配 URL

  语法如下:

location [ = | ~ | ~* ] uri {

}

解释:

  1、=:用于不含正则表达式的uri前,要求请求字符串与uri 严格匹配,如果匹配成功,就继续向下搜索并立即处理该请求。


  2、~:用于表示 uri 包含正则表达式,并区分大小写。


  3、~*:用于表示 uri 包含正则表达式,不区分大小写。



六、nginx配置实例(负载均衡)

1、实现效果 :浏览器访问服务器地址xxx.xxx.xxx.xxx/edu/a.html ,负载均衡效果,平均到8080 和8081端口中。

2、准备工作:

  ①两台 tomcat 服务器 ,一台8080,一台 8081

  ②在两台tomcat webapps 目录下,创建 edu 文件夹,里面创建 a.html 页面,分别显示不同的内容用于区分测试。

3、在nginx 的配置文件中 进行负载均衡配置

配置一版最简单的负载均衡,重启nginx ,访问 xxxx.xxx.xxx.xxx/edu/a.html 发现会跳转到不同的页面:

4、nginx提供了几种分配方式

(1)轮训(默认)

(2)weight

  weight 代表权重,默认为1 ,权重越高被分配的机会越多

(3)ip_hash

  每个请求访问按照 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享的问题。

(4)fair(第三方)

  按照后端服务器的响应时间来分配请求,响应时间短的优先分配。


七、nginx配置实例(动静分离)

1、什么是动静分离?

  Nginx动静分离简单来说就是把动态请求跟静态请求分开,可以理解使用Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来大致分类两种:

一种 是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前比较推崇的方案。

一种 是动态跟静态文件混合在一起发布,通过nginx 来分开。

 

   通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资 源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个 URL,发送 一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码200。

测试效果:

访问图片地址

 访问静态网页:


八、nginx配置高可用集群

1、为什么要位置集群:上面的配置方式都是一个nginx 提供请求的转发,如果这唯一一个nginx 宕机,name就没有然后了,这里我们需要哦诶之nginx集群,防止 单个宕机的情况。

 2、准备工作

  (1)需要配置两台服务器 192.168.17.129 和 192.168.17.131

  (2)在两台服务器安装 Nginx keepalived

    安装Nginx 参考上面的步骤;

    安装keepalived 直接执行命令安装:yum install keepalived -y

  (3)安装完keepalived  ,在etc 目录下 生成了目录 keepalived,有文件 keepalived.conf,后面会配置这个文件。

  (4)完成主从配置

修改 keepalived.conf 配置文件:

在 /usr/local/src 添加检测脚本

(5)两台服务器:重启nginx 和 keepalived

3 、访问测试 

  效果描述:

  1、访问 虚拟IP,可以正常访问 nginx 服务,这是是访问的主服务器

  2、当停掉主服务器的nginx 和 keepalived ,虚拟 ip依然可以访问到副服务器提供的nginx服务。

    主:我们可以通过 ipconfig 在两个服务器上 看到 绑定的虚拟ip 判断验证。

4、配置文件详解

keepalived.conf   文件详解:

第一部分 全局的:

 第二部分 脚本的:

第三部分 虚拟ip部分:


九、nginx原理分析

1、master & worker 工作模式

在服务器上我们可以看到这两个进程:

2、worker 如何工作

  总的来说,是一种 争抢 的模式,当 Master 有了请求,就会有数个worker 来争抢,谁先抢到,谁去处理这个请求。

 3、mastenorkers的机制的好处:

  首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销, 同时在编程以及问题查找时,也会方便很多。

  其次,采用独立的进程,可以让互相之间不会 影响, 一 个进程退出后,其它进程还在工作,服务不会中断,master进程贝!很快启动新的 worker进程。当然,worker进程的异常退出,肯定是程序有bug 了,异常退出,会导致当 前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

  另外可以简单的实现热加载的启动 nginx -s reload,执行完之后只加载没工作的worker,正在工作的worker 完成工作之后再重新加载。

Nginx深入学习(一篇搞定)的更多相关文章

  1. 2021升级版微服务教程6—Ribbon使用+原理+整合Nacos权重+实战优化 一篇搞定

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...

  2. 一篇搞定RSA加密与SHA签名|与Java完全同步

    基础知识 什么是RSA?答:RSA是一种非对称加密算法,常用来对传输数据进行加密,配合上数字摘要算法,也可以进行文字签名. RSA加密中padding?答:padding即填充方式,由于RSA加密算法 ...

  3. 一篇搞定微信分享和line分享

    前言 在h5的页面开发中,分享是不可或缺的一部分,对于一些传播性比较强的页面,活动页之类的,分享功能极为重要.例如,京东等电商年末时会有一系列的总结h5在微信中传播,就不得不提到微信的分享机制. 微信 ...

  4. 【java 数据结构】还不会二叉树?一篇搞定二叉树

    二叉树是我们常见的数据结构之一,在学习二叉树之前我们需要知道什么是树,什么是二叉树,本篇主要讲述了二叉树,以及二叉树的遍历. 你能get到的知识点? 1.树的介绍 2.二叉树的介绍 3.二叉树遍历的四 ...

  5. 一篇搞定MongoDB

    MongoDB最基础的东西,我这边就不多说了,这提供罗兄三篇给大家热身 MongoDB初始 MongoDB逻辑与物理存储结构 MongoDB的基础操作 最后对上述内容和关系型数据做个对比 非关系型数据 ...

  6. nginx基础学习第二篇:nginx内置变量的使用

    ngx_http_core模块提供的内置变量有很多,常见的有 $uri,用来获取当前请求的uri,不含请求参数. $request_uri,用来获取请求最原始的uri,包含请求参数,且未解码. $re ...

  7. 一篇搞定Java过滤器

    Filter:过滤器 引言 我们可以通过使用前面的技术,做出一些简单的登陆注册以及配合数据库实现对数据增删改查的Demo,程序是基本运行起来了,但是却存在着一个重大的安全问题,那就登陆权限验证,一般来 ...

  8. 一篇搞定Python正则表达式

    1. 正则表达式语法 1.1 字符与字符类 1 特殊字符:\.^$?+*{}[]()| 以上特殊字符要想使用字面值,必须使用\进行转义 2 字符类    1. 包含在[]中的一个或者多个字符被称为字符 ...

  9. python 一篇搞定所有的异常处理

    一:什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在python无法正常处理程序时就会发生一个异常(异常是python对象,表示一个错误) 异常就是 ...

随机推荐

  1. winxp无法访问win10教育版共享资源的问题处理

    一.问题来源: dell5460笔记本上一个winxp系统虚拟机,访问一台lenovoT470笔记本win10教育版系统上的共享资源(使用命令行方式:net use s: \\172.18.45.10 ...

  2. Flutter,webview里面实现上传和下载的功能

    前提:Flutter 与 webview(vue) 一起开发的项目 开始的时候并没有想到什么移动端的,所以上传就用input,下载就用iframe来实现,然而真机实测的时候,input那个方法IOS支 ...

  3. 最新 iOS 框架整体梳理(一)

    前言 这段话其实是我差不多写完文章之后再回过头来写的,原本在写文章之前想写一下写的初衷的,但当我写完之后感觉初衷没有收获更真切一些.其实到这篇为止总结出来的也就三十多个,有些是比较新的框架,有些是我们 ...

  4. (Java实现) 子集和问题

    回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试.用回溯算法解决问题的一般步骤为: 1.定义一个解空间,它包含问题的解 ...

  5. Java实现 LeetCode 517 超级洗衣机

    517. 超级洗衣机 假设有 n 台超级洗衣机放在同一排上.开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的. 在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,与此同时将 ...

  6. Java实现 LeetCode 410 分割数组的最大值

    410. 分割数组的最大值 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组.设计一个算法使得这 m 个子数组各自和的最大值最小. 注意: 数组长度 n 满足以下条件: ...

  7. Java实现 蓝桥杯VIP 算法提高 选择排序

    算法提高 选择排序 时间限制:1.0s 内存限制:256.0MB  选择排序 问题描述 排序,顾名思义,是将若干个元素按其大小关系排出一个顺序.形式化描述如下:有n个元素a[1],a[2],-,a[ ...

  8. Java实现复数运算

    1 问题描述 编程实现两个复数的运算.设有两个复数 和 ,则他们的运算公式为: 要求:(1)定义一个结构体类型来描述复数. (2)复数之间的加法.减法.乘法和除法分别用不用的函数来实现. (3)必须使 ...

  9. 【JVM故事】一个Java字节码文件的诞生记

    万字长文,完全虚构. (一) 组里来了个实习生,李大胖面完之后,觉得水平一般,但还是留了下来,为什么呢?各自猜去吧. 李大胖也在心里开导自己,学生嘛,不能要求太高,只要肯上进,慢慢来.就称呼为小白吧. ...

  10. opencl(2)平台、设备、上下文的获取与信息获取

    1:平台 1)获取平台id cl_int clGetPlatformIDs( cl_uint num_entries,      //想要获取的平台数 cl_platform_id * flatfor ...