Nginx入门
一、什么是Nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发 行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆 使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

二、为什么使用Nginx?
在传统的Web项目中,并发量小,用户使用的少。
所以在低并发的情况下,用户可以直接访问tomcat服务器,然后tomcat服务器返回消息给用户。
用户访问<–>Tomcat服务器
而在互联网项目下,因单个tomcat默认并发量有限制。如果请求量过大,会产生如下问题:
高并发(High Concurrency)
是互联网分布式系统架构设计中必须考虑的因素之一,
它通常是指,通过设计保证系统能够同时并行处理很多请求。
高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。
响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时 间。
吞吐量:单位时间内处理的请求数量。
QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。
并发用户数:同时承载正常使用系统功能的用户数量。
高可用(High Availability)
通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。
(一直都能用 99.9999%)
高性能
是指服务响应时间快,(CPU/处理器/内存)特别是在高并发下响应时间不会急剧增加。
Nginx特点:
高并发、高性能
可扩展性好
高可靠性
热部署
BSD许可证
三、简介
Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
Nginx 作为 web 服务器
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php 等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发, 性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高 达 50,000 个并发连接数。 https://lnmp.org/nginx.html
反向代理:
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的 服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代 理服务器。
正向代理:
是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个 请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向 代理。
正向代理和反向代理区别?
正向代理,是在客户端的。比如需要访问某些国外网站,我们可能需要购买vpn。并且vpn是在我们的用户浏览器端 设置的(并不是在远端的服务器设置)。浏览器先访问vpn地址,vpn地址转发请求,并后将请求结果原路返回来。

反向代理是作用在服务器端的,是一个虚拟ip(VIP)。对于用户的一个请求,会转发到多个后端处理器中的一台来处 理该具体请求。

Nginx下载
下载地址:http://nginx.org/download/
Nginx安装与使用
Windows 安装
- 解压文件夹
- 双击nginx.exe ,一闪而过,nginx启动成功了,通过访问:http://localhost (端口号默认80)
使用
nginx 的使用比较简单,就是几条命令。
1 | start nginx 启动nginx |
1 | windows下 需要带上exe ./nginx.exe -s stop |
Linux安装
1 | //1.一键安装Nginx需要的四个依赖 |
1 |
|
四、配置文件描述
nginx.conf配置文件描述



4.1 基本配置
全局块配置
配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路 径,配置文件引入,允许生成worker process数等。
1 | #user nobody; #配置用户或者组,默认为nobody |
events块配置
配置影响nginx服务器或与用户的网络连接。有每个进程的大连接数,选取哪种事件驱动模型处理连接 请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
1 | accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on |
max_client: nginx作为http服务器的时候:
1 | max_clients = worker_processes * worker_connections |
http块配置
可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定 义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
1 | #配置nginx支持哪些文件扩展名与文件类型映射表。在conf/mime.types查看支持哪些类型 |
server块配置
配置虚拟主机的相关参数,一个http中可以有多个server。

server2块配置
和上方很类似,主要是配置另一个虚拟机信息

server3块配置
1 | HTTP:是互联网上应用为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传 输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。 |

