一文帮你整理掌握Nginx(二)

简介: 一文帮你整理掌握Nginx(二)
  • 第五章:Nginx动静分离
  • 第六章:Nginx高可用集群
  • 第七章:Nginx配置详解
  • 第八章:Nginx原理分析

第五章:Nginx动静分离

5.1、概述

Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过Nginx来分开。

5.2、实现效果

如果不设置动静分离,默认会通过Nginx的反向代理去找Tomcat对应的资源,现在我们在根目录下创建一个/data/www/文件夹,里边放上静态资源,比如一个html页面,在8080的那台Tomcat的WebApps下也创建一个www目录,同样是放一个静态资源,当输入这个静态资源的请求时,访问到的是/data/www中的数据。

1.png

5.3、实现思路

2.png

5.4、实现步骤

第一步:创建静态资源文件,为了对比,Tomcat中也放一个

[root@caochenlei ~]# mkdir -p /data/www/
[root@caochenlei ~]# mkdir -p /usr/local/tomcat/webapps/ROOT/www
[root@caochenlei ~]# echo "<h1>/data/www/a.html</h1>" > /data/www/a.html
[root@caochenlei ~]# echo "<h1>/usr/local/tomcat/webapps/ROOT/www/a.html</h1>" > /usr/local/tomcat/webapps/ROOT/www/a.html

第二步:修改Nginx的配置文件

[root@caochenlei ~]# vi /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  192.168.206.128;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location /www/ {
            root /data/;
            index index.html index.htm;
        }
[root@caochenlei ~]# /usr/local/nginx/sbin/nginx

第三步:启动Tomcat

[root@caochenlei ~]# /usr/local/tomcat/bin/startup.sh

第四步:启动浏览器进行测试

打开浏览器输入:http://192.168.206.128/www/a.html

3.png

5.5、关闭服务

[root@caochenlei ~]# /usr/local/nginx/sbin/nginx -s quit
[root@caochenlei ~]# /usr/local/tomcat/bin/shutdown.sh

第六章:Nginx高可用集群

6.1、概述

前边我们学习了反向代理、负载均衡、动静分离,但试想一下,如果Nginx挂掉了,那么服务肯定就没有了,有没有一种解决方案,可以保证Nginx挂掉了,服务也可以照常使用,答案肯定是有的,这就是我们接下来要学习的高可用集群,采用的是一主一备的模式,当主节点Nginx挂掉,备份服务器Nginx立刻跟上,这样就保证了服务的高可用性。

6.2、实现效果

当主节点Nginx挂掉以后,服务依然可以正常使用。

6.3、实现思路

4.png

6.4、实现步骤

第一步:修改主

Kubernetes 是目前唯一被业界广泛认可的 Docker 分布式解决方案。通过Kubernetes,我们可以轻装上阵的开发与管理复杂的业务系统。Kubernetes 已经毫无疑问地成为容器领域当之无愧的事实标准。

节点上的Nginx的配置文件

[root@caochenlei ~]# vi /usr/local/nginx/conf/nginx.conf
upstream myserver {
        server 192.168.206.128:8080;
        server 192.168.206.128:8081;
    }
    server {
        listen       80;
        server_name  192.168.206.128;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            proxy_pass http://myserver;
        }
[root@caochenlei ~]# /usr/local/nginx/sbin/nginx

第二步:启动主节点上的两台Tomcat

[root@caochenlei ~]# /usr/local/tomcat1/bin/startup.sh
[root@caochenlei ~]# /usr/local/tomcat2/bin/startup.sh

第三步:安装主节点上的keepalived

安装keepalived:

[root@caochenlei ~]# yum install -y keepalived

删除keepalived的配置文件:

[root@caochenlei ~]# rm -f /etc/keepalived/keepalived.conf

新增keepalived的配置文件:

[root@caochenlei ~]# vi /etc/keepalived/keepalived.conf

注意:一定要注意router_id、state、interface的值,我就在这里踩坑了。

! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   #邮件服务器通知地址(暂不配置,默认即可)
   smtp_server 192.168.200.1
   #邮件服务器超时时间(暂不配置,默认即可)
   smtp_connect_timeout 30
   #当前虚拟机的IP地址
   router_id 192.168.206.128
}
vrrp_script Monitor_Nginx {
 script "/etc/keepalived/nginx_check.sh"    #检测脚本执行的路径
 interval 2                                 #检测脚本执行的间隔
 weight 2                                   #检测脚本执行的权重
}
vrrp_instance VI_1 {
    state MASTER         #标识这个机器是MASTER还是BACKUP
    interface eth0       #当前机器的网卡名称  
    virtual_router_id 51 #虚拟路由的编号,主备必须一致
    priority 100         #主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1         #(VRRP Multicast广播周期秒数)
    authentication {
        auth_type PASS   #(VRRP认证方式)
        auth_pass 1111   #(密码)
    }
    track_script {
  Monitor_Nginx #(调用Nginx进程检测脚本)
 }
    virtual_ipaddress {
        192.168.206.50  #虚拟IP地址
    }
}

新增keepalived的检测脚本:

[root@caochenlei ~]# vi /etc/keepalived/nginx_check.sh
#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process" | grep -v grep )" == "" ]
 then
 killall keepalived
fi

启动keepalived服务:

[root@caochenlei ~]# service keepalived start

第四步:准备一台全新的虚拟机,安装Nginx和keepalived

启动虚拟机:

5.png

安装Nginx依赖:

[root@caochenlei ~]# yum install -y gcc gcc-c++ make libtool wget pcre pcre-devel zlib zlib-devel openssl openssl-devel

下载Nginx文件:

[root@caochenlei ~]# wget http://nginx.org/download/nginx-1.18.0.tar.gz

安装Nginx程序:

[root@caochenlei ~]# tar -zxvf nginx-1.18.0.tar.gz
[root@caochenlei ~]# cd nginx-1.18.0
[root@caochenlei nginx-1.18.0]# ./configure
[root@caochenlei nginx-1.18.0]# make && make install
[root@caochenlei nginx-1.18.0]# cd ~

开放Nginx防火墙:

[root@caochenlei ~]# /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
[root@caochenlei ~]# /etc/rc.d/init.d/iptables save
iptables:将防火墙规则保存到 /etc/sysconfig/iptables:     [确定]

修改Nginx的配置:

[root@caochenlei ~]# vi /usr/local/nginx/conf/nginx.conf
upstream myserver {
        server 192.168.206.128:8080;
        server 192.168.206.128:8081;
    }
    server {
        listen       80;
        server_name  192.168.206.128;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            proxy_pass http://myserver;
        }

启动Nginx的服务:

[root@caochenlei ~]# /usr/local/nginx/sbin/nginx

安装keepalived:

[root@caochenlei ~]# yum install -y keepalived

删除keepalived的配置文件:

[root@caochenlei ~]# rm -f /etc/keepalived/keepalived.conf

新增keepalived的配置文件:

[root@caochenlei ~]# vi /etc/keepalived/keepalived.conf

注意:一定要注意router_id、state、interface的值,我就在这里踩坑了。

! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   #邮件服务器通知地址(暂不配置,默认即可)
   smtp_server 192.168.200.1
   #邮件服务器超时时间(暂不配置,默认即可)
   smtp_connect_timeout 30
   #当前虚拟机的IP地址
   router_id 192.168.206.129
}
vrrp_script Monitor_Nginx {
 script "/etc/keepalived/nginx_check.sh"    #检测脚本执行的路径
 interval 2                                 #检测脚本执行的间隔
 weight 2                                   #检测脚本执行的权重
}
vrrp_instance VI_1 {
    state BACKUP         #标识这个机器是MASTER还是BACKUP
    interface eth1       #当前机器的网卡名称  
    virtual_router_id 51 #虚拟路由的编号,主备必须一致
    priority 10          #主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1         #(VRRP Multicast广播周期秒数)
    authentication {
        auth_type PASS   #(VRRP认证方式)
        auth_pass 1111   #(密码)
    }
    track_script {
  Monitor_Nginx    #(调用Nginx进程检测脚本)
 }
    virtual_ipaddress {
        192.168.206.50   #虚拟IP地址
    }
}

新增keepalived的检测脚本:

[root@caochenlei ~]# vi /etc/keepalived/nginx_check.sh
#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process" | grep -v grep )" == "" ]
 then
 killall keepalived
fi

启动keepalived服务:

[root@caochenlei ~]# service keepalived start

第五步:测试两个Nginx是否能正确的将请求分发到不同的Tomcat(负载均衡)

