28_linux笔记-web-nginx

文章目录

  • nginx 编译安装
    • ./configure
    • 安装脚本
  • nginx 模块
    • ngx_http_ssl_module
      • 示例1 https服务器的搭建
      • 示例2 访问http跳转到https
    • ngx_http_realip_module
    • ngx_http_autoindex_module
    • ngx_http_stub_status_module
    • ngx_http_auth_basic_module
    • ngx_http_rewrite_module
    • ngx_http_referer_module
    • ngx_http_limit_conn_module
    • ngx_http_limit_req_module
    • ngx_http_core_module
      • 主配置文件
      • 虚拟主机
        • 实验:基于域名的虚拟主机
      • location
      • 限速
  • 负载均衡
    • 负载均衡的算法
    • 七层负载均衡
      • 中台系统转发案例
    • 四层负载均衡
  • 高可用
    • VRRP协议
    • 实验:HA - 单vip
    • 实验:HA - 双vip
  • 其他内容
    • 实验:搭建自己域名的网站
    • deny和allow指令
    • 文件描述符

个人博客
https://blog.csdn.net/cPen_web


nginx 官方文档
http://nginx.org/en/docs/

nginx 编译安装

编译安装  很多功能可以自己定义

./configure

./configure
http://nginx.org/en/docs/configure.html

--user=lixinhai							#注:指定启动nginx的进程的用户
--group=lixinhai						#注:指定启动的组

--prefix=/usr/local/nginx1				#注:指定nginx的安装路径
--with-threads							#注:启用线程池的使用
--with-http_ssl_module 					#注:https
#注:启用构建将HTTPS协议支持添加 到HTTP服务器的模块的功能。默认情况下未构建此模块。需要OpenSSL库来构建和运行此模块。
--with-http_realip_module				#注:负载均衡
#注:启用构建ngx_http_realip_module 模块的功能,该 模块将客户端地址更改为在指定的标头字段中发送的地址。默认情况下未构建此模块。
--with-http_v2_module					#注:http2.0
--with-file-aio							#注:异步IO
#注:支持 在FreeBSD和Linux上使用 异步文件I / O(AIO)。
--with-http_stub_status_module			#注:状态统计
#注:支持构建ngx_http_stub_status_module 模块,该 模块提供对基本状态信息的访问。默认情况下未构建此模块。
--with-stream							#注:四层负载均衡的支持
--with-stream=dynamic					#注:支持构建 用于通用TCP / UDP代理和负载平衡的 流模块。默认情况下未构建此模块。  --> 四层负载均衡的支持


--with-http_flv_module					#注:开启某个功能
--without-http_gzip_module				#注:禁用某个功能

目录解释

[root@cPen_nginx nginx-1.19.6]# cd /usr/local/nginx1/
[root@cPen_nginx nginx1]# ls
conf  html  logs  sbin
# conf		存放配置文件
# html		存放网页(网站)
# logs		存放日志
# sbin		存放启动nginx的程序

启动nginx

[root@cPen_nginx sbin]# pwd
/usr/local/nginx1/sbin
[root@cPen_nginx sbin]# ./nginx 								#注:启动nginx
[root@cPen_nginx sbin]# /usr/local/nginx1/sbin/nginx 			#注:绝对路径启动
[root@cPen_nginx sbin]# ps aux|grep nginx 						#注:查看nginx的进程
root       19558  0.0  0.0  41084   848 ?        Ss   15:01   0:00 nginx: master process ./nginx
lixinhai   19559  0.0  0.2  74644  4740 ?        S    15:01   0:00 nginx: worker process
#注:master process  管理进程 父进程
#注:worker process  工作进程 子进程
#注:只要master进程在,worker进程被杀死后 会自动生成;但是master进程不在了,worker进程被杀死后 不会自动生成。

修改PATH

# 可以实现直接输入nginx启动
[root@cPen_nginx sbin]# PATH=$PATH:/usr/local/nginx1/sbin/		#注:临时修改
# 永久修改
#注:修改PATH变量,可以对下面的4个文件都可以追加进去
[root@cPen_nginx nginx]# vim /etc/bashrc 						#注:4个文件都可
[root@cPen_nginx nginx]# vim /etc/profile
[root@cPen_nginx nginx]# vim /root/.bashrc 
[root@cPen_nginx nginx]# vim /root/.bash_profile 				#注:永久修改
PATH=$PATH:$HOME/bin:/usr/local/nginx1/sbin/
# 脚本写法

#修改PATH变量
echo "PATH=$PATH:/usr/local/nginx1/sbin" >>/root/.bashrc
#执行修改了环境变量的脚本
source /root/.bashrc

nginx 命令

nginx -s stop
nginx -s quit	推荐
nginx -s reload	重新加载   灰度处理  旧 --> 新的 中间并没有暂停业务
				修改了nginx的配置文件
				相当于刷新服务  启动新的配置
nginx -t		测试nginx.conf配置文件是否有错误

官方文档解释

nginx -s signal	
Where signal may be one of the following:

·stop — fast shutdown						#注:立马停止
·quit — graceful shutdown					#注:正常的关闭 (已经服务的服务完)
·reload — reloading the configuration file	#注:重新加载配置文件 (慢慢从旧的进程过渡到新的进程)
·reopen — reopening the log files			#注:重新生成1个新的日志文件

设置开机启动

[root@cPen_nginx nginx]# vim /etc/rc.local 
/usr/local/nginx1/sbin/nginx
[root@cPen_nginx nginx]# chmod +x /etc/rc.d/rc.local

判断nginx 是否启动

# 看端口、看进程
[root@cPen_nginx ~]# ps aux|grep nginx
[root@cPen_nginx ~]# lsof -i:80

关闭防火墙

方便其他机器访问
#firewalld and selinux

#stop firewalld和设置下次开机不启动firewalld
service firewalld stop
systemctl disable firewalld

#临时停止selinux和永久停止selinux
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/sysconfig/selinux

安装脚本

#!/bin/bash

#解决软件的依赖关系,需要安装的软件包
yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake make
#useradd lixinhai
id lixinhai || useradd -s /sbin/nologin lixinhai
#download nginx
mkdir -p /nginx
cd /nginx
curl -O http://nginx.org/download/nginx-1.19.6.tar.gz
#解压 下载的nginx的源码包
tar xf nginx-1.19.6.tar.gz
cd nginx-1.19.6
#生成编译前配置工作 --> Makefile
./configure --prefix=/usr/local/nginx1  --user=lixinhai  --group=lixinhai --with-threads --with-http_ssl_module  --with-http_realip_module  --with-http_v2_module --with-file-aio  --with-http_stub_status_module --with-stream
#编译
make -j 2
#编译安装 --> 将编译好的二进制程序安装到指定目录 /usr/local/nginx1
make install

#修改PATH变量
echo "PATH=$PATH:/usr/local/nginx1/sbin" >>/root/.bashrc
#执行修改了环境变量的脚本
source /root/.bashrc

#启动nginx
/usr/local/nginx1/sbin/nginx

#firewalld and selinux

#stop firewalld和设置下次开机不启动firewalld
service firewalld stop
systemctl disable firewalld

#临时停止selinux和永久停止selinux
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/sysconfig/selinux

