Nginx学习笔记

先看 2 个实际需求,引出 Nginx

需求 1: 访问不同微服务

- 示意图

需求 2: 轮询访问服务

-- 示意图

解决方案: Nginx

  1. 反向代理
  2. 负载均衡
  3. 动静分离

  1. 高可用集群

Nginx 在分布式 微服务 架构的位置

基本介绍

Nginx 是什么? 能干什么?

  1. 是什么:Nginx ("engine x") 是一个高性能的 HTTP 和反向代理 WEB 服务器
  2. 能干什么:反向代理 负载均衡 动静分离
  3. 牛逼之处:高性能,高负载 有报告表明能支持高达 50,000 个并发连接数
  4. 详细说明:https://lnmp.org/nginx.html

官方资料

  1. 官网:https://nginx.org/
  2. 使用文档:https://nginx.org/en/docs/

Nginx 核心功能

正向代理

  1. 一句话:如果我们要访问 www.google.com 但是直接访问不到,则需要通过代理服务器来访问,这种代理服务就称为正向代理
  2. 一图胜千言

老韩图解

  1. 我们知道www.google.com , 但是访问不到
  2. 所以使用代理服务器帮助我们(即客户端)来上网, 注意帮助的对象是客户端, 这种代理,我们称为正向代理.
  3. 正向代理同时也隐藏了客户端信息.
  4. 再次说明,正向代理帮助的是客户端, 因此可以把 客户端+正向代理服务 , 视为一个整体

反向代理

  1. 一句话:客户端将请求发送到代理服务器,由代理服务器去选择目标服务器获取数据后,返回给客户端,这种代理方式为反向代理
  2. 一图胜千言

老韩图解

  1. 项目设计者, 不希望客户端直接访问目标Web 服务器(比如目标 Web 服务器是集群, 如果直接访问就会提供多个公网 IP), 而是希望提供一个统一的访问 IP, 这个是理解反向代理的前提,即为什么要反向代理.
  2. 反向代理帮助的对象是目标 Web 服务器
  3. 当客户端请求达到反向代理服务后,由反向代理服务来决定如何访问目标 Web 服务器(或者是哪个 Web 服务器), 这个过程对客户端是透明的.
  4. 反向代理服务会暴露公共的IP, 只要能上网,就可以访问,但是对于反向代理服务器 管理的/代理的 Web 服务器通常是在局域网内,不能直接访问,只能通过反向代理来访问.
  5. 我们可以将 反向代理服务+反向代理服务代理的Web 服务器 视为一个整体
  6. 反向代理会屏蔽 内网服务器(也就是他代理的服务)信息, 并实现负载均衡访问

负载均衡

  1. 一句话:当客户端向反向代理服务器(比如 Nginx)发出请求,如果 Nginx 代理了多个

    WEB 服务器(集群),Nginx 会将请求/负载分发到不同的服务器,也就是负载均衡

  2. 一图胜千言

-- 示意图

动静分离

  1. 一句话:为了加快网站的解析速度,可以把动态资源和静态资源由不同的服务器来解析,降低单个服务器的压力
  2. 传统的项目资源部署

-- 示意图

  1. 动静分离项目资源部署

-- 示意图

Nginx 下载&安装&启动

下载

  1. 下载地址:https://nginx.org/en/download.html
  2. 版本:nginx-1.20.2.tar.gz

安装

安装 Linux, 登录 Linux

1、我在讲解 Linux 的时候(用的 CentOS7.6, 请小伙伴和我保持一致), 已经讲过, 非常的全面细致

2、带学员看一下笔记位置

3、带学员看一下 Linux 视频课程在哪里

4、保证能登录 Linux

5、保证访问外网-在Linux 讲过怎么配置

具体安装步骤

  1. 搭建 gcc 环境

yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

老韩提示 1: 一定要保证当前的linux 系统, 可以连接外网, 因为yum 需要到外网,获取数据

老韩提示 2: 如何在 Linux 配置网络, 可以连接到外网, 带学员看一下文档和视频位置

(https://www.bilibili.com/video/BV1Sv411r7vd?p=63).

老韩提示 3: 执行上面指令的时候, 可能会报 Centos Another app is currently holding the yum lock..错误,是因为yum 不时会自动升级, 占用了端口或文件, 解决方案 (1)可以重启Linux, 立即执行该指令 (2)或者等一会再执行(3) 或者参考 https://www.cnblogs.com/lzxianren/p/4254059.html, 老韩用的是第 1 种解决方案, 可以搞定..

  1. 将nginx-1.20.2.tar.gz 上传到Linux /opt 目录

  2. 切换到/opt 目录, 解压 nginx-1.20.2.tar.gz

    tar -zxvf nginx-1.20.2.tar.gz

  3. 将解压后的文件放到指定位置

mv nginx-1.20.2 /usr/local/nginx

  1. 进入文件目录

cd /usr/local/nginx

  1. 配置 nginx 路径
./configure --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/temp/nginx/client --http-proxy-temp-path=/var/temp/nginx/proxy --http-fastcgi-temp-path=/var/temp/nginx/fastcgi --http-uwsgi-temp-path=/var/temp/nginx/uwsgi --http-scgi-temp-path=/var/temp/nginx/scgi --conf-path=/usr/local/nginx/nginx.conf 
  1. 补全 nginx 配置目录

mkdir /var/temp/nginx -p

  1. 编译并安装

make && make install

  1. 测试配置与 nginx 是否正常,当出现 successful 即可

./sbin/nginx -t

  1. 启动 nginx

./sbin/nginx -c nginx.conf

  1. 查看进程/或端口(默认端口是 80) ps -ef | grep nginx

启动 Nginx 可能的错误 和解决方案

1. 解决 nginx 启动报错 nginx: [emerg] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory)

验证是否安装成功

  1. nginx 默认监听端口 80,出现 Welcome to nginx!该页面就是搞定了
  2. Linux 的浏览器:http://localhost

配置防火墙,让 Windows 访问 Nginx

  1. 说明:默认情况下 Windows 是不能访问 Nginx , 因为防火墙是关闭 80 端口的
  2. 具体配置
  • 查看开放的端口号

firewall-cmd --list-all

  • 设置开放的端口号

    #firewall-cmd --add-service=http --permanent #增加了一个 http 服务,理解

    firewall-cmd --add-port=80/tcp --permanent

  • 重启防火墙

    firewall-cmd --reload

**老 韩 提 示 : 防 火 墙 配 置 详 情 , << 韩 顺 平 一 周 学 会 Linux>> https://www.bilibili.com/video/BV1Sv411r7vd?p=77

测试: windows 浏览器: http://192.168.12.134/

Nginx 命令行参数

指令说明

地址:https://nginx.org/en/docs/switches.html

使用演示

  1. 启动 /usr/local/nginx/sbin/nginx -c nginx.conf
  2. 停止 /usr/local/nginx/sbin/nginx -s stop
  3. 重新加载(不需要重启) /usr/local/nginx/sbin/nginx -s reload
  4. 查看版本 /usr/local/nginx/sbin/nginx -v
  5. 查看版本、配置参数 /usr/local/nginx/sbin/nginx -V

