架构前端

HTTP协议

01. 当用户访问一个网站时,都发生了事情?

    ①. 利用DNS服务,将输入的域名解析为相应的IP地址

  01  本地主机输入域名后,会查询本地缓存信息和本地hosts

  02  本地主机会向远程LDNS服务器,发送递归查询请求

            LDNS是网卡配置的DNS服务(223.5.5.5 114.114.114.114

  03  LDNS服务器会向根域名服务器发出请求,将请求响应给LDNS服务器

  04  LDNS服务器会向顶级域名服务器发出请求,将请求响应给LDNS服务器

  05  LDNS服务器会向二级域名服务器发出请求,将请求响应给LDNS服务器

  06  LDNS服务器收到二级域名服务器响应过来的信息(解析记录),进行本地缓存

              将解析记录发送给本地主机

   07  本地主机收到LDNS服务器的响应信息,也会将解析记录进行缓存,利用IP地址访问网站服务器

    ②. 利用已知的IP地址,进行网络三次握手连接建立

  ③. 本地主机客户端向网站服务端,发出请求 http请求数据包(http请求报文)

  ④. 网站服务端向本地主机客户端,回复响应 http响应数据包(http响应报文)

  ⑤. 完成网络四次挥手断开过程

02. HTTP通讯原理说明

HTTP请求报文

请求行:

     * 请求方法: 希望客户端完成我的什么样请求

                 get  获取服务端的文件内容

                 post 存储提交数据到服务端

     * 协议版本:http1.0 http1.1 http2.0

         http1.0: 属于TCP短连接类型协议

         http1.1:属于TCP长连接类型协议

 

请求头:

空行:

  /n

请求主体:

     * get方法:没有请求主体内容

     * post方法:会有请求主体内容

   

HTTP响应报文

   起始行:

     * 状态码信息

 

   

[root@m01 ~]# curl -I www.jd.com
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Sat, 29 Feb 2020 15:41:26 GMT
Content-Type: text/html
Content-Length: 154
Connection: keep-alive
Location: https://www.jd.com/
Access-Control-Allow-Origin: *
Timing-Allow-Origin: *
X-Trace: 302-1582990886746-0-0-0-0-0
Strict-Transport-Security: max-age=360

[root@m01 ~]# 

03. HTTP协议资源说明

1. 媒体资源类型

  web服务可以处理接收的资源类型(text/html css jpg avi

  一般在web服务软件程序中,会有一个文件来定义媒体资源类型(mime.type)

2. URL/URI

  URL 统一资源定位符

  URI 统一资源标识符

  www.jd.com       /      error2.aspx

        URL                          URI

3. 静态文件资源

静态网页资源有几个重要的特征:

      1) 每个页面都有一个固定的URL地址,且URL一般以.html.htm.shtml等常见形式为后缀,而且地址中不含有问号“?”或“&”等特殊符号。

      2) 静态网页是实实在在保存在服务器上的文件实体,每个网页都是一个独立的文件。

      3) 网页内容是固定不变的,因此,容易被搜索引擎收录(容易被用户找到)(优点)。

      4) 因为网页没有数据库的支持,所以在网站制作和维护方面的工作量较大,当网站信息量很大时,完全依靠静态网页比较困难(缺点)。

      5) 网页的交互性较差,在程序的功能实现方面有较大的限制(缺点)。

      6) 网页程序在用户浏览器端解析,如IE浏览器,程序解析效率很高,由于服务器端不进行解析,并且不需要读取数据库,因此服务器端可以接受更多的并发访问。当客户端向服务器请求数据时,服务器会直接从磁盘文件系统上返回数据(不做任何解析)。待客户端拿到数据后,在浏览器端解析并展现出来(优点)。

4. 动态文件资源

      1) 网页扩展名后缀常见为:.asp.aspx.php.js.do.cgi 等。

      2) 网页一般以数据库技术为基础,大大降低了网站维护的工作量。

      3) 采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、在线调查、投票、用户管理、订单处理、发博文等。

      4) 动态网页并不是独立存在于服务器上的网页文件,当用户请求服务器上的动态程序时,服务器解析这些程序并可能通过读取数据库来返回一个完整的网页内容。

      5) 动态网页中的“?”在搜索引擎的收录方面存在一定的问题,搜索引擎一般不会从一个网站的数据库中访问全部网页,或者出于技术等方面的考虑,搜索蜘蛛一般不会去抓取网址中“?”后面的内容,因此在企业通过搜索引擎进行推广时,需要针对采用动态网页的网站做一定的技术处理(伪静态技术),以便适应搜索引擎的抓取要求。

5. 伪静态文件资源

      根本实质还是动态资源,将动态资源伪装成静态

      动态不便于搜索引擎收录  响应速度较慢       

04. 网站度量值统计方法

   1. IP(独立IP),即Internet Protocol,这里指独立IP数,

      独立IP数是指不同IP地址的计算机访问网站时被计的总次数

  

   2. PV(访问量)即Page View,中文翻译为页面浏览,即页面浏览量或点击量,不管客户端是不是相同,

      也不管IP是不是相同,用户只要访问网站页面就会被计算PV   

   

   3. UV(独立访客)即Unique Visitor,同一个客户端(PC或移动端)访问网站被计为一个访客。

      一天(0000-24:00)内相同的客户端访问同一个网站只计一次UV

  

  cookie:标识用户主机身份信息 (百度统计)

nginx

01. web服务软件种类介绍

常用来提供静态Web服务的软件

 Apache: 

  这是中小型Web服务的主流,Web服务器中的老大哥。

 Nginx:   

  大型网站Web服务的主流,曾经Web服务器中的初生牛犊,现已长大。

  Nginx的分支Tengine(http://tengine.taobao.org/)目前也在飞速发展。

Lighttpd:

  这是一个不温不火的优秀Web软件,社区不活跃,静态解析效率很高。

  在Nginx流行前,它是大并发静态业务的首选,国内百度贴吧、豆瓣等众多网站都有Lighttpd奋斗的身影。

常用来提供动态服务的软件

PHP(FastCGI):

  大中小型网站都会使用,动态网页语言PHP程序的解析容器。

  它可配合Apache解析动态程序,不过,这里的PHP不是FastCGI守护进程模式,而是mod_php5.so(module)。

  也可配合Nginx解析动态程序,此时的PHP常用FastCGI守护进程模式提供服务。

Tomcat:

  中小企业动态Web服务主流,互联网Java容器主流(如jsp、do)。

Resin:

  大型动态Web服务主流,互联网Java容器主流(如jsp、do)。

02. nginx软件服务介绍

  如果你听说或使用过Apache软件,那么很快就会熟悉Nginx软件,与Apache软件类似,

  Nginx(“engine x”)是一个开源的,支持高性能、高并发的WWW服务器和代理服务软件。

  它是由俄罗斯人lgor Sysoev开发的,最初被应用在俄罗斯的大型网站www.rambler.ru上。

  后来作者将源代码以类BSD许可证的形式开源出来供全球使用。

  Nginx可以运行在UNIX、Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系统中

03. nginx软件特征介绍

    · 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)

    · 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB

    · 支持异步网络I/O事件模型epoll(Linux 2.6+) apache(select)

04. nginx软件功能介绍

  1)作为Web服务软件(处理用户访问静态请求)

  2)反向代理或负载均衡服务

  3)前端业务数据缓存服务

05. nginx软件模型特点说明

apache与nginx软件对比说明

  apache使用select模型

  nginx使用epoll模型

举例说明:宿舍管理员

  select模型版管理员  会一个一个房间查询人员

  epoll模型版管理员   会进行检索后,直接找到需要找的人

举例说明:幼儿园阿姨

  select模型版阿姨    会一个一个小朋友进行询问,确认哪个小朋友需要上厕所

  epoll模型版阿姨     会告知想上厕所小朋友自觉站到响应位置

06. nginx软件编译安装

  3种安装方式:yum安装、二进制包安装、编译安装

  编译安装相当于自己做饭

第一个里程:软件依赖包安装

需要自己手动解决依赖包

pcre-devel:   perl语言正则表达式兼容软件包

openssl-devel:使系统支持https方式访问

安装命令:

[root@web01 ~]# yum install -y pcre-devel openssl-devel

第二个里程:创建一个管理nginx进程的虚拟用户

[root@web01 ~]# useradd www -s /sbin/nologin/ -M

第三个里程:下载并解压nginx软件

[root@web01 ~]# cd /server/tools
[root@web01 /server/tools]# wget http://nginx.org/download/nginx-1.12.2.tar.gz
[root@web01 /server/tools]# tar xf nginx-1.12.2.tar.gz

第四个里程:进行软件编译安装

将软件信息系统可以识别的二进制信息

软件编译安装三部曲:

①. 编译配置

[root@web01 /server/tools]# cd  /server/tools/nginx-1.12.2
[root@web01 /server/tools/nginx-1.12.2]# ./configure  --prefix=/application/nginx-12.2  --user=www  --group=www  --with-http_ssl_module  --with-http_stub_status_module

 --prefix=PATH     指定软件安装在什么目录下

--user=USER       指定软件worker进程管理用户,利用www虚拟用户管理worker进程

--group=USER

--with-http_ssl_module           使nginx程序可以支持HTTPS访问功能

 --with-http_stub_status_module  用于监控用户访问nginx服务情况  

# 通过检查返回值,确认安装成功
[root@web01 nginx-1.12.2]# echo $?
0

②. 编译过程

make

echo  $?

③. 编译安装

make  install

# 进入目录中查看

[root@web01 /server/tools/nginx-1.12.2]# cd /application/
[root@web01 /application]# ll
total 4
drwxr-xr-x 6 root root 4096 Mar 1 03:17 nginx-12.2

第五个里程:为nginx程序软件创建链接目录(方便开发)

[root@web01 /application]# ln -s /application/nginx-12.2 /application/nginx

第六个里程:启动nginx程序服务

[root@web01 ~]# /application/nginx/sbin/nginx
[root@web01 ~]# ps -ef |grep nginx
root       9925      1  0 03:29 ?        00:00:00 nginx: master process /application/nginx/sbin/nginx
www        9926   9925  0 03:29 ?        00:00:00 nginx: worker process        
root       9935   9909  0 03:30 pts/0    00:00:00 grep --color=auto nginx
[root@web01 ~]# 

07. nginx软件程序目录结构

  1.conf     --- nginx程序所有配置文件保存目录

  2.html     --- nginx程序站点目录

  3.logs     --- nginx程序日志文件保存目录

  4.sbin     --- nginx程序命令所在目录

  5.nginx命令参数说明(-h):

[root@web01 ~]# /application/nginx/sbin/nginx -h

  -V       --- 查看nginx软件编译配置参数

  -t       --- 检查nginx配置文件语法格式是否正确

  -s       --- 用于管理nginx服务运行状态

               stop   停止nginx服务

               reload 平滑重启nginx服务器

  重启nginx服务

       nginx -s stop  先停止

       nginx          再启动

08. 编写nginx服务配置

nginx.conf   nginx目录conf中的程序主配置文件

nginx.conf.default 和 nginx  是一样的 是软件的给的备份文件,可以通过vimdiff 对比一下

因为配置文件中有很多空行和注释,可以先把配置文件先精简一下,

