nginx

基础概念

在这里插入图片描述

什么是nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理服务器, 特点是占有内存少, 并发能 力强, 事实上nginx的并发能力确实在同类型的网页服务器中表现较好 Nginx专为性能优化而开发, 性能是其最重要的考量, 实现上非常注重效鸟, 能经受高负载 的考验,有报告表明能支持高达50,000个并发连接数。

nginx做为HTTP服务器, 有以下几项基本特性:

  • 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.
  • 无缓存的反向代理加速,简单的负载均衡和容错.
  • FastCGI, 简单的负载均衡和容错. 模块化的结构。包括g zipping, byte ranges, chunked responses, 以及SS-fit er等fter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI, 则这项处理可以并行运行, 而不需要相互等待。
  • 支持SSL和TLS SNI.

反向代理

Nginx不仅可以做反向代理, 实现负载均衡。还能用作正向代理来进行上网等功能。

正向代理:如果把局域网外的Internet想象成一个巨大的资源库, 则局域网中的客户端要访 问Internet, 则需要通过代理服务器来访问, 这种代理服务就称为正向代理。

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

负载均衡

客户端请求通过nginx均匀分发请求到集群中的各个服务器当中。

在这里插入图片描述

动静分离

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

nginx安装

docker安装niginx

对docker不熟悉的可以看下我写的doker文章

Step1: 下载ngnix镜像

docker pull nginx

Step2: 创建nginx容器卷目录

# 创建挂载目录
mkdir -p /docker/nginx/conf
mkdir -p /docker/nginx/log
mkdir -p /docker/nginx/html

Step3: 启动一个临时nginx, 将配置信息拷贝到容器卷中

# 启动容器
docker run -p 9001:80 --name nginx -d nginx
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /docker/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /docker/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /docker/nginx/

Step4: 删除临时nginx容器,启动带有容器卷的的nginx

# 删除临时nginx容器
docker rm -f nginx
# 启动nginx
docker run -p 80:80 --name nginx -v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /docker/nginx/conf/conf.d:/etc/nginx/conf.d -v /docker/nginx/log:/var/log/nginx -v /docker/nginx/html:/usr/share/nginx/html -v /docker/nginx/static:/data/static -d nginx:latest

Step5: 验证

# 查看容器状态
docker ps

在这里插入图片描述
页面验证:
在这里插入图片描述

centos安装

安装所需插件

#一次安装4个插件
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

创建安装目录

#进入usr下的local目录
cd usr/local
#在local目录下创建 mysql 文件夹
mkdir nginx
#进入nginx目录
cd nginx

下载安装包

wget https://nginx.org/download/nginx-1.21.6.tar.gz

解压

#解压
tar xvf nginx-1.21.6.tar.gz
#进入解压后的目录
cd nginx-1.21.6

配制编译安装

#配制
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
#编译
make
#安装
make install

启动服务

###启动服务
#需要先进入sbin目录下
cd /usr/local/nginx/sbin
#启动nginx服务
./nginx

###关闭服务
#需要先进入sbin目录下
cd /usr/local/nginx/sbin
#关闭nginx服务
./nginx -s stop

防火墙命令

####端口号操作
#查询开启的所有端口
firewall-cmd --list-port
#设置80端口开启
firewall-cmd --zone=public --add-port=80/tcp --permanent
#验证80端口是否开启成功 (单个端口查询)
firewall-cmd --zone=public --query-port=80/tcp
#设置80端口关闭
firewall-cmd --zone=public --remove-port=80/tcp --permanent

####防火墙操作
#检查防火墙是否开启
systemctl status firewalld
#开机自启防火墙
systemctl enable firewalld
#开机禁止自启防火墙
systemctl disable firewalld
#启动
systemctl start firewalld
#关闭
systemctl stop firewalld
#重启
firewall-cmd --reload

nginx常用命令

配置文件

配制文件的组成(三部分)

在这里插入图片描述

全局块

从配置文件开始到events块之间的内容, 主要会设置一些影响ng in x服务器整体运行的配置指令。
在这里插入图片描述
参数

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

events块

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

上述例子就表示每个work process支持的最大连接数为1024。

http块

这部分的配置对Nginx的性能影响较大, 在实际中应该灵活配置。

参数

LOCATION:

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

配制实例

反向代理

Step1:新建两个tomcat容器

docker run -d -p 8081:8080 --name mytomcat2 -v /docker/tomcat/8081:/usr/local/tomcat/webapps 30ef4019761d
docker run -d -p 8082:8080 --name mytomcat3 -v /docker/tomcat/8082:/usr/local/tomcat/webapps 30ef4019761d

Step2:在tomcat2容器中webapps下新建/edu/a.html

vim /edu/a.html

# 内容如下

<h1>8081<h1>

Step3:在tomcat2容器中webapps下新建/edu/a.html

vim /vod/a.html

# 内容如下

<h1>8082<h1>

Step4:编辑nginx配制文件,重启nginx


user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024; 
}

 
http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # include /etc/nginx/conf.d/*.conf;
	
	server{
		listen 80;
		charset utf-8;	
		server_name 192.168.159.3;

		location / {
			proxy_pass http://192.168.159.3:8080;
			proxy_redirect default;
		}
		
		location ~ /edu/ {
			proxy_pass http://192.168.159.3:8081;
			proxy_redirect default;
		}
		
		location ~ /vod/ {
			proxy_pass http://192.168.159.3:8082;
			proxy_redirect default;
		}
	}
	
	#server{
	#	listen 9001;
	#	charset utf-8;
	#	server_name 192.168.159.3;
	#
	#	location ~ /edu/ {
	#		proxy_pass http://192.168.159.3:8081;
	#		proxy_redirect default;
	#	}
	#	location ~ /vod/ {
	#		proxy_pass http://192.168.159.3:8082;
	#		proxy_redirect default;
	#	}
	#}

}