nginx.conf 配置文件

基本说明

Nginx 的配置文件位置

1、文件位置

  1. 安装目录\conf\nginx.conf
  2. 安装目录\nginx.conf

2、两个文件是一样的

  1. 多说一句:使用 /usr/local/nginx/sbin/nginx 启动 Nginx ,默认用的是 安装目录 \nginx.conf 配置文件

  2. 作用:完成对 Nginx 的各种配置,包括端口,并发数,重写规则等

  3. nginx.conf 组成

    1. 全局块
    2. events
    3. http
  4. nginx.conf 详细文档

    1. 地址: 文档:https://blog.csdn.net/liuchang19950703/article/details/110792007
    2. 文档: Nginx 配置文件 nginx.conf 详解.docx
    3. 详细内容
#Nginx 用户及组:用户组。window 下不指定
#user nobody;
#工作进程:数目。根据硬件调整,通常等于CPU 数量或者2 倍于CPU。
worker_processes 1;
#错误日志:存放路径。
#error_log logs/error.log;

#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid(进程标识符):存放路径
pid /usr/local/nginx/logs/nginx.pid;
#一个进程能打开的文件描述符最大值,理论上该值因该是最多能打开的文件数除以进程数。
#但是由于nginx 负载并不是完全均衡的,所以这个值最好等于最多能打开的文件数。
#LINUX 系统可以执行sysctl -a | grep fs.file 可以看到linux 文件描述符。
worker_rlimit_nofile 65535;
events {

    #使用epoll 的I/O 模型。linux 建议epoll,FreeBSD 建议采用kqueue,window 下不指定。
    use epoll;
    #单个进程最大连接数(最大连接数=连接数*进程数)
    worker_connections 1024;
    #客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,
    #一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
    #client_header_buffer_size 4k;
}
http {

    #设定mime 类型,类型由mime.type 文件定义
    include mime.types;
    default_type application/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"';
    #用了log_format 指令设置了日志格式之后,需要用access_log 指令指定日志文件的存放路径
    #记录了哪些用户,哪些页面以及用户浏览器、ip 和其他的访问信息
    #access_log logs/host.access.log main;
    #access_log logs/host.access.404.log log404;
    #服务器名字的hash 表大小
    server_names_hash_bucket_size 128;
    #客户端请求头缓冲大小。
    #nginx 默认会用client_header_buffer_size 这个buffer 来读取header 值,
    #如果header 过大,它会使用large_client_header_buffers 来读取。
    #如果设置过小HTTP 头/Cookie 过大会报400 错误nginx 400 bad request
    #如果超过buffer,就会报HTTP 414 错误(URI Too Long)
    #nginx 接受最长的HTTP 头部大小必须比其中一个buffer 大
    #否则就会报400 的HTTP 错误(Bad Request)
    #client_header_buffer_size 32k;
    #large_client_header_buffers 4 32k;
    #隐藏ngnix 版本号
    #server_tokens off;
    #忽略不合法的请求头
    #ignore_invalid_headers on;
    #让nginx 在处理自己内部重定向时不默认使用server_name 设置中的第一个域名
    #server_name_in_redirect off;
    #客户端请求体的大小
    #client_body_buffer_size 8m;
    #开启文件传输,一般应用都应设置为on;若是有下载的应用,则可以设置成off 来平衡网络I/O 和磁盘的I/O 来降低系统负sendfile on;
    #告诉nginx 在一个数据包里发送所有头文件,而不一个接一个的发送。
    #tcp_nopush on;
    #tcp_nodelay off 会增加通信的延时,但是会提高带宽利用率。在高延时、数据量大的通信场景中应该会有不错的效果
    #tcp_nodelay on,会增加小包的数量,但是可以提高响应速度。在及时性高的通信场景中应该会有不错的效果
    tcp_nodelay on;
    #长连接超时时间,单位是秒
    keepalive_timeout 65;
    #gzip 模块设置,使用gzip 压缩可以降低网站带宽消耗,同时提升访问速度。
    #gzip on; #开启gzip
    #gzip_min_length 1k; #最小压缩大小
    #gzip_buffers 4 16k; #压缩缓冲区
    #gzip_http_version 1.0; #压缩版本
    #gzip_comp_level 2; #压缩等级
    #gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml
    application/xml+rss;#压缩类型
    #负载均衡
    #max_fails 为允许请求失败的次数,默认为1
    #weight 为轮询权重,根据不同的权重分配可以用来平衡服务器的访问率。
    # upstream myServer{
    # server 192.168.247.129:8080 max_fails=3 weight=2;
    # server 192.168.247.129:8081 max_fails=3 weight=4;
    #
}
#server {
# listen 80;
#
# #IP/域名可以有多个,用空格隔开
# server_name 192.168.247.129;
# #server_name www.test.com;
#
# #charset koi8-r;
#
# #access_log logs/host.access.log main;
#
# #反向代理配置,
# #将所有请求为www.test.com 的请求全部转发到upstream 中定义的目标服务器中。
# location / {
#
# #此处配置的域名必须与upstream 的域名一致,才能转发。
# proxy_pass http://myServer;
# #proxy_pass http://192.168.247.129:8080;
#
# proxy_connect_timeout 20; #nginx 跟后端服务器连接超时时间(代理连接超时)
#
# #client_max_body_size 10m; #允许客户端请求的最大单文件字节数
# #client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数
# #proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时)
# #proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时)
# #proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
# #proxy_buffers 4 32k; #proxy_buffers 缓冲区,网页平均在32k 以下的话,这样设置
# #proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
# #proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream 服务器传
#
# root html;
#
# #定义首页索引文件的名称
# index index.html index.htm;
#
}
#
# #动静分离静态资源走linux 动态资源走tomcat
# # 注意/source/image/下面寻找资源
# location /image/ {
# root /source/;
# autoindex on;
#
}
#
#
# # 出现50x 错误时,使用/50x.html 页返回给客户端
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# root html;
#
}
#
}
#下面是配置生产环境中既支持HTTP 又支持HTTPS,保证用户在浏览器中输入HTTP 也能正常访问
# SSL 证书配置
ssl_certificate cert/yphtoy.com.pem; #加密证书路径
ssl_certificate_key cert/yphtoy.com.key; #加密私钥路径
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #加密协议
ssl_session_cache shared:SSL:1m; #加密访问缓存设置,可以大大提高访问速度
ssl_session_timeout 10m; #加密访问缓存过期时间
ssl_ciphers HIGH:!aNULL:!MD5; #加密算法
ssl_prefer_server_ciphers on; #是否由服务器决定采用哪种加密算法
# 负载均衡
upstream api_upstream {

    server 127.0.0.1:8080 max_fails=3 weight=1;
    server 127.0.0.1:8081 max_fails=3 weight=1;
}
#api 接口(兼容HTTP)
server {

    listen 80;
    server_name api.test.com;
    # 301 重定向跳转到HTTPS 接口
    return 301 https://$server_name$request_uri;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {

        root html;
    }
}
#api 接口(兼容HTTPS)
server {

    listen 443 ssl;
    server_name api.test.com;
    location / {

        root html;
        index index.html index.htm;
        proxy_pass http://api_upstream;
        #语法: proxy_cookie_path oldpath replacepath;
        #oldpath 就是你要替换的路径replacepath 就是要替换的值
        #作用:同一个web 服务器下面多个应用之间能获取到cookie
        proxy_cookie_path /api/ /;
        #服务端接收的请求头Cooke 值不变
        proxy_set_header Cookie $http_cookie;
    }
}
#管理后台端(兼容HTTP)
server {

    listen 80;
    server_name manage.test.com;
    # 301 重定向跳转到HTTPS 接口
    return 301 https://$server_name/$request_uri;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {

        root html
    }
}
#管理后台端(兼容HTTPS)
server {

    listen 443 ssl;
    server_name manage.test.com;
    location / {

        root /home/test/web/dist
        index /index.html;
        #语法:try_files 【$uri】【$uri/】【参数】
        #当用户请求https://manage.test.com/login 时,
        #一.如果配置了上面的默认index,会依次请求
        #1./home/test/web/dist/login 查找有没有login 这个文件,没有的话
        #2./home/test/web/dist/index.html 有就直接返回
        #二.如果没有配置了上面的默认index 或者配置了没有找到对应的资源,会依次请求
        #1./home/test/web/dist/login 查找有没有login 这个文件,没有的话
        #2./home/test/web/dist/login/ 查找有没有login 这个目录,没有的话
        #3.请求https://manage.test.com/index.html nginx 内部做了一个子请求
        #三.总的来说,index 的优先级比try_files 高,请求会先去找index 配置,这里最后一个参数必须存在
        try_files $uri $uri/ /index.html;
        #解决跨域问题
        #允许跨域请求地址(*表示全部,但是无法满足带cookie 请求,因为cookie 只能在当前域请求)
        add_header Access-Control-Allow-Origin $http_origin;
        #允许接收cookie 和发送cookie
        add_header Access-Control-Allow-Credentials 'true';
        #允许请求的方法
        add_header Access-Control-Allow-Methods 'GET,POST,DELETE,PUT,OPTIONS';
        #允许请求头(Content-Type:请求数据/媒体类型x-requested-with:判断请求是异步还是同步自定义header 比如token)
        add_header Access-Control-Allow-Headers $http_access_control_request_headers;
        #浏览器缓存请求头信息,1800 秒内,只会有1 次请求,不会出现"OPTIONS"预请求,节约资源
        #add_header Access-Control-Max-Age '1800';
        if ($request_method = 'OPTIONS') {

            return 204;
        }
        #服务端HttpServletRequest 可以获得用户的真实ip
        proxy_set_header X-Real-IP $remote_addr;
        #服务端HttpServletRequest 可以获得用户的真实ip 和经过的每一层代理服务器的ip
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #服务端接收的请求头Host 值不变
        proxy_set_header Host $http_host;
        proxy_set_header X-Nginx-Proxy true;
    }
}
}

