唐僧喜欢小龙女

导航

nginx 的学习整理

1、主配置文件

nginx.conf ,主配置文件会加载别的自定义的配置文件 这里举例:加载 servers 目录下的所有配置文件

 include servers/*;

 1.1 主配置文件详解

  我这里使用docker 安装的nginx,nginx.conf 的主配置文件在/etc/nginx/nginx.conf 下面

nginx的主配置文件 nginx.conf 配置文件有三部分组成
        第一部分全局块
            从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置
            运行Nginx 服务器的用户组,允许生成的 worker process 数,进程PID存放路径,日志存放路径和类型以及配置文件的引入等
            比如 下面的配置:
            worker_process 1;  #nginx进程数,建议设置为等于CPU总核心数,启动时创建的worker进程的数量,这里设置为1.
                               #nginx启动的时候除了启动一个叫master进程还有一个或多个worker进程,master用来
                               #协调worker进程

            pid        /var/run/nginx.pid;  #进程PID存放路径

            error_log  /var/log/nginx/error.log warn; #全局错误日志定义类型和日志的存放路径、这里是warn 级别
            
            user  nginx; #定义Nginx运行的用户,这里用户叫nginx

        第二部分events 块
            worker_connections #一个worker进程可以创建多少个连接,也就是最大并发访问量

        第三部分http 块
            include mime.types #当前配置文件引用另一个配置文件,便于管理.

            sendfile on        #意思是我们访问nginx服务器上的某个目录的一个文件,如果sendfile 不是on,那么nginx会
            把这个文件读到nginx的应用内存里,然后发送到nginx服务器的网卡端口上,网卡端口会从nginx的应用内存中读取,然后
            响应给浏览器。如果是on,网卡端口会从目录文件直接读取,这样减少了一次IO


            server模块。
                一个nginx的配置文件可以有多个server模块。一个server就是一个虚拟主机,就是一个虚拟服务器。
                listen 80  
                    虚拟主机的端口号,默认是80,这里可以修改监听的端口号
                server_name localhost; 
                    主机名称,可以配置域名(www.gaohq.com),或者主机名(k8s_nginx).http://localhost:8013/

                location /xxoo {} 
                    location 是用来匹配uri的。例如一个url是http://atguigu.com/xxoo/index.html。

                    location 是用来配置xxoo/index.html这一段的,这一段就叫uri
                    一个server 下面可以有多个location

                        root /usr/share/nginx/html
                            如果匹配到uri后从那个目录开始找请求的网页,这个是从/usr/share/nginx/html目录下。

                        index 首页,当前location的首页    

                error_page   500 502 503 504  /50x.html 当发生错误时,返回前端首页是 /50x.html 页面

                   location = /50x.html {
                        root   /usr/share/nginx/html; /50x.html uri配置的资源路径。/usr/share/nginx/html这个目录下找50x.html
                    }

 

 

2、配置负载均衡策略

这个是nginx的主配置文件,可以修改的内容 /etc/nginx 目录下的nginx.conf文件

worker_processes  1;

events {
    worker_connections  1024;
}

#proxy_pass 反向代理的关键字,一旦配置了proxy_pass 后,root 和 index 属性就不生效了,一般会注释掉root和index属性


#反向代理代理到内网
http {
   #配置负载均衡 dalaoyang-server 是随便写的这个名字
   upstream  dalaoyang-server {
       server    localhost:10001;
       server    localhost:10002;
   }

   server {
       listen       10000;
       server_name  localhost;

       location / {
        #配置 负载的名字,
        proxy_pass http://dalaoyang-server;
        proxy_redirect default;
      }

    }

#反向代理代理到外网,不支持https的配置
    server {
       listen       80;
       server_name  localhost;

       location / {
        #配置 负载的名字,
        proxy_pass http://www.baidu.com;
        proxy_redirect default;
      }

    }
}

 

 

3、测试结果

重启nginx,第一次访问http://localhost:10000如图所示

 

4、docker 的方式创建nginx

把/Users/gaoheqiang/Desktop/conf.d 这个目录下的文件 挂载到 /etc/nginx/conf.d 目录下

docker run --name docker_nginx -d -p 8013:80 -v /Users/gaoheqiang/Desktop/conf.d:/etc/nginx/conf.d nginx:latest
#配置负载均衡 dalaoyang-server 是随便写的这个名字
upstream  dalaoyang-server {
   server    192.168.1.5:8006;
   server    192.168.1.5:8007;
}

server {
    listen       80;
    server_name  192.168.1.5;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;    

    location / {
        #配置 负载的名字,
        proxy_pass http://dalaoyang-server;
        proxy_redirect default;
    }

}

 

5、nginx 配置动静分离

1、是如果服务器多的话,要修改服务器上的图片,那么需要一个一个的修改,很麻烦,但是如果有cicd工具批量部署的话还可以接受
2、Tomcat在高并发下处理动态请求时性能已经占满了,如果此时在处理静态页面更加脆弱,通过Nginx来处理静态页面就比Tomcat 好很多
docker run --name docker_nginx -d -p 8006:8006 -v /Users/gaoheqiang/Desktop/conf.d:/etc/nginx/conf.d -v /Users/gaoheqiang/img:/data/image nginx:latest

5.1 nginx的配置文件中配置动静分离

#配置负载均衡 dalaoyang-server 是随便写的这个名字
upstream  dalaoyang-server {
   server    192.168.55.90:8009;
}

server {
    listen       8006; #nginx的端口
    server_name  192.168.55.90;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;  

     # 配置图片访问路径 http://ip:port/*.jpg
    location ~ .*\.(gif|jpg|pdf|jpeg|png)$ {
        expires    8h;
        root   /data/image/;
    }


    location / {
        #配置 负载的名字,
        proxy_pass http://dalaoyang-server;
        proxy_redirect default;
    }

}

5.2 html 中配置图片的访问路径

  <img src="/dahai.jpg" height="400px" width="600px">

5.3测试结果

6、nginx常见的命令

手动安装nginx 的方式使用(非yum和docker的方式)如下的命令。进入到/usr/local/nginx/sbin 的目录下
1、查看nginx的版本号
    ./nginx -v
2、启动nginx
    ./nginx
3、关闭nginx
    ./nginx -s stop
4、重新加载nginx
    此时修改了nginx的配置文件
    ./nginx -s reload

7、nginx的高可用配置

nginx高可用的搭建
    方案:
        在两个安装nginx的服务器上安装keepalived软件。两个服务器之间的keepalived
        会彼此通信检查是否存活。keepalived会虚拟出来一个IP,叫vip,
        我们访问的就是这个vip。keepalived会把这个vip来回在两个nginx的服务器
        之间进行切换,当主nginx挂了后这个vip会飘到备机器上,当备机器启动后,会有一个
        竞选的机制,选出主和备。

    机器配置
        192.68.1.12192.168.1.7 备机
            备机上安装nginx
                yum install epel-release -y
                yum install nginx -y

                systemctl start nginx
        
        预设的VIP 192.168.1.13

    安装keepalived

        192.68.1.12和192.168.1.7 都安装keepalived
        yum install keepalived -y 

    192.68.1.12修改keepalived 软件的配置
        /etc/keepalived/keepalived.conf

        global_defs{
          router_id lb12 #这里自己命名的
        }

        vrrp_instance atguigu {
            state MASTER
            interface enp0s3 #这里网卡的名字通过ipaddr看
            virtual_router_id 51
            priority 100
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 1111
            }
            virtual_ipaddress {
                192.168.1.13 #自定义的VIP
            }
        }
        别的部分都可以去掉了


        启动keepalived
            systemctl start keepalived
            systemctl status keepalived 看状态

        192.68.1.12服务器执行ipaddr
            发现多了一个ip 192.168.1.13192.68.1.7 修改keepalived 软件的配置   
        /etc/keepalived/keepalived.conf    
        global_defs{
          router_id lb07 #这里自己命名的
        }

        vrrp_instance atguigu {
            state BACKUP
            interface enp0s3 #这里网卡的名字通过ipaddr看
            virtual_router_id 51
            priority 100
            advert_int 1
            authentication {
                auth_type PASS
                auth_pass 1111
            }
            virtual_ipaddress {
                192.168.1.13 #自定义的VIP
            }
        }
        别的部分都可以去掉了

        启动keepalived
            systemctl start keepalived
            systemctl status keepalived 看状态


        192.68.1.7服务器执行ipaddr
            发现还是一个ip,因为vip在192.168.1.12 上。


    验证nginx的高可用
        192.68.1.12 这个机器杀死。在192.68.1.7 这个机器上ip addr发现多了一个ip 13
        192.68.1.12 这个机器重启后。然后重启keepalived 在192.68.1.12 这个机器上ip addr发现多了一个ip 13

    
    原理
        12和7 两个服务器之间keepalived 会检查彼此的进程是否存在,正常的话,需要写一个脚本定时来检查nginx是否
        可以访问,如果不能访问就杀死当前机器上的keepalived达到VIP的自动飘移。    

8、以https的方式访问nginx

为什么http协议不安全
    手机电脑上网时都会连接路由器-小区路由器-区路由器-市路由器-省路由器等等
    数据在传递时以二进制传递,数据包如果被拦截,然后可以解开。

怎么保证http请求是安全的
    为了保证数据传输安全,在浏览器和客户端加一个安全的协议。浏览器和客户端都遵守同样的安全协议。
    简单的是对称加密
        浏览器通过彼此都熟悉的算法来加密数据,服务端实现加密协议(内置到服务器中)通过同样的协议算法来解密。
    对称加密的缺点
        加密算法是开源的,拦截到后可以按照算法来解密也可以对数据进行解密,由此而来对称加密已经不安全了。    

    非对称加密(RSA)保证数据安全
        每次发送数据时先打一个zip包,然后用共同商议好的密码来加密。
        客户端和服务器端发送请求前先客户端通过服务器端的443端口获取到公钥放在客户端本地。
        非对称加密是:浏览器用公钥来加密,服务器端是用私钥来解密。服务器端响应给客户端时用私钥加密,客户端用公钥解密。所以叫非对称加密算法。
        非对称加密要求
            公钥加密公钥解不开
            私钥加密公钥解得开
            同时私钥不能在网络中传输
        非对称加密的不安全性说明
            在客户端第一次下载获取公钥的时候,中间的拦截服务器可以把公钥获取到,放在本地服务器上,然后返回一个假的公钥。
            以后再请求时,中加拦截服务器使用私钥进行拦截,然后使用公钥进行加密,返回给真的服务器。
            所以说非对称时不安全的

        怎么让非对称加密变得安全
            客户端下载CA机构下发的证书,这个证书即使在下载的时候被拦截加密,重新伪造了后,客户端也接不开,导致证书失效,客户端操作系统
            内置的私钥来揭开CA机构的证书,作为客户端的公钥。以后每次传输数据时用这个公钥来加密,即使第三方获取到了公钥后也接不开数据包。

Nginx配置证书
    在线申请证书
        在阿里云这里申请,申请好后下载到本地。这个文件夹里有两个文件,分别是以.key和.pem结尾的文件。

    上传证书
        cd /etc/nginx/ 目录 使用rz命令,上传我们下载的证书

    nginx.conf 配置证书    
        在nginx.conf的http模块中加一个server
            server {
                listen                  443 ssl;
                server_name             www;
                ssl_certificate         /etc/nginx/8522832_www.gaohq.top.pem;
                ssl_certificate_key     /etc/nginx/8522832_www.gaohq.top.key;

            }

        nginx 重启
            systemctl restart nginx

        以https的方式访问nginx
            https://www.gaohq.top/

        以https的方式访问nginx然后转发到http请求
            server {
                listen                  443 ssl;
                server_name             localhost;
                ssl                     on;
                ssl_certificate         /etc/nginx/8522832_www.gaohq.top.pem;
                ssl_certificate_key     /etc/nginx/8522832_www.gaohq.top.key;
                location /{
                        proxy_pass http://localhost; #https转http
                        proxy_set_header Host $Host;
                }
            }

            #http的后端请求
                upstream ingress-controller {
                   server 192.168.1.7:31278; 
                   server 192.168.1.8:31278;  #这个端口是ingress-controller的svc的nodeport端口。这里配置两个是为了高可用
                }

                server {
                    listen       80;
                    listen       [::]:80;
                    server_name  localhost;
                    #root         /usr/share/nginx/html;
                    location / {
                          proxy_pass http://ingress-controller;
                          #root /usr/share/nginx/html;
                          proxy_set_header Host $Host;
                    }
                    include /etc/nginx/default.d/*.conf;

                    error_page 404 /404.html;
                    location = /404.html {
                    }

                    error_page 500 502 503 504 /50x.html;
                    location = /50x.html {
                    }
                }    

 

 

9、会话保持

Nginx的会话保持
    项目在进行集群部署的时候,如果用户登录成功后,在发起一个请求,该请求的状态是依然是登录的状态,不能变成非登录的状态

会话保持实现方式(负载均衡的策略使用场景)
    1、Nginx 配置不同的负载均衡策略
        1、IP hash
            
            特点:
                此策略可以让用户根据IP把请求定向的转发到后端的某个服务器上。这样就能保持用户的session(会话)信息。

            配置:
                upstream ingress-controller {
                    ip_hash;        #配置负载均衡策略
                       server 192.168.1.130:8082;
                       server 192.168.1.7:8082;
                }

                systemctl reload nginx

                测试结果生效。


            缺点:
                像网吧、学校、大点的公司可能没有公网IP,公用一个IP,如果配置负载该均衡策略后台某个服务器造成很大的压力
                。该策略不适合在局域网内运行的服务。

            使用场景:
                适用于中小型项目,快速扩容


            后端请求错误时:
                即使后端请求错误,同一个IP经过hash算法后同样也会把请求转发到有问题的机器上。    

        2、通过request_uri 来实现负载均衡
            uri 是请求的资源地址 ip:port/{uri}
            特点:
                访问相同的URL的时候会转发到固定的服务器上。有些浏览器或者app,不支持cookie的情况下.
                不同的用户请求的ip不一样,但是uri一样的话也可以实现负载均衡

            配置:

                upstream ingress-controller {
                    hash $request_uri;        #配置负载均衡策略
                       server 192.168.1.130:8082;
                       server 192.168.1.7:8082;
                }

                systemctl reload nginx

                使用相同的url,测试结果生效。

            使用场景:
                有些浏览器或者app,不支持cookie的情况下.
                后端服务器存储的资源不一样。例如 http://192.168.1.200:8080/chenglong.mp4,http://192.168.1.200:8080/zhouxingchi.mp4
                访问的时候,两个资源存储在不同的地址上。通过nginx配置 request_uri 策略来实现 负载

                我们只需要对 url(chenglong.mp4)进行hash,就能得出把资源放到哪里了。


        3、通过cookie_jsessionid 来实现负载均衡
            
            也可以通过自定义的cookie来实现负载均衡我这里使用的是jessionid 来说明的。

            特点:
                根据cookie中jsessionid的hash算法会转发到固定的服务器上。
                不同的用户请求的jsessionid不一样,但是uri一样的话也可以实现负载均衡

                正常的话tomocat的web请求都会生产一个默认的jsessionid,也可以使用自己生成的cookie。

            配置:

                upstream ingress-controller {
                    hash $cookie_jessionid;        #配置负载均衡策略
                       server 192.168.1.130:8082;
                       server 192.168.1.7:8082;
                }

                systemctl reload nginx

                使用相同的jessionid,测试结果生效。

            使用场景
                像网吧、学校、大点的公司可能没有公网IP,公用一个IP,如果配置负载该均衡策略后台某个服务器不会造成很大的压力
                。该策略适合在局域网内运行的服务。

         

    2、后端来处理
        Redis + SpringSession的组合方式
        该方式性能没有Nginx好,并且随着后端服务器越来越多,Redis的压力也很大        

 

posted on 2021-09-26 19:54  与时具进&不忘初心  阅读(136)  评论(0编辑  收藏  举报