Nginx快速入门

Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。

Nginx简介

Nginx发展介绍

Nginx (engine x) 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。

Nginx 特点是占有内存少,并发处理能力强,以高性能、低系统资源消耗而闻名,Nginx官方测试为5万并发请求。与Nginx同类型的Web服务器还有Apache、Lighttpd(音同lighty)、Tengine(阿里巴巴的) 等。Nginx 的并发处理能力在同类型的Web服务器中表现极好(Apache、Lighttpd),在全世界范围内大量的网站使用了Nginx,国内互联网中也大量使用了Nginx,比如:淘宝、新浪、搜狐、网易、美团等。

Nginx是免费开源的,同时Nginx也有收费的商业版本,商业版本提供了性能优化、宕机等紧急问题处理等技术支持和服务。

Nginx是什么

Nginx是一个高性能的HTTP和反向代理服务器,特点是占用内存少,并发能力强。Nginx的并发能力在同类型的网页服务器中表现良好,中国大陆使用Nginx的网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如Perl、PHP等,但是不支持Java

Nginx的应用场景

  • 反向代理。

  • 负载均衡。

  • 动静分离。

  • 高可用集群

正向代理和反向代理概念

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器;

正向代理类似一个跳板机,代理访问外部资源。比如:我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器,它能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。

正向代理和反向代理举例

正向代理

在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。

Nginx快速入门
image-20210124100642890

比如你现在缺钱,想找马云爸爸去借钱,可想而知人家可能鸟都不鸟你,到最后碰一鼻子灰借不到钱。不过你认识你家隔壁老王,而老王认识马云同志,而且关系还很好。这时候你托老王去找马云借钱,当然这事最后成了,你从马云那里借到了500万!这时候马云并不知道钱是你借的,只知道这钱是老王借的。最后由老王把钱转交给你。在这里,老王就充当了一个重要的角色:代理。

此时的代理,就是我们常说的正向代理。代理客户端去请求服务器,隐藏了真实客户端,服务器并不知道真实的客户端是谁。正向代理应用最广泛的莫过于现在的某些“科学上网工具”,你访问不了谷歌、Facebook的时候,你可以在国外搭建一台代理服务器,代理你访问,代理服务器再把请求到的数据转交给你,你就可以看到内容了。

反向代理

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

比如你现在很无聊,想找人聊天,这时候你拨通了联通客服10010电话,联通的总机可能随机给你分配一个闲置的客服给你接通。这时候你如愿以偿的和客服聊了起来,问了问她目前有没有结婚、有没有对象、家住哪里、她的微信号、她的手机号。。。

此时联通总机充当的角色就是反向代理,你只知道和客服接通并聊了起来,具体为什么会接通这个客服MM,怎么接通的,你并不知道。

反向代理隐藏了真正的服务端,就像你每天使用百度的时候,只知道敲打 www.baidu.com 就可以打开百度搜索页面,但背后成千上万台百度服务器具体是哪一台为我们服务的,我们并不知道。我们只知道这个代理服务器,它会把我们的请求转发到真实为我们服务的那台服务器那里去。

Nginx快速入门
image-20210124100710916

综上所述:正向代理代理对象是客户端,反向代理代理对象是服务端。

负载均衡

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先 请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服 务器,也就是我们所说的负载均衡。

Nginx快速入门

动静分离

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

Nginx快速入门

总结

软件层面一般常用Nginx来做反向代理服务器,它的性能非常好,用来做负载均衡。

Nginx使用

下载

免费开源版的官方网站:http://nginx.org

Nginx 有 Windows 版本和 Linux 版本,但更推荐在 Linux 下使用 Nginx

下载 nginx-1.14.2.tar.gz 的源代码文件

wget http://nginx.org/download/nginx-1.14.2.tar.gz

我的习惯,将下载或者上传的安装文件放到 /home/soft/目录下。

安装

安装前的准备

Nginx的安装需要确定Linux安装相关的几个库,否则配置和编译会出现错误:

cc
pcre
openssl
zlib

①  安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装