#开机自启
echo "/usr/local/nginx1/sbin/nginx" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local

如何卸载编译安装的nginx

# 删除安装指定的目录  --prefix指定的路径
[root@cPen_nginx ~]# rm -rf /usr/local/nginx1/

查看nginx版本

[root@cPen_nginx conf]# nginx -v
nginx version: nginx/1.19.6

nginx 模块

nginx是一个模块,一个功能

编译安装的参数

--with-http_stub_status_module	状态统计功能
--with-stream					4层负载均衡功能
--with-http_ssl_module			https
--with-http_realip_module		负载均衡器  中间件

ngx_http_ssl_module

功能:https

http + SSL --> 对http数据进行加密

去阿里云或者腾讯云申请免费的证书  --> 证书是什么?
	证书:其实就是我们的加密使用的密钥

示例1 https服务器的搭建

#步骤1.1:去申请证书,并且下载下来

======================================================================
#步骤1.2:证书需要上传到自己的linux服务器里

[root@cPen_nginx conf]# pwd
/usr/local/nginx1/conf 								#注:证书建议存放在conf目录下
[root@cPen_nginx conf]# ls 5151781_www.cpen.top_nginx.zip 
5151781_www.cpen.top_nginx.zip
[root@cPen_nginx conf]# unzip 5151781_www.cpen.top_nginx.zip 
[root@cPen_nginx conf]# ls 5151781_www.cpen.top*
5151781_www.cpen.top.key  5151781_www.cpen.top_nginx.zip  5151781_www.cpen.top.pem

======================================================================
#步骤1.3:修改nginx.conf配置文件,使用证书

#注:配置文件改之前 做备份
[root@cPen_nginx conf]# cp nginx.conf nginx.conf.20210202.bak
[root@cPen_nginx conf]# vim nginx.conf				#注:可以复制注释的部分
server {											#注:https的配置
        listen       443 ssl;						#注:监听的端口号
        server_name  www.cpen.top;					#注:虚拟主机对应的域名
        access_log  logs/cpen.top.access.log  main;	#注:正常的访问信息(访问日志)
        error_log  logs/cpen.top.error.log;			#注:出错的信息(错误日志)

        ssl_certificate      5151781_www.cpen.top.pem;	#注:公钥 --> 证书
        ssl_certificate_key  5151781_www.cpen.top.key;	#注:私钥

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html/cpen.top;
            index  index.html index.htm;
        }
    }
----------------------------------------------------------------------
[root@cPen_nginx conf]# nginx -s reload
[root@cPen_nginx cpen.top]# netstat -anplut|grep nginx	#注:https监听443端口
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      955/nginx: master p 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      955/nginx: master p 

======================================================================
#步骤1.4:修改本地hosts文件

C:\Windows\System32\drivers\etc\hosts
192.168.1.11  www.cpen.top

效果

www.cpen.top --> https://www.cpen.top/	#注:虚拟主机 匹配不到时,默认选第一个虚拟主机
或者直接访问  https://www.cpen.top/ 成功

示例2 访问http跳转到https

3种方法:proxy_pass、return 301、rewrite
#步骤:修改配置文件

[root@cPen_nginx conf]# vim nginx.conf
server {												#注:http虚拟主机
        listen       80;
        server_name  www.cpen2.top;

        location / {
            #proxy_pass  https://www.cpen.top;  #效果不是特别好
            return  301 https://www.cpen.top;   #效果非常好 (最好)
            #rewrite /(.*) https://www.qq.com permanent;
            #rewrite /(.*) https://www.cpen.top permanent;  #效果也非常好
        }
}

=========================================================================
#注:修改本地hosts文件

C:\Windows\System32\drivers\etc\hosts  (Windows)
192.168.1.11  www.cpen2.top

=========================================================================
#注:效果  Chrome浏览器

www.cpen2.top --> https://www.cpen.top/ 

ngx_http_realip_module

编译安装时 加上  --with-http_realip_module模块
	让后端real server知道前端(client)的ip地址
	模块  ngx_http_realip_module
real-ip模块的使用
	当本机的nginx处于一个反向代理的后端时获取到真实的用户IP
	给后端的backend服务器使用的
后端的real server不知道前端真正访问的ip地址,只是知道负载均衡的ip地址,如何让后端的real server知道前端真正的用户的ip地址?

	解决方法1:后端real server不使用realip模块
	解决方法2:后端real server使用realip模块
#解决方法1:后端real server不使用realip模块

#步骤1.1:在负载均衡器上修改http请求报文头部字段,添加一个X_REAL_IP字段

[root@cPen-LB conf]# vim nginx.conf
http {
    ……
upstream myweb1 {
        server 192.168.1.161 weight=1;
        server 192.168.1.162 weight=1;
        server 192.168.1.163 weight=1;
    }
    server {
        listen       80;
        server_name  www.sc.com;
        location / {
            proxy_pass  http://myweb1;
            proxy_set_header  X-Real-IP  $remote_addr;
        }
    }
    ……
}

#注:详解
将nginx内部的remote_addr这个变量的值,赋值给X-Real-IP这个变量,X-Real-IP这个变量会在http协议的请求报文里添加一个X-Real-IP的字段,后端的real server 服务器上的nginx就可以读取这个字段的值
X-Real-IP  这个变量名可以自己定义,随便取名,后面引用的时候,不区分大小写

proxy_set_header 指令的作用就是告诉nginx去修改http协议的头部信息,增加一个字段

--------------------------------------------------------------------------------------------
#步骤1.2:在后端real server上使用这个x_real_ip这个字段

#注:详解
在主配置文件nginx.conf里的日志部分调用这个变量,获取x_real_ip的值
$HTTP_X_REAL_IP
[root@cPen-web1 conf]# vim nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $HTTP_X_Real_IP - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    ……
}

--------------------------------------------------------------------------------------------
#注:效果

Chrome浏览器
192.168.1.160  --> 192.168.1.161  real server1
[root@cPen-web1 conf]# tail -f /usr/local/nginx1/logs/feng.com.access.log	#注:real server1 的访问日志
192.168.1.160 - 192.168.1.3 - - [04/Feb/2021:20:01:18 +0800] "GET / HTTP/1.0" 200 626 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36" "-"
#注:获取到真实的用户IP 192.168.1.3

===========================================================================================
#解决方法2:后端real server使用realip模块

#步骤2.1:同上

在负载均衡器上修改http请求报文头部字段,添加一个X_REAL_IP字段
[root@cPen-LB conf]# vim nginx.conf
http {
    ……
upstream myweb1 {
        server 192.168.1.161 weight=1;
        server 192.168.1.162 weight=1;
        server 192.168.1.163 weight=1;
    }
    server {
        listen       80;
        server_name  www.sc.com;
        location / {
            proxy_pass  http://myweb1;
            proxy_set_header  X-Real-IP  $remote_addr;
        }
    }
    ……
}

--------------------------------------------------------------------------------------------
#步骤2.2:在后端real server上使用set_real_ip_from 192.168.0.160