nginx.conf 讲解

  1. 一张图说明 nginx.conf 结构

  1. 看一下 /usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {

    worker_connections 1024;
}
http {

    include mime.types;
    default_type application/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 logs/access.log main;
    sendfile on;
    #tcp_nopush on;
    #keepalive_timeout 0;
    keepalive_timeout 65;
    #gzip on;
    server {

        listen 80;
        server_name localhost;
        #charset koi8-r;
        #access_log logs/host.access.log main;
        location / {

            root html;
            index index.html index.htm;
        }
        #error_page 404 /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {

            root html;
        }
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        # proxy_pass http://127.0.0.1;
        #}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        # root html;
        # fastcgi_pass 127.0.0.1:9000;
        # fastcgi_index index.php;
        # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
        # include fastcgi_params;
        #}
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        # deny all;
        #}
    }
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    # listen 8000;
    # listen somename:8080;
    # server_name somename alias another.alias;
    # location / {
    # root html;
    # index index.html index.htm;
    # }
    #}
    # HTTPS server
    #
    #server {
    # listen 443 ssl;
    # server_name localhost;
    # ssl_certificate cert.pem;
    # ssl_certificate_key cert.key;
    # ssl_session_cache shared:SSL:1m;
    # ssl_session_timeout 5m;
    # ssl_ciphers HIGH:!aNULL:!MD5;
    # ssl_prefer_server_ciphers on;
    # location / {
    # root html;
    # index index.html index.htm;
    # }
    #}
}

全局块

说明

  1. 从配置文件开始到 events 块之间的内容
  2. 主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等

简单分析

1、#这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约

2、配置举例:

worker_processes 1;

events 块

说明

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

简单分析

1、#上述例子就表示每个 work process 支持的最大连接数为 1024, 这部分的配置对

Nginx 的性能影响较大,在实际中应根据实际情况配置

2、配置举例 events {

worker_connections 1024;

}

http 块

说明

  1. 这是 Nginx 服务器配置中最复杂的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里
  2. http 块也可以包括 http 全局块、server 块

http 全局块

1、http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单连接请求数上限等

2、配置举例:

http {

include mime.types; default_type application/octet-stream;

#开启文件传输

sendfile on;

#tcp_nopush on;

#keepalive_timeout 0;

keepalive_timeout 65;

}

server

  1. 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
  2. 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
  3. 每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。
    1. 全局 server 块
      最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
    2. location 块
      一个 server 块可以配置多个 location 块
server {

    listen 80;
    server_name localhost;
    #charset koi8-r;
    #access_log logs/host.access.log main;
    location / {

        root html;
        index index.html index.htm;
    }
    #error_page 404 /404.html;
    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {

        root html;
    }
}
  1. 小结: 这块的主要作用是基于 Nginx 服务器接收到的请求字符串( 例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名) 之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。比如地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
    1. 实例 1:修改端口
    2. 实例 2:配置多个 server

反向代理-快速入门

需求说明/图解

  1. 需求说明/图解

    1. 在浏览器输入 www.hsp.com(windows), 可以访问到 tomcat

    2. 使用 Nginx 反向代理功能, 完成需求.

  2. 如图

反向代理配置-思路分析/图解

-- 思路分析示意图

实现步骤

安 装 JDK , 在 8 以 上 , 参 考 : << 韩 顺 平 一 周 学 会 Linux>> https://www.bilibili.com/video/BV1Sv411r7vd?p=86

  1. 安装步骤

    1. mkdir /opt/jdk
    2. 通过 xftp6 上传到 /opt/jdk 下
    3. cd /opt/jdk
    4. 解压 tar -zxvf jdk-8u261-linux-x64.tar.gz
    5. mkdir /usr/local/java
    6. mv /opt/jdk/jdk1.8.0_261 /usr/local/java
    7. 配置环境变量的配置文件 vim /etc/profile
    8. export JAVA_HOME=/usr/local/java/jdk1.8.0_261
    9. export PATH=JAVAHOME/bin:PATH
    10. source /etc/profile [让新的环境变量生效]
  2. 测试是否安装成功

