nginx学习小结

nginx


【0】README

本文po处理 nginx的主要内容,包括反向代理,负载均衡,动静分离,高可用集群等;
本文引用链接:
vmware安装centos8,refer2 https://blog.csdn.net/PacosonSWJTU/article/details/119510351 ;
centos8安装 nginx,refer2 https://blog.csdn.net/PacosonSWJTU/article/details/119479024 ;
centos安装 tomcat9, refer2 https://blog.csdn.net/PacosonSWJTU/article/details/119487438 ;


【1】介绍

【1.1】基本概念

1)nginx是什么,做什么事情;

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

Nginx 是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性:
在连接高并发的情况下,Nginx是Apache服务不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。[服务器]
Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。
无缓存的反向代理加速,简单的负载均衡和容错。
FastCGI,简单的负载均衡和容错。
模块化的结构。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter。如果由 FastCG或其它代理服务器处理单页中存在的多个 SSI,则这项处理可以并行运行,而不需要相互等待。
2)反向代理

2.1)正向代理

正向代理服务器扮演的是客户端角色,是位于客户端和目标服务器之间的代理服务器(中间服务器),需要在本地配置要访问的目标服务器。

为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。

正向代理的情况下客户端必须要进行一些特别的设置才能使用
在这里插入图片描述

2.2)反向代理

反向代理服务器扮演的是服务器角色,因此客户端不需要进行任何设置,因为代理配置在反向代理服务器中配置。

客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务。
在这里插入图片描述

2.3)正向代理与反向代理的区别

  • 区别1:正向代理中,代理服务器作为客户端的代理,反向代理中,代理服务器是服务端的代理(干货——这句真的是说清楚了正向代理与反向代理的区别);
  • 区别2:正向代理一般是客户端架设的,比如本地安装一个代理软件(翻墙软件就是典型的正向代理的例子)。而反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器 ( 前后端统一域名就是反向代理的例子)
  • 区别3:正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器。
  • 区别4:正向代理和反向代理的作用和目的不同。正向代理主要是用来解决访问限制问题。而反向代理则是提供负载均衡、安全防护等作用。二者均能提高访问速度;
  • 区别5:正向代理中,浏览器与代理服务器在同一个LAN 局域网中;而反向代理中,代理服务器与目标服务器在同一个LAN ;
    在这里插入图片描述在这里插入图片描述
3)负载均衡;

定义: 单个服务器无法满足访问请求,我们增加服务器数量,然后将请求分发到各个服务器上。即将原先请求集中到单个服务器上的情况改为 发送到多个服务器上,即把负载或访问压力分发到不同服务器,具体是哪台服务器由 负载均衡器根据给定策略来选择 ; 这种把请求负载分发到多个服务器的请求转发策略,称为负载均衡;

4)动静分离

为了加快网页解析速度,把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力;
静态资源,html,css,js;
动态资源,servlet,jsp;
动静分离部署图:
但现在 servlet,jsp用的比较少了,所以应用场景不多;
在这里插入图片描述

【1.2】nginx安装,常用命令和配置文件

1)在linux系统中安装nginx

参见 https://blog.csdn.net/PacosonSWJTU/article/details/119479024 ;

2)nginx常用命令

安装完成后,nginx 命令在

[root@localhost sbin]# which nginx
/usr/sbin/nginx 

参见 https://blog.csdn.net/PacosonSWJTU/article/details/119479024 ;
在这里插入图片描述

3)nginx配置文件

安装完成后,nginx配置文件在 /etc/nginx/nginx.conf 下面;

3.0)nginx.conf 配置文件由3部分组成;
3.1)部分1:全局块;

从开始到events 块之间的内容,主要设置 nginx运行的配置指令;

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

worker_process auto或1 ; 表示支持的并发请求;

3.2)部分2:events块;

主要是配置nginx服务器与用户网络连接;


events {worker_connections 1024;
}

worker_connections 表示每个worker进程支持的最大连接数是多少;

3.3)部分3:http块;

配置了 代理,缓存和日志定义等; http块下面包括 http全局块, server块

3.3.1)http全局块

配置的指令包括 文件引入, MIME-TYPE定义,日志定义,连接超时时间 等;

媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。

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  /var/log/nginx/access.log  main;sendfile            on;tcp_nopush          on;tcp_nodelay         on;keepalive_timeout   65;types_hash_max_size 2048;include             /etc/nginx/mime.types;default_type        application/octet-stream;# Load modular configuration files from the /etc/nginx/conf.d directory.# See http://nginx.org/en/docs/ngx_core_module.html#include# for more information.include /etc/nginx/conf.d/*.conf;
3.3.2)server块
server {listen       80 default_server;listen       [::]:80 default_server;server_name  _;root         /usr/share/nginx/html;# Load configuration files for the default server block.include /etc/nginx/default.d/*.conf;location / {}error_page 404 /404.html;location = /40x.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}

1个server块就是一个虚拟主机;1个http可以包含多个server块;

每个server块分为全局server, 也可以通过包含多个location块;


【2】nginx配置实例1-反向代理

1)实现效果

浏览器输入地址 www.123.com ; 直接跳转到 tomcat主页面;

2)步骤
step1) 启动tomcat

安装并启动tomcat 参见 https://blog.csdn.net/PacosonSWJTU/article/details/119487438 ;

firewall-cmd --zone=public --add-port=8080/tcp --permanent  开放8080端口被访问 
firewall-cmd --reload  重启防火墙 
step2) 通过nginx 配置反向代理策略

在这里插入图片描述

step3) 配置 host

添加 www.abc.com 的ip地址映射 ,如下:

192.168.163.204 www.abc.com

step4) 添加nginx反向代理配置

在这里插入图片描述

server {listen       80;server_name  192.168.163.204;location / {root   html;index  index.html index.htm;proxy_pass http://127.0.0.1:8080;}}

效果如下: 访问www.abc.com , 被代理到 tomcat首页, 即127.0.0.1:080 d端口
在这里插入图片描述


【3】nginx配置实例2-反向代理

1)实现效果

使用nginx反向代理,根据访问路径的不同代理到请求不同端口;
如 nginx监听端口 9001
访问 www.abc.com/test01 直接跳转到 http://192.168.163.204:8080/test01/index01.html
访问 www.abc.com/test02 直接跳转到 http://192.168.163.204:8080/test02/index02.html

2)步骤
step1)配置tomcat测试页面

在这里插入图片描述

step2)配置nginx反向代理

在这里插入图片描述

server {listen       80;server_name  192.168.163.204;location / {root   html;index  index.html index.htm;proxy_pass http://127.0.0.1:8080;}location /test01 {proxy_pass http://127.0.0.1:8080/test01/;}location /test02 {proxy_pass http://127.0.0.1:8080/test02/;}}
补充: 反向代理proxy_pass绝对路径与相对路径

注意 https://www.jianshu.com/p/ec14f55fd209 , nginx反向代理proxy_pass绝对路径和相对路径 ;

  • 绝对路径: 127.0.0.1:8080/test01/ 后面带了斜杠,就是 绝对路径 ; 绝对路径会把 location中的 /test01 给删除掉;
  • 相对路径: 127.0.0.1:8080/test01 后面不带斜杠,就是 相对路径; 相对路径会把 location中的 /test01 也作为请求路径一部分传给服务器;
step3)反向代理设置访问成功

在这里插入图片描述
在这里插入图片描述

补充2: 详解Nginx location 匹配规则

https://blog.csdn.net/bigtree_3721/article/details/106105924


【4】nginx配置实例2-负载均衡

1)负载均衡定义

通过增加服务器数量,把请求负载分发到各个服务器上,以减少单个服务器访问压力的访问模型;

2)实现效果

访问 http://www.abc.com/test01/index01.html , nginx 把请求分发到 192.168.163.201 和 192.168.163.204 ;

3)步骤
step1)负载均衡配置

在http 块中添加 upstream块,并取名为 myserver;
在 location块中设置 反向道理到myserver;
在这里插入图片描述

http {# load balance config       upstream myserver {server 192.168.163.201:8080;server 192.168.163.204:8080;}include       mime.types;default_type  application/octet-stream;sendfile        on;#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;#gzip  on;server {listen       80;server_name  192.168.163.204;location / {proxy_pass http://myserver;root   html;index  index.html index.htm;}location /test01 {proxy_pass http://myserver/test01/;}location /test02 {proxy_pass http://myserver/test02/;}}}
step2)执行效果