# 检查是否安装
yum list installed | grep gcc

# 执行安装
yum install gcc -y

②  PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。

# 检查是否安装
yum list installed | grep pcre

# 执行安装
yum install pcre pcre-devel -y

③  zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。

# 检查是否安装
yum list installed | grep zlib

# 执行安装
yum install zlib zlib-devel -y

④  OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。

# 检查是否安装
yum list installed | grep openssl

# 执行安装
yum install openssl openssl-devel -y

⑤ 一次性安装,执行如下命令

yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y

正式安装

① 下载nginx,两种方式

a.  直接下载.tar.gz安装包,地址:https://nginx.org/en/download.html

b.  使用wget命令下载(推荐)。确保系统已经安装了wget,如果没有安装,执行 yum install -y wget 安装。

cd /home/soft  # 我喜欢将东西放到这里

wget http://nginx.org/download/nginx-1.14.2.tar.gz

② 解压命令

tar -zxvf nginx-1.14.2.tar.gz

③ 切换至解压后的nginx主目录,执行命令

cd nginx-1.14.2

④ 进行配置,大多数使用默认配置就行了

./configure --prefix=/usr/local/nginx # (其中--prefix是指定nginx安装路径) 注意:等号左右不要有空格

⑤ 执行命令进行编译安装

make && make install

⑥ 安装成功后,可以切换到 /usr/local/nginx 目录下,查看内容

[root@iz2ze4lfnjztrjppyfbqo1z nginx]# cd /usr/local/nginx/
[root@iz2ze4lfnjztrjppyfbqo1z nginx]# ll
total 16
drwxr-xr-x 2 root root 4096 Jan 24 10:37 conf
drwxr-xr-x 2 root root 4096 Jan 24 10:37 html
drwxr-xr-x 2 root root 4096 Jan 24 10:37 logs
drwxr-xr-x 2 root root 4096 Jan 24 10:37 sbin

⑦ 查看版本号(使用nginx操作命令前提条件:必须进入nginx的目录/usr/local/nginx/sbin)

./nginx -v

⑧ 查找安装路径

whereis nginx

启动

普通启动

切换到nginx安装目录的sbin目录下,执行:./nginx

Nginx快速入门
image-20210124104555053

nginx 体系结构由 master 进程和其 worker 进程组成。

master 进程读取配置文件,并维护 worker 进程,而 worker 进程则对请求进行实际处理。

nginx 启动后,安装目录下会出现一些 _tmp 结尾的文件,这些是临时文件,不用管。

进行访问,配置文件中默认端口为80,在浏览器可以看到这样的页面。

Nginx快速入门
image-20210124104652788

通过配置文件启动

# 先进入到sbin目录下关闭nginx
./nginx -s stop

# 通过配置文件启动
./nginx -c /usr/local/nginx/conf/nginx.conf # 进入到 usr/local/nginx/sbin 目录下
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 使用绝对路径执行命令

其中 -c 是指定配置文件,而且配置文件路径必须指定绝对路径

Nginx 常用的命令

启动命令

/usr/local/nginx/sbin 目录下执行 ./nginx 或者 ./nginx -c 配置文件路径

关闭命令

/usr/local/nginx/sbin 目录下执行 ./nginx -s stop

安全退出命令

/usr/local/nginx/sbin 目录下执行 ./nginx -s quit ,比 stop 更安全一点

重新加载命令

/usr/local/nginx/sbin 目录下执行 ./nginx -s reload

配置检查

当修改Nginx配置文件后,可以使用Nginx命令进行配置文件语法检查,用于检查Nginx配置文件是否正确

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf –t

其它

Linux上查看nginx版本:/usr/local/nginx/sbin/nginx -V

-v (小写的v)显示 nginx 的版本

-V (大写的V)显示 nginx 的版本、编译器版本和配置参数

Nginx 配置文件

学习Nginx首先需要对它的核心配置文件有一定的认识,这个文件位于Nginx的安装目录 /usr/local/nginx/conf 目录下,名字为 nginx.conf

