nginx基础

nginx基础

nginx的安装

  • 此处采用docker进行nginx的安装(为例方便后续部署集群)

    # 获取镜像
    docker pull nginx
    # 创建并运行容器
    docker run 
    --name nginx 
    -p 81:80 
    -v /home/docker/nginx/html:/usr/share/nginx/html               # 挂载虚拟目录
    -v /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 
    -v /home/docker/nginx/logs:/var/log/nginx 
    -v /home/docker/nginx/conf.d:/etc/nginx/conf.d 
    --restart always 	
    -d nginx:1.19.6 
    
  • 安装完毕后通过访问htpp:[服务器ip]:[-p设置的端口],可以看到nginx的主页

nginx反向代理

  • nginx的各种配置都主要在于修改nginx.conf文件,上述运行时已经挂载在本地的/home/docker/nginx/conf目录下,未挂载的可以通过docker exec -it nginx /bin/bash进入容器后,在etc/nginx/目录下找到nginx.conf文件

nginx.conf结构解析

​ nginx.conf 的代码结构主要由三部分组成

  • 全局块

    从配置文件开始,到events块之间的内容,主要会设置一些影响nginx整体运行的配置指令,如用户组允许生成的work process数进程pid存放路径,日志类型和存放路径,配置文件的引入

    image-20210106183515149

  • events块

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

    image-20210106183745589

  • http块

    http块是nginx.conf修改最频繁的地方,代理,缓存,日志定义等绝大部分功能都在这里修改,主要可分为两部分

    http全局块

    image-20210106184347903

    server块

    server块相当于一个虚拟主机,其中指定监听的端口server_name(一般为ip),一个server中可以包含多个location,location中定义了代理的路径和代理后的转发路径,通过proxy_pass进行转发路径指定

    image-20210106184419579