[root@web01 /application/nginx/conf]# grep -Ev "#|^$" nginx.conf.default >nginx.conf
[root@web01 /application/nginx/conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
[root@web01 /application/nginx/conf]# 

nginx配置文件组成:

①. main       nginx主区块

②. event      nginx事件区块

③. http         nginx http功能区块

④. server     nginx 网站主机区块

⑤. location   nginx 匹配或者定位区块

nginx配置详细说明示意图

[root@web01 conf]# ps -ef |grep nginx
root       6701      1  0 17:17 ?        00:00:00 nginx: master process sbin/nginx
www        6702   6701  0 17:17 ?        00:00:00 nginx: worker process

只有两个进程,一个主进程(master process)和worker进程(服务员)

mime.types文件就在当前目录下

三个语法格式说明

①. 大括号要成对出现

②. 每一行指令后面要用分号结尾

③. 每一个指令要放置在指定的区块中

官网帮助:Nginx官网   右边有一个documentation    下面有一个指令索引Alphabetical index of directives   使用ctrl+F 搜索我们要查询的指令

实现编写一个网站页面

[root@web01 ~]# vim /application/nginx/conf/nginx.conf

worker_processes  1;
    events {
        worker_connections  1024;

    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        server {
            listen       80;
            server_name  www.etiantian.org;
            location / {
                root   html/www;    目录要正确,必须要有
                index  index.html index.htm;
           }
        }
    }



# 编写完毕检查一下,使用-t 参数测试语法是否都正确
[root@web01 ~]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-12.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-12.2/conf/nginx.conf test is successful

# 重启服务
[root@web01 ~]# /application/nginx/sbin/nginx -s reload

# 需要在win中配置一下hosts
找到 C:\Windows\System32\drivers\etc下的hosts
添加 10.0.0.7 www.etiantian.org

访问成功

实现编写多个网站页面 == 编写多个虚拟主机(一个虚拟主机等于一个网站)

第一个里程:编写配置文件

 

[root@web01 ~]# cat /application/nginx/conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.etiantian.org;
        location / {
            root   html/www;
            index  index.html index.htm;
        }        
    }
   server {
        listen       80;
        server_name  bbs.etiantian.org;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
    }
    server {
        listen       80;
        server_name  blog.etiantian.org;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
    }    
}

 

第二个里程:创建站点目录

[root@web01 ~]# mkdir -p /application/nginx/html/{www,bbs,blog}

第三个里程:创建站点目录下首页文件

[root@web01 ~]# for name in www bbs blog;do echo "10.0.0.7 $name.etiantian.org" >/application/nginx/html/$name/index.html;done
[root@web01 ~]# for name in www bbs blog;do cat /application/nginx/html/$name/index.html;done
10.0.0.7 www.etiantian.org
10.0.0.7 bbs.etiantian.org
10.0.0.7 blog.etiantian.org
[root@web01 ~]# 

第四个里程:进行访问测试

浏览器访问测试:

  注意:需要编写windows主机hosts文件,进行解析

  10.0.0.7  www.etiantian.org  bbs.etiantian.org  blog.etiantian.org

命令行访问测试:

     利用curl命令在linux系统中访问测试

  注意:需要编写linux主机hosts文件,进行解析

第五个里程:Nginx企业规范配置

将nginx中的多个server拆分成小文件,进行分类管理,以防止配置出错

[root@web01 ~]# cd /application/nginx/conf/
[root@web01 /application/nginx/conf]# ls
fastcgi.conf            koi-utf             nginx.conf           uwsgi_params
fastcgi.conf.default    koi-win             nginx.conf.default   uwsgi_params.default
fastcgi_params          mime.types          scgi_params          win-utf
fastcgi_params.default  mime.types.default  scgi_params.default
[root@web01 /application/nginx/conf]# mkdir extra
[root@web01 /application/nginx/conf]# cd extra/
[root@web01 /application/nginx/conf/extra]# sed -n '10,17p' ../nginx.conf > www.conf
[root@web01 /application/nginx/conf/extra]# sed -n '18,25p' ../nginx.conf > bbs.conf
[root@web01 /application/nginx/conf/extra]# sed -n '26,33p' ../nginx.conf > blog.conf
[root@web01 /application/nginx/conf/extra]# cat www.conf
    server {
        listen       80;
        server_name  www.etiantian.org;
        location / {
            root   html/www;
            index  index.html index.htm;
        }        
    }
[root@web01 /application/nginx/conf/extra]# 

将原来的nginx.conf修改一下,进行分类管理

[root@web01 /application/nginx/conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include extra/www.conf;
    include extra/bbs.conf;
    include extra/blog.conf;    
}
[root@web01 /application/nginx/conf]# 

虚拟主机配置文件编写方法

①. 基于域名的虚拟主机配置方法(最常用)

②. 基于端口的虚拟主机配置方法

      说明:当你访问的网站域名在虚拟主机配置中不存在时,默认会将第一个虚拟主机的配置页面响应给用户

    在配置中修改 listen 8080;
    在浏览器中使用 bbs.etiantian.org:8080 进行访问,没有给端口就会变成www的内容

③. 基于IP地址的虚拟主机配置方法

      说明:nginx服务中只要涉及IP地址的修改,都需要重启nginx服务,而不能采用平滑重启

    在配置中修改 listen 10.0.0.7:80

09.Nginx服务日志信息

[root@web01 /application/nginx]# cd logs/
[root@web01 /application/nginx/logs]# ll
total 12
-rw-r--r-- 1 root root 2330 Mar  1 03:57 access.log
-rw-r--r-- 1 root root 1008 Mar  1 03:57 error.log
-rw-r--r-- 1 root root    5 Mar  1 03:29 nginx.pid
[root@web01 /application/nginx/logs]# 

错误日志error.log

访问日志access.log

master主进程号 nginx.pid 

01. 错误日志

我们可以在默认的配置文件nginx.conf.default中找到下面的内容

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

在nginx.conf中编辑 加入

[root@web01 /application/nginx/conf]# cat nginx.conf
worker_processes  1;
error_log logs/www_error.log error;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include extra/www.conf;
    include extra/bbs.conf;
    include extra/blog.conf;    
}
[root@web01 /application/nginx/conf]# /application/nginx/sbin/nginx -s reload
[root@web01 /application/nginx/conf]# 
[root@web01 /application/nginx/conf]# cd .. [root@web01 /application/nginx]# cd logs/ [root@web01 /application/nginx/logs]# ll total 12 -rw-r--r-- 1 root root 2330 Mar 1 03:57 access.log -rw-r--r-- 1 root root 1130 Mar 1 04:05 error.log -rw-r--r-- 1 root root 5 Mar 1 03:29 nginx.pid -rw-r--r-- 1 root root 0 Mar 1 04:05 www_error.log [root@web01 /application/nginx/logs]#

修改好了,重启一下!

补充说明:

==========================================================

错误日志的,默认情况下不指定也没有关系,因为nginx很少有错误日志记录的。

但有时出现问题时,是有必要记录一下错误日志的,方便我们排查问题。

error_log 级别分为 debug, info, notice, warn, error, crit  默认为crit

该级别在日志名后边定义格式如下:

error_log  /your/path/error.log crit; 

crit 记录的日志最少,而debug记录的日志最多。

如果nginx遇到一些问题,比如502比较频繁出现,但是看默认的error_log并没有看到有意义的信息,

那么就可以调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富

===========================================================

02. 访问日志(重点关注)

同样的,我们可以在默认的配置文件nginx.conf.default中找到下面的内容

下面的变量信息在官网的Alphabetical index of variables中查询

# 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;                    --- 调用定义格式信息,生成访问日志

$remote_addr       10.0.0.1                 --- 访问客户端的源地址信息

$remote_user          -                     --- 访问客户端认证用户信息   ???

[$time_local]                                   --- 显示访问时间

$request        GET / HTTP/1.1               --- 请求行信息

$status              304                       --- 状态码信息(304状态码利用缓存显示页面信息)

$body_bytes_sent                               --- 服务端响应客户端的数据大小信息

$http_referer                                  --- 记录链接到网站的域名信息  ???

$http_user_agent                             --- 用户访问网站客户端软件标识信息

                                                       用户利用客户端浏览器测试访问时,win10默认浏览器会有异常问

$http_x_forwarded_for                          --- ???  反向代理,下面讲

官方链接http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log

[root@web01 /application/nginx/conf]# cat nginx.conf
worker_processes  1;
error_log logs/www_error.log error;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    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/www_access.log  main; 
    include extra/www.conf;
    include extra/bbs.conf;
    include extra/blog.conf;    
}
[root@web01 /application/nginx/conf]# /application/nginx/sbin/nginx -s reload
[root@web01 /application/nginx/conf]# cd ../logs/
[root@web01 /application/nginx/logs]# ll
total 16
-rw-r--r-- 1 root root 2330 Mar  1 03:57 access.log
-rw-r--r-- 1 root root 1252 Mar  1 04:12 error.log
-rw-r--r-- 1 root root    5 Mar  1 03:29 nginx.pid
-rw-r--r-- 1 root root    0 Mar  1 04:12 www_access.log
-rw-r--r-- 1 root root  530 Mar  1 04:07 www_error.log
[root@web01 /application/nginx/logs]# ll

03. 日志要进行切割

利用shell脚本实现日志切割

[root@web01 scripts]# vim cut_log.sh

#!/bin/bash
data_info=$(date +%F-%H:%M)
mv /application/nginx/logs/www_access.log /application/nginx/logs/access.log.$data_info

/application/nginx/sbin/nginx -s reload

# cut nginx log cron
* */6 * * * /bin/sh /server/scripts/cut_log.sh &>/dev/null

10.Nginx服务location区块说明

利用location区块可以用于定位或者匹配网站资源信息

企业需求解决:

搭建好一台nginx的web服务器。配置好内网卡地址与外网卡地址

web服务的网站域名为www.etiantian.org,站点目录为html/www

要求内网用户可以访问网站http://www.etiantian.org/AV资源信息

要求外网用户禁止访问网站http://www.etiantian.org/AV资源信息

①. 如何利用nginx进行访问控制

deny allow   -----   在rsync中的访问控制

deny(ngx_http_access_module )    --- 在doc中找到实现访问控制模块

官方链接:nginx.org/en/docs/http/ngx_http_access_module.html

   location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
    } 

②. 如何定位站点目录资源信息

location区块进行定位站点目录下资源信息

       Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }

       location @name { ... }

       Default: —

       Context: server, location

官方链接:http://nginx.org/en/docs/http/ngx_http_core_module.html#location

第一个里程:编写nginx配置文件

[root@web01 /application/nginx/conf/extra]# cat www.conf 
server {
    listen       80;
    server_name  www.etiantian.org;
    root   html/www;
    index  index.html index.htm;
    location /AV {
       allow   172.16.1.0/24;
       deny    10.0.0.0/24;
    }
}
[root@web01 /application/nginx/conf/extra]# 

第二个里程:创建测试访问资源

 

[root@web01 /application/nginx/logs]# cd ../html/
[root@web01 /application/nginx/html]# cd www
[root@web01 /application/nginx/html/www]# mkdir AV
[root@web01 /application/nginx/html/www]# echo "AV info" >AV/oldboy.html
[root@web01 /application/nginx/html/www]# cat AV/oldboy.html
AV info
[root@web01 /application/nginx/html/www]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5      lb01
172.16.1.6      lb02
172.16.1.7      web01 www.etiantian.org bbs.etiantian.org blog.etiantian.org
172.16.1.8      web02
172.16.1.9      web03
172.16.1.51     db01
172.16.1.31     nfs01
172.16.1.41     backup
172.16.1.61     m01

第三个里程:重启nginx服务

[root@web01 ~]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-12.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-12.2/conf/nginx.conf test is successful
[root@web01 ~]# /application/nginx/sbin/nginx -s reload

第四个里程:测试

内网测试:

 

[root@web01 ~]# curl www.etiantian.org/AV/oldboy.html
AV info

 

外网测试:

location参数用法

location [ = | ~ | ~* | ^~ ] uri { ... }
=     ---  精确匹配网站uri资源信息
~     ---  区分大小写匹配网站uri资源信息
~*    ---  不区分大小写匹配网站uri资源信息
^~    ---  优先匹配网站uri资源信息
/AV/ ---  指定匹配网站资源目录信息
/      ---  默认匹配网站资源信息
!      --- 对匹配的内容进行取反


location = / {
   [ configuration A ]       --- 优先级最高 ①
}

location / {                  --- 所有匹配都不满足时候,匹配默认location ④
   [ configuration B ]
}

location /documents/ {        --- 根据资源目录进行匹配         ③
   [ configuration C ]
}