五、应用场景
需求1: 静态资源
由于Nginx性能很高,对于常用的静态资源,可直接交由Nginx进行访问处理
1 | location / { |
需求2:反向代理
让nginx进行转发,即所 谓的反向代理 访问localhost时转到tomcat
修改nginx.conf文件,查看server 节点,相当于一个代理服务器,可以配置多个。
1 | listen:表示当前的代理服务器监听的端口,默认的是监听80端口。 |
localhost时转到tomcat时。修改两个地方:
1 | server_name exam_qf; |
proxy_pass,它表示代理路径,相当于转发,而不像之前说的root必须指定一个文件夹。
需求3: 动静分离
我们需要分文件类型来进行过滤,比如jsp直接给tomcat处理,因为nginx并不是servlet 容器,没办法处理JSP,而 html,js,css这些不需要处理的,直接给nginx进行缓存即可。
1 | 动态资源:如JSP由Tomcat或其它WEB服务器处理。 |
让JSP页面直接给tomcat,而html,png等一些图片和JS等直接给nginx进行缓存
1 | location ~ \.jsp$ { |
1 | ~ .*\.(html|js|css|images|png|gif|jpg|jpeg|swf|ioc|rar|zip|txt|fiv|mid|doc|ppt|xls|mp3|wma)$ |
1 | ~ 表示正则匹配,后面的内容可以是正则表达式匹配 |
解决方案:
1 | location ~ \.jsp$ { |
同时,页面上方要进行 静态资源的变更:(以绝对路径方式进行访问)
1 | <script type="text/javascript" src="/js/jquery-3.1.1.js"> |
结束:nginx对location访问优先是以精确优先为原则,故将精确细的请求放在前面。这样可以完成基本的动静分离 配置。
1 | location ~ \.(html|js|css|png|gif)$ { |
需求4: 负载均衡
1 | 将一个应用程序,部署到多台服务器上面,然后在这些服务器的前面通过负载均衡服务器来择优选择哪一台服务器去执行;(保证高可用) |
- 进入nginx-1.10.1conf路径,修改配置文件nginx.conf
1 | 配置服务器组,在http{}节点之间添加upstream配置。(注意不要写localhost,不然访问速度会很慢) |
- 在location{}中,利用proxy_pass配置反向代理地址;
1 | 此处“http://”不能少,后面的地址要和第一步upstream定义的名称保持一致 |
注意:
upstream中的server元素必须要注意,不能加http://,但proxy_pass中必须加
proxy_pass,它表示代理路径,相当于转发,而不像之前说的root必须指定一个文件夹。
完整如下:
1 | upstream nginxCluster{ |
Nginx负载均衡策略
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
2、指定轮询几率
weight和访问比率成正比,用于后端服务器性能不均的情况默认选项,当weight不指定时,各服务器weight 相同, (weight=1)

1 | 数字越大,表明请求到的机会越大 |
**3、ip_hash **
每个请求按访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一服务器进行处理,可以解决 session的问题。当后台服务器宕机时,会自动跳转到其它服务器。

1 | 基于weight的负载均衡和基于ip_hash的负载均衡可以组合在一起使用 |
4、url_hash(第三方)
1 | url_hash是nginx的第三方模块,nginx本身不支持,需要打补丁 |
5、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
六、Nginx 配置高可用的集群
1、什么是 nginx 高可用

(1)需要两台 nginx 服务器
(2)需要 keepalived
(3)需要虚拟 ip
2、配置高可用的准备工作
(1)需要两台服务器 192.168.17.129 和 192.168.17.131
(2)在两台服务器安装 nginx
(3)在两台服务器安装 keepalived
3、在两台服务器安装 keepalived
(1)使用 yum 命令进行安装 yum install keepalived –y
(2)安装之后,在 etc 里面生成目录 keepalived,有文件 keepalived.conf
4、完成高可用配置(主从配置)
(1)修改/etc/keepalived/keepalivec.conf 配置文件
1 | global_defs { |
(2)在/usr/local/src 添加检测脚本
nginx_check.sh
1 | #!/bin/bash |
(3)把两台服务器上 nginx 和 keepalived 启动
1 | 启动 nginx:./nginx |
5、最终测试
(1)在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50


(2)把主服务器(192.168.17.129)nginx 和 keepalived 停止,再输入 192.168.17.50


七、Nginx 的原理
1、mater 和 worker


2、worker 如何进行工作的

3、一个 master 和多个 woker 有好处
(1)可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作
(2)每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的, 继续进行争抢,实现请求过程,不会造成服务中断
4、设置多少个 woker 合适
worker 数和服务器的 cpu 数相等是最为适宜的
5、连接数 worker_connection
第一个:发送请求,占用了 woker 的几个连接数? 答案:2 或者 4 个
第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的 最大并发数是多少?
普通的静态访问最大并发数是: worker_connections * worker_processes /2,
而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。



