期中架構-前端部分

 

期中集羣架構-第七章-HTTP協議概念原理說明

======================================================================php

 

01. 當用戶訪問一個網站時,都發生了事情?

    ①. 利用DNS服務,將輸入的域名解析爲相應的IP地址css

  回顧網絡基礎部分知識html

  01  本地主機輸入域名後,會查詢本地緩存信息和本地hosts前端

  02  本地主機會向遠程LDNS服務器,發送遞歸查詢請求mysql

            LDNS是網卡配置的DNS服務(223.5.5.5 114.114.114.114linux

  03  LDNS服務器會向根域名服務器發出請求,將請求響應給LDNS服務器android

  04  LDNS服務器會向頂級域名服務器發出請求,將請求響應給LDNS服務器nginx

  05  LDNS服務器會向二級域名服務器發出請求,將請求響應給LDNS服務器web

  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響應報文

   起始行:

     * 狀態碼信息

 

   

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方式訪問

  安裝命令:yum install -y pcre-devel openssl-devel

第二個里程:建立一個管理nginx進程的虛擬用戶

  useradd www -s /sbin/nologin/ -M

第三個里程:下載並解壓nginx軟件

  cd /server/tools

  wget http://nginx.org/download/nginx-1.12.2.tar.gz

  tar xf nginx-1.12.2.tar.gz

第四個里程:進行軟件編譯安裝

  將軟件信息系統能夠識別的二進制信息

  軟件編譯安裝三部曲:

  ①. 編譯配置

    cd  /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程序能夠支持HTTPsF訪問功能

      --with-http_stub_status_module  用於監控用戶訪問nginx服務狀況

  

# 經過檢查返回值,確認安裝成功
[root@web01 nginx-1.12.2]# echo $?
0

 

 

  ②. 編譯過程

    make

    echo  $?

  ③. 編譯安裝

    make  install

# 進入目錄中查看
[root@web01 nginx-1.12.2]# cd /application/
[root@web01 application]# ll
total 4
drwxr-xr-x 6 root root 4096 Feb 26 16:52 nginx-12.2

 

第五個里程:爲nginx程序軟件建立連接目錄

  ln -s /application/nginx-12.2 /application/nginx

第六個里程:啓動nginx程序服務

  惟一的命令

  /application/nginx/sbin/nginx

07. nginx軟件程序目錄結構

  1.conf     --- nginx程序全部配置文件保存目錄

  2.html     --- nginx程序站點目錄

  3.logs     --- nginx程序日誌文件保存目錄

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

  5.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 conf]# grep -Ev "#|^$" nginx.conf.default >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 搜索咱們要查詢的指令
 

實現編寫一個網站頁面

 

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 conf]# /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 conf]# /application/nginx/sbin/nginx -s reload

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

訪問成功

 

 

 

 

實現編寫多個網站頁面 == 編寫多個虛擬主機(等於一個網站)

第一個里程:編寫配置文件

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;
        }
    }

 

第二個里程:建立站點目錄

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

第三個里程:建立站點目錄下首頁文件

for name in www bbs blog;do echo "10.0.0.7 $name.etiantian.org" >/application/nginx/html/$name/index.html;done

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

 

第四個里程:進行訪問測試

瀏覽器訪問測試:

  注意:須要編寫windows主機hosts文件,進行解析

命令行訪問測試:

     利用curl命令在linux系統中訪問測試

  注意:須要編寫linux主機hosts文件,進行解析

第五個里程:Nginx企業規範配置

將nginx中的多個server拆分紅小文件,進行分類管理,以防止配置出錯

[root@web01 conf]# mkdir extra 
[root@web01 conf]# cd extra/
[root@web01 extra]# sed -n '10,17p' ../nginx.conf > www.conf
[root@web01 extra]# sed -n '18,25p' ../nginx.conf > bbs.conf
[root@web01 extra]# sed -n '26,33p' ../nginx.conf > blog.conf

 

將原來的nginx.conf修改一下,進行分類管理

# 使用include 修改如下內容
include extra/www.conf;
include extra/bbs.conf;
include extra/blog.conf;

 

虛擬主機配置文件編寫方法

  ①. 基於域名的虛擬主機配置方法(最經常使用)

  ②. 基於端口的虛擬主機配置方法

      說明:當你訪問的網站域名在虛擬主機配置中不存在時,默認會將第一個虛擬主機的配置頁面響應給用戶

    在配置中修改 listen 8080;
    在瀏覽器中使用 bbs.etiantian.org:8080 進行訪問,沒有給端口就會變成www的內容

  ③. 基於IP地址的虛擬主機配置方法

      說明:nginx服務中只要涉及IP地址的修改,都須要重啓nginx服務,而不能採用平滑重啓

    在配置中修改 listen 10.0.0.7:80

09.Nginx服務日誌信息