location ^~ /images/ {        --- 优先匹配 ②
   [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {  --- 不区分大小写匹配网站资源  ③
[ configuration E ]
}

11. Nginx服务rewrite模块功能说明

01. 实现域名地址信息跳转

实现类似百度重写域名的功能?

baidu.com  ===>  www.baidu.com

etiantian.org  ===> www.etiantian.org

02. 用于做伪静态

www.etiantian.org/oldboy?edu.html   ---动态资源

www.etiantian.org/oldboy-edu.html   ---伪静态

官方说明

rewrite

Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if

last 一旦找到匹配信息,执行跳转,继续匹配后面的
    stops processing the current set of ngx_http_rewrite_module directives and starts a search for a new location matching the changed URI;

break 一旦找到匹配信息,就终止
    stops processing the current set of ngx_http_rewrite_module directives as with the break directive;

redirect 临时跳转
    returns a temporary redirect with the 302 code; used if a replacement string does not start with “http://”, “https://”, or “$scheme”;

permanent  永久跳转
    returns a permanent redirect with the 301 code.

rewrite指令实践操作一:(错误--> 进入了无限循环状态)

[root@web01 extra]# cat www.conf
server {
    listen       80;
    server_name  www.etiantian.org;
    root   html/www;
    index  index.html index.htm;
    rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
} 
[root@web01 extra]# curl -L etiantian.org  (-L 追踪参数,一直跟着)
curl: (47) Maximum (50) redirects followed 
[root@web01 extra]# curl -Lv etiantian.org   --- 显示无限循环过程

rewrite指令实践操作二:(正确)

[root@web01 extra]# cat www.conf
server {
    listen       80;
    server_name  etiantian.org;
    root   html/www;
    index  index.html index.htm;
    rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
}
server {
    listen       80;
    server_name  www.etiantian.org;
    root   html/www;
    index  index.html index.htm;
}

rewrite指令实践操作三:(正确)

[root@web01 extra]# cat www.conf
server {
    listen       80;
    server_name  www.etiantian.org;
    if ($host ~* "^etiantian.org$") {
       rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
    }
    root   html/www;
    index  index.html index.htm;
}

配置hosts:

[root@web01 ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5      lb01
172.16.1.6      lb02
172.16.1.7      web01 www.etiantian.org etiantian.org www.bbs.etiantian.org bbs.etiantian.org www. blog.etiantian.org blog.etiantian.org
172.16.1.8      web02
172.16.1.9      web03
172.16.1.51     db01
172.16.1.31     nfs01
172.16.1.41     backup
172.16.1.61     m01

[root@web01 ~]# 

测试:

[root@web01 ~]# /application/nginx/sbin/nginx -s reload
[root@web01 ~]# curl -L etiantian.org
10.0.0.7 www.etiantian.org
[root@web01 ~]# 

01、LNMP架构说明

使前端web服务和后端存储服务进行串联

nginx只能处理静态的信息,动态的信

主要实现处理PHP程序动态请求

02、LNMP架构工作原理

L linux

N nginx

M MySQL

P php

LNMP

01. LNMP架构说明

  0)nginx 无法完成动态请求解析,只能处理静态请求,所以要找帮手

  1)使前端web服务和后端存储服务进行串联

  2)主要实现处理PHP程序动态请求

02. LNMP架构工作原理

    L Linux  N nginx M mysql P php

03. LNMP架构部署

1)安装LNMP相关软件

①. 部署Linux系统

    基础优化操作要完成(防火墙关闭 关闭selinux /tmp权限为1777)

[root@web01 ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@web01 ~]# getenforce
Disabled
[root@web01 ~]# ll /tmp/ -d
drwxrwxrwt. 3 root root 4096 Feb 27 09:43 /tmp/

②. 部署nginx服务

  暂时忽略,之前部署过

③. 部署mysql服务

  yum部署软件   编译安装软件   二进制包方式部署mysql服务

  这次我们用二进制包方式部署mysql服务

第一个里程:下载并解压mysql软件程序

  mysql官方下载链接地址:ftp://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/

  一定要选择glibc的

  上传mysql软件程序,进行利用xftp软件进行上传

  cd /server/tools/

  tar xf mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz

  mv mysql-5.6.34-linux-glibc2.5-x86_64 /application/mysql-5.6.34

第二个里程:创建软件程序软链接

  ln  -sf  /application/mysql-5.6.34/ /application/mysql

  -f 参数是强制覆盖原有的软链接

第三个里程:创建数据库管理用户,并授权数据目录

  useradd mysql -M -s /sbin/nologin

  chown -R mysql.mysql /application/mysql/data/

   注:/data 是所有数据存放的地方

第四个里程:对数据库服务进行初始化

  /application/mysql/scripts/mysql_install_db  --basedir=/application/mysql  --datadir=/application/mysql/data/  --user=mysql

  该过程出现两个OK 就表示成功的!也可以用echo $?

第五个里程:启动mysql服务

  在系统中,默认是没有启动脚本的。

  将mysql中的mysql.server(启动脚本)复制到/etc/init.d/mysqld

    cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld

  在脚本中有一个默认的basedir和binddir,需要修改两个文件

    sed   -ri   's#/usr/local#/application#g' /etc/init.d/mysqld   /application/mysql/bin/mysqld_safe

  配置文件的修改,默认配置文件不太符合我们使用的5.6

    cp /application/mysql/support-files/my-default.cnf /etc/my.cnf

  启动

    /etc/init.d/mysqld start

第六个里程:设置数据库root用户登录密码

  设置密码,不是修改密码

    /application/mysql/bin/mysqladmin -uroot password "oldboy123"

  登录

    /application/mysql/bin/mysql -uroot -poldboy123

④. PHP软件编译安装部署过程

第一里程:解决PHP软件的依赖关系

        yum install -y zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel

        libiconv 软件安装---字符集转换库(默认可以不进行安装了)

        cd /server/tools

        #wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

        tar zxf libiconv-1.14.tar.gz

        cd libiconv-1.14

        ./configure --prefix=/usr/local/libiconv

        make

        make install

        cd ../

   程序加密的软件的安装,依赖epel源,因为之前已经安装了,所以注释掉了

        #wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

        yum -y install libmcrypt-devel mhash mcrypt

        rpm -qa libmcrypt-devel mhash mcrypt

第二个里程:下载解压PHP软件

php官方网站下载:php.net

   cd /server/tools/

        tar xf php-5.5.32.tar.gz

        cd php-5.5.32

./configure  --prefix=/application/php-5.5.32  --with-mysql=/application/mysql-5.6.34  --with-pdo-mysql=mysqlnd  --with-iconv-dir=/usr/local/libiconv  --with-freetype-dir  --with-jpeg-dir  --with-png-dir  --with-zlib  --with-libxml-dir=/usr  --enable-xml  --disable-rpath  --enable-bcmath  --enable-shmop  --enable-sysvsem  --enable-inline-optimization  --with-curl  --enable-mbregex  --enable-fpm  --enable-mbstring  --with-mcrypt  --with-gd  --enable-gd-native-ttf  --with-openssl  --with-mhash  --enable-pcntl  --enable-sockets  --with-xmlrpc  --enable-soap  --enable-short-tags  --enable-static  --with-xsl --with-fpm-user=www  --with-fpm-group=www  --enable-ftp  --enable-opcache=no

 

        ##防报错处理(以下信息可以不进行配置了) ,用来与数据库沟通

        ln -s /application/mysql/lib/libmysqlclient.so.18  /usr/lib64/

   创建文件,用来保存安装信息

        touch ext/phar/phar.phar 

   安装

   make

        make install

   ln -s /application/php-5.5.32/ /application/php

第三个里程:设置PHP程序配置文件

        php.ini      php-fpm.ini     两个配置文件

   cd php-5.5.32

        cp php.ini-production /application/php-5.5.32/lib/

   cd /application/php/etc/

   cp php-fpm.conf.default php-fpm.conf

第四个里程:启动php程序服务

  /application/php/sbin/php-fpm   这样就启动了

  netstat -lntup|grep php

        tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      6251/php-fpm

2)进行软件直接的结合

nginx与php结合:编写nginx配置文件

  vim /application/nginx/conf/extra/blog.conf

   location ~* .*\.(php|php5)?$ {     # 不缺分大小写,地址后面有php或者php5
          fastcgi_pass  127.0.0.1:9000;   # 将请求抛给 127.0.0.1:9000,实际上就是抛给PHP服务
          fastcgi_index index.php;    # 当没有指定特殊的请求的时候,默认的动态资源文件
          include fastcgi.conf;    # 接口配置文件
       }

原来的blog.conf

    server {
        listen       80;
        server_name  blog.etiantian.org;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
    }

修改后的

[root@web01 extra]# vim blog.conf 
    server {
        listen       80;
        server_name  blog.etiantian.org;
        root   html/blog;
        index  index.html index.htm;
        location ~* .*\.(php|php5)?$ {
          fastcgi_pass  127.0.0.1:9000;
          fastcgi_index index.php;
          include fastcgi.conf;
       }
    }   

检查并平滑重启

[root@web01 extra]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-12.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-12.2/conf/nginx.conf test is successful
[root@web01 extra]# /application/nginx/sbin/nginx -s reload

测试

[root@web01 html]# cd /application/nginx/html/blog/
[root@web01 blog]# ll
total 4
-rw-r--r-- 1 root root 28 Feb 26 19:46 index.html
[root@web01 blog]# vim test_php.php
<?php
phpinfo();
?>
                                                                                                     
"test_php.php" [New] 3L, 20C written                                                 
[root@web01 blog]# 

重启后,访问blog.etiantian.org/test_php.php成功(配置hosts)

php与mysql结合:编写php程序代码

[root@web01 blog]# vim test_mysql.php
   <?php
           //$link_id=mysql_connect('主机名','用户','密码');
           //mysql -u用户 -p密码 -h 主机
        下面link_id这是了一个变量,创建了一个函数用来连接mysql
           $link_id=mysql_connect('localhost','root','oldboy123') or mysql_error();
           if($link_id){
                        echo "mysql successful by oldboy !\n";
                       }else{
                        echo mysql_error();
                       }
       ? >   

访问blog.etiantian.org/test_mysql.php成功

3)部署一个真的网站

第一个里程:下载与上传网站代码

  以wordpress网站模板为例子,将压缩包传到服务器中

第二个里程:解压程序代码,将程序代码保存到站点目录并进行授权

  cd /server/tools/

  tar xf wordpress-4.7.3-zh_CN.tar.gz

  mv wordpress/* /application/nginx/html/blog/

  修改权限为nginx的work进程相通的用户权限

  chown -R www.www /application/nginx/html/blog/

    为什么要用www呢,因为我们的这个nginx程序,当用户访问进来之后,有点类似我们之前所学的rsync和nfs,不管你你的哭护短身份是什么,可能是win7、win10不管是什么样的主机以什么样的身份登录我们的主机,都会把我们的身份做一个映射,压缩转换,而我们的www会把他映射转换成相应的www用户,而之前的rsync转换成相应的rsync用户,nfs转换成nfs-nobody用户,这都需要改相应的程序目录权限。而现在。把站点目录改成相应的www用户管理,只有这样设置以后,以后有用户向目录中写入数据的时候,我们才能有数据信息生成出来,否则,就会报权限终止,只能查看,无法上传和修改。先放置最大,通过以后的学习,再调整。

 

第三个里程:直接访问blog网站,进行初始化操作

直接访问blog.etiantian.org,会出现403

这是因为,我们blog.conf中的配置如果没有指定后缀,默认是访问index.html

但是,在我们的目录中没有这个文件

修改一下配置文件,在默认中加入index.php
[root@web01 html]# vim /application/nginx/conf/extra/blog.conf 
    server {
        listen       80;
        server_name  blog.etiantian.org;
        root   html/blog;
        index index.php index.html index.htm;
        location ~* .*\.(php|php5)?$ {
          fastcgi_pass  127.0.0.1:9000;
          fastcgi_index index.php;
          include fastcgi.conf;
       }
    }
创建数据库:

  /application/mysql/bin/mysql -uroot -p

  create database wordpress;

  show databases;

创建连接数据用户信息

   grant all on wordpress.* to 'wordpress'@'localhost' identified by '123456';

   select user,host from mysql.user;

nginx反向代理负载均衡

01. LNMP架构迁移数据库说明

  我们把所有的LNMP软件都装在了一台服务器上,但是,这样安装会造成各个web服务器上的数据不一致,所以无法统一数据资源。

  现在,我们需要把数据资源都存储在一个地方,存储在db01的服务器上。

  迁移数据库:利用数据库备份命令(mysql mysqladmin mysqldump) 

1) 备份数据库数据库信息

        /application/mysql/bin/mysqldump -uroot -p123456 --all-databases >/tmp/bak.sql

        ll /tmp/bak.sql -h

        scp /tmp/bak.sql 172.16.1.51:/tmp/

   注:数据库没有启动,将无法使用命令mysqldump

2) 恢复数据库数据库信息,并授权给远程服务器用户

        ##db01

        /application/mysql/bin/mysql -uroot -p123456 </tmp/bak.sql

        ###web01添加新的用户,并授权

        grant all on wordpress.* to wordpress@'172.16.1.0/255.255.255.0' identified by '123456;

        flush privileges;

        /application/mysql/bin/mysql -uwordpress -poldboy123 -h 172.16.1.51

3) 数据库迁移完毕,修改网站连接数据库的配置文件

  /application/mysql/bin/mysql -uwordpress -poldboy123 -h 172.16.1.51       <-- 修改配置文件之前,先测试网站web服务器与迁移后的数据库连通性

  cd /application/nginx/html/blog/

  vim wp-config.php                                                     <-- 修改wordpress上的数据库连接参数信息

    /** MySQL主机 */

    define('DB_HOST','172.16.1.51')                       <-- 修改连接的主机信息,将localhost修改为172.16.1.51

  说明:web服务器数据库此时可以关闭了 