docker restart nginx

Step5:验证
在这里插入图片描述
在这里插入图片描述

负载均衡

实例

Step1:在两个tomcat容器中webapps下新建目录avg,在目录内新建页面a.html
内容没别为
在这里插入图片描述
在这里插入图片描述

Step2:修改配置文件


user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024; 
}

 
http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
  
    # include /etc/nginx/conf.d/*.conf;
	
	# 负载均衡
	upstream myserver{
		server 192.168.159.3:8081;
		server 192.168.159.3:8082;
	}
	
	server{
		listen 80;
		charset utf-8;	
		server_name 192.168.159.3;
		
		# 负载均衡
		location ~ /avg/ {
		proxy_pass http://myserver;
			proxy_redirect default;
		}
	}
}

Step5:验证
在这里插入图片描述
在这里插入图片描述

策略

轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器, 如果后端服务器down掉, 能自动剔除。

weight

weight代表权, 重默认为1, 权重越高被分配的客户端越多。

配制方法:

# 负载均衡
upstream myserver{
	server 192.168.159.3:8081 weight=1;
	server 192.168.159.3:8082 weight=5;  
}
ip_hash

每个请求按访问ip的hash结果分配, 这样每个访客固定访问一个后端服务器 可以解决session的问题。例如:

# 负载均衡
upstream myserver{
	# ip_hash
	ip_hash;
	server 192.168.38.3:8081;
	server 192.168.38.3:8082;
}

4、fair(第三方)

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

# 负载均衡
upstream myserver{
	# ip_hash
	server 192.168.38.3:8081;
	server 192.168.38.3:8082;
	fair
}

动静分离

nginx动静分离简单来说就是把动态跟静态请求分开, 不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开, 可以理解成使用nginx处理静态页面, Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种:

  • 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
    在这里插入图片描述
  • 另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。

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

实例

Step1: 在nginx容器内挂在宿主机目录下创建静态目录,一个html,一个image,并分布在其中创建一个页面,和一个图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Step2: 编辑配置文件

server{
		listen 80;
    	charset utf-8;	
    	server_name 192.168.38.3;
    	
    	
    	location /html/ {
			root /data/static/; # 容器内静态文件位置
			autoindex on;  # 列出文件的意思
    	}
		
		location /image/ {
			root /data/static/;  # 容器内静态文件位置
			autoindex on;
    	}
    }

Step3: 重启验证
在这里插入图片描述
在这里插入图片描述

nginx高可用集群

  • 原理为多台机器安装并启动nginx,这些nginx代理的服务完全相同
  • 这些nginx由keepalived管理,keepalived对外暴露虚拟ip供外界访问
  • keepalived接收请求,调用nginx服务
  • 如果主节点nginx服务挂掉,keepalived的监听脚本会启动从节点nginx,进行访问
    在这里插入图片描述

实例

这里不使用容器,采用多机实现

Step1:首先创建两台centos

在这里插入图片描述
Step2:分别在两台centos中安装nginx

安装方法参考文中centos安装方法

Step3:安装keepalived

# 进入/usr
cd /usr
# 安装
yum install keepalived -y

Step4:修改keepalived配制文件

添加配置脚本
文件位置在 /etc/keepalived

! Configuration File for keepalived
# 全局块
global_defs {
  router_id LVS_DEVEL
}

# 配制检测脚本
vrrp_script chk_nginx {
  script "/usr/local/src/nginx_check.sh" 		# 脚本位置
  interval 2		# 每隔两名执行
  weight 3 		# 设置权重
}

vrrp_instance VI_1 {
  state MASTER            # 从服务用BACKUP
  interface ens33		  # 网卡
  virtual_router_id 51    # 路由地址主从一致
  priority 100			  # 优先权,主要比从多一些
  advert_int 1				# 心跳1秒
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.159.101		 # 虚拟ip
  }
  track_script {
    chk_nginx
  }
}

Step5:添加检测脚本

位置在 /usr/local/src/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 -1` -eq 0 ];then 
		killall keepalived 
	fi 
fi

Step6:启动nginx及keepalived

systemctl start keepalived

Step7:验证
在这里插入图片描述
在这里插入图片描述

关闭主服务keepalived验证

systemctl stop keeplived

从服务

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

nginx原理

mater&worker

nginx有一个master线程和多个worker组成,master线程接受请求信号,之后分派给worker线程worker数量与服务器cpu数量相当为宜

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

一个master和多个woke r有好处.

(1) 可以使用ng in x-s reload热部署, 利用ng in x进行热部署操作
(2) 每个woke r是独立的进程, 如果有其中的一个woke r出现问题, 其他woke r独立的, wwwwwww 继续进行争抢,实现请求过程, 不会造成服务中断

连接数 worker connection问题

发送请求,占用了 woke r的几个连接数?

  • 2或者4个
  • 2个时为访问静态资源
  • 4个为访问服务器,nginx需要与服务器进行交互,多两个连接

nginx有一个master,有4个woker,每个woker支持最大的连接数1024,支持的最大并发数是多少?

  • 普通的静态访问最大并发数是: worker connections*worker processes/2, 即:4x1024/2=2048
  • 而如果是HTTP作为反向代理来说, 最大并发数量应该是worker_connections* + wwwww wvwwwwwwwwwwwwwwww worker_processes/4。 即:4x1024/4=1024
  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值