配置反向代理

  • 什么是正向代理

    正向代理服务器相当于一个资源传递,比如正常我们访问谷歌是无法访问,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了

    img

    • 正向代理的用途

      (1)访问原来无法访问的资源,如google

      (2) 可以做缓存,加速访问资源

      (3)对客户端访问授权,上网进行认证

      (4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

  • 什么是反向代理

    ​ 反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器

    m

  • 配置反向代理服务器

    修改nginx.conf文件,添加一个server,或者在原有server(80端口)下添加location进行反向代理转发

    # 此处我们新建一个最简易版的server
    server{
    	listen 8100 ;  # 监听8100端口
    	server_name 192.168.56.101 # 天写ip或者是负载均衡的upstream
    	location /test{
    		proxy_pass http:192.168.56.101:8080/  # 将请求转发到本地的tomcat主页(或者其他地址)
    	}
    	error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    }
    

    保存后重启nginx,启动tomcat,访问[你的ip]:80/test/,跳转到tomcat首页,即配置成功

nginx负载均衡

修改nginx.conf,添加upstream

 # 此处同样使用tomcat首页作为转发,启动两个tomcat,修改server.xml将其中一个端口改为8081即可
 upstream myserver {
 	 # ip hash;  # ip hash分配方式
 	 # fair;        # 按照响应速度的分配方式
        server 192.168.56.101:8081 weight=1;  # weight为nginx的权重负载均衡策略,默认weight为1
        server 192.168.56.101:8080 weight=2;
    }

nginx的负载均衡策略

  • 默认为轮询方式

  • weight为权重方式进行轮询

    指定轮询的几率,和weight设置的值成正比

  • ip hash 策略

    ip hash策略主要是当用户访问时,计算当前用户访问ip的hash值,根据hash值进行负载均衡分配,这样可以保证同一个ip之后访问的一定是同一台服务器,可以解决session的问题

  • fair策略

    根据服务器的响应速度来进行分配,响应速度快的服务器优先分配,有效利用服务器资源

ps:此处的8100端口在docker运行时并未指定,配置完成后可能无法访问,动态给docker容器添加开放端口的方法如下: [docker给已运行容器添加开放端口]

nginx动静分离

​ 动静分离即动态请求和静态请求通过分发到不同的地方进行分离,减轻服务器的流量与网络请求压力。

准备工作

​ 首先创建用于存储静态资源的目录mkdir -p /home/data/{html,imgs},并在html目录新建a.html,index.html,在imgs目录添加a.jpg;

​ 由于本文中nginx是部署在docker中的,在运行时并没有挂载静态文件的资源目录,首先需要为nginx容器新增挂载目录。已经挂载的可以忽略此步。

  • 重新发布后重启容器进行添加

    最直接的办法就是通过docker commit 容器名/容器id 镜像名将当前容器重新发布为镜像,然后将打包后的镜像重新运行,添加需要挂载的目录即可

    # 打包镜像
    docker commit nginx nginx_new
    # 重新运行容器
    docker run 
    --name nginx 
    -p 81:80 
    -v /home/docker/nginx/html:/usr/share/nginx/html               # 挂载虚拟目录
    -v /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 
    -v /home/docker/nginx/logs:/var/log/nginx 
    -v /home/docker/nginx/conf.d:/etc/nginx/conf.d 
    -v /home/data:/data    # 挂载存放静态资源的目录,目录随意,此处为/home/data
    --restart always 	
    -d nginx:1.19.6 
    
  • 修改配置文件动态添加挂载目录

    • 获取容器id docker images

    • 进入容器目录 cd /var/lib/docker/containers/[容器id]

    • 关闭docker! systemctl stop docker

    • 修改hostconfig.json vim hostconfig.json,找到Binds节点,将挂载目录新增进去

      image-20210107094939293

    • 修改config.v2.json vim config.v2.json,通过:?MountPoints命令在文件中查找到该节点,依照该节点原有的格式将新挂载的目录添加进去,如下

       "/data":{
                  "Source":"/home/data",   # 源目录
                  "Destination":"/data",      # 目标目录
                  "RW":true,                        # 读写权限
                  "Name":"",  
                  "Driver":"",
                  "Type":"bind",
                  "Propagation":"rprivate", 
                  "Spec":{
                      "Type":"bind",
                      "Source":"/home/data",
                      "Target":"/data"
                  }
      
    • 修改完成后重启docker,通过docker inspect nginx 查看nginx容器信息,此时新目录已经挂载进去了。

      image-20210107095646588

动静分离配置

  • 在 nginx.conf的server下添加location对静态资源进行转发

    # 此处是在监听80端口的srever下进行配置,端口随意
    location  /html/ {
        # 注:nginx默认只能识别index.html,所以访问[nginx]/html/ 为index.html,其他页面要加上名字
        alias /data/html/;    
    }
    
    location /img/ {
        alias /data/imgs/;
        autoindex on; # 列出文件夹中目录
        expires 3d;      # 缓存过期时间3天
    }
    
  • 重启nginx docker restart nginx

  • 访问静态资源,浏览器访问http:192.168.56.101:81/img/,可以得到文件目录(前提是配置中加了 autoindex on),点击即可浏览图片,或者直接访问http:192.168.56.101:81/img/a.jpg

    image-20210107100535369

  • 浏览器访问http:192.168.56.101:81/html/默认访问的是index.html,要访问其他html需要在后缀中加上,如http:192.168.56.101:81/html/a.html

nginx集群

准备工作

  • 通过docker搭建一个简易的nginx集群,首先总共需要启动三个nginx服务,一个master,两个slave,其中只有主服务需要挂载目录和指定端口,主服务器已经准备好,只需准备两个从服务器即可

    # 运行两个从服务器
    docker run -itd  --name nginx_slave1 nginx:1.19.6
    docker run -itd  --name nginx_slave2 nginx:1.19.6
    
  • 查看三个nginx分区的ip信息

    docker network ls查看docker的网络信息,获取network_id,根据你虚拟机的网络配置情况选择。

    image-20210107102900654

  • 查看docker中容器的网络信息 docker network inspect【上一步的network_id】,可查看到如下信息,docker ps查看到三个nginx容器的id,然后逐一匹配找到其对应的ip,此处示例对应ip分别为172.17.0.2172.17.0.7172.17.0.8

    image-20210107103206376

修改配置文件配置集群

  • 修改master的配置,进入容器vim /etc/nginx/nginx.conf,挂载了目录的话则直接在本地目录修改,添加如下配置。

     # 集群配置
     upstream 172.17.0.4 {
     	# 添加两个nginx从服务器并设置权重
         server 172.17.0.7 weight=10;  # 对应nginx_slave1
         server 172.17.0.8 weight=20; # 对应nginx_slave2
     }
     
     # 在server中新建/修改location,此处为80端口的server,对/路径的location进行修改
    location / {
                root   /usr/share/nginx/html;
                index  index.html index.htm;
    
                proxy_pass http://172.17.0.4/;     # 配置集群代理
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    
    
  • 为了让集群访问效果看起来明显,对两个从服务器的index.html进行修改,加上各自的信息

    # 进入nginx_slave容器
    docker exec -it nginx_slave1 /bin/bash
    # 修改index.html
    vim /usr/share/nginx/html/index.html
    
    # nginx_slave1的index.html加上<h1>this is nginx_slave1 </h1>,对nginx_slave2做系统的配置
    
  • 之后访问192.168.56.101:81/,可以看到slave1和slave2交替被访问,且频率和之前设置的权重成正比。

    image-20210107104414386

原文地址:https://www.cnblogs.com/FriendA1/p/14245173.html