[root@cPen-web2 conf]# vim nginx.conf
server {
        listen       80;
        set_real_ip_from 192.168.1.160; #告诉本机的nginx 192.168.0.160 是负载均衡器,不是真正的client
    ……

#注:详解
set_real_ip_from 192.168.0.160;	告诉本机的nginx 192.168.0.160 是负载均衡器,不是真正的client

--------------------------------------------------------------------------------------------
#注:效果

Chrome浏览器
192.168.1.160  --> 192.168.1.161  real server1
[root@cPen-web2 conf]# tail -f /usr/local/nginx1/logs/feng.com.access.log	#注:real server2 的访问日志
192.168.1.3 - - [04/Feb/2021:20:01:17 +0800] "GET / HTTP/1.0" 200 626 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36" "-"
#注:获取到真实的用户IP 192.168.1.3

ngx_http_autoindex_module

模块学习:利用nginx做网站提供下载功能

ngx_http_autoindex_module 模块,把文件夹里的东西列出来给你看

autoindex on 指令放在 location / 下,实现下载功能

#步骤1:修改配置文件

[root@cPen_nginx conf]# vim nginx.conf
server {
        listen 80;
        server_name  www.a.com;
        access_log  logs/a.com.access.log  main;
        location / {
            root   html/a.com;
            index  index.html index.htm;
            autoindex on;
        }
        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html/a.com;
        }
    }

-------------------------------------------------------------------
#步骤2:刷新nginx服务

[root@cPen_nginx conf]# nginx -s reload

-------------------------------------------------------------------
#步骤3:准备一个下载的目录,赋值一些文件到里面去,供其他人可以下载,测试这个下载功能

[root@cPen_nginx b.com]# mkdir download
[root@cPen_nginx b.com]# mkdir cPen
[root@cPen_nginx b.com]# cd download/
[root@cPen_nginx download]# cp /nginx/nginx-1.19.6 . -r
[root@cPen_nginx download]# cp /etc/hosts .
[root@cPen_nginx download]# cp /etc/passwd .

效果

Chrome浏览器
http://www.b.com/download/
	只能提供下载功能,别人不能上传文件(不能提供上传)

28_linux笔记-web-nginx_第1张图片


ngx_http_stub_status_module

模块学习:nginx状态统计功能

要求:编译安装时构建模块  --with-http_stub_status_module

功能:知道当前时刻有多少人在线,进行状态统计
官网示例
location = /basic_status {
    stub_status;
}
#步骤:添加路由

[root@cPen_nginx conf]# vim nginx.conf
server {
        listen 80;
        server_name  www.c.com;
        access_log  logs/c.com.access.log  main;
        location / {
            root   html/c.com;
            index  index.html index.htm;
        }
        location = /status {			#注:= 号  精准匹配
            stub_status;
        }
        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html/c.com;
        }
    }

-------------------------------------------------------------------
#效果

Chrome浏览器
http://www.c.com/status

28_linux笔记-web-nginx_第2张图片


ngx_http_auth_basic_module

模块学习:认证功能 (认证模块)

官网示例
location / {
    auth_basic           "closed site";
    auth_basic_user_file conf/htpasswd;
}

可以给任意的url增加认证功能:
给 http://www.c.com/status --> 访问这个url需要提供用户名和密码
给 http://www.b.com/download/ --> 访问这个url需要提供用户名和密码

步骤1:修改配置文件

[root@cPen_nginx conf]# vim /usr/local/nginx1/conf/nginx.conf
server {
        listen 80;
        server_name  www.b.com;
……
        #下载需要提交用户名和密码
        location = /download {								#注:路由/download
            auth_basic           "sanchuang download site";	#注:站点名
            auth_basic_user_file b.com.htpasswd;			#注:认证文件
        }
    }