Nginx快速入门
image-20210124110123362
Nginx快速入门
image-20210124110329420

根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分。

全局块

配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

比如上面第一行配置的:

worker_processes  1;

这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。

events块

比如上面的配置:

events {
    worker_connections  1024;
}

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

上述例子就表示每个 work process 支持的最大连接数为 1024, 这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

http块

http全局块

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

Nginx快速入门
image-20210124111026493

server块

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

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。

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

1、全局server块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

2、location块

一个 server 块可以配置多个 location 块

这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

Nginx快速入门
image-20210124111114949

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

需要注意的是:http 块也可以包括 http全局块server块

Nginx 部署静态网站

Nginx是一个HTTP的web服务器,可以将服务器上的静态文件(如HTML、图片等)通过HTTP协议返回给浏览器客户端。

案例

上传项目

将静态网站部署到Nginx服务器上,比如我本地有个静态项目 ace-master 。

通过 Xftp 将 ace-master 上传到 linux 服务器 /opt/static 目录下,为了演示方便,将名字改为 ace 。

Nginx快速入门
image-20210124115601485

修改配置

修改 nginx.conf 配置文件

在server中,通过location匹配访问的路径,然后转发给静态资源,注意要以分号结尾

Nginx快速入门
image-20210124115746857

重启nginx服务器

/usr/local/nginx/sbin/nginx -s reload

去浏览器访问!通过 http://47.94.217.177 访问即可。

精确匹配

若想通过 http://47.94.217.177/ace 访问,则修改配置文件

Nginx快速入门
image-20210124121206825

重启服务器访问,这样,访问 /ace 的时候就会去 /opt/static 下找 ace 目录,访问 index.html 。

location中配置路径讲解

初次接触:可能会遇到404找不到页面的错误,主要原因是配置路径问题

规则:ip + port 等于 root,假设server的配置如下:

server {  
    listen 80; # 端口号  
    location / {  
        root /opt/static/ace; # 静态文件路径
    }  
}

# 那么以下访问地址访问的静态资源为
http://192.168.92.128:80/ = root = /opt/static/ace
http://192.168.92.128:80/ace = root/ace = /opt/static/ace/ace 

location匹配顺序

在没有标识符的请求下,匹配规则如下:

1、nginx服务器首先在server块的多个location块中搜索是否有标准的uri和请求字符串匹配。如果有多个标准uri可以匹配,就匹配其中匹配度最高的一个location。

2、然后,nginx在使用location块中,正则uri和请求字符串,进行匹配。如果正则匹配成功,则结束匹配,并使用这个location处理请求;如果正则匹配失败,则使用标准uri中,匹配度最高的location。

备注:

1、如果有精确匹配,会先进行精确匹配,匹配成功,立刻返回结果。

2、普通匹配与顺序无关,因为按照匹配的长短来取匹配结果。

3、正则匹配与顺序有关,因为是从上往下匹配。(首先匹配,就结束解析过程)

4、在location中,有一种通配的location,所有的请求,都可以匹配,如下:

location / { 
 # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 
 # 但是正则和最长字符串会优先匹配
}

语法:

location [ = | ~ | ~* | ^~] uri {

}
=  # 用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求
~  # 用于表示uri包含正则表达式,并且区分大小写
~* # 用于表示uri包含正则表达式,并且不区分大小写
^~ # 用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配

# 注意: 如果uri包含正则表达式,则必须要有~或者~*标识。

结合标识符,匹配顺序如下:

(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)