打开IE浏览器输入:http://192.168.206.128/edu/a.html

6.png

按住F5多刷新两遍,看看会不会,将请求转发到Tomcat2中去。

11.png7.png

打开IE浏览器输入:http://192.168.206.129/edu/a.html

8.png

按住F5多刷新两遍,看看会不会,将请求转发到Tomcat2中去。

9.png打开IE浏览器输入:http://192.168.206.50/edu/a.html,测试虚拟IP能不能实现负载均衡。

10.png

按住F5多刷新两遍,看看会不会,将请求转发到Tomcat2中去。

11.png

经过测试,我们发现一主一从、虚拟IP都能正常的进行负载均衡,接下来我们测试主节点挂掉,从节点会不会自动顶上,打开主节点机器,查看相关进程,杀死Nginx,然后打开浏览器,输入配置的虚拟IP地址:http://192.168.206.50/edu/a.html,发现负载均衡的效果还在,说明配置成功了。

12.png

13.png

6.5、关闭服务

主机节点:

[root@caochenlei ~]# service keepalived stop
[root@caochenlei ~]# /usr/local/nginx/sbin/nginx -s quit
[root@caochenlei ~]# /usr/local/tomcat1/bin/shutdown.sh
[root@caochenlei ~]# /usr/local/tomcat2/bin/shutdown.sh

备份节点:

[root@caochenlei ~]# service keepalived stop
[root@caochenlei ~]# /usr/local/nginx/sbin/nginx -s quit

第七章:Nginx配置详解

Nginx是通过配置文件来做到各个功能的实现的。Nginx的配置文件的格式非常合乎逻辑,学习这种格式以及如何使用这种每个部分是基础,这将帮助我们有可能手工创建一个配置文件。

7.1、整体结构图

14.png

7.2、配置演示图

15.png

7.3、全局块

配置影响Nginx全局的指令。主要包括:

  • 配置运行Nginx服务器用户(组)
  • worker process数
  • Nginx进程
  • PID存放路径错误日志的存放路径
  • 一个Nginx进程打开的最多文件描述符数目

例如:

#配置worker进程运行用户(和用户组),nobody也是一个Linux用户,一般用于启动程序,没有密码
user nobody;
#user www www;
#配置工作进程数目,根据硬件调整,通常等于CPU数量或者2倍于CPU数量
worker_processes 1;
#配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#配置进程pid文件
pid logs/nginx.pid;
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与Nginx进程数相除,但是Nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

7.4、events块

配置影响Nginx服务器或与用户的网络连接。主要包括:

  • 事件驱动模型的选择
  • 最大连接数的配置

例如:

#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; 
#epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;

7.5、http块

可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。主要包括:

  • 定义MIMI-Type
  • 自定义服务日志
  • 允许sendfile方式传输文件
  • 连接超时时间
  • 单连接请求数上限

例如:

#常见的一些基础配置
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓冲
client_max_body_size 8m; #设定请求缓冲
sendfile on; #开启高效文件传输模式,对于普通应用设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型
gzip_vary on; #增加响应头'Vary: Accept-Encoding'
limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

7.6、server块

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

  • 配置网络监听
  • 配置https服务
  • 基于名称的虚拟主机配置
  • 基于IP的虚拟主机配置

例如:

#虚拟主机的常见配置
server {
    listen       80; #配置监听端口
    server_name  localhost; #配置服务名
    charset utf-8; #配置字符集
    access_log  logs/host.access.log  main; #配置本虚拟主机的访问日志
    location / {
        root html; #root是配置服务器的默认网站根目录位置,默认为Nginx安装主目录下的html目录
        index index.html index.htm; #配置首页文件的名称
    }
    error_page 404             /404.html; #配置404错误页面
    error_page 500 502 503 504 /50x.html; #配置50x错误页面
}
#配置https服务,安全的网络传输协议,加密传输,端口443
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;
    }
}

7.7、location块

配置请求的路由,以及各种页面的处理情况。主要包括:

  • 请求根目录配置更改
  • 网站默认首页配置
  • location的URI

例如:

root html; #root是配置服务器的默认网站根目录位置,默认为Nginx安装主目录下的html目录
index index.html index.htm; #配置首页文件的名称
proxy_pass http://127.0.0.1:88; #反向代理的地址
proxy_redirect off; #是否开启重定向
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
#以下是一些反向代理的配置,可选。
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(Nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;  #设定缓存文件夹大小

location的URI:

描述:该指令用于匹配URL

语法:

16.png

通配符:

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

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

第八章:Nginx原理分析

8.1、Nginx的线程模型?

Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求。

Nginx的进程模型如图所示:

17.png

8.2、worker的工作模式?

worker对于连接是采用争抢的模式,谁先抢到就先交给谁处理,如果想要重新更新配置,由于已经抢到任务的worker不会参与争抢,那些空闲的worker就会去争抢连接,拿到连接后会自动更新配置信息,当那些有任务的worker完成任务后,会自动更新配置,这样就实现了无缝热部署。由于每个worker是独立的进程,如果有其中的一个worker出现问题,并不会影响其它worker继续进行争抢,在实现请求的过程,不会造成服务中断,建议worker数和服务器的CPU数相等是最为适宜的。

18.png

8.3、如何计算worker连接数?

如果只访问Nginx的静态资源,一个发送请求会占用了woker的2个连接数

而如果是作为反向代理服务器,一个发送请求会占用了woker的4个连接数

8.4、如何计算最大的并发数?

如果只访问nginx的静态资源,最大并发数量应该是:worker_connections * worker_processes / 2

而如果是作为反向代理服务器,最大并发数量应该是:worker_connections * worker_processes / 4

相关文章
|
数据可视化 算法 数据挖掘
Python量化投资实践:基于蒙特卡洛模拟的投资组合风险建模与分析
蒙特卡洛模拟是一种利用重复随机抽样解决确定性问题的计算方法,广泛应用于金融领域的不确定性建模和风险评估。本文介绍如何使用Python和EODHD API获取历史交易数据,通过模拟生成未来价格路径,分析投资风险与收益,包括VaR和CVaR计算,以辅助投资者制定合理决策。
991 15
|
算法 NoSQL Java
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
这篇文章介绍了Spring Boot 3中GraalVM Native Image Support的新特性,提供了将Spring Boot Web项目转换为可执行文件的步骤,并探讨了虚拟线程在Spring Boot中的使用,包括如何配置和启动虚拟线程支持。
1306 9
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
|
存储 数据可视化 搜索推荐
教育团队协作效率飙升,六款软件究竟在哪?
教育教培行业需高效管理学生作业以提升教学质量。为此,J人主导的教育团队可通过六款可视化团队协作办公软件优化作业管理流程:板栗看板、Notion、ClickUp、Airtable、Slack。这些软件分别在作业流程呈现、任务分配、资源整合、沟通协作及数据分析等方面展现出色,有助于构建条理化、个性化的作业管理体系,满足教育团队的高效管理需求。
359 3
|
网络协议 算法
SYN Cookie技术
【8月更文挑战第18天】
625 4
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的会议发布与预约系统的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的会议发布与预约系统的详细设计和实现
244 0
vxe-table可编辑状态默认显示下拉选select为默认展示
vxe-table可编辑状态默认显示下拉选select为默认展示
|
存储 JavaScript 前端开发
区块链代币支付钱包(trx/trc20代币/usdt)对接开发
区块链代币支付钱包(trx/trc20代币/usdt)对接开发
|
移动开发 缓存 前端开发
DingTalk「开发者说」第8期 钉钉微应用开发实战
DingTalk「开发者说」是钉钉开发者最新上线的开发者栏目,联合阿里云ACE团队,分享钉应用开发解决方案、技术更新、实战技巧,致力于成为钉钉与开发者的桥梁与纽带,让更多的钉钉开发者传播技术、提升技能、分享观点。在数字化变革的时代,“云钉一体”“钉钉全面开放”战略之后,希望钉钉技术可以持续激发开发者的创造力,为组织数字化赋能。 本篇介绍了钉钉H5微应用的概念、原理及开发实战。
3438 2
DingTalk「开发者说」第8期 钉钉微应用开发实战
|
JavaScript Java Linux
【vim && neovim】从入门到放弃(“四种”模式、常用命令、正则表达式、文件属性、插件安装--代码补全、一键格式化、显示目录)(三)
本文所有操作均通过ssh连接腾讯云服务器完成。如果你正在使用安装GNOME桌面的Linux,很多操作可以通过鼠标完成,或许更加直观。 推荐使用neovim(结合鼠标操作更加丝滑)。

热门文章

最新文章