安 装 Tomcat , 参 考 : << 韩 顺 平 一 周 学 会 Linux>> https://www.bilibili.com/video/BV1Sv411r7vd?p=87

1、步骤

  1. 上传安装文件,并解压缩到/opt/tomcat
  2. 进入解压目录/bin , 启动 tomcat ./startup.sh
  3. 开放端口 8080 , 回顾 firewall-cmd

2、测试是否安装成功

在windows、Linux 下 访问 http://linuxip:8080

修改 C:\Windows\System32\drivers\etc\hosts 配置虚拟主机名

#127.0.0.1 www.mynews.com

127.0.0.1 localhost

#eureka 主机名和 ip 映射

127.0.0.1 eureka9001.com

127.0.0.1 eureka9002.com

192.168.12.134 www.hsp.com

修改 安装目录\nginx.conf

小技巧: 如何查看 nginx.conf 的配置错误

  • nginx -t #检测默认配置文件

  • nginx -t -c 配置文件 #指定检测配置文件

完成测试

  1. 重启 或者 重新加载 Nginx
  2. windows 浏览器输入: http://www.hsp.com

注意事项和细节

  1. Nginx 对外提供访问入口,充当反向代理服务器,Tomcat 的端口就无需对外暴露-测试一把
  2. 开启和关闭防火墙的端口
  • 以 8080 端口为例,关闭 8080 端口
firewall-cmd --remove-port=8080/tcp --permanent
firewall-cmd --reload
  • 以 8080 端口为例,开放 8080 端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
  • 查看防火墙状态
firewall-cmd --list-all

反向代理配置-Location 实例

需求说明/图解

-- 效果示意图

反向代理配置-思路分析/图解

-- 示意图

Location 语法规则

解读 1-location 语法规则

Location规则

语法规则: location [=|~|~*|^~] /uri/ {… }

首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

符号 含义
= = 开头表示精确匹配
^~ ^~开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)
~ ~ 开头表示区分大小写的正则匹配
~* ~* 开头表示不区分大小写的正则匹配
!~和!~* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则
/ 用户所使用的代理(一般为浏览器)
$http_x_forwarded_for 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$http_referer 可以记录用户是从哪个链接访问过来的

匹配规则示例

IMG_256


location = / {

#规则A

}

location = /login {

#规则B

}

location ^~ /static/ {

#规则C

}

location ~ \.(gif|jpg|png|js|css)$ {

#规则D

}

location ~* \.(gif|jpg|png|js|css)$ {

#规则E

}

location !~ \.xhtml$ {

#规则F

}

location !~* \.xhtml$ {

#规则G

}

location / {

#规则H

}

IMG_257


那么产生的效果如下:

1. 访问根目录/,比如http://localhost/将匹配规则A

2. 访问 http://localhost/login 将匹配规则B,http://localhost/register则匹配规则H

3. 访问 http://localhost/static/a.html 将匹配规则C

4. 访问 http://localhost/a.gif,http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而http://localhost/static/c.png则优先匹配到规则C

5. 访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。

6. 访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。

7. 访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(PHP),tomcat(jsp),nginx作为反向代理服务器存在。

实际常用规则

#直接匹配网站根目录,通过域名访问网站首页比较频繁,使用这个会加速处理。

#这里是直接转发给后端应用服务器了,也可以是一个静态首页

# 第一个必选规则

location = / {

proxy_pass http://tomcat:8080/index

}

# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项

# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

IMG_258


location ^~ /static/ {

# 请求/static/a.txt 将被映射到实际目录文件:/webroot/res/static/a.txt

root /webroot/res/;

}

location ~* \.(gif|jpg|jpeg|png|css|js|html|ico)${

root /webroot/res/;

}

IMG_259


第三个规则就是通用规则,用来转发动态请求到后端应用服务器

#非静态文件请求就默认是动态请求,自己根据实际把握

#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了

location / {

proxy_pass http://tomcat:8080/

}

Location解析过程

IMG_260

老韩梳理[大概]:

1、 先判断精准命中,如果命中,立即返回结果并结束解析过程。

2、 判断普通命中,如果有多个命中,“记录”下来“最长”的命中结果(记录但不结束,最长的为准)[一会还要梳理]。

3、 继续判断正则表达式的解析结果,按配置里的正则表达式顺序为准,由上至下开始匹配,一旦匹配成功1个,立即返回结果,并结束解析过程。

4、 普通命中顺序无所谓,是因为按命中的长短来确定。正则命中,顺序有所谓,因为是从前往后命中的。

总结——精准匹配>^~匹配>正则匹配>普通匹配

解读 2-nginx 的 location 解析过程

- 参考 : https://blog.huati365.com/89af5ae5a56d1b96

实现步骤

  1. 修改 C:\Windows\System32\drivers\etc\hosts 配置虚拟主机名

#127.0.0.1 www.mynews.com

127.0.0.1 localhost

#eureka 主机名和 ip 映射

127.0.0.1 eureka9001.com

127.0.0.1 eureka9002.com

192.168.56.100 hspliving.com

192.168.12.134 www.hsp.com

192.168.12.134 www.hspmall.com

  1. 修改 安装目录\nginx.conf

  1. 在 Linux 的 Tomcat 创建 webapps\product\hi.html

hi.html

<h1>product service linux tomcat </h1>

  1. 在 windows 的 Tomcat 创建 webapps\member\hi.html

  2. linux 防火墙打开 10000 端口

  3. 保证 linux 可以访问Windows Tomcat 【即:可以访问 Windows 的 8080 端口, 可暂时关闭 windows 防火墙,测完恢复】

完成测试

  1. 确保启动 Linux 下的 Tomcat
  2. 确保启动 Windows 下的 Tomcat
  3. 重启 或者 重新加载 Nginx
  4. windows 浏览器输入[注意带上端口]: http://www.hspmall.com:10000/product/hi.html http://www.hspmall.com:10000/member/hi.html

几个小实验-多测试

负载均衡-配置实例

需求说明/图解

-- 示意图

负载均衡配置-思路分析/图解

-- 示意图

负载均衡配置规则

  • 负载均衡就是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快
  • linux 下有 Nginx、LVS、Haproxy 等等服务可以提供负载均衡服务, Nginx 提供了几种分配方式(策略):

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除

2、weight

weight 代表权,重默认为 1,权重越高被分配的客户端越多

指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如

upstream hspservers{
server 192.168.12.134:8080 weight=1;
server 192.168.12.134:8081 weight=2;
}

3、ip_hash

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

session 的问题。例如:

upstream hspservers{
    ip_hash;
    server 192.168.12.134:8081;
    server 192.168.12.134:8080;
}

4、fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配