精确匹配)> (最长字符串匹配,但完全匹配) >(非正则匹配)>(正则匹配)>(最长字符串匹配,不完全匹配)>(location通配

Nginx 应用案例

反向代理

实现效果

使用 nginx 反向代理,根据访问的路径跳转到不同端口的 tomcat 服务中。

nginx 监听端口为9001。

访问 http://47.94.217.177:9001/edu/ 直接跳转到 47.94.217.177:8081

访问 http://47.94.217.177:9001/vod/ 直接跳转到 47.94.217.177:8082

准备工作

使用docker启动两个tomcat容器,对外暴露端口,一个8081端口,一个8082端口

分别创建文件夹edu和vod和对应index页面。

docker run -d -p 8081:8080 --name tomcat01 tomcat:9.0

docker run -d -p 8082:8080 --name tomcat02 tomcat:9.0

nginx配置

进入/usr/local/nginx/conf/目录,修改nginx.conf文件:

nginx.conf文件修改格式:

.........

server {
    listen       9001; # 端口号
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;
    location ~ /edu/ {
       proxy_pass http://localhost:8081;
    }

    location ~ /vod/ {
       proxy_pass http://localhost:8082;
    }
    
    ............
}

开放对外访问的端口号9001。

如果nginx没启动,那么就启动:

cd /usr/local/nginx/sbin/

./nginx -c /usr/local/nginx/conf/nginx.conf

如果nginx启动了,那么就让nginx重新加载一下配置文件

cd /usr/local/nginx/sbin/

./nginx -s reload

负载均衡

实现效果

浏览器地址栏输入地址 http://47.94.217.177/edu/index.html ,负载均衡效果,平均到8081和8082端口中,

准备工作

使用docker启动两个tomcat容器,对外暴露端口,一个8081端口,一个8082端口

两个容器中都创建文件夹edu和对应index.html页面,index.html内容要能分辨这两个tomcat。

docker run -d -p 8081:8080 -v /usr/local/tomcat/webapps8081:/usr/local/tomcat/webapps --name tomcat01 tomcat:9.0

docker run -d -p 8082:8080 -v /usr/local/tomcat/webapps8082:/usr/local/tomcat/webapps --name tomcat02 tomcat:9.0

负载均衡的配置

http {
  ...
    upstream myserver {
        server  localhost:8081 weight=3;
        server  localhost:8082 weight=1;
    }
    
    server{
      location / {
        ...
        proxy_pass http://myserver;
        proxy_set_header Host $host;  
             ...
      }
      ...
    }
}

其中weight=1表示权重,用于后端服务器性能不均的情况,访问比率约等于权重之比,权重越大访问机会越多。

upstream是配置nginx与后端服务器负载均衡非常重要的一个模块,并且它还能对后端的服务器的健康状态进行检查,若后端服务器中的一台发生故障,则前端的请求不会转发到该故障的机器。

如果nginx没启动,那么就启动:

cd /usr/local/nginx/sbin/

./nginx -c /usr/local/nginx/conf/nginx.conf

如果nginx启动了,那么就让nginx重新加载一下配置文件

cd /usr/local/nginx/sbin/

./nginx -s reload

Nginx常用负载均衡策略

轮询(默认)

注意:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。

如果后端服务器down掉,将自动剔除。

upstream backserver { 
    server 127.0.0.1:8080; 
    server 127.0.0.1:9090; 

权重

每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况。

upstream backserver { 
    server 192.168.0.14 weight=5; 
    server 192.168.0.15 weight=2; 

ip_hash

ip_hash也叫IP绑定,每个请求按访问ip的hash值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话Session丢失的问题。

算法:hash("124.207.55.82") % 2 = 0, 1

upstream backserver { 
    ip_hash; 
    server 127.0.0.1:8080; 
    server 127.0.0.1:9090; 
}
fair (第三方)

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

upstream backserver { 
    server 127.0.0.1:8080; 
    server 127.0.0.1:9090;
    fair;

最少连接

web请求会被转发到连接数最少的服务器上

upstream backserver { 
    least_conn;
    server 127.0.0.1:8080; 
    server 127.0.0.1:9090; 

负载均衡其他几个配置

upstream backserver { 
    server 127.0.0.1:9100;
    # 其它所有的非backup机器down的时候,才请求backup机器
    server 127.0.0.1:9200 backup; 

upstream backserver { 
 server 127.0.0.1:9100;
 # down表示当前的server是down状态,不参与负载均衡
    server 127.0.0.1:9200 down; 

一般在项目上线的时候,可以分配部署不同的服务器上,然后对Nginx重新reload。

reload不会影响用户的访问,或者可以给一个提示页面,系统正在升级…

动静分离

概述

Nginx的负载均衡和静态代理结合在一起,我们可以实现动静分离,这是实际应用中常见的一种场景。

动态资源,如jsp由tomcat或其他web服务器完成。

静态资源,如图片、css、js等由nginx服务器完成。

它们各司其职,专注于做自己擅长的事情。

动静分离充分利用了它们各自的优势,从而达到更高效合理的架构。

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

准备工作

# 在liunx系统中准备静态资源,用于进行访问

/data/image # 图片文件夹

/data/www # html文件夹

具体配置

在nginx配置文件中进行配置

 
 location /www/ {
        root   /data/;
        index  index.html index.htm;
    }

    location /image/ {
        root   /data/;
        autoindex on;
    }

重启nginx,测试

http://47.94.217.177:9001/www/a.html
http://47.94.217.177:9001/image/001.png
Nginx快速入门
image-20210124140504514

上图是因为autoindex on这个设置生效的。

nginx.conf配置参考

# 安全问题,建议使用nobody,不要用root
# user  nobody;

# worker数和服务器的CPU数量相等为最佳
worker_processes  1;

# worker绑定CPU(1个worker绑定4个CPU)
# worker_cpu_affinity 0001 0010 0100 1000

# 错误日志
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    # 每个worker进程所能建立连接的最大值
    worker_connections  1024;
    
    # Nginx支持IO多路复用
    # use epoll;
    
    # 当一个worker抢占到一个连接时,是否尽可能的让其获取更多的链接,默认是off。
    # multi_accept on;
    
    # 默认是on,开启Nginx的抢占锁机制
    # accept_mutex on;
}


http {
    # 当Web服务器收到静态的资源文件请求的时候,根据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME Type,再根据MIME TYPE设置HTTP Response的Content-Type,然后浏览器根据Content-Type的值处理文件
    include       mime.types;
    
    # 如果不能从mime.types找到映射的话,用以下的作为默认值
    default_type  application/octet-stream;

    # 日志格式
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
  
  # 访问日志位置
    #access_log  logs/access.log  main;

    # 开启从磁盘直接到网络的文件传输,适用于有大文件上传下载的情况,提高IO的效率
    sendfile        on;
    #tcp_nopush     on;

    # 一个请求完成之后还要保持连接多久,默认为0,表示完成请求后直接关闭连接
    #keepalive_timeout  0;
    keepalive_timeout  65;

    # 开启或关闭gzip模块
    #gzip  on;
    
    # 设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Type中进行获取
    #gzip_min_length 1k;
    
    # gzip的压缩比,1 压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输速度快但比较消耗CPU)
    #gzip_comp_level 4;
    
    # 匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的
    #gzip_types types text/plain text/css application/json application/x-JavaScript text/xml

  # 动静分离
  # 服务器端静态资源缓存,最大缓存到内存中的文件,不活跃期限
  #open_file_cache max=655350 inactive=20s;
  # 活跃期限内最少使用的次数,否则视为不活跃
  #open_file_cache_min_uses 2;
  # 验证缓存是否活跃的时间间隔
  # open_file_cache_valid 30s;
  
  # 负载均衡
    upstream myserver {
       # 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,则自动剔除
       # 2.指定权重 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。server 192.168.247.101:8081 weight=1;
       # 3.IP绑定 ip_hash 每个请求按照访问ip的hash的结果分配,这样每个访客固定一个后端服务器,可以解决Session的问题。
       # 4.备机方式 backup 正常情况下不访问设置为backup的备机,只有当所有非备机全部宕机的情况下,服务才会进备机
       # 5. fair 第三方 按后端服务器的响应时间来分配请求,响应时间短的优先分配
       # 6. url_hash 第三方 按访问URL的hash的结果来分配请求,使得每一个URL都定向到同一个后端服务器,后端服务器为缓存时比较有效
       server 192.168.247.101:8081;
       server 192.168.247.101:8082;
    }   

    server {
        # 监听端口
        listen       80;
        
        # 服务名
        server_name  localhost;
      # 字符集 
        #charset koi8-r;
     
        #access_log  logs/host.access.log  main;
        
        # 路径匹配
        # location [=|~|~*|^~] /uri/ { _ }
        # = 精确匹配
        # ~ 正则匹配,区分大小写
        # ~* 正则匹配,不区分大小写
        # ^~ 关闭正则匹配
        
        # 匹配规则
        # 1. 所有匹配分两个阶段,第一个叫做普通匹配,第二个叫做正则匹配。
        # 2. 普通匹配,首先通过"="来匹配完全精确的location
          # 2.1 如果没有精确匹配到,那么按照最大前缀匹配的原则,来匹配location
          # 2.2 如果匹配到的location有^~,则以此location为匹配最终结果,如果没有会把匹配结果暂存,继续进行正则匹配
        # 3. 正则匹配,依次从上到下匹配前缀是~或~*的location,一旦匹配成功依次,则立刻以此location为准,不再向下继续进行正则匹配
        # 4. 如果正则匹配度不成功,则继续使用之前暂存的普通匹配的location 
        location / { # 匹配任何查询,因为所有请求都以/开头,但是正则表达式罪责和长的块规则将被优先和查询匹配
            # 反向代理的路径
          proxy_pass http://myserver;
          proxy_set_header Host $host;
          # 定义服务器的默认网站根目录位置 
            root   html;
            # 默认访问首页索引文件的名称
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ .php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ .php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

Nginx配置高可用集群

概述

我们已经可以使用Nginx来保证服务的高可用,但是依然有问题,如果Nginx出现了单点故障,那么整个服务就将宕机,所以我们可以考虑使用Nginx+Keepalived来实现集群高可用。

Nginx快速入门
image-20210124141211453

Keepalived介绍

  • Keepalived是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障的发生,通过配合Nginx可以实现web前端服务的高可用。

  • Keepalived以VRRP协议为实现基础,用VRRP协议来实现高可用性(HA)。VRRP(Virtual Router Redundancy Protocol)协议用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器工作正常的话就是MASTER,或者通过算法选举产生,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP以及数据的转发等,其他设备不拥有该虚拟IP,状态是BACKUP,除了接受MASTER的VRRP状态通告信息完,不执行对外的网络功能。当主机失效的时候,BACKUP将接管原先MASTER的网络功能。

  • VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行的时候只有MASTER路由器定时发送VRRP通告信息,表示MASTER工作正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,如果一定时间内没有接受到MASTER的通告信息,各个BACKUP将宣告自己成为MASTER,发送通告信息,重新进行MASTER选举。

架构图

Nginx快速入门
image-20210124141254080

机器规划

主机名称 IP地址 安装软件
Nginx-MASTER(Nginx的主节点) 192.168.49.100 Nginx、Keepalived
Nginx-BACKUP(Nginx的从节点) 192.168.49.101 Nginx、Keepalived

Nginx+Keepalived实现高可用集群

安装nginx

在192.168.49.100和192.168.49.101机器上安装Nginx。

  • 为了以示区别,将192.168.49.100上的Nginx的首页换成192.168.49.100:
cd /usr/local/nginx/html
echo "192.168.49.100" > index.html
  • 为了以示区别,将192.168.49.101上的Nginx的首页换成192.168.49.101:
cd /usr/local/nginx/html
echo "192.168.49.101" > index.html
  • 分别启动192.168.49.100和192.168.49.101上的Nginx:
cd /usr/local/nginx/sbin
./nginx

安装Keepalived

wget方式
  • 下载keeepalived:
wget https://www.keepalived.org/software/keepalived-2.2.1.tar.gz
  • 解压keeepalived:
tar -zxvf keepalived-2.2.1.tar.gz
  • 进入keeepalived的解压目录:
cd keepalived-2.2.1/
  • 执行./configure命令:
./configure
  • 如果出现了*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS,可以执行如下的命令:
yum -y install libnl libnl-devel libnfnetlink-devel
./configure
  • 执行make && make install命令:
make && make install
yum方式

使用yum命令进行安装

$ yum install keepalived -y
$ rpm -q -a keepalived    #查看是否已经安装上

默认安装路径: /etc/keepalived

安装之后,在etc里面生成目录keepalived, 有配置文件keepalived.conf

配置

  • 在192.168.49.100(主节点)配置Keepalived:
mkdir -pv /etc/keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   ## 标识本节点的字条串,通常为 hostname
   router_id nginx-master;
   script_user root
   enable_script_security  
}
## 检测脚本
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_nginx {
 script "/etc/keepalived/nginx_check.sh"
 interval 2
 weight -5
 fall 3  
 rise 2
}
## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    ## 主节点为 MASTER,对应的备份节点为 BACKUP
    state MASTER
    interface ens33
    # 主机的IP地址
    mcast_src_ip 192.168.49.100
     # 虚拟路由id
    virtual_router_id 100
    ## 节点优先级,值范围 0-254,MASTER 要比 BACKUP 高
    priority 100
    ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
    nopreempt
    ## 组播信息发送间隔,所有节点设置必须一样,默认 1s
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
       chk_nginx
    }
    ## 虚拟 IP 池, 所有节点设置必须一样
    virtual_ipaddress {
        192.168.49.110
    }
}
  • 在192.168.49.101(从节点)配置Keepalived:
mkdir -pv /etc/keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id nginx-backup
   script_user root
   enable_script_security 
}

vrrp_script chk_nginx {
 script "/etc/keepalived/nginx_check.sh"
 interval 2
 weight -5
 fall 3  
 rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 101
    priority 90
    mcast_src_ip 192.168.49.101
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
      chk_nginx
    }
    virtual_ipaddress {
        192.168.49.110
    }
}
  • 在192.168.49.100和192.168.49.101上创建Nginx的检查脚本:

    cd /etc/keepalived
    vim nginx_check.sh
    #!/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
    chmod +x /etc/keepalived/nginx_check.sh
  • 分别启动192.168.49.100和192.168.49.101上的Keepalived:

systemctl daemon-reload
systemctl enable --now keepalived # keepalived启动

systemctl stop keepalived.service  #keepalived停止
# 另一种方式
systemctl start keepalived.service  #keepalived启动
ps -ef I grep keepalived  #查看keepalived是否启动
  • 查看VIP:
# 在192.168.49.100和192.168.49.101上输入如下的命令
ip a
  • 测试VIP:
ping 192.168.49.110 -c 4

Nginx的原理

Master && Worker

Nginx快速入门
image-20210124143144997

Nginx的Worker是如何工作的

Nginx快速入门
image-20210124143209511

一个Master和多个Worker的好处

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

  • 采用独立的进程 ,可以互相之间不会影响,一个进程退出后,其他进程还在工作,服务不会中断,master进行则可以很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worer上的所有请求失败,不过不会影响到所有的请求,降低了风险,这也是我们使用nginx -s reload能热部署的原因所在。

设置多少个worker合适

  • worker数量和服务器的CPU数量相等最为合适。

  • 设置worker数量:

worker_processes 4
  • worker绑定CPU(4个worker绑定4核CPU)
worker_cpu_affinity 0001 0010 0100 1000
  • worker绑定CPU(4个worker绑定8核CPU中的4个)
worker_cpu_affinity 00000001 00000010 00000100 00001000

连接数worker_connections

发送一个请求,占用了worker几个连接数

  • 如果是普通静态访问,是2个连接数。

  • 如果是反向代理来说,是4个连接数。

并发数

Nginx有1个Master,有4个worker,每个worker支持的最大连接数1024,支持的最大并发数是多少?

  • 如果是普通的静态访问,最大的并发数是:worker_connections * worker_processes / 2 = 1024 * 4 / 2
  • 如果作为反向代理来说,最大的并发数是:worker_connections * worker_processes / 4 = 1024 * 4 / 4


原文始发于微信公众号(程序员阿晶):Nginx快速入门

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/19692.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!