[root@web01 nginx]# cd logs/
[root@web01 logs]# ll
total 28
-rw-r--r-- 1 root root 18202 Feb 26 20:29 access.log
-rw-r--r-- 1 root root  2960 Feb 26 20:02 error.log
-rw-r--r-- 1 root root     5 Feb 26 17:17 nginx.pid

 

    錯誤日誌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中編輯 加入

   vim nginx.conf
   error_log  /tmp/www_error.log error;

   修改好了,重啓一下!

   補充說明:

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

   錯誤日誌的,默認狀況下不指定也沒有關係,由於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

03. 日誌要進行切割

       01. 利用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配置文件

   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;

        }

    }

第二個里程:建立測試訪問資源

   mkdir AV

     echo "AV info" >AV/oldboy.html

      cat AV/oldboy.html

第三個里程:重啓nginx服務

  /application/nginx/sbin/nginx -t

  /application/nginx/sbin/nginx -s reload

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 bbs.conf

    server {

        listen       80;

        server_name  www.etiantian.org bbs.org;

        rewrite ^/(.*) http://www.etiantian.org/$1 permanent;

        root   html/bbs;

        index  index.html index.htm;

    } 

    [root@web01 extra]# curl -L etiantian.org  (-L 追蹤參數,一直跟着)

    curl: (47) Maximum (50) redirects followed 

[root@web01 extra]# curl -Lv etiantian.org   --- 顯示無限循環過程

說明:以上配置進入了無限循環狀態

    rewrite指令實踐操做二:(正確)

cat bbs.conf

    server {

        listen 80;

        server_name etiantian.org;

        rewrite ^/(.*) http://bbs.etiantian.org/$1 permanent;

    }

    server {

        listen       80;

        server_name  bbs.etiantian.org bbs.org;

        root   html/bbs;

        index  index.html index.htm;

    }

    rewrite指令實踐操做三:(正確)

    [root@web01 extra]# cat bbs.conf

    server {

        listen       80;

        server_name  bbs.etiantian.org bbs.org;

        if ($host ~* "^etiantian.org$") {

           rewrite ^/(.*) http://bbs.etiantian.org/$1 permanent;

        }

        root   html/bbs;

        index  index.html index.htm;

    }

0一、LNMP架構說明

使前端web服務和後端存儲服務進行串聯

nginx只能處理靜態的信息,動態的信

主要實現處理PHP程序動態請求

0二、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軟件進行上傳

  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     兩個配置文件

        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網站模板爲例子,將壓縮包傳到服務器中

  

第二個里程:解壓程序代碼,將程序代碼保存到站點目錄並進行受權

  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,無論你你的哭護短身份是什麼,多是win七、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) 備份數據庫數據庫信息

        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

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

        ###db01添加新的用戶,並受權

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

        flush privileges;

        mysql -uwordpress -poldboy123 -h 172.16.1.51

 

3) 數據庫遷移完畢,修改網站鏈接數據庫的配置文件

  mysql -uwordpress -poldboy123 -h 172.16.1.51       <-- 修改配置文件以前,先測試網站web服務器與遷移後的數據庫連通性

  vim wp-config.php                                                     <-- 修改wordpress上的數據庫鏈接參數信息

    /** MySQL主機 */

    define('DB_HOST','172.16.1.51')                       <-- 修改鏈接的主機信息,將localhost修改成172.16.1.51

  說明:web服務器數據庫此時能夠關閉了

   

4)中止nginx服務器上MySQL服務    

  /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服務器上配置建立共享目錄

        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反向代理負載均衡功能

集羣概念知識介紹

一羣完成相同工做的服務器

  集羣概念做用說明:

    一、提升網站處理請求能力;二、提升網站穩定運行,高可用性

  集羣做用分類說明

    一、高可用集羣HA;

    二、負載均衡集羣LB

      硬件實現:一、F5硬件設備;二、A10硬件設備;價格貴

      軟件實現:一、Nginx(7層,19以後支持4層負載);二、LVS(4層);三、HAproxy(4層、7層)

  負載均衡概念說明:

    一、對用戶請求進行跳讀管理;二、對用戶的訪問請求進行壓力分擔

  反向代理概念說明:

    一、接受用戶請求代替用戶向後端訪問;二、反向代理與數據轉發概念區別說明

          客戶端====代理服務器===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

模塊經常使用功能

①. 定義後端可調度節點信息
# 標準配置
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 }

 

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地址信息

 

 

做業

一、負載均衡反向代理根據請求地址分配

解題:

解題方法:

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; } }

 

 

二、負載均衡反向代理根據訪問軟件分配

根據用戶請求客戶端軟件,顯示不一樣頁面信息

解決:

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  必定要重啓

    /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,並將生成的私鑰信息保存在一個文件中

openssl genrsa -out server.key 2048    <- 將私鑰信息直接進行保存,加密長度必定要放在輸出文件後面

保存在/server/key須要本身建立,

(umask 077;openssl genrsa -out server1024.key 1024)    <- 利用小括號,實現子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 []:

    

[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 ACCEPT

   經過利用 !進行規則取反,進行策略控制

 咱們設置的規則和默認的規則是如何配合的?默認的規則是最後採起匹配的

實踐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 目的地址改寫。

相關文章
相關標籤/搜索