nginx

what is nginx ? : 其特点是占有内存少,并发能力强。

what is 正向代理? : C知道A有钱,但是A和B的关系又好,C和B的关系又好,C缺点钱,告诉了B,B帮C找A借了钱,此时A只知道把钱借给了B,但是A不知道钱去了C哪里。

反向代理

  也就相当于我给10086打电话,我永远不知道那边是谁接我的电话,但是我只知道这个电话永远打得通

负载均衡

  以前客户端发送多个请求到服务器,服务器处理请求,有一些可能是要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。如果此时请求上万,那么后果就不用说了

  那么负载均衡是什么?

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

动静分离:

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

 

nginx安装:

  (1)在linux系统安装nginx

    ①使用远程连接工具连接上linux系统

    ②下载nginx安装包

    ③需要的素材

      a.pcre的依赖

      第一步:安装pcre依赖,直接借用图形化界面,将压缩包放入linux系统中,将压缩文件解压(tar -xvf pcre-xx.tar.gz),进入解压之后的目录,输入./configure命令,然后使用make && make install(使用并编译),查看版本号(pcre-config --version)

      b.openssl依赖

      c.zlib依赖

      d.nginx依赖

      1.解压nginx压缩包

      2.进入解压后的文件,执行./configure命令(如果报错执行不了,则需安装一下yum install -y gcc gcc-c++)

      3.使用并编译(make && make install)

      安装成功后,会在usr下多出来一个叫local/nginx的文件,sbin则是nginx的启动路径,在sbin下执行(./nginx),通过(ps -ef | grep nginx)则可查看是否成功。访问可以直接通过自己的ip地址可以直接访问nginx界面,如果不能则是相应的默认80端口号没有开启。

        开启端口号:

          1.查看开放的端口号:firewall-cmd --list-all

          2.设置开放的端口号:sudo firewall-cmd --add-port=80/tcp --permanent

          3.设置之后需要重启防火墙:firewall-cmd --reload

 

  (2)nginx常用命令

    1.查看nginx的版本号:./nginx -v

    2.启动nginx:./nginx

    3.关闭nginx:./nginx -s stop

    4.重新加载nginx:./nginx -s reload(将配置文件重新加载,而不是重新启动nginx)

  (3)nginx配置文件

    在nginx的目录下的conf目录下有个叫nginx.conf配置文件

    nginx配置文件的内容:

      1.全局块:从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置命令

        eg:worker_process 1;worker_process值越大,可以支持的并发处理量也越多,但是会受到硬件,软件等设备的制约。

      2.events块:events块涉及的指令主要影响nginx服务器与用户的网络连接

        eg:worker_connections 1024;表示最大连接数。

      3.http块:使用最频繁的部分,又可以包含http全局块和server

 

09.Nginx配置实例(反向代理实例一)

1.在 windows 系统的 host 文件进行域名和 ip 对应关系的配

C:\Windows\System32\drivers\etc\hosts文件末添加127.0.0.1 www.123.com

2.在 nginx 进行请求转发的配置(反向代理配置)

http {
	...
    server {
        listen       80;

		# 修改成对应的ip地址
        server_name  localhost;

        location / {
            root   html;
			# Tomcat的IP地址
            proxy_pass http://127.0.0.1:8080/;
            index  index.html index.htm;
        }
	...
    }
}

最后启动nginx,浏览器地址栏输入www.123.com,验证页面是否跳转到Tomcat的页面。若能跳到Tomcat的页面,表示ngnix反向代理配置成功。

10.Nginx配置实例(反向代理实例二)

实现效果

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

Nginx监听端口为 80,

准备工作

  1. 准备两个Tomcat 服务器,一个 8080 端口,一个 8081 端口Windows上同时运行两个Tomcat
  2. 分别为两个Tomcat服务器创建简单Web应用helloworld1、helloworld2,应用包含简单页面,页面内容表明哪个端口号被访问。

修改配置文件

server {
    listen       80;
    server_name  localhost;

    location ~ /helloworld1 {
        proxy_pass   http://127.0.0.1:8081;
    }
        
    location ~ /helloworld2 {
        proxy_pass   http://127.0.0.1:8082;
    }
}

注意,http://127.0.0.1:8082后不要添加路径,如http://127.0.0.1:8082/helloworld2,否则,ngnix启动失败,抛出异常[emerg] 7288#6368: "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in C:\nginx-1.18.0/conf/nginx.conf:44

Nginx会将域名后的路径自动添加到反代理的域名后,例如浏览器地址输入http://127.0.0.1/helloworld1反向代理到http://127.0.0.1:8081/helloworld1,这可能是正则表达式的功效吧?

运行结果

地址栏输入http://127.0.0.1/helloworld1则返回http://127.0.0.1:8081/helloworld1的页面。

地址栏输入http://127.0.0.1/helloworld2则返回http://127.0.0.1:8082/helloworld2的页面。

location 指令说明

该指令用于匹配 URL,语法如下:

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

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

Nginx location doc

11.Nginx配置实例(负载均衡)

实现效果

浏览器地址栏输入地址http://127.0.0.1/helloworld,负载均衡效果,平均 8081和 8082 端口中。

准备工作

  • 准备两台 tomcat 服务器,一台 8080,一台 8081。
  • 在两台 tomcat 里面 webapps 目录中,创建名称是 helloworld 简单应用。

修改配置文件

在 Nginx 的配置文件中进行负载均衡的配置