upstream hspservers{
    server 192.168.12.134:8080;
    server 192.168.12.134:8081;
    fair;
}

实现步骤

修改 C:\Windows\System32\drivers\etc\hosts 配置虚拟主机名

#127.0.0.1 www.mynews.com

127.0.0.1 localhost

#eureka 主机名和 ip 映射

127.0.0.1 eureka9001.com

127.0.0.1 eureka9002.com

192.168.12.134 www.hsp.com

192.168.12.134 www.hspmall.com

192.168.12.134 www.hspcrm.com

修改 安装目录\nginx.conf

在 Linux 的 Tomcat8080 创建 webapps\search\look.html

look.html

<h1>tomcat 8080 search </h1>

在 Linux 下重新安装一份 Tomcat, 并将端口修改成 8081

  1. 修改 tomcat 的 conf\server.xml , 注意要修改如下位置,否则该 Tomcat 是不能正常工作.

  1. 细节说明:不同版本的 tomcat 修改的端口还不一样, 小伙伴们灵活处理即可,一定要认真,否则后面测试失败,你排除错误会花费很长时间,让你搞到怀疑人生

在 Linux 的 Tomcat8081 创建 webapps\search\look.html

look.html

<h1>tomcat 8081 search </h1>

linux 防火墙打开 80 端口, 保证外网可以访问

完成测试

启动 Linux 下两个 Tomcat

1、查看启动的端口, 确保有 8080 和 8081 端口在监听(老韩提示: 如果 tomcat 没有监听对应端口, 说明启动失败了, 可以尝试先执行 shutdown.sh 再执行 startup.sh 解决)

2、在 linux 下可以正常访问到两个页面

启动 或者 重新加载 Nginx

windows 浏 览 器 输 入 ( 保 证 浏 览 器 不 是 无 痕 上 网 ): http://www.hspcrm.com/search/look.html

注意事项和避免的坑

  1. nginx.conf 的 upstream 不能带下划线, 否则会失败, 但是语法检测不到

  1. 如果你的浏览器是无痕上网, 负载均衡可能失效, 因为 Nginx 无法采集到相关信息, 老师 就遇到这个情况. 改用其它浏览器即可(比如 chrome)

  2. 老韩提示: 如果某 tomcat 没有监听对应端口, 说明启动失败了, 可以尝试先执行

    shutdown.sh 再执行 startup.sh 解决

几个小实现-多测试

文档: Nginx 的 upstream 配置技巧

1、基本介绍

Nginx 是一个反向代理软件,大部分的网站都采用Nginx 作为网站/平台的
服务器软件。Nginx 除了可以直接作为web 服务器使用外,更多的情况是
通过反向代理将请求转发给上游服务器
配置上游服务器可以使用upstream 进行设置,通过upstream 可以实现服
务的负载均衡规则,可以提高服务器的高可用性。

2、地址: https://zhuanlan.zhihu.com/p/409693332

如果停掉 1 个 Tomcat, 会怎样?

如果停掉 1 个 Tomcat, 然后又恢复,会怎样?

如何给不同的服务,分配权重 weight

动静分离-应用实例

什么是动静分离

  1. Nginx 动静分离简单来说就是把动态跟静态请求分开,可以理解成使用 Nginx 处理静态页面/资源,Tomcat 处理动态页面/资源。
  2. 动静分离可以减轻 Tomcat 压力,静态请求由 Nginx 处理,提供系统整体性能.
  3. 回顾前面-示意图

需求说明/图解

动静配置-思路分析/图解

-- 示意图

先使用传统方式实现

  1. 创建tomcat\webapps\search\cal.jsp [老韩说明: 为了测试方便, 在tomcat2 也对应创建一份]
<%-- Created by IntelliJ IDEA. User: 韩顺平 Version: 1.0 To change this template use File | Settings | File Templates. --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <html>

        <head>
            <title>hello, jsp</title>
        </head>

        <body>
            <img src="image/cal.jpg" />
            <h1>JSP, 计算器</h1>
            <% int i=20; int j=70; int res=i + j; out.println(i + " + " + j + " = " + res); %>
        </body>

        </html>
  1. 拷贝 cal.jpg 到 tomcat\webapps\search\image 目录, [ 老韩说明: 为了测试方便, 在

    tomcat2 也对应创建一份]

  1. 浏览器访问 http://www.hspcrm.com/search/cal.jsp 就可以看到正确页面

动静分离优化步骤

  1. 修改 安装目录\nginx.conf

  1. 创 建 /usr/local/nginx/html/search/image 目 录 , 因 为 图 片 路 径 其 实 是

ip/search/image

  1. 将 Linux 的 两 个 Tomcat\webapps\search\image 目 录 删 除 , 在

/usr/local/nginx/html/search/image 目录下放入图片

  1. linux 防火墙打开 80 端口, 保证外网可以访问

完成测试

  1. 启动 或者 重新加载 Nginx
  2. windows 浏览器输入 http://www.hspcrm.com/search/cal.jsp

老师解读

  1. 这时图片就是从 Nginx 直接返回的
  2. 而请求cal.jsp 才转发到对应 tomcat 完成

如果有css js 文件 需要动静分离,按照规则配置即可

Nginx 工作机制&参数设置

master-worker 机制

master-worker 工作原理图-先搂一眼

-- 示意图

master-worker 机制

老韩图解

  1. 一个 master 管理多个 worker

一说master-worker 机制

  • 争抢机制示意图

老韩图解

  1. 一个master Process 管理多个worker process, 也就是说Nginx 采用的是多进程结构, 而不是多线程结构.

  2. 当client 发出请求(任务)时,master Process 会通知管理的 worker process

  3. worker process 开始争抢任务, 争抢到的worker process 会开启连接,完成任务

  4. 每个 worker 都是一个独立的进程,每个进程里只有一个主线程

  5. Nginx 采用了 IO 多路复用机制(需要在 Linux 环境), 使用 IO 多路复用机制, 是 Nginx 在使用为数不多的 worker process 就可以实现高并发的关键

二说master-worker 机制

  • 二说 Master-Worker 模式

老韩对上图说明

  • Master-Worker 模式

    1、Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。

    2、Master 进程 接收来自外界的信号,向各 worker 进程发送信号,每个进程都有可能来

处理这个连接。

​ 3、Master 进程能监控 Worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。

  • accept_mutex 解决 "惊群现象"/理论

1、所有子进程都继承了父进程的 sockfd,当连接进来时,所有子进程都将收到通知并“争着”与它建立连接,这就叫“惊群现象”。

2、大量的进程被激活又挂起,只有一个进程可以 accept() 到这个连接,会消耗系统资源。

3、Nginx 提供了一个 accept_mutex ,这是一个加在 accept 上的一把共享锁。即每个 worker 进程在执行 accept 之前都需要先获取锁,获取不到就放弃执行 accept()。有了这把锁之后,同一时刻,就只会有一个进程去 accpet(),就不会有惊群问题了。

4、当一个 worker 进程在 accept() 这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,完成一个完整的请求。

