目录

Nginx

Nginx

1 引言

为什么学习nginx?

问题1:客户端到底要讲请求发给哪台服务器

问题2:如果所有客户端的请求都发送给了服务器1,那么服务器1的处理压力会很大

问题3:客户端发送的请求可能是申请动态资源的,也有可能申请静态资源,最好是做一个动静分离

![image-20201127205157787](/Users/cjp/Library/Application Support/typora-user-images/image-20201127205157787.png)

nginx可以根据一定的算法来选择服务器,同时对于一些静态资源如图片,css文件,html文件等资源,nginx自己就可以处理(nginx本身也是一个服务器,)

Nginx介绍

nginx是由一个俄罗斯人研发,应对Rambler网站,并且在2004年发行了第一个版本(这是作者)

![image-20201127205745570](/Users/cjp/Library/Application Support/typora-user-images/image-20201127205745570.png)

nginx的特点:

  • 稳定性极强。7*24小时不间断运行。
  • Nginx提供了非常丰富的配置实例
  • 占用内存小,并发能力强

tomcat仅仅支持150个(线程池只有150个)

也就是说tomcat最多就支持150个并发,nginx最多支5 w以上的并发

二、Nginx的安装

Docker compose的yml版文件

version:'3.1'
services:
	nginx:
		restart:always
		image:daoclould.io/library/nginx:latest
		container_name:nginx
		ports:
			-80:80
      

这里直接用狂神的安装方法其实也一样

执行

docker-compose up -d #运行docker compose

常见的docker compose命令

#重新构建容器
docker-compose bulid
#重新启动容器
docker-compose up -d
#退出容器
exit
#关闭容器
docker-compose down

nginx的配置文件

# 先用docker ps找到nginx的容器id
cjp@bogon ~ % docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
608fa11e8d00        tomcat              "catalina.sh run"        About an hour ago   Up About an hour    0.0.0.0:32768->8080/tcp   tomcat-net-01
8a22ec7081a5        nginx               "/docker-entrypoint.…"   10 days ago         Up 7 minutes        0.0.0.0:3344->80/tcp      nginx01
# 然后进入到nginx
docker exec -it 8a22ec7081a5 bash
# 然后找到nginx.conf文件
root@8a22ec7081a5:/# cd etc/nginx
root@8a22ec7081a5:/etc/nginx# ls
root@8a22ec7081a5:/etc/nginx# cat nginx.conf 

#然后找到了nginx的核心配置文件
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
# 以上统称为全局快,worker——process的数值越大,nginx的并发能力越强
# error——log代表nginx的错误日志存放的位置
events {
    worker_connections  1024;
}
# events块
# worker——connections他的数值越大,nginx的并发能力越强
# http块
http {
    include       /etc/nginx/mime.types;		# 代表引入外部文件-> mime.type存放着大量的媒体类型
    default_type  application/octet-stream;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;				# 引入了/etc/nginx/conf.d/目录下以.conf结尾的配置文件
}

# 下面查看/etc/nginx/conf.d/目录
root@8a22ec7081a5:/etc/nginx# cd
root@8a22ec7081a5:~# bash
root@8a22ec7081a5:~# cd /etc/nginx/conf.d/
root@8a22ec7081a5:/etc/nginx/conf.d# ls
default.conf
# 在这里发现了default.conf文件,下面查看default.conf
root@8a22ec7081a5:/etc/nginx/conf.d# cat default.conf
  server {
      listen       80;											# nginx监听的端口号
      listen  [::]:80;
      server_name  localhost;								# nginx接受请求的ip

      location / {
          root   /usr/share/nginx/html;			# 将接收到的请求根据/usr/share/nginx/html;去抄着静态资源
          index  index.html index.htm;			# 默认从上述的路径中找到index.html或者index.html
      }
      # server块
      
  }


其实后期主要就是修改server块的文件

2.3修改docker-compose文件

修改成这样

version:'3.1'
services:
	nginx:
		restart:always
		image:daoclould.io/library/nginx:latest
		container_name:nginx
		ports:
			-80:80
		volumes:
			- /Users/cjp/Desktop/docker/nginx_test/conf/:/etc/nginx/conf.d
# 然后重新构建一下
docker-compose build
#重新启动容器
docker-compose up -d

这个还是不能运行的,现在编写config文件

在/Users/cjp/Desktop/docker/nginx_test/conf/下新建default.conf并插入如下内容

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
#重启nginx
docker-compose restart

三、Nginx的反向代理

正向代理和反向代理

正向代理

  • 正向代理服务器由客户端设立的
  • 客户端了解代理服务器和目标服务器都是谁
  • 帮助用户突破访问权限,提高访问速度,对目标服务器隐藏客户端的ip地址

国内直接访问谷歌是访问不到的,需要使用正向代理服务器,由正向代理服务器代替你访问谷歌

![image-20201128163121597](/Users/cjp/Library/Application Support/typora-user-images/image-20201128163121597.png)

反向代理

  • 反向代理服务器配置在服务端
  • 客户端是不知道访问的是哪一台服务器
  • 使用反向代理可以实现负载均衡,并且可以隐藏服务器真正的ip都做

![image-20201128163425579](/Users/cjp/Library/Application Support/typora-user-images/image-20201128163425579.png)

3.2 机遇nginx实现反向代理

准备一个目标服务器

运行此命令

docker run -d -p 8080:8080 --name tomcat_nginx -v /Users/cjp/Desktop/docker/docker_compose/tomcat/webapps:/usr/local/tomcat/webapps -v /Users/cjp/Desktop/docker/docker_compose/tomcat/logs:/usr/local/tomcat/logs tomcat