……
server {
        listen 80;
        server_name  www.c.com;
……
        location = /status {								#注:路由/status
            auth_basic           "sanchuang site";			#注:站点名
            auth_basic_user_file htpasswd;					#注:认证文件
            stub_status;
        }

-----------------------------------------------------------------------------------------
步骤2:生成 htpasswd文件,文件里存放我们的用户名和密码

#注:认证文件放在conf目录下
#问:htpasswd文件 到底需要放到哪里?哪个目录?
	#答:/usr/local/nginx1/conf目录下
	/usr/local/nginx1/conf/htpasswd
	/usr/local/nginx1/conf/b.com.htpasswd

[root@cPen_nginx conf]# yum provides htpasswd
httpd-tools-2.4.37-30.module_el8.3.0+561+97fdbbcc.x86_64 : Tools for use with the Apache HTTP Server
[root@cPen_nginx conf]# yum install httpd-tools -y							#注:得到htpasswd命令
[root@cPen_nginx conf]# htpasswd -c /usr/local/nginx1/conf/htpasswd cali	#注:设置认证文件
New password: 																#注:认证用户名和密码
[root@cPen_nginx conf]# htpasswd -c /usr/local/nginx1/conf/b.com.htpasswd feng
New password: 
[root@cPen_nginx conf]# cat htpasswd 
cali:$apr1$agL3hnrA$dWwcbnAe5HnifgnIItJrC1
[root@cPen_nginx conf]# cat b.com.htpasswd 
feng:$apr1$cqOa9pfC$02gF0.0c.9kKmz/KGzQp91

-----------------------------------------------------------------------------------------
步骤3:重新启动nginx服务

[root@cPen_nginx conf]# nginx -s reload

========================================
效果:
Chrome浏览器
http://www.c.com/status

28_linux笔记-web-nginx_第3张图片


ngx_http_rewrite_module

模块学习:rewrite功能
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

rewrite功能 https://www.cnblogs.com/brianzhu/p/8624703.html
rewrite功能 https://www.cnblogs.com/crazymagic/p/11034300.html
rewrite功能 https://segmentfault.com/a/1190000002797606
示例1:页面跳转

  • 办法1:dns域名解析
www.360buy.com --> www.jd.com
www.jd.com --> 111.13.149.108
  • 办法2:页面跳转功能 (HTML实现 meta标签)
<head>
……						#注:5  5s跳转
<meta http-equiv="refresh" content="5;url=https://www.sanchuangedu.cn"> 
head>
#注:0  0s跳转
<meta http-equiv="refresh" content="0;url=https://www.sanchuangedu.cn"> 

示例2:对url进行转发

rewrite ^/(.*) http://www.sanchuangedu.cn/$1 permanent;
#解释:
	http://www.b.com/feng --> http://www.sanchuangedu.cn/feng    #注:$1表示 第一个组 feng
	http://www.b.com/lixinhia --> http://www.sanchuangedu.cn/lixinhia 
	#注:permanent永久重定向的意思
	
	rewrite是实现URL重定向的重要指令,他根据regex(正则表达式)来匹配内容跳转到相应的网站
#步骤:修改配置文件

[root@cPen_nginx conf]# vim nginx.conf
    server {
        listen 80;
        server_name  www.b.com;
        access_log  logs/b.com.access.log  main;  
        location / {
            root   html/b.com;
            index  index.html index.htm;
            autoindex on;
        rewrite ^/(.*) http://www.sanchuangedu.cn/$1 permanent;
        } 
	……
    }
-----------------------------------------------
#效果:

http://b.com --> https://www.sanchuangedu.cn/
http://b.com/cpen --> https://www.sanchuangedu.cn/cpen/ 

ngx_http_referer_module

模块 ngx_http_referer_module  与引用相关的模块

http://nginx.org/en/docs/http/ngx_http_referer_module.html#valid_referers

防盗链
	rewrite功能可以帮我们去做,防止别人盗

http标签里有 http_referer,这个字段写明你曾经从哪个网站跳转过来的
	http_referer	从哪个网站导流过来的 --> 引流过来的
#步骤:修改配置文件 (图片防盗链)

[root@cPen_nginx conf]# vim nginx.conf
        location ~* \.(gif|jpg|png|swf|flv)$ {
            valid_referers none blocked www.a.cn www.b.com; # 定义有效的引用
            if ($invalid_referer) {
                return 404;
            }
        } # 防盗链
#注解:
	none  blocked  www.a.cn  www.b.com	有效的引用	
	直接访问的,requests 包头里的refere字段没有内容 --> none
	blocked代表有 referer 但是被防火墙或者是代理给去除了
	refere字段的内容里有 www.a.cn www.b.com 这些字符串
	当不满足 valid_referers 指令的条件,就返回1赋值给$invalid_referer这个变量

ngx_http_limit_conn_module

模块  ngx_http_limit_conn_module  限制连接的模块

http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

官网示例
	可以根据ip地址或者域名来限制

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server {
    ...
    limit_conn perip 10;
    limit_conn perserver 100;
}
#示例:

[root@cPen_nginx conf]# vim nginx.conf
limit_conn_zone $binary_remote_addr zone=perip:10m;
    server {
        listen 80;
        limit_conn perip 1;

#注:for循环写个脚本,发起10个进程去下载资源,后面9个会下载失败

ngx_http_limit_req_module

限制请求数
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

官方示例

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;		#注:在http里面开辟空间
limit_req_zone $server_name zone=perserver:10m rate=10r/s;

server {
    ...
    limit_req zone=perip burst=5 nodelay;
    limit_req zone=perserver burst=10;
}
#示例:修改配置文件

[root@cPen_nginx conf]# vim nginx.conf
http {
    ……
limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
    server {
        listen       80;
        server_name  www.feng.com;
        limit_req zone=perip burst=1 nodelay;
    ……
}

效果
503


ngx_http_core_module

主配置文件

属于nginx核心模块内容
http://nginx.org/en/docs/http/ngx_http_core_module.html

[root@cPen_nginx conf]# vim nginx.conf
#user  nobody;						#注:默认使用nobody用户去启动nginx
worker_processes  1;				#注:工作进程的数量,建议工作进程的数量和CPU核心一致

#error_log  logs/error.log;			#注:错误日志 /usr/local/nginx1/logs/……
#error_log  logs/error.log  notice;	#注:notice通知
#error_log  logs/error.log  info;	#注:级别 info级别

#pid        logs/nginx.pid;			#注:nginx master的进程号pid 
#注:/usr/local/nginx1/logs/nginx.pid


events {		
#注:需要根据实际的CPU,内存,带宽,磁盘IP能力来进行压力测试
#注:1个cpu核心 --> 4G的内存
    worker_connections  1024;		#注:并发数量,同时可以允许多少人同时访问nginx
}									#注:--> 同时1024个人访问 (开的线程)
									#注:一个用户访问,nginx就会起一个线程来接待
									#注:worker_processes * worker_connections = 2 * 1024=2048

http {								#注:http协议的相关的配置
    include       mime.types;		#注:nginx服务器支持打开哪些文件类型 /usr/local/nginx1/conf/mime.types
    default_type  application/octet-stream;
									#注:日志格式 log_format
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '	
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
						#注:远程ip地址、远程用户、本地时间、请求报文、状态码……
    #access_log  logs/access.log  main;		#注:正常的访问日志 /usr/local/nginx1/…

    sendfile        on;				#注:发送文件  启动异步数据加载  传输方面的加速
    #tcp_nopush     on;				#注:传输层push标志位,nopush

    #keepalive_timeout  0;
    keepalive_timeout  65;			#注:65秒后nginx会主动断开连接

    #gzip  on;						#注:启用压缩功能 --> 加快传输的速度    gzip模块
#注:将index.html压缩 传送过来,所用的时间短一些

    server {						#注:提供web服务的配置 --> 虚拟主机 --> 网站
        listen       80;			#注:监听80端口
        server_name  localhost;		#注:网站服务的域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;	#注:访问日志的路径和格式

        location / {				#注:提供某个路由的配置 --> / 访问网站的根目录
            root   html;			#注:html是存放网页的根目录 --> /usr/local/nginx1/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	#注:lnmp的架构
        #
        #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							#注:对HTTPS的支持的配置
    #
    #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;
    #    }
    #}

}
/usr/local/nginx1/conf/nginx.conf
配置文件:给进程传参
[root@cPen_nginx conf]# pwd
/usr/local/nginx1/conf
[root@cPen_nginx conf]# ls nginx.conf
nginx.conf
[root@cPen_nginx conf]# cat /proc/cpuinfo 	#注:cpu信息,比如CPU核心数

虚拟主机

虚拟主机是核心模块的功能

virtual server --> 虚拟主机

nginx服务器 --> 跑很多的虚拟主机 --> 网站
虚拟主机的配置
	基于域名的
		最常见的
	基于 IP 的虚拟主机
		一个网站对应一个公网ip
	基于端口的虚拟主机
		一个网站一个端口

实验:基于域名的虚拟主机

www.a.com 192.168.1.11
www.b.com 192.168.1.11
www.c.com 192.168.1.11

#注:架构 (修改nginx.conf主配置文件)
[root@cPen_nginx conf]# vim nginx.conf
http{

server{
    server_name www.a.com
……
}
server{
    server_name www.b.com
……
}
server{
    server_name www.c.com
……
}
}

步骤1:第1步是修改nginx.conf主配置文件,添加3个虚拟主机的配置

# 修改主配置文件,添加3个虚拟主机的配置
[root@cPen_nginx conf]# vim nginx.conf
http {
……
server {
        listen 80;
        server_name  www.a.com;
        access_log  logs/a.com.access.log  main;
        location / {
            root   html/a.com;
            index  index.html index.htm;
        }
        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html/a.com;
        }
    }
    server {
        listen 80;
        server_name  www.b.com;
……
……
}

# 重启服务
[root@cPen_nginx conf]# nginx -t
[root@cPen_nginx conf]# nginx -s reload

步骤2:到存放网页的地方新建文件夹和网页

[root@cPen_nginx conf]# cd /usr/local/nginx1/html/
[root@cPen_nginx html]# mkdir a.com b.com c.com
[root@cPen_nginx html]# cd a.com/
[root@cPen_nginx a.com]# vim index.html
[root@cPen_nginx a.com]# vim 404.html
[root@cPen_nginx a.com]# vim 50x.html
[root@cPen_nginx a.com]# cd ..
[root@cPen_nginx html]# cp a.com/* b.com/
[root@cPen_nginx html]# cp a.com/* c.com/
[root@cPen_nginx html]# yum install tree -y
[root@cPen_nginx html]# tree 
.
├── a.com
│?? ├── 404.html
│?? ├── 50x.html
│?? └── index.html
├── b.com
……

步骤3:在客户机上直接修改hosts文件进行域名解析

# Linux里修改
[root@web-client ~]# vim /etc/hosts 
192.168.1.11  www.a.com
192.168.1.11  www.b.com
192.168.1.11  www.c.com

# Windows系统里修改
C:\Windows\System32\drivers\etc\hosts
192.168.1.11  www.a.com
192.168.1.11  www.b.com
192.168.1.11  www.c.com

查看效果

# Linux客户机
[root@web-client ~]# curl www.a.com			#注:访问 查看效果
welcome to a.com
[root@web-client ~]# curl www.a.com/chenpeng
404 error a.com 
[root@web-client ~]# curl www.a.com/50x.html
50x error a.com

# Windows客户机
http://www.a.com/			welcome to a.com
http://www.a.com/chenpeng	404 error a.com
http://www.a.com/50x.html	50x error a.com

location

location 属于 ngx_http_core_module 模块
	= 优先级最高(进准匹配);/ 优先级最低(模糊匹配)

location对url的匹配
http://nginx.org/en/docs/http/ngx_http_core_module.html#location

URI和URL
	http://www.a.com/download/a.txt --> URL
	download/a.txt --> URI (不看前面的域名、协议)

location语法规则
https://blog.csdn.net/zwl18210851801/article/details/81699977

示例:location路由转发功能

#步骤:修改配置文件

[root@cPen_nginx conf]# vim nginx.conf
server {
        listen 80;
        server_name  www.d.com;
        location / {
            proxy_pass http://www.qq.com;			#注:proxy_pass --> 转发
            #注:也可以rewrite 转发
        #rewrite ^/(.*) http://www.sanchuangedu.cn/$1 permanent;
        }
    }

-------------------------------------------------------
#步骤:修改hosts文件 (Windows)

C:\Windows\System32\drivers\etc\hosts
192.168.1.11  www.d.com

-------------------------------------------------------
#步骤:访问www.d.com

www.d.com --> https://www.qq.com/

限速

http://nginx.org/en/docs/http/ngx_http_core_module.html#limit_rate

官网示例

location /flv/ {
    flv;
    limit_rate_after 500k;
    limit_rate       50k;
}
此处官方网站介绍有误
	不起限速作用
	放在http里或者server里 生效

当一个文件下载到指定大小(本例中为500k)之后开始限速
#示例:修改配置文件

[root@cPen_nginx conf]# vim nginx.conf
    server {
        listen 80;
        limit_rate_after 10k;
        limit_rate 5k;
------------------------------------------
#注:配置不能放在location里,不然不会生效
#注:放在http里或者server里 生效 (只是http里会影响所有的server)

负载均衡

反向代理和正向代理区别
https://www.cnblogs.com/taostaryu/p/10547132.html

正向代理
	正向代理类似一个跳板机,代理内部机器去访问外部资源	#注:站在用户一方去思考
反向代理
	代理服务器在企业一方  							#注:为企业加速
为什么需要负载均衡? 
	答:用户量大。大流量大负载,负载均衡的引入

如何把用户均匀的分散到15台服务器上?
	答:负载均衡器 LB  HTTP load balancer

负载均衡的算法

http://nginx.org/en/docs/http/load_balancing.html

负载均衡策略 (方法、算法) - 调度方法
	round-robin		轮询、轮叫、rr算法		#注:均衡访问,默认的调度算法
	least-connected	最小连接数
	ip-hash			让同一个ip地址的所有的请求都集中到一台服务器	
										#注:可以解决session的问题
	以上是3种经典算法

	Generic Hash						#注:url hash
	Least Time (NGINX Plus only)
	Random
	Server Weights

https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/

Generic Hash							#注:根据url做哈希
Least Time (NGINX Plus only)			#注:最低平均延迟  PLUS 付钱的插件
Random									#注:随机
Server Weights							#注:加权  常见加权轮询
										#注:weight 权重  默认是1,越大权重越高

七层负载均衡

http://nginx.org/en/docs/http/load_balancing.html
实验:nginx - 负载均衡实验

准备环境: 
网卡类型使用桥接
4台Linux服务器  1个核心1G

nginx - 负载均衡实验图 (数据流向图 + 物理连接图)
28_linux笔记-web-nginx_第4张图片

默认的调度算法 是rr 轮询调度
官网示例

http {
    upstream myapp1 {						#注:upstream上游,指后端 real server
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://myapp1;
        }
    }
}

示例:默认轮询

#示例:HTTP load balancer  			#注:默认算法 rr  轮询

[root@cPen-LB conf]# vim nginx.conf
http {
    ……
    #定义上游服务器集群,定义一个负载均衡器
upstream myweb1 {
        server 192.168.1.161;
        server 192.168.1.162;
        server 192.168.1.163;
    }
    server {
        listen       80;
        server_name  www.sc.com;					#注:基于域名的访问
        location / {
            proxy_pass  http://myweb1;
        }
    }
……
}

#注:LB不需要真正的提供web服务(但要打开nginx)
#注:real server需要真正的提供web服务
-------------------------------------------------------------------------------
#注:效果

Chrome浏览器
192.168.1.160  --> 192.168.1.161  real server1
192.168.1.160  --> 192.168.1.162  real server2
192.168.1.160  --> 192.168.1.163  real server3
或
www.sc.com --> 192.168.1.161  real server1
www.sc.com --> 192.168.1.162  real server2
www.sc.com --> 192.168.1.163  real server3

示例:最小连接数 - ip_hash - 加权轮询

#示例:算法  最小连接数 least-connected

[root@cPen-LB conf]# vim nginx.conf
#定义上游服务器集群,定义一个负载均衡器
    upstream myweb1 {
        least_conn;					#注:添加这个
        server 192.168.1.161;
        server 192.168.1.162;
        server 192.168.1.163;
    }
    server {
        listen       80;
        server_name  www.sc.com;
        location / {
            proxy_pass  http://myweb1;
        }
    }

===============================================================================
#示例:算法  ip_hash

#注:Session persistence  会话持久性
#注:让同一个ip地址的所有的请求都集中到一台服务器

[root@cPen-LB conf]# vim nginx.conf
#定义上游服务器集群,定义一个负载均衡器
    upstream myweb1 {
        ip_hash;						#注:添加这个
        server 192.168.1.161;
        server 192.168.1.162;
        server 192.168.1.163;
    }
    server {
        listen       80;
        server_name  www.sc.com;
        location / {
            proxy_pass  http://myweb1;
        }
    }

===============================================================================
#示例:算法  加权负载均衡

#注:Weighted load balancing

#注:weight权重值 默认值是1
#注:weight值越大权重越高,得到的请求数就会越多
-----------------------------------------------------
#示例:加权轮询 (加权 + 轮询)

[root@cPen-LB conf]# vim nginx.conf
#定义上游服务器集群,定义一个负载均衡器
    upstream myweb1 {
        server 192.168.1.161 weight=1;
        server 192.168.1.162 weight=3;
        server 192.168.1.163 weight=6;
    }
    server {
        listen       80;
        server_name  www.sc.com;
        location / {
            proxy_pass  http://myweb1;
        }
    }

#注:轮询、ip_hash、最小连接数 应该都适合加权
#注:加权论询 考虑到服务端的性能差异性。加权论询效果最好

#注:weight值越大权重越高,得到的请求数就会越多

图示:数据流
28_linux笔记-web-nginx_第5张图片

#注:数据传到real server1时,源ip变成了LB的ip

[root@cPen-web1 conf]# tail -f /usr/local/nginx1/logs/feng.com.access.log	#注:web1 访问日志
192.168.1.160 - - [03/Feb/2021:15:21:14 +0800] "GET / HTTP/1.0" 200 626 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36" "-"		#注:为LB 的ip地址
后端的real server不知道前端真正访问的ip地址,只是知道负载均衡的ip地址,如何让后端的real server知道前端真正的用户的ip地址?

	解决方法1:后端real server不使用realip模块
	解决方法2:后端real server使用realip模块
#解决方法1:后端real server不使用realip模块

#步骤1.1:在负载均衡器上修改http请求报文头部字段,添加一个X_REAL_IP字段

[root@cPen-LB conf]# vim nginx.conf
http {
    ……
upstream myweb1 {
        server 192.168.1.161 weight=1;
        server 192.168.1.162 weight=1;
        server 192.168.1.163 weight=1;
    }
    server {
        listen       80;
        server_name  www.sc.com;
        location / {
            proxy_pass  http://myweb1;
            proxy_set_header  X-Real-IP  $remote_addr;
        }
    }
    ……
}

#注:详解
将nginx内部的remote_addr这个变量的值,赋值给X-Real-IP这个变量,X-Real-IP这个变量会在http协议的请求报文里添加一个X-Real-IP的字段,后端的real server 服务器上的nginx就可以读取这个字段的值
X-Real-IP  这个变量名可以自己定义,随便取名,后面引用的时候,不区分大小写

proxy_set_header 指令的作用就是告诉nginx去修改http协议的头部信息,增加一个字段

--------------------------------------------------------------------------------------------
#步骤1.2:在后端real server上使用这个x_real_ip这个字段

#注:详解
在主配置文件nginx.conf里的日志部分调用这个变量,获取x_real_ip的值
$HTTP_X_REAL_IP
[root@cPen-web1 conf]# vim nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $HTTP_X_Real_IP - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    ……
}

--------------------------------------------------------------------------------------------
#注:效果

Chrome浏览器
192.168.1.160  --> 192.168.1.161  real server1
[root@cPen-web1 conf]# tail -f /usr/local/nginx1/logs/feng.com.access.log	#注:real server1 的访问日志
192.168.1.160 - 192.168.1.3 - - [04/Feb/2021:20:01:18 +0800] "GET / HTTP/1.0" 200 626 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36" "-"
#注:获取到真实的用户IP 192.168.1.3

===========================================================================================
#解决方法2:后端real server使用realip模块

#步骤2.1:同上

在负载均衡器上修改http请求报文头部字段,添加一个X_REAL_IP字段
[root@cPen-LB conf]# vim nginx.conf
http {
    ……
upstream myweb1 {
        server 192.168.1.161 weight=1;
        server 192.168.1.162 weight=1;
        server 192.168.1.163 weight=1;
    }
    server {
        listen       80;
        server_name  www.sc.com;
        location / {
            proxy_pass  http://myweb1;
            proxy_set_header  X-Real-IP  $remote_addr;
        }
    }
    ……
}

--------------------------------------------------------------------------------------------
#步骤2.2:在后端real server上使用set_real_ip_from 192.168.0.160

[root@cPen-web2 conf]# vim nginx.conf
server {
        listen       80;
        set_real_ip_from 192.168.1.160; #告诉本机的nginx 192.168.0.160 是负载均衡器,不是真正的client
    ……

#注:详解
set_real_ip_from 192.168.0.160;	告诉本机的nginx 192.168.0.160 是负载均衡器,不是真正的client

--------------------------------------------------------------------------------------------
#注:效果

Chrome浏览器
192.168.1.160  --> 192.168.1.161  real server1
[root@cPen-web2 conf]# tail -f /usr/local/nginx1/logs/feng.com.access.log	#注:real server2 的访问日志
192.168.1.3 - - [04/Feb/2021:20:01:17 +0800] "GET / HTTP/1.0" 200 626 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36" "-"
#注:获取到真实的用户IP 192.168.1.3
real-ip模块的使用
	当本机的nginx处于一个反向代理的后端时获取到真实的用户IP
	给后端的backend服务器使用的

中台系统转发案例

根据不同的url做转发
	基于url做转发,转到不同的服务器。成为 网关服务器、API服务器、中台系统 (API Gateway)
为什么实验 要用7层负载均衡,而不是四层负载均衡?
	答:因为根据url做转发,需要读取http里的请求报文 request url,需要打开应用层,去获取http里面的信息,基于url做的转发。而四层负载均衡的配置 是关于端口号
#步骤1:负载均衡器的配置

[root@cPen-LB conf]# vim nginx.conf
server {
        listen       80;
        server_name  www.cpen.top;

        location /login {
            proxy_pass  http://192.168.1.161;
        }
        location /pic {
            proxy_pass  http://192.168.1.162;
        }
        location /music {
            proxy_pass  http://192.168.1.163;
        }
        location /download {
            proxy_pass  http://192.168.1.163;
        }
    }

#注:* 转发过去后,url是不会变的
例:www.cpen.top/login --> 192.168.1.161/login

--------------------------------------------------------------------------------------------------------------------
#注:添加路由转发的策略
需要去新建login、pic、music、download目录,里面还需要存放主页或者其他的内容,确保能正常访问
#注:后端的real server需要增加真正能访问的目录,并且有主页index.html 
#注:download不需要有主页,因为real server3有url的转发

#步骤2:后端real server上需要能访问

需要去新建login、pic、music、download目录,里面还需要存放主页或者其他的内容,确保能正常访问
例2.1:real server1 --> login
[root@cPen-web1 login]# pwd
/usr/local/nginx1/html/feng.com/login
[root@cPen-web1 login]# cat index.html 
161  login
例2.2:real server3 --> download功能
[root@cPen-web3 conf]# vim nginx.conf
        location / {
            autoindex on;
            root   html/feng.com;
            index  index.html index.htm;
        }

--------------------------------------------------------------------------------------------------------------------
#注:效果

www.cpen.top/login --> 161  login (192.168.1.161/login  index.html)
www.cpen.top/download/ --> 下载页面 (192.168.1.163/download/)
如果有多个download 怎么解决?

	本质上就是实现了基于某个url做负载均衡
#步骤:修改配置文件

[root@cPen-LB conf]# vim nginx.conf
upstream mydownload {       	#定义 负载均衡器
        server 192.168.1.161 weight=1;
        server 192.168.1.162 weight=1;
        server 192.168.1.163 weight=1;
    }

    server {
        listen       80;
        server_name  www.cpen.top;

        location /login {
            proxy_pass  http://192.168.1.161;
        }
        location /pic {
            proxy_pass  http://192.168.1.162;
        }
        location /music {
            proxy_pass  http://192.168.1.163;
        }
        location /download {    #使用/转到 负载均衡器
            proxy_pass  http://mydownload;
        }
    }

----------------------------------------------------------------------
#注:效果 轮询

www.cpen.top/download/ --> 下载页面 (192.168.1.161/download/)
www.cpen.top/download/ --> 下载页面 (192.168.1.162/download/)
www.cpen.top/download/ --> 下载页面 (192.168.1.163/download/)

四层负载均衡

TCP and UDP Load Balancing
https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer/

full nat
	4层负载均衡 动了ip地址
	数据转发这块是full nat
		不但修改了源ip和目的ip,还修改了源端口和目的端口
#注:示例

[root@cPen-LB conf]# vim nginx.conf
#4层的负载均衡
stream {
    #负载均衡器的定义web
    upstream scweb {
        least_conn;							#注:算法  最小连接数
        server 192.168.1.161:80;
        server 192.168.1.162:8080;
        server 192.168.1.163:80;
    }
    #负载均衡器的定义dns
    upstream dns_servers {
        hash   $remote_addr consistent;		#注:算法  hash
        server 192.168.1.130:53;
        server 192.168.1.131:53;
    }
    server {
        listen     80;
        proxy_pass scweb;
    }
    server {
        listen     53;
        proxy_pass dns_servers;
    }
}

高可用

高可用:HA 高可用性 (HighAvailability)

问题1. 如何理解高可用HA?
	答:防止单点故障
	有备份

软件 keepalived
	官网	https://www.keepalived.org/
问题2. 什么是keepalived?
	Keepalived是用C语言编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础结构提供负载均衡和高可用性的简单而强大的功能。 

keepalived实现负载均衡的功能是依靠lvs这个软件来实现的
负载平衡框架依赖于提供第4层负载平衡的著名且广泛使用的Linux虚拟服务器(IPVS)内核模块。
负载均衡和高可用性是2个概念
	负载均衡:将很多的请求分散到后端很多的服务器上 --> 化解压力的一个软件
	高可用:有2个或者多个服务器做相同的事情,互相备份

VRRP协议

vrrp协议
	虚拟路由器冗余协议(vrrp)

vrrp协议 参考文档
https://blog.csdn.net/zhongzh86/article/details/81537644
https://blog.csdn.net/u010391029/article/details/48311699
https://blog.51cto.com/billy98/2064252

VRRP通告(advertisement)。它使用IP多播数据包进行封装,组地址为224.0.0.18,发布范围只限于同一局域网内

实验:HA - 单vip

实验图
28_linux笔记-web-nginx_第6张图片

HA的步骤:
1.安装keepalived,在2台LB上都要安装
2.调试
3.验证

#步骤1:安装keepalived,在2台LB上都要安装

[root@cPen-LB-1 ~]# cat /etc/centos-release
CentOS Linux release 8.2.2004 (Core) 
[root@cPen-LB-1 ~]# yum install keepalived -y

[root@cPen-LB-2 ~]# yum install keepalived -y

---------------------------------------------------------------------------------------------------------------------------------
#步骤2:修改配置文件,添加vip等相关的配置

[root@cPen-LB-1 ~]# cd /etc/keepalived/
[root@cPen-LB-1 keepalived]# ls
keepalived.conf

------------------------------------------------------------------------------
#注:master上的配置
#注:删除一些不相关的配置(和lvs有关的,在下面)
#注:注释掉vrrp_strict 严格的vrrp协议 注释掉
[root@cPen-LB-1 keepalived]# vim keepalived.conf 
vrrp_instance VI_1 {			#注:vrrp实例名字VI_1 --> 相当于启动一个vrrp进程去工作
    state MASTER				#注:指定服务器充当的角色为MASTER
    interface ens33				#注:在ens33接口上监听vrrp报文
    virtual_router_id 99		#注:虚拟路由组的id 为99  此值有个范围 0~255
    priority 110 				#注:优先级
    advert_int 1				#注:发宣告报文的间隔时间为1秒
    authentication {			#注:认证
        auth_type PASS			#注:密码认证	password
        auth_pass 123456		#注:密码为123456
    }   
    virtual_ipaddress {			#注:定义vip		可以多个,这次文件只用1个 单vip
        192.168.1.180
    }
}

#注:virtual_router_id	虚拟路由id一定要一样,否则会出现脑裂现象

------------------------------------------------------------------------------
#注:backup服务器上的配置
[root@cPen-LB-2 conf]# cd /etc/keepalived/
[root@cPen-LB-2 keepalived]# scp 192.168.1.160:/etc/keepalived/keepalived.conf .
[root@cPen-LB-2 keepalived]# vim keepalived.conf 
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 99		#注:虚拟路由组id合master一致
    priority 100				#注:优先级比master低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.180
    }
}

---------------------------------------------------------------------------------------------------------------------------------
#步骤3:启动keepalived服务

[root@cPen-LB-1 keepalived]# service keepalived start			#注:master上启动
[root@cPen-LB-1 keepalived]# ps aux|grep keepalived
root        2007  0.0  0.0 106212   996 ?        Ss   15:16   0:00 /usr/sbin/keepalived -D
root        2008  5.0  0.0 106212  1000 ?        S    15:16   0:00 /usr/sbin/keepalived -D
root        2010  0.0  0.0  12324  1080 pts/0    S+   15:16   0:00 grep --color=auto keepalived

[root@cPen-LB-2 keepalived]# service keepalived start			#注:backup上也要启动

#注:keepalived 有进程,没有端口

---------------------------------------------------------------------------------------------------------------------------------
#注:注意两边都要关闭防火墙:防火墙会阻止2台机器之间交流选举vrrp报文
[root@cPen-LB-1 keepalived]# service firewalld stop
[root@cPen-LB-1 keepalived]# systemctl disable firewalld
[root@cPen-LB-2 keepalived]# service firewalld stop
[root@cPen-LB-2 keepalived]# systemctl disable firewalld

---------------------------------------------------------------------------------------------------------------------------------
#效果:vip出现在LB-1上

[root@cPen-LB-1 keepalived]# ip add
……
    inet 192.168.1.160/24 brd 192.168.1.255 scope global noprefixroute ens33
    inet 192.168.1.180/32 scope global ens33
……

现象1:vip漂移

1.在master上停止keepalived服务

[root@cPen-LB-1 keepalived]# service keepalived stop			#注:master上 停止服务

-----------------------------------------------------
2.backup上就会立马配上vip

[root@cPen-LB-2 keepalived]# ip add
……
    inet 192.168.1.164/24 brd 192.168.1.255 scope global noprefixroute ens33
    inet 192.168.1.180/32 scope global ens33					#注:vip漂移现象
……

C:\Users\15334>arp -a											#注:win 查看arp缓存表
  192.168.1.160         00-0c-29-ab-9e-eb     动态
  192.168.1.164         00-0c-29-86-f7-6c     动态
  192.168.1.180         00-0c-29-86-f7-6c     动态				#注:LB-2的mac地址

-----------------------------------------------------
3.在master上启动keepalived服务,vip会再次漂移回来

[root@cPen-LB-1 keepalived]# service keepalived start
[root@cPen-LB-1 keepalived]# ip add
……
    inet 192.168.1.160/24 brd 192.168.1.255 scope global noprefixroute ens33
    inet 192.168.1.180/32 scope global ens33
……

C:\Users\15334>arp -a											#注:win 查看arp缓存表
  192.168.1.160         00-0c-29-ab-9e-eb     动态
  192.168.1.164         00-0c-29-86-f7-6c     动态
  192.168.1.180         00-0c-29-ab-9e-eb     动态				#注:LB-1的mac地址

现象2:脑裂

脑裂:就是2台或者多台LB上都有vip地址
原因:
	1.防火墙阻止了keepalived的vrrp消息的通告
	2.virtual_router_id 不一样的时候
脑裂现象是否有危害?如果有,你觉得有什么危害?
	答:没有危害。都能访问,但这样master和backup就没有意义了,对于运维人员,不能决定外面的客户机选择哪个负载均衡器去访问

如果只是单vip,master会工作,backup服务器会闲置,如何让backup不闲置,你也什么方法?
	方法1:故意制造脑裂
	方法2:dns域名解析 + 使用双vip
如何实现双vip的效果?
	dns域名集群解析记录 + 双vip实现,master和backup都不闲置
		www  192.168.0.181
		www  192.168.0.180

实验:HA - 双vip

如何实现双vip的效果?
	dns域名集群解析记录+双vip实现,master和backup都不闲置
#步骤:dns域名集群解析记录

	#注:dns集群域名解析记录,dns域名负载均衡,dns域名解析,使用论询调度算法  dns域名方面的负载均衡
		www.cpen.top  192.168.0.181
		www.cpen.top  192.168.0.180

-------------------------------------------------------------------------------------------
同一个域名对应2或者多条A记录
	ip地址不同名字相同
	使用dns域名解析实现第1层负载均衡    默认的调度算法是轮询  round-robin

#注:去阿里云域名控制台添加域名解析 A记录
-------------------------------------------------------------------------------------------
[root@cPen-LB-2 keepalived]# yum install bind-utils -y
[root@cPen-LB-2 keepalived]# nslookup www.cpen.top
Name:	www.cpen.top
Address: 47.110.144.55
Name:	www.cpen.top
Address: 47.110.144.66
#步骤:双vip的配置文件

#注:第1台服务器上的配置

[root@cPen-LB-1 keepalived]# vim keepalived.conf 
……
   #vrrp_strict
……
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 199
    priority 110
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.180
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 200
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.181
    }
}

------------------------------------------------
#注:第2台服务器上的配置

[root@cPen-LB-2 keepalived]# vim keepalived.conf 
……
   #vrrp_strict
……
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 199
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.180
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 200
    priority 110
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.181
    }
}