# 负载用到的配置
upstream myserver{
	server 127.0.0.1:8081;
	server 127.0.0.1:8082;
}

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
		# 负责用到的配置
	    proxy_pass  http://myserver;
        root   html;
        index  index.html index.htm;
    }
}

负载均衡分配策略

负载均衡(load balance)即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。

快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx 就是其中的一个,在 linux 下有 Nginx、 LVS、 Haproxy 等等服务可以提供负载均衡服务,而且 Nginx 提供了几种分配方式(策略)

轮询

这是Ngnix负载均衡默认分配策略。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

加权

weight 代表权,重默认为 1,权重越高被分配的客户端越多。指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。例如:

upstream myserver{
	server 127.0.0.1:8081 weight=8;
	server 127.0.0.1:8082 weight=2;
}

ip_hash

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

upstream myserver{
	ip_hash;
	server 127.0.0.1:8081;
	server 127.0.0.1:8082;
}

fair

这是Ngnix负载均衡第三方分配策略。按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream myserver{
	server 127.0.0.1:8081;
	server 127.0.0.1:8082;
	fair;
}

可能需要额外安装,否则就抛出异常[emerg] 7032#7120: unknown directive "fair" in C:\nginx-1.18.0/conf/nginx.conf:38

12.Nginx配置实例(动静分离准备工作)

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

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

通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存)

若将其设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。

准备工作

  1. 新建一个目录路径C:/image
  2. 准备一个tomcat服务器,访问端口为8081

13.Nginx配置实例(动静分离)

修改配置文件

server {
    listen       80;
    server_name  localhost;

	# 主要配置内容
	location /image {
		alias  C:/image/;
		autoindex on;
	}

    location ~ /helloworld {
        proxy_pass   http://127.0.0.1:8081;
    }
}

运行结果

在浏览器地址栏输入

  • http://127.0.0.1/image/java.png 将会显示java.png图片文件。
  • http://127.0.0.1/helloworld 将会显示Tomcat的应用页面
  • http://127.0.0.1/image/ 可查阅C:/image/目录下的文件列表。

 

六、Nginx配置高可用集群

1、什么是nginx高可用

(1) 需要两台nginx服务器。
(2) 需要keepalived
(3) 需要虚拟ip

2、配置高可用的准备工作

(1) 需要两台服务器192.168.17.129 和192.168.17.1314
(2) 在两台服务器安装nginx.
(3) 在两合服务器安装keepalived.

3、在两台服务器安装keepalived
使用yum命令进行安装

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

默认安装路径: /etc/keepalived

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

4、完成高可用配置(主从配置)

(1)修改keepalived的配置文件keepalived.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
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 # LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}

vrrp_script chk_http_ port {
script "/usr/local/src/nginx_check.sh"
interval 2 # (检测脚本执行的间隔)2s
weight 2 #权重,如果这个脚本检测为真,服务器权重+2
}

vrrp_instance VI_1 {
state BACKUP # 备份服务器上将MASTER 改为BACKUP
interface ens33 //网卡名称
virtual_router_id 51 # 主、备机的virtual_router_id必须相同
priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔1s发送一次心跳
authentication { # 校验方式, 类型是密码,密码1111
auth type PASS
auth pass 1111
}
virtual_ipaddress { # 虛拟ip
192.168.17.50 // VRRP H虛拟ip地址
}
}

(2)在路径/usr/local/src/ 下新建检测脚本 nginx_check.sh

nginx_check.sh

1
2
3
4
5
6
7
8
9
#! /bin/bash
A=`ps -C nginx -no-header | wc - 1`
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

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

1
2
$ systemctl start keepalived.service		#keepalived启动
$ ps -ef I grep keepalived #查看keepalived是否启动

5、最终测试

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

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

1
$ systemctl stop keepalived.service  #keepalived停止

七、Nginx原理解析

1、master和worker

2、worker如何进行工作的

3、一个master和多个woker的好处
(1) 可以使用nginx -s reload热部署。

1
2
3
4
5
首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,
同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会
影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的
worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当
前worker.上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

4、设置多少个woker合适

1
2
3
4
Nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程, 但每个进
程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是 千上万个请求也不在话
下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu
数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。
1
2
3
4
5
6
7
8
# 设置worker数量
worker.processes 4

# work绑定cpu(4work绑定4cpu)
worker_cpu_affinity 0001 0010 0100 1000

# work绑定cpu (4work绑定8cpu中的4个)
worker_cpu_affinity 0000001 00000010 00000100 00001000

5、连接数worker_ connection

1
这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx 能建立的最大连接数,应该是worker.connections * worker processes。当然,这里说的是最大连接数,对于HTTP 请求本地资源来说,能够支持的最大并发数量是worker.connections * worker processes,如果是支持http1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker.connections * worker.processes / 2, 而如果是HTTP作为反向代理来说,最大并发数量应该是worker.connections * worker_proceses/4. 因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接.

第一个: 发送请求,占用了woker的几个连接数?
答案: 2或者4个。

第二个: nginx有一个master,有四个woker,每个woker支持最大的连接数1024,支持的最大并发数是多少?
答案:普通的静态访问最大并发数是: worker connections * worker processes /2,
而如果是HTTP作为反向代理来说,最大并发数量应该是worker connections * worker processes/4

posted @ 2020-11-28 15:40  事在人为、  阅读(161)  评论(0)    收藏  举报
Live2D