5、一个请求,完全由 worker 进程来处理,而且只能在一个 worker 进程中处理。

  • 用多进程结构而不用多线程结构的好处/理论

1、节省锁带来的开销, 每个 worker 进程都是独立的进程,不共享资源,不需要加锁。在编程以及问题查上时,也会方便很多。

2、独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快重新启动新的 worker 进程

  • 实现高并发的秘密-IO 多路复用

1、对于 Nginx 来讲,一个进程只有一个主线程,那么它是怎么实现高并发的呢?

2、采用了IO 多路复用的原理,通过异步非阻塞的事件处理机制,epoll 模型,实现了轻量级和高并发

3、nginx 是如何具体实现的呢,举例来说:每进来一个 request,会有一个 worker 进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发 request,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事件:"如果 upstream 返回了,告诉我一声,我再接着干"。于是他就休息去了。此时,如果再有 request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker 才会来接手,这个 request 才会接着往下走。由于 web server 的工作性质决定了每个request 的大部份生命都是在网络传输中,实际上花费在server 机器上的时间片不多,这就是几个进程就能解决高并发的秘密所在

  • 老韩小结:Nginx 的 master-worker 工作机制的优势

1、支持 nginx -s reload 热部署, 这个特征在前面我们使用过

2、对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多

3、每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式/IO 多路复用 来处理请求, 即使是高并发请求也能应对.

4、采用独立的进程,互相之间不会影响,一个 worker 进程退出后,其它 worker 进程还在工作,服务不会中断,master 进程则很快启动新的worker 进程

5. 一个 worker 分配一个 CPU , 那么 worker 的线程可以把一个 cpu 的性能发挥到极致

参数设置

worker_processes

  • 需要设置多少个 worker

每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。

  • 设置 worker 数量, Nginx 默认没有开启利用多核cpu,可以通过增加 worker_cpu_affinity配置参数来充分利用多核 cpu 的性能
#2 核cpu,开启2 个进程
worker_processes 2;
worker_cpu_affinity 01 10;
#2 核cpu,开启4 个进程,
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
#4 核cpu,开启2 个进程,0101 表示开启第一个和第三个内核,1010 表示开启第二个和
第四个内核;
worker_processes 2;
worker_cpu_affinity 0101 1010;
#4 个cpu,开启4 个进程
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
#8 核cpu,开启8 个进程
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
  • worker_cpu_affinity 理解

  • 配置实例
  1. vi /usr/local/nginx/nginx.conf

  1. 重新加载 nginx

/usr/local/nginx/sbin/nginx -s reload

  1. 查看 nginx 的 worker process 情况

worker_connection

  1. worker_connection 表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes
    1. 默认:worker_connections: 1024
    2. 调大:worker_connections: 60000,(调大到 6 万连接)
    3. 同时要根据系统的最大打开文件数来调整.

系统的最大打开文件数>= worker_connections*worker_process

根据系统的最大打开文件数来调整,worker_connections 进程连接数量要小
于等于系统的最大打开文件数,worker_connections 进程连接数量真实数量=worker_connections * worker_process
查看系统的最大打开文件数
ulimit -a|grep "open files"
open files (-n) 65535

  1. 根据最大连接数计算最大并发数:如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,而如果 是 HTTP 作 为 反 向 代 理 来 说 , 最 大 并 发 数 量 应 该 是 worker_connections * worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接, 看一个示意图

配置 Linux 最大打开文件数

  1. 使用 ulimit -a 可以查看当前系统的所有限制值,使用 ulimit -n 可以查看当前的最大打开文件数。

  2. 新装的linux 默认只有 1024,当作负载较大的服务器时,很容易遇到 error: too many open files。因此,需要将其改大。

  3. 使用 ulimit -n 65535 可即时修改,但重启后就无效了。(注 ulimit -SHn 65535 等效 ulimit

    -n 65535,-S 指soft,-H 指 hard)

  4. 有如下三种修改方式:

    1. 在/etc/rc.local 中增加一行 ulimit -SHn 65535
    2. 在/etc/profile 中增加一行 ulimit -SHn 65535
    3. 在/etc/security/limits.conf 最后增加如下两行记录
      • soft nofile 65535
      • hard nofile 65535

在 CentOS 中使用第 1 种方式无效果,使用第 3 种方式有效果,而在 Debian 中使用第 2 种有效果

  1. 参考: https://blog.csdn.net/weixin_43055250/article/details/124980838

搭建高可用集群

Keepalived+Nginx 高可用集群(主从模式)

集群架构图

- 老韩解读

1、准备两台 nginx 服务器, 一台做主服务器, 一台做备份服务器

2、两台 Nginx 服务器的 IP 地址, 可以自己配置, 不一定和老师一样(具体配置看 Linux 网络配置章节)

3、安装 keepalived , 保证主从之间的通讯

4、对外提供统一的访问 IP(虚拟 IP-VIP)

- 示意图

具体搭建步骤

搭建高可用集群基础环境

1、准备两台 Linux 服务器 192.168.198.130 和 192.168.198.131

  1. 可以克隆来完成
  2. 也可以直接拷贝一份

2、在两台 Linux 服务器, 安装并配置好 Nginx

  1. 安装配置Nginx 步骤前面讲过, 如果你克隆的Linux, 本身就有安装好了Nginx, 直接使用即可.
  2. 验证安装是否成功, 在 windows 可以通过 IP 访问到 Nginx, 具体的操作步骤和注意事项, 前面也都是说过了
  3. 因为我们是拷贝了一份 Linux , 而新的Linux 的 Ip 已经变化了, 所以需要克隆的 Linux的 nginx.conf 文件中的 IP 地址, 做相应的修改

  1. 如图

3、在两台 Linux 服务器, 安装 keepalived

  1. 下载 keepalived-2.0.20.tar.gz 源码安装包, https://keepalived.org/download.html

  1. 上传到两台 Linux /root 目录下

  1. mkdir /root/keepalived
  2. 解压文件到指定目录: tar -zxvf keepalived-2.0.20.tar.gz -C ./keepalived
  3. cd /root/keepalived/keepalived-2.0.20
  4. ./configure --sysconf=/etc --prefix=/usr/local

说明: 将配置文件放在 /etc 目录下, 安装路径在 /usr/local

  1. make && make install

说明: 编译并安装

  1. 如果成功, 就会安装好 keepalived 【可以检查一下】

    说明: keepalived 的配置目录在 /etc/keepalived/keepalived.conf keepalived 的启动指令在 /usr/local/sbin/keepalived

  2. 提示: 两台 Linux 都要安装 keepalived

完成高可用集群配置

  1. 将 其 中 一 台 Linux( 比 如 192.168.198.130) 指 定 为 Master : vi

/etc/keepalived/keepalived.conf

  1. 将其中一台 Linux( 比如 192.168.198.131) 指定为 Backup( 备份服务器) : vi

    /etc/keepalived/keepalived.conf

  1. 启动 两台 Linux 的keepalived 指令: /usr/local/sbin/keepalived
  2. 观察两台 linux 的 ens33 是否已经绑定 192.168.198.18