============================================================================================
#步骤:重启keepalived服务

[root@cPen-LB-1 keepalived]# service keepalived restart
[root@cPen-LB-2 keepalived]# service keepalived restart

============================================================================================
#注:效果

#注:第1台上的效果

[root@cPen-LB-1 keepalived]# ip add
inet 192.168.1.160/24 brd 192.168.1.255 scope global noprefixroute ens33
inet 192.168.1.180/32 scope global ens33

--------------------------------------------
#注:第2台上的效果

[root@cPen-LB-2 keepalived]# ip add
inet 192.168.1.164/24 brd 192.168.1.255 scope global noprefixroute ens33
    inet 192.168.1.181/32 scope global ens33

其他内容

实验:搭建自己域名的网站

一个nginx进程可以同时开启很多虚拟主机
一个server其实就是虚拟主机 --> 对应一个网站

步骤:
1.修改配置文件
2.去新建我们的存放网页的目录,以及我们的首页,其他的网页
3.重启nginx
4.需要修改客户机的hosts文件,linux和windows系统都需要修改

[root@cPen_nginx ~]# vim /usr/local/nginx1/conf/nginx.conf
……
server {
        listen       80;
        server_name  www.feng.com;						#注:域名
        #charset koi8-r;
        access_log  logs/feng.com.access.log  main;		#注:打开访问日志,格式是main;指定文件
        location / {
            root   html/feng.com;						#注:存放网页的根目录
            index  index.html index.htm;				#注:指定首页
        }
        error_page  404              /404.html;			#注:错误页面  返回404错误页面
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;		#注:nginx服务错误 访问根目录下…
        location = /50x.html {
            root   html/feng.com;
        }
#步骤:测试nginx.conf内容是否有错误
[root@cPen_nginx conf]# nginx -t						#注:测试nginx.conf配置文件内容是否有错误
nginx: [emerg] unknown log format "main" in /usr/local/nginx1/conf/nginx.conf:39	#注:出错
nginx: configuration file /usr/local/nginx1/conf/nginx.conf test failed

[root@cPen_nginx ~]# vim /usr/local/nginx1/conf/nginx.conf
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"';
[root@cPen_nginx conf]# nginx -t						#注:测试nginx.conf配置文件是否有错误
nginx: the configuration file /usr/local/nginx1/conf/nginx.conf syntax is ok		#注:成功
nginx: configuration file /usr/local/nginx1/conf/nginx.conf test is successful

#步骤:重启nginx
[root@cPen_nginx conf]# nginx -s reload

步骤4:修改客户机hosts文件

需要修改客户机的hosts文件,Linux和windows系统都需要修改

Linux

[root@cPen_nginx ~]# vim /etc/hosts
192.168.1.11  www.feng.com

Windows
C:\Windows\System32\drivers\etc\hosts

192.168.1.11 www.feng.com

效果:访问www.feng.com 测试是否成功

# Linux客户机 访问
[root@cPen_nginx ~]# curl www.feng.com
Welcome to feng.com!
[root@cPen_nginx ~]# curl www.feng.com/404.html
404 error sanchaung

# Windows客户机 访问
http://www.feng.com/
http://www.feng.com/404.html

deny和allow指令

#步骤:修改配置文件

[root@cPen_nginx conf]# vim nginx.conf
    ……
server {
        listen 80;
        server_name  www.a.com;
        access_log  logs/a.com.access.log  main;
        location / {
            root   html/a.com;
            index  index.html index.htm;
            autoindex on;
            deny 192.168.1.12;
        }
-------------------------------------------
#效果:192.168.1.12 Linux客户机

[root@web-client ~]# curl www.a.com
<head><title>403 Forbidden</title></head>

文件描述符

[root@cPen_nginx conf]# ulimit -a			#注:查看Linux内核的限制
……
open files                      (-n) 1024

#注:Linux kernel 对一个进程最多能打开多少文件数量的限制 --> 1个进程最多可以打开1024个文件

[root@cPen_nginx conf]# ulimit -n
1024

#注:默认情况下Linux内核允许一个进程打开的文件描述符是1024   默认的范围0~1023

临时修改

#示例:临时修改Linux内核 允许一个进程打开的文件数量 (文件描述符)

[root@cPen_nginx conf]# ulimit -n 1000000		#注:为了不影响nginx的并发数

永久修改

#示例:永久修改文件描述符的限制
如何永久有效?
-----------------------------------------------------------
#方法1:写进/etc/rc.local文件里

[root@cPen_nginx conf]# vim /etc/rc.local 
ulimit -n 1000000
[root@cPen_nginx conf]# chmod +x /etc/rc.d/rc.local

-----------------------------------------------------------
#方法2:/etc/security/limits.conf文件

[root@cPen_nginx conf]# vim /etc/security/limits.conf 		#注:永久修改文件描述符的限制
#        - nofile - max number of open file descriptors
* soft nofile 1000000						#注:软限制
* hard nofile 1000000						#注:硬限制

#注:设置完后  需要重启系统

你可能感兴趣的:(Linux笔记,linux,nginx)