(请求被平均分发到 centos201 centos204 服务器)
在这里插入图片描述
在这里插入图片描述

3)负载均衡分发策略
策略1:轮询(默认*)

按照请求时间先后顺序分配到不同的后端服务器;如果后端服务器down掉,则自动剔除;

策略2:weight 权值 (默认值为1)
    upstream myserver {server 192.168.163.201:8080 weight=10;server 192.168.163.204:8080 weight=20;}
策略3:ip hash方式(散列分发)

每个请求按照访问 ip 的hash结果进行分配,这样每个访客在同一个ip都会被分发到固定的服务器

upstream myserver {ip_hash; server 192.168.163.201:8080;server 192.168.163.204:8080;}
策略4: fair 公平分发

按照后端服务器的响应时间来分配,响应时间越短,则优先分配;

upstream myserver {fair;server 192.168.163.201:8080;server 192.168.163.204:8080;    	}

补充: fair是第三方模块,需要重新安装 依赖包;


【5】ngxinx配置实例-动静分离

1)动静分离定义

为了加快网页解析速度,把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力;
静态资源,html,css,js;
动态资源,servlet,jsp;

更直白点: nginx处理静态资源, tomcat处理动态资源
在这里插入图片描述

2)动静分离实现策略(两种策略)

策略1: 把静态资源单独放在独立服务器上,主流推崇的方式;
策略2: 动态与静态文件混合放在一起发布在同一台服务器上,通过nginx来分开 ;

通过location 指定不同的后缀名实现不同的请求转发; 通过expires 参数设置, 可以让浏览器缓存过期时间 ,减少与服务器之间的请求和流量;

策略3:expires缓存静态资源例子

若设置 expires为3d(3天),表示在3天内访问某个静态资源的请求, 若比对服务器该文件的最后修改时间没有变化,则不会从服务器抓取,返回304状态码,让浏览器从本地获取资源; 若发送了变化,则服务器重新从发送资源到 浏览器,状态码200;

3)步骤
step1)nginx静态资源

在这里插入图片描述

step2)nginx配置访问静态资源

nginx静态资源准备及访问 https://blog.csdn.net/PacosonSWJTU/article/details/119505771
在这里插入图片描述


【6】nginx配置高可用集群

1)高可用定义

若nginx是单个接口,则当nginx宕机了,请求无法顺利进行;
若是高可用,则启动一台服务器节点宕机了,服务还是可以正常访问;
在这里插入图片描述

1.1)高可用集群架构

在这里插入图片描述

1.2)高可用环境准备

step1)需要两台nginx 服务器;
安装nginx, https://blog.csdn.net/PacosonSWJTU/article/details/119479024 ;
安装tomcat, https://blog.csdn.net/PacosonSWJTU/article/details/119487438 ;

step2)需要keepalived ;
两台机器都要装 keepalived
yum -y install keepalived ;
rpm -q -a keepalived 查看是否安装成功;

[root@centos205 nginx]# rpm -q -a keepalived
keepalived-2.1.5-6.el8.x86_64

其配置文件在 /etc/keepalived/ 目录 下;

[root@centos205 nginx]# cd /etc/keepalived/
[root@centos205 keepalived]# pwd
/etc/keepalived
[root@centos205 keepalived]# ll
总用量 4
-rw-r--r--. 1 root root 3550 1月  27 2021 keepalived.conf
2)高可用集群配置
step1) 修改keepalived配置

/etc/keepalived/keepalived.conf
centos204 MASTER

! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.163.204  smtp_connect_timeout 30router_id LVS_DEVEL    # /etc/hosts 添加 127.0.0.1 LVS_DEVEL
}vrrp_script chk_http_port {script "/usr/script/nginx/nginx_check.sh" interval 2  # 检测脚本执行间隔时间weight 2
}vrrp_instance VI_1 {state MASTER    # MASTER OR BACKUPinterface ens160  virtual_router_id 51 # 主从机器的virtual_route_id 必须相同priority 100         # 主从机器的优先级,主机值较大, 从机较小advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.163.200  # 虚拟ip地址 主从机器配置相同}
}

centos205 SLAVE

! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.163.204 smtp_connect_timeout 30router_id LVS_DEVEL     # /etc/hosts 添加 127.0.0.1 LVS_DEVEL 
}vrrp_script chk_http_port {script "/usr/script/nginx/nginx_check.sh"interval 2  # 检测脚本执行间隔时间weight 2
}vrrp_instance VI_1 {state BACKUP    # MASTER OR BACKUPinterface ens160  # 网卡 ifconfig 查看virtual_router_id 51 # 主从机器的virtual_route_id 必须相同priority 90         # 主从机器的优先级,主机值较大, 从机较小advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.163.200  # 虚拟ip地址 主从机器配置相同}
}

/usr/script/nginx/nginx_check.sh 检测master是否存活的脚本;

#!/bin/bash
A=`ps -C nginx -no-header | wc -l`
if [ $A -eq 0 ]; then/usr/sbin/nginxsleep 2if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; thenkillall keepalivedfi
fi
step2)启动两台服务器的 nginx 和 keepalived
  • 启动nginx: nginx;
  • 启动keepalived: systemctl start keepalived.service
  • 停止nginx: nginx -s stop;
  • 停止 keepalived: systemctl stop keepalived.service
3)执行效果
3.1)访问虚拟ip 192.168.163.200

http://192.168.163.200/www2/home.html 可用;
在这里插入图片描述

3.2)停用 centos205机器的 nginx 和 keepalived;
[root@centos205 keepalived]# nginx -s stop
[root@centos205 keepalived]# systemctl stop keepalived.service  
3.3)再次访问虚拟ip 192.168.163.200成功

再次访问 192.168.163.200 成功,因为 centos205 宕机,当因为centos204 , centos205 属于高可用集群,所以centos204继续提供服务;
在这里插入图片描述

【7】nginx小结

1)1个master和多个worker进程好处

好处1: 可以使用 nginx-s reload 热部署;
好处2: 每个worker 是独立的进程,如果有其中一个worker 出现问题,其他worker是独立的,会继续进行争抢,实现请求过程,不会造成服务中断;

2)设置多少个worker进程合适

worker进程数量与cpu核数相等是最为合适的;

worker_processes  4; // nginx.conf 中进行配置 
3)连接数 worker_connection

问题1: 发送一个请求,占用了worker进程的几个连接数 ? 2个
客户端请求nginx (第1个连接), nginx请求tomcat(第2个连接) ;
问题2: nginx中有1个 master,4个worker进程; 每个worker进程 支持的最大连接数是 1024 ; 那worker支持的最大并发数是多少?4*1024/2 = 2k

// nginx.conf 中的events 块中设置  
events {worker_connections  1024;  # 每个worker进程的最大连接数  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缓存与数据库的一致性:先操作缓存还是先操作数据库?

数据缓存 在我们实际的业务场景中,一定有很多需要做数据缓存的场景,比如售卖商品的页面,包括了许多并发访问量很大的数据,它们可以称作是是“热点”数据,这些数据有一个特点,就是更新频率低,读…

Object.hashCode()与Object.equals()

【README】 本文旨在po出 hashCode , equals的api描述,以加深理解; 本文翻译自 jdk 文档; 【1】Object.hashCode() 1)介绍:返回对象的哈希码值。支持此方法是为了有利于哈希表,例如由 java.u…

for in for of区别_(for…in) VS (for…of)

这篇文章应该是在一年多之前读过的,那会看完感觉作者文采不错,就做了收藏,做此分享,希望能帮助到你更好的理解js中的循环~~~以下正文。。。今天可是个好日子!你问我为什么?你这都不知道,ChinaJo…

Innodb中的事务隔离级别和锁的关系

前言 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力…

并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究

转载自 并发队列-无界非阻塞队列 ConcurrentLinkedQueue 原理探究一、 前言 常用的并发队列有阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一般性能比较好,下面就看看常用的非阻塞Concurrent…

(转)如何保障微服务架构下的数据一致性?

转自: https://cloud.tencent.com/developer/article/1459734 【1】写在前面 随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台。就像前边的文章说的,微服务架构为业务开发带来了诸多好处的同时,例如单一…

python中math库_Python的math库、random库实际应用

昨天在说那个列表的时候,我挖了一个坑,不知道你们看出来没有?就是用循环语句写迭代的时候,总是运行不了结果,其实是因为我没有缩进的问题,因为有一个for循环,下面print如果没有对应的缩进&#…