4)停止nginx服务器上MySQL服务(web01)    

  /etc/init.d/mysql stop

02. LNMP架构数据迁移到NFS存储说明

01:先将原有目录中数据移出(web01服务器)

        cd /application/nginx/html/blog/wp-content/uploads

        mkdir /tmp/wordpress_backup -p

        mv ./* /tmp/wordpress_backup/

        

        数据存储到本地什么位置,获取方法

        ①. 通过网站页面右键点击,获取资源地址信息

        ②. find命令利用-mmin 5

        ③. 利用inotify服务监控目录数据变化  

02NFS服务器上配置创建共享目录

 

[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
[root@nfs01 ~]# showmount -e 172.16.1.31

[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt/


[root@nfs01 ~]# showmount -e 172.16.1.31

[root@web01 ~]# mount -t nfs 172.16.1.31:/data/ ./uploads/
[root@web01 ~]# cd /application/nginx/html/blog/wp-content/uploads
[root@web01 uploads]# mv /tmp/wordpress_backup/* ./

 

        vim /etc/exports

        /data 172.16.1.0/24(rw,sync,all_squash)

        showmount -e 172.16.1.31

        mount -t nfs 172.16.1.31:/data /mnt/

        上面是之前做过的配置,现在,将nfs挂载到upload是下面

        showmount -e 172.16.1.31

        mount -t nfs 172.16.1.31:/data/ ./uploads/

        mv /tmp/wordpress_backup/* ./

03. nginx反向代理负载均衡功能

集群概念知识介绍

一群完成相同工作的服务器

  集群概念作用说明:

    1、提高网站处理请求能力;2、提高网站稳定运行,高可用性

  集群作用分类说明

    1、高可用集群HA;

    2、负载均衡集群LB

      硬件实现:1、F5硬件设备;2、A10硬件设备;价格贵

      软件实现:1、Nginx(7层,19之后支持4层负载);2、LVS(4层);3、HAproxy(4层、7层)

  负载均衡概念说明:

    1、对用户请求进行跳读管理;2、对用户的访问请求进行压力分担

  反向代理概念说明:

    1、接受用户请求代替用户向后端访问;2、反向代理与数据转发概念区别说明

          客户端====代理服务器===web服务器

          客户端看到的服务端==代理服务器

          代理服务器====web服务器

 

  反向代理功能架构

    3web服务器,组建出web服务器集群

      web01  10.0.0.7   172.16.1.7

      web02  10.0.0.8   172.16.1.8

         web03  10.0.0.9   172.16.1.9

    1台负载均衡服务器

      lb01   10.0.0.5   172.16.1.5

. 部署web服务器

第一个里程:安装部署nginx软件

mkdir /server/tools -p
cd /server/tools
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar xf nginx-1.12.2.tar.gz
yum install -y pcre-devel openssl-devel
useradd -M -s /sbin/nologin www
cd nginx-1.12.2
#在我们装好的nginx软件的服务器是上用 nginx -V 命令找到 编译参数
./configure --prefix=/application/nginx-1.12.2 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
make && make install
ln -s /application/nginx-1.12.2 /application/nginx
 /application/nginx/sbin/nginx
netstat -lntup|grep nginx

第二个里程:编辑nginx配置文件

   server {

           listen       80;

           server_name  www.etiantian.org;

           root   html/www;

           index  index.html index.htm;

       }

       server {

           listen       80;

           server_name  bbs.etiantian.org;

           root   html/bbs;

           index  index.html index.htm;

       }

   scp -rp /application/nginx/conf/nginx.conf 172.16.1.8:/application/nginx/conf/

   scp -rp /application/nginx/conf/nginx.conf 172.16.1.9:/application/nginx/conf/

   

第三里程:创建模拟测试环境

   mkdir /application/nginx/html/{www,bbs} -p

   for name in www bbs;do echo "$(hostname) $name.etiantian.org" >/application/nginx/html/$name/oldboy.html;done

   for name in www bbs;do cat /application/nginx/html/$name/oldboy.html;done

   

第四里程:在负载均衡服务器上,进行测试访问

       curl -H host:www.etiantian.org 10.0.0.7/oldboy.html

       web01 www.etiantian.org

       curl -H host:bbs.etiantian.org 10.0.0.7/oldboy.html

       web01 bbs.etiantian.org

       curl -H host:www.etiantian.org 10.0.0.8/oldboy.html

       web02 www.etiantian.org

       curl -H host:bbs.etiantian.org 10.0.0.8/oldboy.html

       web02 bbs.etiantian.org

       curl -H host:www.etiantian.org 10.0.0.9/oldboy.html

       web03 www.etiantian.org

       curl -H host:bbs.etiantian.org 10.0.0.9/oldboy.html

       web03 bbs.etiantian.org

. 部署负载均衡服务器(upstream和proxy_pass)

第一个里程:安装部署nginx软件

mkdir /server/tools -p
cd /server/tools
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar xf nginx-1.12.2.tar.gz
yum install -y pcre-devel openssl-devel
useradd -M -s /sbin/nologin www
cd nginx-1.12.2
./configure --prefix=/application/nginx-1.12.2 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
make && make install
ln -s /application/nginx-1.12.2 /application/nginx
/application/nginx/sbin/nginx
netstat -lntup|grep nginx

第二个里程:编写nginx反向代理配置文件

精简化配置文件

  grep -Ev "#|^$" nginx.conf.default >nginx.conf

两个模块应用
# upstream 官方链接:

http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream

Syntax: upstream name { ... }

        Default: —

        Context: http      # 只能配置在http中

eg:

upstream oldboy {

# 名字(oldboy)可以随便定义

   server 10.0.0.7:80;

   server 10.0.0.8:80;

   server 10.0.0.9:80;

}

# 说明:upstream模块就类似定义一个一个地址池或者说定一个web服务器组

 

# proxy_pass 官方链接:

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

Syntax: proxy_pass URL;

        Default: —

        Context: location, if in location, limit_except

eg:

location / {

   proxy_pass http://oldboy;

}

# 说明:proxy_pass主要用于进行抛送用户访问请求给upstream模块中的相应节点服务器
修改配置文件
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;     
    keepalive_timeout  65;
    upstream oldboy {
        server 10.0.0.7:80;
        server 10.0.0.8:80;
        server 10.0.0.9:80;
    }
    server {
        listen       80;     
        server_name  localhost;
        root   html;   
        index  index.html index.htm;
      location / {
          proxy_pass http://oldboy;
       }       
    }
}
 重启nginx

  /application/nginx/sbin/nginx -t

       /application/nginx/sbin/nginx -s reload

 负载的多虚拟机配置

 定义多个虚拟主机标签信息
      ①. proxy模块参数添加-proxy_set_header Host $host    使用浏览器中的请求HOST
      ②. proxy模块参数添加-proxy_set_header X-Forwarded-For $remote_addr  保留原始访问信息

第三个里程:进行访问负载均衡服务器测试

1)利用浏览器进行测试

   进行hosts解析

  10.0.0.5  www.etiantian.org

    访问http://www.etiantian.org/oldboy.html  

  --- >利用ctrl+F5刷新测试,检查是否进行负载调度

2)利用curl命令进行测试

           [root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.5/oldboy.html

           web01 www.etiantian.org

           [root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.5/oldboy.html

           web02 www.etiantian.org

           [root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.5/oldboy.html

           web03 www.etiantian.org

04.Nginx反向代理负载均衡模块详述

ngx_http_upstream_module  

说明:定义后端集群web节点信息,定义一个地址的池子 

模块常用功能

①. 定义后端可调度节点信息
# 标准配置
upstream oldboy {
        server 10.0.0.7:80;
        server 10.0.0.8:80;
        server 10.0.0.9:80;
}

②. 实现权重值负载访问功能-weight

# 服务器的品质不一定是一样的,所以,给好的服务器承担多一点,数字越大,责任越大

upstream oldboy {
        server 10.0.0.7:80 weight=3;
        server 10.0.0.8:80 weight=1;
        server 10.0.0.9:80 weight=1;
}
注:共分配了5个权重,加入有5个请求,3个会去10.0.0.7
③. 定义后端访问的失败次数-max_fails

# 我们的负载服务器要随时观察,下面负责的web服务器是否可用,如果可用,我才分配请求

# 因此,就有了一个健康检查的功能

# 在达到最大失败次数之后,就不再分配请求

upstream oldboy {
        server 10.0.0.7:80 weight=3 max_fails=2;
        server 10.0.0.8:80 weight=1 max_fails=1;
        server 10.0.0.9:80 weight=1 max_fails=3;
}
④. 定义后端失败重试的间隔-fail_timeout
# 比如10.0.0.7出现异常后,我先给你3次机会,但是都没有成功,就不给了,
# 10s后再给一次机会,如果还不行,就不给了,再等10s后给一次......

upstream oldboy {
        server 10.0.0.7:80 weight=3 max_fails=2 fail_timeout=10s;
        server 10.0.0.8:80 weight=1 max_fails=1;
        server 10.0.0.9:80 weight=1 max_fails=3;
}
⑤. 定义后端服务的热备节点-backup(负载节点服务器都挂了,使用备份)

# 谁都不好用的时候,我才用9,只要有好的,就不用9
upstream oldboy {
        server 10.0.0.7:80 weight=3 max_fails=2 fail_timeout=10s;
        server 10.0.0.8:80 weight=1 max_fails=1;
        server 10.0.0.9:80 backup;
}

模块调度算法

①. 定义轮询调度算法-rr-默认调度算法

  采取平均分配

②. 定义权重调度算法-wrr

  能者多劳

③. 定义静态调度算法-ip_hash
# 配置ip_hash
upstream oldboy {
        ip_hash;
        server 10.0.0.7:80 ;
        server 10.0.0.8:80 ;
        server 10.0.0.9:80 ;
}
# 注意:配置ip_hash时,一定不能和backup与weight参数同时使用
④. 定义最小的连接数-least_conn

  谁的链接多,就不要再分配给他了,谁的链接少,给他多分配一点,达到最小连接数

ngx_http_proxy_module

 模块常用功能

①. 修改反向代理到后端请求头信息-proxy_set_header
# 作用:设置反向代理服务器到web服务器的HTTP请求中的头部信息
# 配置nginx.conf
[root@lb01 nginx]# vim ./conf/nginx.conf
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream oldboy {
        server 10.0.0.7:80;
        server 10.0.0.8:80;
        server 10.0.0.9:80;
    }
    server {
        listen       80;
        server_name  www.etiantian.org;
        root   html;
        index  index.html index.htm;
      location / {
        proxy_pass http://oldboy;
       }   
    }
    server {
        listen       80;
        server_name  bbs.etiantian.org;
        root   html;
        index  index.html index.htm;
      location / {
        proxy_pass http://oldboy;
       }
"./conf/nginx.conf" 33L, 722C written                                              
[root@lb01 nginx]# ./sbin/nginx -t
nginx: the configuration file /application/nginx-1.12.2/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.12.2/conf/nginx.conf test is successful
[root@lb01 nginx]# ./sbin/nginx -s reload
# 用浏览器访问 www.etiantian.org
# 是正常的
# 用浏览器访问 bbs.etiantian.org
# 访问的竟然也是www.etiantian.org的结果
# 用抓包软件看一下
# 抓取http协议的包,看到在虚部服务器中,使用的是分组名oldboy请求,这样,就会使用相应的IP地址在访问web服务器,如果用IP地址访问服务器,默认响应的是第一个虚拟主机

# 所以,解决的方式就是HOST使用bbs.etiantian.org去访问
# 我们需要修改请求头的HOST信息
# 在配置文件中修改
location / {   proxy_pass http://oldboy;   proxy_set_header host $host # 这个$host 就是客户端浏览器请求头中的HOST }
server {
        listen       80;
        server_name  www.etiantian.org;
        root   html;
        index  index.html index.htm;
        location / {
        proxy_pass http://oldboy;
        proxy_set_header  host $host; 
       }   
    }
server {
    listen       80;
    server_name  bbs.etiantian.org;
    proxy_set_header  host $host; 
    root   html;
    index  index.html index.htm;
    location / {
    proxy_pass http://oldboy;
   }
2.保留原始访问地址X-Forwarded-For $remote_addr
# 打开我们我日志监控
[root@web01 logs]# tail -f access.log
# 进行一次访问,查看日志
10.0.0.5 - - [28/Feb/2019:15:18:30 +0800] "GET /oldboy.html HTTP/1.0" 200 24 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0" "-"
10.0.0.5 - - [28/Feb/2019:15:18:32 +0800] "GET /favicon.ico HTTP/1.0" 404 169 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0" "-"
# 发现,日志中并不是真实的访问IP,而是10.0.0.5反向代理服务器
# 这里就有问题了
# 有时候,我们需要统计有多少用户在访问我们,肯定无法得到真实的信息
# 这时需要修改配置proxy_set_header
location / {
  proxy_pass http://oldboy;
  proxy_set_header  host $host  # 这个$host 就是客户端浏览器请求头中的HOST
  proxy_set_header X-Forwarded-For $remote_addr 
}
#重新访问,查看日志
10.0.0.5 - - [28/Feb/2019:15:28:31 +0800] "GET /oldboy.html HTTP/1.0" 200 24 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0" "10.0.0.253"
10.0.0.5 - - [28/Feb/2019:15:28:31 +0800] "GET /favicon.ico HTTP/1.0" 404 169 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0" "10.0.0.253"
# 在日志的最后多了一个IP地址

说明:X-Forwarded-For  $remote_addr 实现用户访问反向代理服务,让web服务器日志中记录真实的IP地址信息

 

server {
        listen       80;
        server_name  www.etiantian.org;
        root   html;
        index  index.html index.htm;
        location / {
        proxy_pass http://oldboy;
        proxy_set_header  host $host; 
        proxy_set_header X-Forwarded-For $remote_addr;
       }   
    }
server {
    listen       80;
    server_name  bbs.etiantian.org;
    root   html;
    index  index.html index.htm;
    location / {
    proxy_pass http://oldboy;
    proxy_set_header  host $host; 
    proxy_set_header X-Forwarded-For $remote_addr;
   }

1、负载均衡反向代理根据请求地址分配

解题:

解题方法:

1)完成nginx网站服务器配置
第一个里程:创建测试环境
# 10.0.0.8 主机上创建upload目录,然后生成网站测试页面文件
cd /application/nginx/html/www/
mkdir upload
cp oldboy.html upload/
# 10.0.0.7 主机上创建static目录,然后生成网站测试页面文件
cd /application/nginx/html/www/
mkdir static
cp oldboy.html static/
# 10.0.0.9 主机上创建默认测试页面文件即可

第二个里程:利用lb01进行访问测试
# 测试10.0.0.8访问是否正常
curl -H host:www.etiantian.org 10.0.0.8/upload/oldboy.html
web02 www.etiantian.org
# 测试10.0.0.7访问是否正常
curl -H host:www.etiantian.org 10.0.0.7/static/oldboy.html
web01 www.etiantian.org 
# 测试10.0.0.9访问是否正常
curl -H host:www.etiantian.org 10.0.0.9/oldboy.html
web03 www.etiantian.org
2)完成nginx反向代理服务器配置
第一个里程:配置upstream模块信息
upstream upload {
    server 10.0.0.8:80;
    }
upstream static {
    server 10.0.0.7:80;
    }
upstream default {
    server 10.0.0.9:80;
    }   
第二个里程:配置proxy_pass模块信息 server { listen
80; server_name www.etiantian.org; root html; index index.html index.htm; location / { proxy_pass http://default; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } location /upload { proxy_pass http://upload; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } location /static { proxy_pass http://static; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } }

2、负载均衡反向代理根据访问软件分配

根据用户请求客户端软件,显示不同页面信息

解决:

1)nginx网站服务器配置
第一个里程:创建测试环境
# 10.0.0.8 主机上创建upload目录,然后生成网站测试页面文件
cd /application/nginx/html/www/
cat oldboy.html
# 10.0.0.7 主机上创建static目录,然后生成网站测试页面文件
cd /application/nginx/html/www/
cat oldboy.html
# 10.0.0.9 主机上创建默认测试页面文件即可
cd /application/nginx/html/www/
cat oldboy.html

测试访问:
[root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.7/oldboy.html
web01 www.etiantian.org
[root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.8/oldboy.html
web02 www.etiantian.org
[root@lb01 conf]# curl -H host:www.etiantian.org 10.0.0.9/oldboy.html
web03 www.etiantian.org
 
2)nginx反向代理服务器配置
第一个里程:配置upstream模块信息
    upstream iphone {
    server 10.0.0.8:80;
    }
    upstream android {
    server 10.0.0.7:80;
    }
    upstream pc {
    server 10.0.0.9:80;
    }   

第二个里程:配置proxy_pass模块信息 server { listen
80; server_name www.etiantian.org; root html; index index.html index.htm; location / { if ($http_user_agent ~* "iphone") { proxy_pass http://iphone; } if ($http_user_agent ~* "android") { proxy_pass http://android; } proxy_pass http://pc; proxy_set_header host $host; proxy_set_header X-Forwarded-For $remote_addr; } }

keepalived高可用集群

01. keepalived服务概念说明   

keepalived软件能干什么?

    Keepalived软件起初是专为LVS负载均衡软件设计的,

    用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能

 

    Keepalived软件主要是通过VRRP协议实现高可用功能的。

    VRRPVirtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,

    VRRP出现的目的就是为了解决静态路由单点故障问题的,

 它能够保证当个别节点宕机时,整个网络可以不间断地运行

keepalived软件工作原理?(重点)

原理

    1VRRP协议,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,

       VRRP的出现是为了解决静态路由的单点故障。

    2VRRP是用过IP多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信的。

    3)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,

       就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,

       但一般Keepalived系统运维工作中都是一对。

keepalived软件主要功能

    ①. 管理LVS负载均衡软件

    ②. 实现对LVS集群节点健康检查功能

    ③. 作为系统网络服务的高可用功能

02. 部署keepalived高可用服务

1)确认反向代理服务是否工作正常

第一个里程:在lb01/lb02上测试web服务器是否可以正常

curl -H host:www.etiantian.org 10.0.0.7/oldboy.html

curl -H host:www.etiantian.org 10.0.0.8/oldboy.html

curl -H host:www.etiantian.org 10.0.0.9/oldboy.html

curl -H host:bbs.etiantian.org 10.0.0.7/oldboy.html

curl -H host:bbs.etiantian.org 10.0.0.8/oldboy.html

curl -H host:bbs.etiantian.org 10.0.0.9/oldboy.html

   

第二个里程:在浏览器上测试访问lb01/lb02

   解析hosts文件,将域名解析为10.0.0.5,进行测试访问

   解析hosts文件,将域名解析为10.0.0.6,进行测试访问

   scp -rp /application/nginx/conf/nginx.conf 10.0.0.6:/application/nginx/conf/  ---测试前同步lb01lb02配置文件 

2)安装部署高可用keepalived服务

   第一个里程:安装keepalived服务软件

   yum install -y keepalived

 

   第二个里程:编写keepalived配置文件

   vim /etc/keepalived/keepalived.conf

   man keepalived.conf   --- 配置文件说明信息

   配置文件结构:

       GLOBAL CONFIGURATION  --- 全局配置(*

       VRRPD CONFIGURATION    --- vrrp配置(*

       LVS CONFIGURATION          --- LVS服务相关配置

   lb01主负载均衡器配置

 

! Configuration File for keepalived

global_defs {
    router_id lb01
}

vrrp_instance gorup01 {
   state MASTER
   interface eth0
   virtual_router_id 51
   priority 150
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       10.0.0.3/24 dev eth0 label eth0:1
   }
}

   /etc/init.d/keepalived start

   lb02配置信息

 

! Configuration File for keepalived

global_defs {
    router_id lb02
}

vrrp_instance group01 {
   state BACKUP
   interface eth0
   virtual_router_id 51
   priority 100
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       10.0.0.3/24 dev eth0 label eth0:1
   }
}

   /etc/init.d/keepalived start

3)进行测试访问

10.0.0.5

[root@lb01 nginx]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:e6:d1:df brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
    inet 10.0.0.3/24 scope global secondary eth0:1    # vip网卡地址
    inet6 fe80::20c:29ff:fee6:d1df/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:e6:d1:e9 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1
    inet6 fe80::20c:29ff:fee6:d1e9/64 scope link 
       valid_lft forever preferred_lft forever

10.0.0.6

[root@lb02 conf]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:5f:f1:03 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
    inet6 fe80::20c:29ff:fe5f:f103/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:5f:f1:0d brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.6/24 brd 172.16.1.255 scope global eth1
    inet6 fe80::20c:29ff:fe5f:f10d/64 scope link 
       valid_lft forever preferred_lft forever

模拟10.0.0.5宕机

[root@lb01 nginx]# /etc/init.d/keepalived stop
Stopping keepalived:                                       [  OK  ]
[root@lb01 nginx]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:e6:d1:df brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
    inet6 fe80::20c:29ff:fee6:d1df/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:e6:d1:e9 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1
    inet6 fe80::20c:29ff:fee6:d1e9/64 scope link
       valid_lft forever preferred_lft forever

查看10.0.0.6

[root@lb02 conf]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:5f:f1:03 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
    inet 10.0.0.3/24 scope global secondary eth0:1
    inet6 fe80::20c:29ff:fe5f:f103/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:5f:f1:0d brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.6/24 brd 172.16.1.255 scope global eth1
    inet6 fe80::20c:29ff:fe5f:f10d/64 scope link
       valid_lft forever preferred_lft forever

无论谁是主,客户端访问的都是10.0.0.3这个地址

03. 部署keepalived高可用服务问题

    同时在keepalived高可用集群中,出现了两个虚拟IP地址信息,这种情况就称为脑裂

脑裂情况出现原因

  1. 心跳线出现问题

       网卡配置有问题

       交换设备有问题

       线缆连接有问题

  2. 有防火墙软件阻止问题

  3. virtual_router_id配置数值不正确

  总之:只要备服务器收不到组播包,就会成为主,而主资源没有释放,就会出现脑裂

解决:利用shell脚本实现监控管理

  出问题要点:备用设备有VIP就是表示不正常

    01. 真正实现主备切换

    02. 出现脑裂情况了

#!/bin/bash
check_info=$(ip a|grep -c 10.0.0.3)
# -c 统计数字
if [ $check_info -ne 0 ]
then
   echo "keepalived server error!!!"
fi

04. 实现nginx反向代理监控虚拟IP地址

  为了网站的安全性,在我们的架构中,只给负载服务器提高外网网卡,

  其他的服务器都不设置外网网卡。

  所以,负载服务器就成了可能被黑客攻击的入口。

  对于攻击者而言,不要让他看到服务器的IP(你访问IP地址,我可以不接受)

  通过监听网卡,

1)编写nginx反向代理配置

server {
        listen      10.0.0.3:80;
        server_name  www.etiantian.org;
        root   html;
        index  index.html index.htm;
        location / {
            proxy_pass http://oldboy;
            proxy_set_header host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
    }

server {
        listen       10.0.0.3:80;
        server_name  bbs.etiantian.org;
        root   html;
        index  index.html index.htm;
        location / {
            proxy_pass http://oldboy;
            proxy_set_header host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
       }
    }

    /application/nginx/sbin/nginx -s stop  修改了IP地址一定要重启

    /application/nginx/sbin/nginx

 netstat -lntup|grep nginx

    tcp        0      0 10.0.0.3:80                 0.0.0.0:*                   LISTEN      53334/nginx    

 

2)实现监听本地网卡上没有的IP地址

 因为只能监听网卡上有的地址,如果10.0.0.3没有,启动程序后就会报错

[root@lb01 nginx]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:e6:d1:df brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
    inet6 fe80::20c:29ff:fee6:d1df/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:e6:d1:e9 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.5/24 brd 172.16.1.255 scope global eth1
    inet6 fe80::20c:29ff:fee6:d1e9/64 scope link 
       valid_lft forever preferred_lft forever
[root@lb01 nginx]# ./sbin/nginx -s stop
[root@lb01 nginx]# ./sbin/nginx
nginx: [emerg] bind() to 10.0.0.3:80 failed (99: Cannot assign requested address)

 解决:修改内核配置参数

    echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf

    sysctl -p

3)10.0.0.5和10.0.0.6已经无法访问

  只能访问10.0.0.3 记得修改hosts

  服务器的地址已经无法实现访问,只有一个虚拟IP地址提供访问

  实现了提高了网站的安全性

05. 将高可用keepalived服务和反向代理nginx服务建立联系

  为什么要部署高可用keepalived?你可能会说。是为了是防止一台宕机还能工作~!

     但是,当我们把nginx反向代理服务停止之后,keepalived服务并没有进行主备切换!

  那么,我们的页面就这样丢失了!这不是我们希望看到的

  我们希望,

  nginx反向代理服务停止之后,keepalived服务也停止!

1)编写脚本

#!/bin/bash
web_info=$(ps -ef|grep [n]ginx|wc -l)
if [ $web_info -lt 2 ]
then
  /etc/init.d/keepalived stop
fi
注:grep 中 带上[]表示 过滤grep命令本身

  chmod +x check_web.sh   --- 修改脚本可执行权限

2)运行脚本,实现监控nginx服务

 可以编写一个定时任务,也可以编写一个while 循环 放在守护进程里面

    更好的方法

    编辑keepalived服务配置文件

 vrrp_script check_web {
    #定义一个监控脚本,脚本必须有执行权限
        script "/server/scripts/check_web.sh"    
    #指定脚本间隔时间
        interval 2   
        #脚本执行完成,让优先级值和权重值进行运算,从而实现主备切换
  # 在本例子中,服务已经被停止了, 
        weight 2                                                                            
    }
    track_script {
         check_web
    }

 脚本要添加在全局配置和实例配置之间

 执行脚本的函数放在实例中

! Configuration File for keepalived
global_defs {
  router_id lb01
}
vrrp_script check_web {
    #定义一个监控脚本,脚本必须有执行权限
    script "/server/scripts/check_web.sh"
    #指定脚本间隔时间
    interval 2
    #脚本执行完成,让优先级值和权重值进行运算,从而实现主备切换
  # 在本例子中,服务已经被停止了,所以这个权重计算没有意义
    weight 2
    }
vrrp_instance gorup01 {
   state MASTER
   interface eth0
   virtual_router_id 51
   priority 150
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
       10.0.0.3/24 dev eth0 label eth0:1
   }
   # 执行监控脚本函数
   track_script {
         check_web
   }
}

 备注:在实际测试中,出问题了,命令行中web_info 是0.但是脚本中却是2。没有找到原因

06. 实现高可用集群架构中双主配置(互为主备配置)

  再增加一个虚拟网卡

    lb01服务器

vrrp_instance gorup01 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3/24 dev eth0 label eth0:1
       }
    }

vrrp_instance gorup02 { state BACKUP interface eth0 virtual_router_id
52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 dev eth0 label eth0:1 } }

lb02服务器

vrrp_instance gorup01 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
virtual_ipaddress {
        10.0.0.3/24 dev eth0 label eth0:1
       }
    }
vrrp_instance gorup02 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.4/24 dev eth0 label eth0:1
        }
    }  

修改nginx反向代理监控地址信息,将bbs的监听地址改为10.0.0.4

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream oldboy {
        server 10.0.0.7:80;
        server 10.0.0.8:80;
        server 10.0.0.9:80;
    }
    server {
        listen      10.0.0.3:80;
        server_name  www.etiantian.org;
        root   html;
        index  index.html index.htm;
      location / { 
        proxy_pass http://oldboy;
        proxy_set_header  host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
       }
    }
    server {
        listen      10.0.0.4:80;
        server_name  bbs.etiantian.org;
        root   html;
        index  index.html index.htm;
      location / {
        proxy_pass http://oldboy;
        proxy_set_header  host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
       }
    }
}

 备注:在win的本地host中如下两种修改都能访问,我不知道是为什么

 10.0.0.3  www.etiantian.org

 10.0.0.4  bbs.etiantian.org

 或者

 10.0.0.3 www.etiantian.org   bbs.etiantian.prg

为啥咧?突然懂了,因为对于第一种情况来说,无论是www.或者bbs都解析到了10.0.0.3

HTTPS安全证书访问连接实践配置

01.网络安全涉及的问题

    ①. 网络安全问题-数据机密性问题

    传输的数据可能会被第三方随时都能看到

 

    ②. 网络安全问题-数据完整性问题

    传输的数据不能随意让任何人进行修改

 

    ③. 网络安全问题-身份验证问题

    第一次通讯时,需要确认通讯双方的身份正确

 

02.网络安全涉及的问题及解决

. 网络安全问题-数据机密性问题解决

a) 利用普通加密算法解决机密性

利用相应算法,对传输数据(明文数据)进行加密(密文数据);
再利用对应算法,将加密数据解密变为真实数据 优点:实现了数据机密传输,避免了明文传输数据的危险性。 缺点:利用加密算法,将明文改密文,如果第三方获得加密算法,即可将传输密文再次变为明文

b) 利用对称加密算法解决机密性(重要的一种加密方式)

对称加密算法就好比将普通算法的规则手册放入到了保险柜里,只有获取保险柜和保险柜钥匙才能获取《算法手册》
优点:密钥加密算法计算速度非常快;解决了普通加密算法的安全问题
缺点:加解密过程的安全性完全依赖于密钥,并且对称加密密钥是公开的,当通讯加密对象过多时,无法解决密钥管理问题。

. 网络安全问题-数据完整性问题解决

a) 利用单项加密算法(全网备份数据完整性)

根据数据生成特征码(数据指纹信息);
接收数据方获取数据信息算出特征码,验证是否与发送过来的特征码一致 若特征码一致,表示数据完整性没被破坏;若特征码不一致,表示数据已被破坏,直接丢弃
**************************************************************************** 扩展说明: 01:不同数据的特征码(数据指纹信息)是不可能一致的 单项加密算法特征 · 数据输入一样,特征码信息输出必然相同 · 雪崩效应,输入的微小改变,将造成输出的巨大改变 · 定长输出,无论源数据多大,但结果都是一样的 · 不可逆的,无法根据数据指纹,还原出原来的数据信息。 **************************************************************************** 优点:有效的解决了数据完整性问题 缺点:没有考虑中间人攻击对数据信息的影响

 

b) 利用单项加密算法(加密特征码)

利用对称加密算法对数据加密的同时,也对特征码进行加密;
接收方拥有和发送方一样的密钥,才可以解密加密后的数据和特征码
而中间人加密的特征码是没有办法让接收方进行解密的,所以接收方获取不了特征码,直接丢弃数据
****************************************************************************

扩展说明:
01:那么对称密钥如何有效的让通讯双方获取呢
需要进行对称密钥协商过程,即通过密钥交换机制(Internet key exchange IKE)
实现密钥交换机制的协议称为diffie-hellman协议
****************************************************************************

 

. 网络安全问题-身份验证问题解决

a)利用非对称密钥加密算法(公钥加密算法)

发送方建立私钥和公钥,将公钥发送给接收方,从而实现发送数据方的身份验证

让你的母亲验证你的爸爸身份信息,你的母亲就称为证书颁发机构

公钥信息在网站访问过程中,被称为证书(身份证)

 

网络安全问题结论:实现网络安全性,需要解决问题的顺序为

    1. 解决身份验证问题

    2. 解决数据完整性问题

    3. 解决数据机密性问题

03.网络安全证书由来

根据上述结论可知,网络安全性最首先要解决的就是身份验证问题;

而解决身份验证问题,最主要的方式就是借助私钥和公钥

 

默认公钥在网络进行传递时,默认情况下也是会出现问题的如下图所示:

而最主要的公钥信息获取就变得尤为重要;利用第三方公正者,公正公钥信息

所以为了避免上述情况的出现,需要引入一个新的概念:第三方CA证书签发机构。

目前标准的证书存储格式是x509,还有其他的证书格式,需要包含的内容为:

证书==身份证

公钥信息,以及证书过期时间  

证书的合法拥有人信息  

证书该如何被使用(不用关注)   

CA颁发机构信息

CA签名的校验码

 

04.网络安全算法知识总结

1.对称加密算法知识总结

对称加密算法特性是加密和解密使用同一个密钥,利用对称算法可以将明文改为密文(加密),密文还原为明文(解密)。

对称加密算法常见的有:

最早期的称为DES(Data Encryption Standard),是美国国家安全局征集加密算法时,由一个美国公司提出的,是公开可以使用的,使用的是56位的密钥长度,但是由于计算机的发展,可以使用计算机对56位的密钥进行暴力破解了,因此DES渐渐不再被使用。

一种新的算法,将DES加密后,再进行一次DES加密,然后再进行一次DES,称为3DES算法,是目前使用比较多的加密算法

更安全的加密算法,AES(高级加密标准)加密算法产生,默认使用128位的加密密钥,但是也有特殊的AESAES192 AES256 AES512等),密钥越长安全性提高的同时,加密效率就会降低,因此应该选择比较合适的加密算法

blowfish加密算法,加密不是按位进行加密的,而是将数据分成大小相同的数据块进行加密的

2.单向加密算法知识总结

单项加密算法常见的有:

DH加密算法,主要用于密钥的协商交换

MD4 MD5(128)

SHA1(160) SHA(192) SHA(256) SHA(384)

CRC-32(循环输出校验码),不是加密机制,只是一种校验机制,不提供安全性,正常加密算法是不允许出现输入不一样,输出一样的情况,但CRC是可以有这样情况的,因为CRC只是具有校验功能,不具有加密功能

3.非对称加密算法知识总结

非对称加密算法可以实现身份认证功能(通过数字签名实现),数据加密功能,以及现密钥交换功能。

非对称加密算法常见的有:

RSARSA既是一个公司的名称,也是三个创始人的名称,RSA既可以加密又可以进行签名。

DSA,只能实现数字签名功能

ELGamal,属于商业化的加密算法

加密和解密需要算法来实现,因此需要主机上可以有相应的软件工具来控制加密和解密的算法相应的工具就是加密和解密算法的具体实现,对称加密算法可以实现的工具:opensslgpg

05.OpenSSL软件详细说明

Netscape网景公司生产了最初的浏览器,但为了提高浏览器访问页面的安全性,对TCP/IP模型进行了一定改进,在传输层与应用层之间,
创建了一个3.5层的概念,称为SSL((Secure Sockets Layer 安全套接层))层,SSL不是一个软件,只是一个库,
让应用层将数据传输到传输层前,调用了ssl层的功能对数据进行了加密,目前比较流行的版本是(SSLv2 v3),
但是SSL是netscape公司进行定义的,不够开放性,因此为了使加密功能更加开放,TSL(传输层安全协议)协议就出现了,
目前比较流行的版本是(TSLv1==ssl v3),TSL更像是传输层上实现的数据加密。

SSL数据通讯实现原理介绍

由于借助SSL实现安全数据通讯的方式比较多,本文只以最基本的HTTP协议为例,了解一下SSL数据安全通讯的过程。具体实现过程说明如下:
01.http是基于tcp协议进行建立的,因此在建立tcp连接之前要先进行tcp的三次握手过程
02.三次握手之后,不马上进行数据的传输,而是进行SSL的建立
03.客户端首先向服务器端发起数据传输请求,但服务端不会回复http数据包,而是与客户端一来一回协商生成/建立SSL会话,
  确认是选用SSLv2还是SSLv3,TSL协议,并且还要协商加密算法。
04.服务端与客户端的加密协议协商好后,服务端会将自己的证书发送给客户端 05.客户端在获取到证书后,先进行对证书的验证,确认是否是信任机构颁发的,并且验证证书是否是完整的,以及确认证书是没有注销的,
  验证完毕后,获得的证书中的公钥就可以进行使用了
06.证书合法性验证完毕后,客户端会建立生成一个会话密钥 07.客户端选择随机数生成一个随机密钥,并且利用服务端的公钥对随机密钥进行加密,发给服务端 08.服务器端收到公钥加密的数据,就可以利用自己的私钥进行解密,获得对称密钥,就可以对传输数据进行加密了

openSSL概念说明

ssl功能的开源实现,就称为openssl,功能非常强大,几乎实现了市面上主流的加密算法,并且工作性能非常的好。
openssl的官方链接:http://openssl.org/。

openSSL软件组成部分

openssl是由三部分组成:
libcrpto:通用加密库
libssl:TSL/SSL功能的实现,基于会话的,实现了身份认证,数据机密性和会话完整性的TSL/SSL库
openssl:提供的命令行工具,多用途命令工具,模拟实现私有证书颁发机构;命令行工具是通过多种子命令实现openssl的相应功能

获取OpenSSL软件的版本信息:

rpm -qa openssl

openssl version <- 查看openssl版本信息

 

获取OpenSSL配置文件信息:

/etc/pki/tls/openssl.cnf     <- openssl配置文件,主要用于配置成私有ca时进行使用

说明:基本上openssl 配置文件不需要运维过多修改配置,有CA证书颁发机构去关注

 

利用openssl软件实现HTTPS访问过程

实现HTTPS:

第一步:创建出一个私钥文件(出生证明)--- 运维人员需要会

# openssl genrsa 2048 >server.key         <- 创建私钥信息,并指定私钥的长度为2048,并将生成的私钥信息保存在一个文件中

cd /server/key

openssl genrsa -out server.key 2048    <- 将私钥信息直接进行保存,加密长度一定要放在输出文件后面

chmod 600 server.key 

保存在/server/key需要自己创建,或者用下面的命令实现

cd /server/key

(umask 077;openssl genrsa -out server2048.key 2048)    <- 利用小括号,实现子shell功能,临时修改umask,使之创建的私钥文件权限为600

第二步:生成证书文件信息

. 生成自签发证书    --- 运维人员可以自行操作

[root@NFS-server-01 ~]# openssl  req  -new  -x509  -key server.key -out server.crt -days 365

    req <- 用于请求创建一个证书文件

    new <- 表示创建的是新的证书

    x509 <- 表示定义证书的格式为标准格式

    key <- 表示调用的私钥文件信息

    out <- 表示输出证书文件信息

    days <- 表示证书的有效期

    You are about to be asked to enter information that will be incorporated

    into your certificate request.

    What you are about to enter is what is called a Distinguished Name or a DN.

    There are quite a few fields but you can leave some blank

    For some fields there will be a default value,

    If you enter '.', the field will be left blank.

    -----

    Country Name (2 letter code) [XX]:CN <- 定义生成证书的国家

    State or Province Name (full name) []:BJ <- 定义生成证书的省份

    Locality Name (eg, city) [Default City]:BJ <- 定义生成证书的城市

    Organization Name (eg, company) [Default Company Ltd]:oldboy       <- 定义生成证书的组织

    Organizational Unit Name (eg, section) []:it       <- 定义生成证书的职能部门

    Common Name (eg, your name or your server's hostname) []:oldboy.com.cn    <- 定义主机服务器名称

    说明:此输出信息非常重要,客户端在获取证书前,会利用主机名与相应服务器之间建立连接,然后获得证书

    Email Address []:123@qq.com    <- 邮箱一定要填写正确

[root@web01 key]# ll
total 8
-rw------- 1 root root 1675 Mar  1 16:57 server2048.key
-rw-r--r-- 1 root root 1367 Mar  1 17:04 server.crt  # 生成了自签发证书,不具有合法性,主要用于本地测试

. 向证书颁发机构申请证书     --- ca证书版本机构完成

       生成请求证书文件 (户口本)       --- 运维人员完成

  openssl req -new -key server.key -out server.csr 

[root@web01 key]# openssl req -new -key server2048.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GD
Locality Name (eg, city) [Default City]:ZS
Organization Name (eg, company) [Default Company Ltd]:JINXINDENGSHI
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:web01    
Email Address []:123@qq.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:                # 可以设置密码,防止被截获
An optional company name []:
[root@web01 key]# ll
total 12
-rw------- 1 root root 1675 Mar  1 16:57 server2048.key
-rw-r--r-- 1 root root 1367 Mar  1 17:04 server.crt # 
-rw-r--r-- 1 root root 1025 Mar  1 17:09 server.csr # 发送给证书盘发机构,证书颁发机构会给我们crt

  获取得到证书文件 (身份证)       --- ca颁发机构完成   

  省略

第三步:配置网站服务,加载私钥和证书信息

 在web服务器设置nginx 添加server

# 样本:
server { server_name YOUR_DOMAINNAME_HERE; listen
443; # 不能使用80端口了,80是http的 ssl on; # 开启ssl功能 ssl_certificate /usr/local/nginx/conf/server.crt; # 加载证书 ssl_certificate_key /usr/local/nginx/conf/server.key; 加载key私钥 }


# 配置:

# 添加配置信息:自动加上https server { listen 80; server_name www.etiantian.org; rewrite ^(.*)$ https://$host$1 permanent; }

server {
        listen       443;
        server_name  www.etiantian.org;
        ssl on;
        ssl_certificate /server/key/server.crt;
        ssl_certificate_key /server/key/server.key;
        root   html/www;
        index  index.html index.htm;
    }
# 测试的时候,要将本地host文件解析到测试所在的web01服务器的ip地址

第四步:利用浏览器访问测试

第一次在没有设置rewrite 的时候,要输入https://www.etiantina.org进行访问

成功后,才有加入了配置,实现自动加上https

需要详细了解,请参看官方文档

ssl模块官方链接:http://nginx.org/en/docs/http/ngx_http_ssl_module.html

iptables防火墙网路安全实践配置

01.iptables防火墙网路安全前言介绍

学好iptables的基础:

  OSI7层模型以及不同层对应哪些协议?

  TCP/IP三次握手,四次断开的过程,TCP HEADER,状态转换

  常用的服务端口要非常清楚了解。

  常用服务协议原理http协议,icmp协议。

企业中安全配置原则:

  尽可能不给服务器配置外网IP,可以通过代理转发或者通过防火墙映射。

  并发不是特别大情况有外网IP,可以开启防火墙服务。

  大并发的情况,不能开iptables,影响性能,利用硬件防火墙提升架构安全。

02. iptables防火墙概念介绍

  真正实现防火墙的是一个内核netfiilter,我们的iptables是控制内核的软件。

  Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤

  的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。

  iptableslinux2.42.6内核中集成的服务。

  iptables主要工作在OSI七层的二(MAC地址的过滤局域网之间的通讯,一般不用)、三(IP地址)、四层(访问服务的端口),如果重新编译内核,iptables也可以支持7层控制

03. iptables防火墙使用时名词概念理解

容器

  容器:装东西的器皿,docker容器技术,将镜像装在了一个系统中,这个系统就称为容器

    iptables称为一个容器 --- 装着防火墙的表

    防火墙的表又是一个容器---装着防火墙的链

    防火墙的链也是一个容器---装着防火墙的规则

    iptables---------规则

规则

  规则:防火墙一条一条安全策略

    防火墙匹配规则流程:

防火墙工作流程图

    1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。

    2. 如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则。

    3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。

    4. 防火墙的默认规则是所有规则执行完才执行的。

表和链说明:45

  表(tables) 链(chains)

  Filter:实现防火墙安全过滤功能

  · INPUT          对于指定到本地套接字的包,即到达本地防火墙服务器的数据包      外面---->(门)房子iptables

  · FORWARD      路由穿过的数据包,即经过本地防火墙服务器的数据包                  外面-----(前门)房子(后门)---房子

  · OUTPUT  本地创建的数据包                                                                            外面<-----(门)房子iptables

  NAT:实现将数据包中IP地址或者端口信息,内网到外网进行改写/外网到内网进行改写

  · PREROUTING     一进来就对数据包进行改变        在路由之前,进行数据包IP地址或端口信息的转换

  · OUTPUT           本地创建的数据包在路由之前进行改变       本地防火墙要出去的流量进行相应转换(了解)

  · POSTROUTING  在数据包即将出去时改变数据包信息           在路由之后,进行数据包IP地址或端口信息的转换

  Managle :对数据进行标记

  raw :忽略不计

多个表和链的关系

  man iptables中可以查看

[root@web01 key]# man iptables
IPTABLES(8)                     iptables 1.4.7                     IPTABLES(8)

NAME
       iptables — administration tool for IPv4 packet filtering and NAT
# 是对 IPV4 进行管理

 数据包访问过滤流程

 

04. iptables防火墙操作实践练习

[root@web01 key]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@web01 key]# /etc/init.d/iptables start
iptables: Applying firewall rules:                         [  OK  ]
[root@web01 key]# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination       

# 上面的规则都是默认的

我们希望,规则都是我们自己设定的

1iptables防火墙配置初始化

   /etc/init.d/iptables start

   chkconfig iptables on

   iptables -F              --- 清除防火墙默认规则

   iptables -X              --- 清除防火墙自定义链

   iptables -Z              --- 清除防火墙计数器信息 

2iptables防护墙信息查看方法

   /etc/init.d/iptables status

   iptables -L               --- -L   以列表形式显示所有规则信息

   iptables -L -n           --- -n   以数字形式显示IP地址或端口信息,不要转换为字符串显示

   iptables -t nat -L -n  --- -t   表示指定查看或者配置相应的表

   iptables -L -n -v       --- -v   表示显示详细规则信息,包含匹配计数器数值信息

   iptables  -L -n --line-number      --- --line-number 显示规则序号信息

3iptables防火墙端口规则配置

实践01:阻止用户访问服务器的22端口

   iptables -t filter -A INPUT -p tcp --dport 22 -j DROP   --- -A 表示添加规则到相应链上,默认表示添加规则到结尾

   iptables -t filter -D INPUT -p tcp --dport 22 -j DROP   --- -D 表示删除规则从相应链上。

   iptables -t filter -D INPUT 规则序号

   iptables -t filter -I INPUT -p tcp --dport 22 -j DROP      --- -I 表示插入规则到相应链上,默认表示插入规则到首部

   iptables -t filter -I INPUT 3 -p tcp --dport 22 -j DROP   --- 指定规则插入位置

   iptables -t filter -R INPUT 6 -p tcp --dport 8080 -j DROP   --- -R 指定将配置好的规则信息进行替换

 

总结防火墙参数信息

   -A   --- 表示将规则添加到指定链上

   -I   --- 表示将规则插入到指定链上

   -D   --- 表示将规则从指定链上删除

   -R   --- 表示将规则信息进行修改

   -p   --- 指定相应服务协议信息(tcp udp icmp all

        --dport    --- 表示指定目标端口信息, 只有tcp和udp有端口信息

   --sport    --- 表示指定源端口号信息

   -j   --- 指定对相应匹配规则执行什么操作(ACCEPT DROP(拒绝推荐使用DROP) REJECT(拒绝)

实践02:阻止相应网段主机访问服务端指定端口服务

   10.0.0.0/24 -- 22端口(阻止)

   iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP  

   iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j DROP

   iptables -t filter -A INPUT -i eth0 -s 10.0.0.9 -p tcp --dport 22 -j DROP

总结参数信息

   -s   --- 指定匹配的源地址网段信息,或者匹配的主机信息

   -d   --- 指定匹配的目标地址网段信息,或者匹配的主机信息

   -i    --- 指定匹配的进入流量接口信息 只能配置在INPUT链上

   -o   --- 指定匹配的发出流量接口信息 只能配置在OUTPUT链上

实践03:除了某个地址可以访问22端口之外,其余地址都不能访问

   10.0.0.1 10.0.0.253    10.0.0.9(只允许)

 两行实现

   iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT

   iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP

   一步实现,利用!

   iptables -t filter -A INPUT ! -s 10.0.0.9 -p tcp --dport 22 -j DROP

   通过利用 !进行规则取反,进行策略控制

 我们设置的规则和默认的规则是如何配合的?默认的规则是最后采取匹配的

实践04:指定阻止访问多个端口服务

   22--80    22,24,25

   iptables -A INPUT -s 10.0.0.9 -p tcp --dport 22:80 -j DROP    --- 匹配连续的端口号访问

   iptables -A INPUT -s 10.0.0.9 -m multiport -p tcp --dport 22,24,25 -j DROP   --- 匹配不连续的端口号访问

总结参数信息

   -m            --- 指定应用扩展模块参数

     multiport   --- 可以匹配多个不连续端口信息

 

实践05: 通过防火墙实现禁ping功能

       实现ping功能测试链路是否正常,基于icmp协议实现的

       icmp协议有多种类型:

       icmp-type 8:请求类型  icmp-type 0:回复类型   

   情况一:实现禁止主机访问防火墙服务器(禁ping

   iptables -A INPUT -p icmp --icmp-type 8 -j DROP

   iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP

   情况二:实现禁止防火墙访问主机服务器(禁ping

   iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP

   iptables -A INPUT -p icmp --icmp-type 0 -j DROP

   默认情况:所有icmp类型都禁止

   iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP

   iptables -A OUTPUT -p icmp -m icmp --icmp-type any -j DROP

实践05:实现防火墙状态机制控制

   NEW: 发送数据包里面控制字段为syn=1,其他都是0,发送第一次握手的数据包

   ESTABLISHED: 请求数据包发出之后,响应回来的数据包称为回复的包

   RELATED: 基于一个连接,然后建立新的连接,进行新数据包的通讯(FTP传输-控制连接和传输连接)

   INVALID: 无效的的数据包,数据包结构不符合正常要求的(损坏、被修改等)

 

 允许哪些状态包:

   iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

05. 企业当中应用防火墙方法-部署一个最安全的企业级防火墙(案例)

    项目:部署一个最安全的企业级防火墙(案例)

    两种思想:针对默认规则而言。

    逛公园:黑名单

      1、默认规则默认是允许的状态。

    看电影:白名单(更安全,推荐配置)

      2、默认规则默认是不允许的状态。更安全。

    看电影的思想更安全。

1)保存防火墙配置文件信息

cp /etc/sysconfig/iptables{,.bak}

2)清除配置规则

iptables -F    <- 清空iptables所有规则信息(清除filter

iptables -X    <- 清空iptables自定义链配置(清除filter

iptables -Z    <- 清空iptables计数器信息(清除filter

3)别把自己踢出到门外

iptables -A INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j ACCEPT

4)配置防火墙filter上各个链的默认规则

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT ACCEPT

-P   --- 指定相应链的默认规则策略,是允许还是阻止

5)允许iptables服务端ping自己的网卡地址

iptables -A INPUT -i lo -j ACCEPT   --- 让自己可以ping自己

lo 全称 loopback,指回环接口

为的是数据要发出去的时候,通过loopback在回来

而如果是发到往卡上,就直接发出去了

6)指定外网可以访问的端口信息

    iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT

7)企业中内网之间不要配置防火墙策略

iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT  --- 允许架构内部服务进行访问

8)企业之间有合作关系的,不要将友商的网络禁止(主要经常改动)

    iptables -A INPUT -s 10.0.1.0/24 -j ACCEPT    --- 允许一些合作企业的外网服务器进行访问

    iptables -A INPUT -s 10.0.2.0/24 -j ACCEPT

    9)如果防火墙上配置了FTP服务,需要配置网络状态机制

    iptables -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT  --- 允许web服务与ftp服务器建立连接

  在没有配置之前使用telnet 是没用的,因为ESTABLISHED数据包进不来

10)实现iptables策略配置永久保存

    ①. 利用防火墙启动脚本命令参数,实现永久保存

  /etc/init.d/iptables save

 ②. 利用防火墙配置信息保存命令,实现永久保存

  iptables-save >/etc/sysconfig/iptables   原理是转变成配置文件里面的信息

    实例拓展:避免自己被踢出门外

    01. 去机房重启系统或者登陆服务器删除刚才的禁止规则。

    02. 让机房人员重启服务器或者让机房人员拿用户密码登录进去

    03. 通过服务器的远程管理卡管理(推荐)

    04. 先写一个定时任务,每5分钟就停止防火墙

    05. 测试环境测试好,写成脚本,批量执行

    以上内容为防火墙filter表的配置实践与原理说明

06. 防火墙nat表的配置实践

  iptables NAT:(配置NAT表示就是配置以下两个链)

  01. postrouting(内网---外网-NAT  源私网IP地址---源公网IP地址)

          路由之后,进行地址映射转换,把源地址进行转换(源私网地址==>源公网地址)

  02. prerouting(外网---内网-NAT  目标公网IP地址---目标私网IP地址  映射目标端口)

          路由之前,进行地址映射转换,把目标地址进行转换(目标公网地址==>目标变为私网地址)

实践一:iptables实现共享上网方法(postrouting)

 假设有10.0.0.7(iptables服务器)和10.0.0.8(内网服务器,无外网网卡)两台服务器,

在8的服务器上,关闭外网网卡ifdown  eth0

在7的服务器连接到8:ssh 172.16.1.8

[root@web02 ~]# ifconfig
eth1      Link encap:Ethernet  HWaddr 00:0C:29:DF:D0:8C  
          inet addr:172.16.1.8  Bcast:172.16.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fedf:d08c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:142 errors:0 dropped:0 overruns:0 frame:0
          TX packets:178 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:18804 (18.3 KiB)  TX bytes:20392 (19.9 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:576 (576.0 b)  TX bytes:576 (576.0 b)

[root@web02 ~]# ping 223.5.5.5
connect: Network is unreachable

 

第一个历程:配置内网服务器,设置网关地址

/etc/init.d/iptables stop    --- 内网服务器停止防火墙服务

ifdown eth0                     --- 模拟关闭内网服务器外网网卡

setup                              --- 修改内网网卡网关和DNS地址信息

  将默认网关修改为172.16.1.7

  添加DNS 223.5.5.5

 

# 重启网卡
[root@web02 ~]# /etc/init.d/network restart Shutting down interface eth1: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: Determining if ip address 10.0.0.8 is already in use for device eth0... [ OK ] Bringing up interface eth1: Determining if ip address 172.16.1.8 is already in use for device eth1... [ OK ] [root@web02 ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:DF:D0:82 inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fedf:d082/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:14429 errors:0 dropped:0 overruns:0 frame:0 TX packets:15197 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1352195 (1.2 MiB) TX bytes:1227453 (1.1 MiB) eth1 Link encap:Ethernet HWaddr 00:0C:29:DF:D0:8C inet addr:172.16.1.8 Bcast:172.16.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fedf:d08c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:492 errors:0 dropped:0 overruns:0 frame:0 TX packets:409 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:51240 (50.0 KiB) TX bytes:69590 (67.9 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:56 errors:0 dropped:0 overruns:0 frame:0 TX packets:56 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4032 (3.9 KiB) TX bytes:4032 (3.9 KiB) # 关闭etho,外网网卡 [root@web02 ~]# ifdown eth0 [root@web02 ~]# ifconfig eth1 Link encap:Ethernet HWaddr 00:0C:29:DF:D0:8C inet addr:172.16.1.8 Bcast:172.16.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fedf:d08c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:539 errors:0 dropped:0 overruns:0 frame:0 TX packets:434 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:55538 (54.2 KiB) TX bytes:73912 (72.1 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:56 errors:0 dropped:0 overruns:0 frame:0 TX packets:56 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4032 (3.9 KiB) TX bytes:4032 (3.9 KiB) #检查路由生效了没有 [root@oldboyedu42-lnb-02 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         172.16.1.7      0.0.0.0         UG    0      0        0 eth1 说明:内网服务器网关地址指定为共享上网服务器内网网卡地址
[root@web02 ~]# ping 172.16.1.7
PING 172.16.1.7 (172.16.1.7) 56(84) bytes of data.
64 bytes from 172.16.1.7: icmp_seq=1 ttl=64 time=0.372 ms
64 bytes from 172.16.1.7: icmp_seq=2 ttl=64 time=0.399 ms
^C
--- 172.16.1.7 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7211ms
rtt min/avg/max/mdev = 0.305/0.424/0.749/0.136 ms
[root@web02 ~]#


   第二个历程:配置共享上网服务器,开启共享上网服务器路由转发功能

 也就是要想让我们的防火墙充当路由器的功能,把主机8的请求经过防火墙路由转发到外网,需要编写7服务器内核配置文件,实现路由转发的功能

  [root@web01 ~]# vim /etc/sysctl.conf

   net.ipv4.ip_forward = 1  改为1

   [root@web01 ~]# sysctl -p

  

   第三个历程:配置共享上网服务器,实现内网访问外网的NAT映射

  [root@web01 ~]#  iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.7

   -s 172.16.1.0/24                  --- 指定将哪些内网网段进行映射转换

   -o eth0                                 --- 指定在共享上网哪个网卡接口上做NAT地址转换

   -j SNAT                                  --- 将源地址进行转换变更

   -j DNAT                                  --- 将目标地址进行转换变更

   --to-source ip地址      --- 将源地址映射为什么IP地址

   --to-destination ip地址    --- 将目标地址映射为什么IP地址

   扩展如果开启:forward默认drop策略,如果配置forward

 正常来说,现在已经可以访问外网了,但是

# 无法访问
[root@web02 ~]# ping 223.5.5.5
PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data.
^C
--- 223.5.5.5 ping statistics ---
60 packets transmitted, 0 received, 100% packet loss, time 59770ms
# 查看防火墙
[root@web02 ~]# iptables -t nat -nL -v
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 2 packets, 204 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 SNAT       all  --  *      eth0    172.16.1.0/24        0.0.0.0/0           to:10.0.0.7

Chain OUTPUT (policy ACCEPT 2 packets, 204 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@web02 ~]# # 数据包是0,表示没有生效
[root@web02 ~]# # 看我们之前的一张图数据包过滤匹配流程,我们的nat(POSTROUTING)是最后经过的
# 看一下7服务器的fiter
[root@web01 ~]# iptables -nL -v
Chain INPUT (policy DROP 129 packets, 28011 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       10.0.0.1             0.0.0.0/0           tcp dpt:22
 1803  155K ACCEPT     tcp  --  *      *       10.0.0.0/24          0.0.0.0/0           tcp dpt:22
    6   504 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           multiport dports 80,443
  547 89233 ACCEPT     all  --  *      *       172.16.1.0/24        0.0.0.0/0           
 1420  120K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED

Chain FORWARD (policy DROP 0 packets, 0 bytes) # FORWARD 默认是阻止的
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 5048 packets, 401K bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@web01 ~]# #

 对7服务器做以下配置

   iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT

   iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT

   iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT

   iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT

   网络数据包传输过程一定是有去有回的

 可以访问了

[root@web02 ~]# ping 223.5.5.5
PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data.
64 bytes from 223.5.5.5: icmp_seq=2 ttl=127 time=32.5 ms
64 bytes from 223.5.5.5: icmp_seq=3 ttl=127 time=41.9 ms
^C
--- 223.5.5.5 ping statistics ---
3 packets transmitted, 2 received, 33% packet loss, time 2976ms
rtt min/avg/max/mdev = 32.586/37.269/41.952/4.683 ms
[root@web02 ~]# 

实践二:iptables实现共享上网方法(postrouting)

   iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE <- 伪装共享上网

   说明:在企业中如何没有固定外网IP地址,可以采取以上伪装映射的方式进行共享上网

   总结:配置映射方法

   01. 指定哪些网段需要进行映射    -s 172.16.1.0/24

   02. 指定在哪做映射          -o eth0

   03. 用什么方法做映射         -j SNAT/DNAT

   04. 映射成什么地址          --to-source  ip地址/--to-destination ip地址

实践三:iptables实现外网IP的端口映射到内网IP的端口

   需求:将网关的IP9000端口映射到内网服务器的22端口

   端口映射 10.0.0.7:9000 -->172.16.1.8:22 

   实现命令:

   iptables -t nat -A PREROUTING -d 10.0.0.7  -i eth0 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.8:22

   (1)-d 10.0.0.8目标地址。

   (2)-j DNAT 目的地址改写。

[root@web01 ~]

posted @ 2020-02-08 03:05  silencio。  阅读(382)  评论(0编辑  收藏  举报