注意事项和细节

1、keepalived 启动后无法 ping 通 VIP,提示 ping: sendmsg: Operation not permitted https://blog.csdn.net/xjuniao/article/details/101793935

2、nginx+keepalived 配置说明和需要避开的坑

https://blog.csdn.net/qq_42921396/article/details/123074780

测试

1、首先保证 windows 可以连通 192.168.198.18 这个虚拟 IP

2、访问 nginx 如图

说明:大家可以看到, 因为 192.168.198.130 是 Master 他的优先级高, 所以访问的就是

192.168.198.130 的 Nginx, 同时仍然是支持负载均衡的.

3、停止 192.168.198.130 的 keepalived 服务, 否则直接关闭 192.168.198.130 主机

, 再次访问 http://192.168.198.18/search/cal.jsp , 这时虚拟 IP 绑定发生漂移, 绑定到

192.168.198.131 Backup 服务, 访问效果如图

这里老师直接关闭 192.168.198.130 Master 的 keepalived 来测试

自动检测Nginx 异常, 终止 keepalived

实现步骤

1、编写 shell 脚本: vi /etc/keepalived/ch_nginx.sh

简单说明: 下面的脚本就是去统计 ps -C nginx --no-header 的行数, 如果为 0 , 说明 nginx已经异常终止了, 就执行 killall keepalived

#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];then
killall keepalived
fi

2、修改 ch_nginx.sh 权限

chmod 755 ch_nginx.sh

3、修改 192.168.198.130 主 Master 配置文件, 指令: vi /etc/keepalived/keepalived.conf

4、重新启动 192.168.198.130 Master 的 keepalived , 这时因为 Master 的优先级高,会争夺到 VIP 优先绑定.

5、手动关闭 192.168.198.130 Master 的 Nginx

注意观察 keepalived 也终止了

6、再次访问 nginx , 发现 192.168.198.18 这个虚拟IP 又和 192.168.198.131 备份服务器绑定了.

注意事项

1、keepalived vrrp_script 脚本不执行解决办法

-打开日志观察

tail -f /var/log/messages

-重启 keepalived

systemctl restart keepalived.service

--老师说明一下: 备课时,曾经出现过文件找不到 可以修改执行脚本文件名,不要有_就 OK

  1. 如果配置有定时检查 Nginx 异常的脚本, 需要先启动 nginx ,在启动 keepalived ,否则 keepalived 一起动就被 killall 了
  2. 老师提醒: 小伙伴们配置时,会遇到各种各样问题,有针对性解决即可
  3. 配置文件keepalived.conf 详解
#这里只注释要修改的地方
global_defs {

    notification_email {

        test@foxmail.com #接收通知的邮件地址
    }
    notification_email_from Alexandre.Cassen@firewall.loc #发送邮件的邮箱
    smtp_server 192.168.200.1 #smtp server 地址
    smtp_connect_timeout 30
    router_id Node132 #Node132 为主机标识
    vrrp_skip_check_adv_addr
    #vrrp_strict #这里需要注释,避免虚拟ip 无法ping 通
    vrrp_garp_interval 0
    vrrp_gna_interval 0
}
vrrp_instance VI_1 {

    state MASTER #主节点MASTER 备用节点为BACKUP
    interface ens33 #网卡名称
    virtual_router_id 51 #VRRP 组名,两个节点的设置必须一样,指明属于同一VRRP 组
    priority 100 #主节点的优先级(1-254 之间),备用节点必须比主节点优先级低
    advert_int 1 #组播信息发送间隔,两个节点设置必须一样
    authentication {

        #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {

        #指定虚拟IP, 两个节点设置必须一样
        192.168.200.16
    }
}

nginx.conf 详解

 
#Nginx用户及组:用户 组。window下不指定
#user  nobody;
 
#工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。
worker_processes  1;
 
#错误日志:存放路径。
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid(进程标识符):存放路径
pid       /usr/local/nginx/logs/nginx.pid;
 
