一、什么是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
2
3
4
5
6
7
8
start nginx   启动nginx 
nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload 因改变了Nginx相关配置,需要重新加载配置而重载。
nginx -s reopen 重新打开日志文件。
nginx -c filename 为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -V 显示 nginx 的版本,编译器版本和配置参数
1
2
windows下 需要带上exe ./nginx.exe -s stop
# 我是没加过 没发现啥区别

Linux安装

1
2
3
4
5
6
7
8
9
10
11
//1.一键安装Nginx需要的四个依赖
yum -y install make gcc zlib zlib-devel pcre-devel openssl openssl-devel

2.解压缩 nginx-xx.tar.gz 包。

//可以指定解压目录 ./configure --prefix=/usr/local/nginx
3. 进入解压缩目录,执行./configure。

4. make && make install


1
2
3
4
5
6
7
8
9
10

//Nginx的常用命令
1)启动命令
在/usr/local/nginx/sbin目录下执行 ./nginx

2)关闭命令
在/usr/local/nginx/sbin目录下执行 ./nginx -s stop

3)重新加载命令
在/usr/local/nginx/sbin目录下执行 ./nginx -s reload

四、配置文件描述

nginx.conf配置文件描述

20200531220735

20200531220803

4.1 基本配置

全局块配置

配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路 径,配置文件引入,允许生成worker process数等。

1
2
3
4
5
6
#user  nobody;      #配置用户或者组,默认为nobody 
worker_processes 1; #允许生成的进程数,默认为1
#error_log logs/error.log; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #指定nginx进程运行文件存放地址

events块配置

配置影响nginx服务器或与用户的网络连接。有每个进程的大连接数,选取哪种事件驱动模型处理连接 请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

1
2
3
4
accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #大连接数,默认为1024(早期是512)

max_client: nginx作为http服务器的时候:

1
2
3
max_clients = worker_processes * worker_connections   

由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听 客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文 件、错误消息、或者其它信息。同一时刻nginx在处理客户端发送的http请求应该只是一个connection,由此可知理论上作 为http web服务器角色的nginx能够处理的大连接数就是大客户端连接数。

http块配置

可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定 义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 #配置nginx支持哪些文件扩展名与文件类型映射表。在conf/mime.types查看支持哪些类型 
include mime.types;
#默认文件类型(流)类型,支持很多文件、图片、js/css等
default_type application/octet-stream;

#自定义格式
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status
$body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';

access_log log/access.log myFormat; #combined为日志格式的默认值
#优化参数 允许sendfile方式传输文件,开启高校效传输模式
sendfile on;
#tcp_nopush on; #防止网络阻塞

#keepalive_timeout 0;
keepalive_timeout 65; #长连接超时时间(单位秒)
#gzip on; #开启gzip压缩

server块配置

配置虚拟主机的相关参数,一个http中可以有多个server。

server2块配置

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

server3块配置

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

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的 详细内容就需要SSL。(加密)

五、应用场景

需求1: 静态资源

由于Nginx性能很高,对于常用的静态资源,可直接交由Nginx进行访问处理

1
2
3
4
location / {  
root D:/nginx-tomcat/exam; # /opt/static/exam
index index.html index.htm;
}

需求2:反向代理

让nginx进行转发,即所 谓的反向代理 访问localhost时转到tomcat

修改nginx.conf文件,查看server 节点,相当于一个代理服务器,可以配置多个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
listen:表示当前的代理服务器监听的端口,默认的是监听80端口。 
server_name:表示服务名称。
location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
root:里面配置了root这时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件。
index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二 个,依此类推
下面的error_page是代表错误的页面,

server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404

localhost时转到tomcat时。修改两个地方:

1
2
3
4
server_name  exam_qf;  
location / {
proxy_pass http://127.0.0.1:8080;
}

proxy_pass,它表示代理路径,相当于转发,而不像之前说的root必须指定一个文件夹。

需求3: 动静分离

我们需要分文件类型来进行过滤,比如jsp直接给tomcat处理,因为nginx并不是servlet 容器,没办法处理JSP,而 html,js,css这些不需要处理的,直接给nginx进行缓存即可。