(转)漫画:什么是分布式事务?

转自: https://blog.csdn.net/bjweimengshu/article/details/79607522 假如没有分布式事务 在一系列微服务系统当中,假如不存在分布式事务,会发生什么呢?让我们以互联网中常用的交易业务为例子: 上图中包含了库存和订…

Java 线程池框架核心代码分析

转载自 Java 线程池框架核心代码分析前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的。线程池应运而生,成为我们管理线程的利器。Java 通过Executor接口,提供了一种标准的方法将任务的提…

python渐变色代码_如何在Python中创建颜色渐变?

6 个答案: 答案 0 :(得分:54) 我还没有看到一个简单的答案就是使用colour package。 通过pip安装 pip install colour 如此使用: from colour import Color red Color("red") colors list(red.range_to(Color("green"),10)) # col…

(转)web.xml 中的listener、 filter、servlet 加载顺序及其详解

转&#xff1a; https://www.cnblogs.com/Jeely/p/10762152.html web.xml 中的listener、 filter、servlet 加载顺序及其详解 一、概述 1、启动一个WEB项目的时候&#xff0c;WEB容器会去读取它的配置文件web.xml&#xff0c;读取<listener>和<context-param>两个…

柱状图python_python柱状图一行

编写计算柱状图的python程序有很多种方法。 通过柱状图,我指的是一个计算对象在 iterable 并在字典中输出计数。例如: >>> L abracadabra >>> histogram(L) {a: 5, b: 2, c: 1, d: 1, r: 2} 编写此函数的一种方法是: def histogram(L): d {} for x in L: i…

HashMap 和 HashTable 到底哪不同 ?

转载自 HashMap 和 HashTable 到底哪不同 &#xff1f;代码版本 JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 1.7.0_67。源码见这里 1. 时间 HashTable产生于JDK 1.1&#xff0c;而HashMap产生于JDK 1.2。从时间的维度上来看&#xff0c;HashMap要比HashTable出…

架构师成长之路(内附推荐书籍)

转&#xff1a; https://www.jianshu.com/p/f661f098b88a 想要成为架构师&#xff0c;对技术的深度和广度都有很高的要求&#xff0c;本文列举出成为一个架构师必备的技能和学习路线。 对于学习途径有疑惑或苦恼&#xff0c;或者有优秀资料可以提供的同学&#xff0c;可加留言&…

python 虚拟环境_理解Python虚拟环境

什么是环境既然有所谓的 虚拟环境&#xff08;Virtual Environment&#xff09;&#xff0c;那么首先有必要解释一下&#xff0c;什么是环境。这里的环境&#xff0c;指的就是 Python 代码的运行环境。它应该包含以下信息&#xff1a;Python 解释器&#xff0c;用哪个解释器来执…

java.util.concurrent.locks.Lock文档说明

【1】Lock接口文档描述 1.相比于使用synchronized方法和代码块&#xff0c;锁的出现提供了更广泛的锁操作。 锁允许更灵活的代码结构&#xff0c;具有许多不同的属性&#xff0c;还支持多个关联的Condition条件对象。 2.锁是用于控制多个线程访问共享资源的工具。通常&#…

20 个使用 Java CompletableFuture的例子

转载自 20 个使用 Java CompletableFuture的例子这篇文章介绍 Java 8 的 CompletionStage API和它的标准库的实现 CompletableFuture。API通过例子的方式演示了它的行为&#xff0c;每个例子演示一到两个行为。既然CompletableFuture类实现了CompletionStage接口&#xff0c;首…

fastreport 打印两个list_Smaller And Smarter Python数据结构:合并两个有序链表

原创&#xff1a; 老表 简说Python 今日问题 &#xff1a;翻转链表k个相邻结点"""目标&#xff1a;写一段程序&#xff0c;合并两个有序链表例如&#xff1a;输入-> 1->2->3输入-> 2->5->6->8输出-> 1->2->2->3->5->6-&…

java.util.concurrent.locks.Condition文档说明

【1】Condition接口文档描述 1.Condition类把Object监视器方法&#xff08;wait,nofify, notifyAll&#xff09;分解为不同对象&#xff0c;通过与Lock实现类的合并使用&#xff0c;Condition可以产生每个object都有多个等待集的效果。在Lock实现类替代synchronized方法或语句…