tomcat运行成功,然后在webapps目录下面,创建一个初始页面

cd webapps
mkdir ROOT
cd ROOT
vi index.html

然后随便在html里面添加内容,就可以访问到页面了

![image-20201128164634388](/Users/cjp/Library/Application Support/typora-user-images/image-20201128164634388.png)

下面让nginx负责转发

编写nginx配置文件

server {
   listen       80;
   listen  [::]:80;
   server_name  localhost;
  #基于反向代理访问Tomcat服务器
  location / {
       proxy_pass http://localhost:8080/;
}
  # location / {
  #     root   /usr/share/nginx/html;
  #     index  index.html index.htm;
  # }
}

proxy_pass是动态资源转发

然后重新启动nginx

3.3关于nginx的location路径映射

优先级关系

(location =)> (location /xx/yy/zz) > (location ^~) > (location ~,location ~*) > (location /启始路径) > (location /)

匹配到上面就不会匹配到下面的了

1 精准匹配

# 1、 = 匹配
localton = / {
		# 精准匹配:主机名后面不带任何字符串
}

2 通用匹配

# 2、 通用匹配
location /xx 
	# 匹配所有以/xx开头的路径
}

3 正则匹配

#3、 正则匹配
location ~/xx {
	# 匹配所有以/xxx开头的路径
}

4 匹配开头路径

location ^~ /xxx/xx {
	#匹配所有以/xxx/xx开头的路径
}

5

location ~* \.(gif/jpg/png)$ {
	#匹配以.gif、.jpg或者.png结尾的路径
}

![image-20201128172727826](/Users/cjp/Library/Application Support/typora-user-images/image-20201128172727826.png)

四、负载均衡

nginx默认提供了3种负载均衡策略

轮询:把请求顺着分配,平均分配给每一台服务器

权重:根据处理请求速度的比例来分配

ip_hash:请求的时候肯定会带着客户端的ip地址,如果ip不变,默认的会一直交给某一台服务器

编辑nginx

4.1轮询

把default.conf文件改为

upstream my-server{
    server 192.168.0.5:8080;
    server 192.168.0.7:8080;
}
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        proxy_pass http://my-server/;    #tomcat首页
    }
}

就会发现每次访问localhost会出现不同的页面

格式

upstream 名字{
	server ip:port;
	server ip:port;
}
server {
	listen 80;
	server_name localhost;
}
location / {
	proxy_pass http://upstream的名字/;
}

4.2 权重

只需要在upstream里面加点东西就可以了

这样改动的话每6个请求里面有一个会到192.168.0.7中

upstream my-server{
   server 192.168.0.5:8080 weight=10;
   server 192.168.0.7:8080 weight=2;
}
server {
   listen       80;
   listen  [::]:80;
   server_name  localhost;

   location / {
       proxy_pass http://my-server/;    #tomcat首页
   }
}

4.3 ip_hash

在upstream下面加ip_hash

只要客户端不变,就会一直是请求到的地址

upstream my-server{
		ip_hash;
    server 192.168.0.5:8080 weight=10;
    server 192.168.0.7:8080 weight=2;
}
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        proxy_pass http://my-server/;    #tomcat首页
    }
}

五 动静分离

nginx的并发能力公式

worker_processes * worker_connections / 4|2 = nginx最终的并发能力

动态资源需要除以4,静态资源需要除以2

Nginx通过动静分离,来提升Nginx的并发能力

也可以更快的给用户响应

这是动态资源的请求链路

![image-20201128200520029](/Users/cjp/Library/Application Support/typora-user-images/image-20201128200520029.png)

这是静态资源的请求链路

![image-20201128200653794](/Users/cjp/Library/Application Support/typora-user-images/image-20201128200653794.png)

5.1 动态资源代理

# 配置如下
location / {
	proxy_pass 路径;
}

5.2 静态资源代理

# 配置如下
location / {
	root 静态资源路径;
	index 默认访问路径下的什么资源;
	autoindex on; #代表展示静态资源的全部内容,以列表形式展开 
}

静态资源其实就是在nginx里面,因此docker需要挂载一个数据卷,映射到nginx服务器的一个目录

修改compose

version: '3.1'
services:
  nginx:
    restart: always
    image: daocloud.io/library/nginx:latest
    container_name: nginx_compose_yml01
    ports:
      - 80:80
    volumes:
    - /Users/cjp/Desktop/docker/nginx_test/conf/:/etc/nginx/conf.d
    - /Users/cjp/Desktop/docker/nginx_test/image/:/data/image
    - /Users/cjp/Desktop/docker/nginx_test/html/:/data/html

修改配置文件

upstream my-server{
    server 192.168.0.5:8080 weight=10;
    server 192.168.0.7:8080 weight=2;
}
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    #代理到html静态资源
    location /html {
        root /data;
        index index.html;
    }
    #代理到img静态资源
    location /image{
        root /data;
        autoindex on;
    }
    #location / {
    #  proxy_pass http://my-server/;    #tomcat首页
    #}
}

六 nginx集群

使用集群可以防止服务器单点故障的问题

同时分散压力

如果担心nginx出现单点故障,可以搭建nginx集群

keepalived程序可以监听nginx运行是否运行正常

haproxy可以帮助客户端选择使用哪个nginx服务中

haproxy会提供一个虚拟端口路径

![image-20201128210333388](/Users/cjp/Library/Application Support/typora-user-images/image-20201128210333388.png)

nginx集群搭建

准备多台Nginx

准备keepalived,监听nginx的健康情况

准备haproxy,提供一个虚拟的路径,统一的去接受用户的请求