1
2
3
动态资源:如JSP由Tomcat或其它WEB服务器处理。 
静态资源:如图片、css、js等由nginx服务器完成。
(动静分离充分利用各自的优势完成高性能访问)

让JSP页面直接给tomcat,而html,png等一些图片和JS等直接给nginx进行缓存

1
2
3
4
5
6
7
location ~ \.jsp$ {     
proxy_pass http://127.0.0.1:8080;
}

location ~ \.(html|js|css|images|png|gif)$ {
root D:/nginx-tomcat/apache-tomcat-8080/webapps/maven_exam;
}
1
~ .*\.(html|js|css|images|png|gif|jpg|jpeg|swf|ioc|rar|zip|txt|fiv|mid|doc|ppt|xls|mp3|wma)$ 
1
2
3
4
5
6
7
~ 表示正则匹配,后面的内容可以是正则表达式匹配 
. 点表示任意字符
*表示一个或多个字符
\. 是转移字符
|表示或
$表示结尾
整个配置代表括号晨面的后缀请求都由nginx处理。

解决方案:

1
2
3
4
5
6
location ~ \.jsp$ {        
proxy_pass http://127.0.0.1:8080;
}
location ~ \.(html|js|css|png|gif)$ {
root static/maven_exam; #此处在nginx 目录下创建该文件夹(存储静态资源访问)
}

同时,页面上方要进行 静态资源的变更:(以绝对路径方式进行访问)

1
2
<script type="text/javascript" src="/js/jquery-3.1.1.js">
</script> <script src="/js/quiz.js"></script>

结束:nginx对location访问优先是以精确优先为原则,故将精确细的请求放在前面。这样可以完成基本的动静分离 配置。

1
2
3
4
5
6
location ~ \.(html|js|css|png|gif)$ {    
root D:/static; #可以是nginx 外部的文件
}
location /{
proxy_pass http://127.0.0.1:8080;
}

需求4: 负载均衡

1
将一个应用程序,部署到多台服务器上面,然后在这些服务器的前面通过负载均衡服务器来择优选择哪一台服务器去执行;(保证高可用) 
  1. 进入nginx-1.10.1conf路径,修改配置文件nginx.conf
1
2
3
4
5
6
配置服务器组,在http{}节点之间添加upstream配置。(注意不要写localhost,不然访问速度会很慢)

upstream nginxCluster{
server 127.0.0.1:8080; #服务器8080
server 127.0.0.1:8081; #服务器8081
}
  1. 在location{}中,利用proxy_pass配置反向代理地址;
1
2
3
4
5
6
此处“http://”不能少,后面的地址要和第一步upstream定义的名称保持一致

location /{
proxy_pass http://nginxCluster;
}

注意:

upstream中的server元素必须要注意,不能加http://,但proxy_pass中必须加

proxy_pass,它表示代理路径,相当于转发,而不像之前说的root必须指定一个文件夹。

完整如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
upstream nginxCluster{  
server 127.0.0.1:8080; #服务器8080
server 127.0.0.1:8081; #服务器8081 .....
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location ~ \.(html|js|css|png|gif)$ {
root D:/static; #可以是nginx 外部的文件
}
location /{
proxy_pass http://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
2
3
4
url_hash是nginx的第三方模块,nginx本身不支持,需要打补丁 

nginx按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器、文件服务 器、静态服务器时比较有效。缺点是当后端服务器宕机的时候,url_hash不会自动跳转的其他缓存服务器,而是返回 给用户一个503错误。

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL #etc/hosts中配置的本机域名,相当于
windows配置的localost
}

vrrp_script chk_http_port {

script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)

weight 2

}

vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
}
}

(2)在/usr/local/src 添加检测脚本

nginx_check.sh

1
2
3
4
5
6
7
8
9
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi

(3)把两台服务器上 nginx 和 keepalived 启动

1
2
启动 nginx:./nginx 
启动 keepalived:systemctl start keepalived.service

5、最终测试

(1)在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50

20200601112425

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

20200601112448

七、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。