#一个进程能打开的文件描述符最大值,理论上该值因该是最多能打开的文件数除以进程数。
#但是由于nginx负载并不是完全均衡的,所以这个值最好等于最多能打开的文件数。
#LINUX系统可以执行 sysctl -a | grep fs.file 可以看到linux文件描述符。
worker_rlimit_nofile 65535;
 
 
events {
	#使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
	use epoll;
	
	#单个进程最大连接数(最大连接数=连接数*进程数)
    worker_connections  1024;
	
	#客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,
	#一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
	#client_header_buffer_size 4k;
}
 
 
http {
	#设定mime类型,类型由mime.type文件定义
    include       mime.types;
	
    default_type  application/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"';
	
		
	#用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径
	#记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息
	#access_log  logs/host.access.log  main;
	#access_log  logs/host.access.404.log  log404;
	
	#服务器名字的hash表大小
    server_names_hash_bucket_size 128;
	
	#客户端请求头缓冲大小。
    #nginx默认会用client_header_buffer_size这个buffer来读取header值,
    #如果header过大,它会使用large_client_header_buffers来读取。
    #如果设置过小HTTP头/Cookie过大 会报400 错误 nginx 400 bad request
    #如果超过buffer,就会报HTTP 414错误(URI Too Long)
    #nginx接受最长的HTTP头部大小必须比其中一个buffer大
    #否则就会报400的HTTP错误(Bad Request)
    #client_header_buffer_size 32k;
    #large_client_header_buffers 4 32k;
	
	
	#隐藏ngnix版本号
    #server_tokens off;
	
	#忽略不合法的请求头
    #ignore_invalid_headers   on;
	
	#让 nginx 在处理自己内部重定向时不默认使用  server_name设置中的第一个域名
    #server_name_in_redirect off;
	
	
	#客户端请求体的大小
    #client_body_buffer_size    8m;
   
  
    #开启文件传输,一般应用都应设置为on;若是有下载的应用,则可以设置成off来平衡网络I/O和磁盘的I/O来降低系统负载
    sendfile        on;
	
	
	#告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。
    #tcp_nopush     on;
	
	#tcp_nodelay off 会增加通信的延时,但是会提高带宽利用率。在高延时、数据量大的通信场景中应该会有不错的效果
    #tcp_nodelay on,会增加小包的数量,但是可以提高响应速度。在及时性高的通信场景中应该会有不错的效果
	tcp_nodelay on;
	
 
    #长连接超时时间,单位是秒
    keepalive_timeout  65;
 
    #gzip模块设置,使用 gzip 压缩可以降低网站带宽消耗,同时提升访问速度。
    #gzip  on;                     #开启gzip
    #gzip_min_length  1k;          #最小压缩大小
    #gzip_buffers     4 16k;       #压缩缓冲区
    #gzip_http_version 1.0;        #压缩版本
    #gzip_comp_level 2;            #压缩等级
    #gzip_types   text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss;#压缩类型
    
	
	
	
    #负载均衡
	#max_fails为允许请求失败的次数,默认为1
	#weight为轮询权重,根据不同的权重分配可以用来平衡服务器的访问率。
    # upstream myServer{
    #   server  192.168.247.129:8080 max_fails=3 weight=2;
    #   server  192.168.247.129:8081 max_fails=3 weight=4;	
    # }
	
	
	
    #server {
    #    listen       80;
	#	
	#	#IP/域名可以有多个,用空格隔开
	#	server_name  192.168.247.129;
	#	#server_name  www.test.com;
	#
    #    #charset koi8-r;
	#
    #    #access_log  logs/host.access.log  main;
	#	
	#   #反向代理配置,
    #   #将所有请求为www.test.com的请求全部转发到upstream中定义的目标服务器中。
    #   location / {
	#   			
	#	    #此处配置的域名必须与upstream的域名一致,才能转发。
	#	    proxy_pass http://myServer;
	#	    #proxy_pass http://192.168.247.129:8080;
	#		
	#		 proxy_connect_timeout 20;          #nginx跟后端服务器连接超时时间(代理连接超时)
	#		
    #        #client_max_body_size       10m;   #允许客户端请求的最大单文件字节数
    #        #client_body_buffer_size    128k;  #缓冲区代理缓冲用户端请求的最大字节数
	#		 #proxy_send_timeout         300;   #后端服务器数据回传时间(代理发送超时)
    #        #proxy_read_timeout         300;   #连接成功后,后端服务器响应时间(代理接收超时)
    #        #proxy_buffer_size          4k;    #设置代理服务器(nginx)保存用户头信息的缓冲区大小
    #        #proxy_buffers              4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
    #        #proxy_busy_buffers_size    64k;   #高负荷下缓冲大小(proxy_buffers*2)
    #        #proxy_temp_file_write_size 64k;   #设定缓存文件夹大小,大于这个值,将从upstream服务器传    		
	#		
	#		root   html;
	#		
	#		#定义首页索引文件的名称
	#		index  index.html index.htm;
    #    }
	#
    #   #动静分离 静态资源走linux 动态资源走tomcat
    #   # 注意 /source/image/下面寻找资源
    #   location /image/ {
    #       root /source/;
	#       autoindex on;
    #   } 		
	#
	#
	#    # 出现50x错误时,使用/50x.html页返回给客户端
    #    error_page   500 502 503 504  /50x.html;
    #    location = /50x.html {
    #        root   html;
    #    }
    #}
		
		
		
	#下面是配置生产环境中既支持HTTP又支持HTTPS,保证用户在浏览器中输入HTTP也能正常访问
	
	# SSL证书 配置                                 
	ssl_certificate     	cert/yphtoy.com.pem;   #加密证书路径
	ssl_certificate_key	cert/yphtoy.com.key;       #加密私钥路径
	ssl_protocols		TLSv1 TLSv1.1 TLSv1.2;     #加密协议
	ssl_session_cache	shared:SSL:1m;             #加密访问缓存设置,可以大大提高访问速度
	ssl_session_timeout	10m;                       #加密访问缓存过期时间
	ssl_ciphers		HIGH:!aNULL:!MD5;              #加密算法
	ssl_prefer_server_ciphers on;	               #是否由服务器决定采用哪种加密算法
	
	# 负载均衡
	upstream api_upstream
	{
	    server 127.0.0.1:8080 max_fails=3 weight=1;
		server 127.0.0.1:8081 max_fails=3 weight=1;
	}
	
	#api 接口(兼容HTTP)
	server{
	    listen 80;
		server_name api.test.com;
		# 301重定向跳转到HTTPS接口
		return 301 https://$server_name$request_uri;
		error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
	}
	
	#api 接口(兼容HTTPS)
	server{
	    listen 443 ssl;
		server_name api.test.com;
		location / {
		   root html;
		   index  index.html index.htm;
		   proxy_pass http://api_upstream;
		   
		   #语法: proxy_cookie_path oldpath replacepath;
		   #oldpath就是你要替换的路径 replacepath 就是要替换的值
		   #作用:同一个web服务器下面多个应用之间能获取到cookie
		   proxy_cookie_path /api/ /;
		   
		   #服务端接收的请求头Cooke值不变
		   proxy_set_header Cookie $http_cookie;
		}
	}
	
	#管理后台端(兼容HTTP)
	server{
	    listen 80;
		server_name manage.test.com;
		# 301重定向跳转到HTTPS接口
		return 301 https://$server_name/$request_uri;
		error_page 500 502 503 504 /50x.html;
		location = /50x.html{
			 root html	
		}
	}
	
	#管理后台端(兼容HTTPS)
	server{
	    listen 443 ssl;
		server_name manage.test.com;
		location / {
		    root /home/test/web/dist
			
			index /index.html;
			
			
			#语法:try_files 【$uri】 【 $uri/】 【参数】
			#当用户请求https://manage.test.com/login时,
			#一.如果配置了上面的默认index,会依次请求
			#1./home/test/web/dist/login       查找有没有login这个文件,没有的话
			#2./home/test/web/dist/index.html  有就直接返回
			
			#二.如果没有配置了上面的默认index或者配置了没有找到对应的资源,会依次请求
			#1./home/test/web/dist/login        查找有没有login这个文件,没有的话
			#2./home/test/web/dist/login/       查找有没有login这个目录,没有的话
		    #3.请求https://manage.test.com/index.html  nginx内部做了一个子请求
			
			#三.总的来说,index的优先级比try_files高,请求会先去找index配置,这里最后一个参数必须存在
			try_files $uri $uri/ /index.html;	
			
			
			
			#解决跨域问题
            #允许跨域请求地址(*表示全部,但是无法满足带cookie请求,因为cookie只能在当前域请求)
            add_header Access-Control-Allow-Origin $http_origin;
            #允许接收cookie和发送cookie
            add_header Access-Control-Allow-Credentials 'true';
            #允许请求的方法
            add_header Access-Control-Allow-Methods 'GET,POST,DELETE,PUT,OPTIONS';
            #允许请求头(Content-Type:请求数据/媒体类型 x-requested-with:判断请求是异步还是同步 自定义header 比如 token)
            add_header Access-Control-Allow-Headers $http_access_control_request_headers;
            #浏览器缓存请求头信息,1800秒内,只会有1次请求,不会出现"OPTIONS"预请求,节约资源
            #add_header Access-Control-Max-Age '1800';
		    if ($request_method = 'OPTIONS') {
                    return 204;
            }
			
			
			#服务端HttpServletRequest可以获得用户的真实ip
		    proxy_set_header X-Real-IP $remote_addr;
			
			#服务端HttpServletRequest可以获得用户的真实ip和经过的每一层代理服务器的ip
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			
			#服务端接收的请求头Host值不变
            proxy_set_header Host  $http_host;
			
            proxy_set_header X-Nginx-Proxy true;
		}
	}
}

posted @   青墨染烟雨  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示