九. Nginx

396 阅读3分钟

1.Nginx基础

1.1 为什么要使用Nginx

  • 问题1: 客户端到底要将请求发送给哪台服务器
  • 问题2: 如果所有客户端的请求都发送给了服务器1. 服务器集群没起到实际作用
  • 问题3: 客户端发送的请求可能是申请动态资源的, 也可能是申请静态资源的
  • 我们在客户端和服务器之间可以追加一个Nginx反向代理服务器
  • 之后我所有客户端的请求,都可以交给Nginx来处理.
  • 我的客户端只需要记住Nginx的ip和端口号
  • 以后的客户端的请求,到底是发给了服务器1,2,3...的哪一个,我的客户端不用关注
  • Nginx在它这个位置会做一个负载均衡的策略,根据一定的算法来决定你的请求到底发给哪一个服务器
  • Nginx可以帮我们实现动静分离,把动态资源交给咱们的服务器处理,静态资源他自己就可以处理,不用经过服务器,效率会更高一些.

1.2 Nginx介绍

  • 是由俄罗斯人研发的,应对Rambler的网站,并且2004年发布的第一个版本.
  • Nginx的特点
(1)稳定性极强
(2)Nginx提供了非常丰富的配置实例
(3)占用内存小,并发能力强(Tomcat能承受150个并发, Nginx能承受5万以上的并发)
  • Nginx的安装
(1)
version: '3.1'
services:  // 服务
  nginx:
    restart: always   // 总是启用
    image: xx/xx/xx   // 地址
    container_name: nginx   // 容器名
    ports: // nginx默认占用的端口
      - 80:80
    volumes:
    	-/opt/docker_nginx/conf.d/:/etc/nginx/conf.d
        
(2)
终端: mkdir docker_nginx
      cd docker_nginx
      vi docker-compose.yml  将上述(1)中的内容 复制到这个文件中
      docker-compose up -d   运行
      

1.3 Nginx配置文件

(1)
在/etc/nginx/nginx.conf 文件中: (核心配置文件)

worker_processes 1;    他的数值越大 Nginx并发能力越强
error_log   /var/log/nginx/error.log warn;    代表Nginx错误日志存放的位置
pid        /var/run/nginx.pid;    运行的标识
注: 以上统称为全局块


events {
  worker_connections    1024;    他的数值越大,Nginx并发能力也越强
}
注: 以上是events块


http {
  include    /etc/nginx/mime.types;    代表引入一个外部的文件.  mime.types中放着大量的媒体类型
  default_type    applition/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;
  
  sendfilr    on;
  #tcp_nopush   on;
  
  keepalive_timeout   65;
  
  #zaip   on;
  
  include /etc/nginx/conf.d/*.conf;    引入了conf.d目录下的以.conf为后缀名的配置文件 (我们主要的操作,就是配置这里的文件 )
}
注: 以上是http块


(2) 在/etc/nginx/conf.d/xxx.conf 文件中: (我们主要的配置操作)
    
    server {
        listen 80;    监听的端口
        server_name localhost;   代表nginx接收请求的ip或域名
        location / {
            root /usr/share/nginx/html; 代表将接收到的请求根据 root后边的路径去查找静态资源
            index   index.html  index.htm;   默认去上诉的路径中 找到index.html或者index.htm
        }
    }

2.nginx的反向代理

2.1正向代理:

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

2.2 反向代理

  • 反向代理服务器 是配置在服务端的.
  • 客户端是不知道访问的到底是哪一台服务器的.
  • 达到负载均衡,并且可以隐藏服务器真正的ip地址
http块下的
server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass: http://192.168.199.109:8080/;    反向代理要转发的地址
    }
}


2.3 关于Nginx的location路径映射

优先级: = 最高 > 完整路径 > 匹配开头^~ > 正则~ 和 结尾匹配~* > 通用匹配/xxx > 通用匹配 /

1. = 等号匹配
location = /{   只会匹配斜杠, 斜杠后边有内容的话,不会匹配到
}
2. 通用匹配
location /{   会匹配带有斜杠的,任意以斜杠开头的都能匹配
}
location /newly-apaas-user {   
    proxy_pass: 192.168.10.100:9898
}

location /rtmp-serve {   
    proxy_pass: 192.168.9.120:2020    //反向代理到你想访问的 IP地址 或者 域名
}

3.正则匹配
location ~/xxx { 匹配所有以/xxx开头的路径
}
4.匹配开头的路径
location ^~ /xxx{ 匹配所有以/xxx开头的路径
}
5.匹配结尾的路径
location ~* \.(gif|jpg|png)${ 匹配所有以.gif .jpg .png 为结尾的路径
}

3.负载均衡

3.1 介绍 (Nginx为我们提供了三种负载均衡的策略)

  • 轮询:将客户端发起的请求,平均的分配给每一台服务器
  • 权重:会将客户端的请求根据服务器的权重值的不同,分配不同的数量
  • ip_hash:基于发起请求的客户端的IP地址的不同,他始终会将请求发送到指定的服务器上.

3.2 负载均衡配置过程

upstream来声明变量,  upstream块是与server块 并列的
(1) 轮询
upstream my-server {   // 自己声明的变量一定不要加下划线
    server 192.xxx.xx.xx:8080;
    server 192.xxx.xx.xx:8081;
    server 192.xxx.xx.xx:8082;
    server 192.xxx.xx.xx:8083;
}
location / {
proxy_pass http://my-server/;
}
(2) 权重
upstream my-server {   // 自己声明的变量一定不要加下划线
    server 192.xxx.xx.xx:8080 weight=10;
    server 192.xxx.xx.xx:8081 weight=15;
    server 192.xxx.xx.xx:8082 weight=5;
    server 192.xxx.xx.xx:8083 weight=3;
}
location / {
proxy_pass http://my-server/;
}
(3) ip哈希
upstream my-server {   // 自己声明的变量一定不要加下划线
    ip_hash;
    server 192.xxx.xx.xx:8080;
    server 192.xxx.xx.xx:8081;
    server 192.xxx.xx.xx:8082;
    server 192.xxx.xx.xx:8083;
}
location / {
    proxy_pass http://my-server/;
}

4. Nginx动静分离

  • Nginx并发能力: worker_processes * worker_connections/4或2 最终得到并发能力
  • Nginx通过动静分离,来提升Nginx的并发能力,更快的用户响应

4.1 动态资源代理

location / {
    proxy_pass 路径:
}

4.2 静态资源代理

location / {
    root 静态资源路径
    index 默认访问路径下的什么资源
    autoindex on; 代表展示静态资源全部内容(以列表的形式)
}
  • 先修改docker,添加一个数据卷,映射到Nginx服务器的一个目录

5.Nginx集群的搭建

5.1

  • 准备多个Nginx
  • 在每个Nginx中都添加一个keepalived,来监听当前Nginx是否挂掉
  • 准备happroxy,提供一个虚拟的路径,统一去接收用户的请求,来决定用哪个Nginx.