Linux(12):期中架構(4)--- 前端部分:HTTP & Nginx & LNMP架構

HTTP協議概念原理說明

1. 當用戶訪問一個網站時經歷的過程

# ①. 利用DNS服務,將輸入的域名解析爲相應的IP地址
    a 本地主機輸入域名後,會查詢本地緩存信息和本地hosts
    b 本地主機會向遠程LDNS服務器,發送遞歸查詢請求
      LDNS是網卡配置的DNS服務(223.5.5.5 114.114.114.114)
    c LDNS服務器會向根域名服務器發出請求,將請求響應給LDNS服務器
    d LDNS服務器會向頂級域名服務器發出請求,將請求響應給LDNS服務器
    e LDNS服務器會向二級域名服務器發出請求,將請求響應給LDNS服務器
    f LDNS服務器收到二級域名服務器響應過來的信息(解析記錄),進行本地緩存
      將解析記錄發送給本地主機
    g 本地主機收到LDNS服務器的響應信息,也會將解析記錄進行緩存,利用IP地址訪問網站服務器
# ②. 利用已知的IP地址,進行網絡三次握手鍊接創建
# ③. 本地主機客戶端向網站服務端,發出請求 http請求數據包(http請求報文)
# ④. 網站服務端向本地主機客戶端,回覆響應 http響應數據包(http響應報文)
# ⑤. 完成網絡四次揮手斷開過程

2. HTTP通信原理說明

HTTP請求報文
請求行:
* 請求方法: 但願客服務端完成個人什麼樣請求
           get  獲取服務端的文件內容
           post 存儲提交數據到服務端
* 協議版本:http1.0 http1.1 http2.0
 http1.0: 屬於TCP短鏈接類型協議
 http1.1:屬於TCP長鏈接類型協議
 
請求頭:
空行
請求主體
* get方法:沒有請求主體內容
* post方法:會有請求主體內容

HTTP響應報文 
起始行:
* 狀態碼信息

 

HTTP請求報文:php

HTTP響應報文:css

3. HTTP 協議資源說明html

# 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. 僞靜態文件資源
  根本實質仍是動態資源,將動態資源假裝成靜態
  動態不便於搜索引擎收錄  響應速度較慢

4. 網站度量值統計方法:

# 1. IP(獨立IP),即Internet Protocol,這裏指獨立IP數,
  獨立IP數是指不一樣IP地址的計算機訪問網站時被計的總次數    

# 2. PV(訪問量)即Page View,中文翻譯爲頁面瀏覽,即頁面瀏覽量或點擊量,無論客戶端是否是相同,
  也無論IP是否是相同,用戶只要訪問網站頁面就會被計算PV   
   
# 3. UV(獨立訪客)即Unique Visitor,同一個客戶端(PC或移動端)訪問網站被計爲一個訪客。
  一天(00:00-24:00)內相同的客戶端訪問同一個網站只計一次UV
  
  cookie:標識用戶主機身份信息      

 

架構之nginx的Web服務

1. web服務軟件種類介紹

# 1.1 經常使用來提供靜態Web服務的軟件有以下三種:
    # Apache:  
    這是中小型Web服務的主流,Web服務器中的老大哥。
    
    # Nginx:   
    大型網站Web服務的主流,曾經Web服務器中的初生牛犢,現已長大。
    Nginx的分支Tengine(http://tengine.taobao.org/)目前也在飛速發展。
    
    # Lighttpd:
    這是一個不溫不火的優秀Web軟件,社區不活躍,靜態解析效率很高。
    在Nginx流行前,它是大併發靜態業務的首選,國內百度貼吧、豆瓣等衆多網站都有Lighttpd奮鬥的身影。

# 1.2 經常使用來提供動態服務的軟件
    # PHP(FastCGI):
    大中小型網站都會使用,動態網頁語言PHP程序的解析容器。
    它可配合Apache解析動態程序,不過,這裏的PHP不是FastCGI守護進程模式,而是mod_php5.so(module)。
    也可配合Nginx解析動態程序,此時的PHP經常使用FastCGI守護進程模式提供服務。
    
    # Tomcat:
    中小企業動態Web服務主流,互聯網Java容器主流(如jsp、do)。
    
    # Resin:
    大型動態Web服務主流,互聯網Java容器主流(如jsp、do)。

2. nginx軟件服務介紹

若是你使用過Apache軟件,那麼很快就會熟悉Nginx軟件,與Apache軟件相似,
Nginx(「engine x」)是一個開源的,支持高性能、高併發的WWW服務器和代理服務軟件。
Nginx能夠運行在UNIX、Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操做系統中

3. nginx軟件特徵介紹

· 支持高併發:能支持幾萬併發鏈接(特別是靜態小文件業務環境)
· 資源消耗少:在3萬併發鏈接下,開啓10個Nginx線程消耗的內存不到200MB
· 支持異步網絡I/O事件模型epoll(Linux 2.6+); apache(select模型)

4. nginx軟件功能介紹

1)做爲Web服務軟件(處理用戶訪問靜態請求)
2)反向代理或負載均衡服務
3)前端業務數據緩存服務

5. nginx軟件模型特色說明

apache與nginx軟件對比說明???
# apache使用select模型
# nginx使用epoll模型
舉例說明:宿舍管理員
select模型版管理員  會一個一個房間查詢人員
epoll模型版管理員   會進行檢索後,直接找到須要找的人

6. nginx軟件編譯安裝

# 第一個步:軟件依賴包安裝
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 tools]# pwd
/server/tools
[root@web01 tools]# wget http://nginx.org/download/nginx-1.12.2.tar.gz  # 下載到 /server/tools 目錄下
...
[root@web01 tools]# tar xf nginx-1.12.2.tar.gz 

# 第四個步:進行軟件編譯安裝
# 軟件編譯安裝三部曲:
# ①. 編譯配置
    # 參數:
    --prefix=PATH     指定軟件安裝在什麼目錄下
    --user=USER       指定軟件worker進程管理用戶(利用www虛擬用戶管理worker進程)
    --group=GROUP     指定軟件worker進程管理用戶組
    --with-http_ssl_module           使nginx程序能夠支持https訪問功能
    --with-http_stub_status_module     用於監控用戶訪問nginx服務狀況    
    
    # 命令:
    [root@web01 nginx-1.12.2]# ./configure --prefix=/application/nginx-12.2 --user=www --group=www --with-http_ssl_module --with-http_stub_status_module
# ②. 編譯過程
    [root@web01 nginx-1.12.2]# make
# ③. 編譯安裝
    [root@web01 nginx-1.12.2]# make install
    
# 第五個步:爲nginx程序軟件建立連接目錄
[root@web01 nginx-12.2]# ln -s /application/nginx-12.2/ /application/nginx

# 第六個步:啓動nginx程序服務
[root@web01 application]# /application/nginx/sbin/nginx
[root@web01 application]# ps -ef |grep nginx
root       8046      1  0 01:25 ?        00:00:00 nginx: master process /application/nginx/sbin/nginx
www        8047   8046  0 01:25 ?        00:00:00 nginx: worker process        
root       8049   2735  0 01:25 pts/0    00:00:00 grep --color=auto nginx
[root@web01 application]# 

7. nginx軟件程序目錄結構

nginx.conf   nginx程序主配置文件

# 精簡nginx.conf配置文件內容:
[root@web01 conf]# egrep -v "#|^$" nginx.conf.default >nginx.conf   # 去掉空格和註釋

nginx配置文件組成:
①. main       nginx主區塊
②. event      nginx事件區塊
③. http       nginx http功能區塊
④. server     nginx 網站主機區塊
⑤. location   nginx 匹配或者定位區塊

html 目錄 --- nginx程序站點目錄
logs 目錄 --- nginx程序日誌文件保存目錄
sbin 目錄 --- nginx程序命令所在目錄
nginx命令參數說明:
-V       --- 查看nginx軟件編譯配置參數
-t       --- 檢查nginx配置文件語法格式是否正確
-s       --- 用於管理nginx服務運行狀態
             stop    #  中止nginx服務
             reload  #  平滑重啓nginx服務器
             # 重啓nginx服務:
                nginx -s stop  先中止 
                nginx          再啓動

nginx配置文件結構:

nginx配置文件詳解:

8. 編寫nginx服務配置

# 三個語法格式說明:
①. 大括號要成對出現
②. 每一行指令後面要用分號結尾
③. 每個指令要放置在指定的區塊中

# 實現編寫一個網站頁面
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;
        }
    }
}

# 實現編寫多個網站頁面==編寫多個虛擬主機(等於一個網站)
# 第一步:編寫配置文件
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.com;
         location / {
             root   html/www;
             index  index.html index.htm;
         }
     }
     server {
         listen       80;
         server_name  bbs.etiantian.com;
         location / {
             root   html/bbs;
             index  index.html index.htm;
         }
     }
     server {
        listen       80;
        server_name  blog.etiantian.com;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
    }
}

# 第二步:建立站點目錄:
[root@m01 ~]# mkdir -p /application/nginx/html/{www,bbs,blog}

# 第三步: 建立站點目錄下首頁文件:
[root@m01 ~]# for name in www bbs blog;do echo "10.0.0.7 $name.etiantian.org" >/application/nginx/html/$name/index.html;done
[root@m01 ~]# 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文件,進行解析

[root@m01 ~]# tail -1 /etc/hosts
10.0.0.7 www.etiantian.com bbs.etiantian.com blog.etiantian.com
[root@m01 ~]# for domain in www bbs blog;do curl $domain.etiantian.com;done
10.0.0.7 www.etiantian.org
10.0.0.7 bbs.etiantian.org
10.0.0.7 blog.etiantian.org


# 把每一個 nginx.conf文件中的 server 放到單獨的文件中
[root@web01 conf]# mkdir extra   # 建立一個 extra 的目錄
[root@web01 conf]# sed -n "10,17p" nginx.conf>extra/www.conf    # 在 extra 目錄下爲每一個 server 作單獨的配置
[root@web01 conf]# sed -n "18,25p" nginx.conf>extra/bbs.conf    # 在 extra 目錄下爲每一個 server 作單獨的配置
[root@web01 conf]# sed -n "26,33p" nginx.conf>extra/blog.conf    # 在 extra 目錄下爲每一個 server 作單獨的配置

# 把 nginx.conf 修改成以下:
[root@web01 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/www.conf 配置文件引入到 nginx.conf 中
    include extra/bbs.conf;        # include 指令:把 extra/bbs.conf 配置文件引入到 nginx.conf 中
    include extra/blog.conf;    # include 指令:把 extra/blog.conf 配置文件引入到 nginx.conf 中
}


# 虛擬主機配置文件編寫方法:
①. 基於域名的虛擬主機配置方法(最經常使用)
②. 基於端口的虛擬主機配置方法
    說明:當你訪問的網站域名在虛擬主機配置中不存在時,默認會將第一個虛擬主機的配置頁面響應給用戶
③. 基於IP地址的虛擬主機配置方法
    說明:nginx服務中只要涉及IP地址的修改,都須要重啓nginx服務,而不能採用平滑重啓

9. Nginx服務日誌信息

錯誤日誌 訪問日誌
# 01. 錯誤日誌
Syntax:    error_log file [level];  # 語法格式
Default:    
error_log logs/error.log error;   # 默認錯誤日誌
Context:    main, http, mail, stream, server, location    # 可以使用的區塊
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

vim nginx.conf    # 本身配置的錯誤日誌示例
error_log  logs/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. 訪問日誌(重點關注)
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 conf]# vim nginx.conf
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;    # 調用上面配置好的 main 


# 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            # 重啓 nginx 服務從新生成 日誌文件

# 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 資源信息。
   
# 1. 利用 nginx 進行訪問控制:
    deny  allow 
    ngx_http_access_module   --- 實現訪問控制模塊
    官方連接:http://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;
    }
   
# 2. 定位站點目錄資源信息:
    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 ~]# cd /application/nginx/conf/extra/
[root@web01 extra]# vim www.conf 

# www.conf 修改成以下:
    server {
        listen       80;
        server_name  www.etiantian.org;
        root   html/www;
        index  index.html index.htm;
        location /AV {                    # location /AV 用於定位資源
            allow 172.16.1.0/24;        # 內網用戶能訪問
            # deny  10.0.0.0/24;        # 外網網段不能訪問 
        }
    }
   server {
        listen       80;
        server_name  www.etiantian.org;
        root   html/www;
        index  index.html index.htm;
    location / {
        deny  172.16.1.0/24;
        allow 10.0.0.0/24;
    }
    }
   
# 第二步:建立測試訪問資源
[root@web01 www]# pwd
/application/nginx/html/www
[root@web01 www]# mkdir AV
[root@web01 www]# echo "AV info" >AV/oldboy.html
[root@web01 www]# cat AV/oldboy.txt 
AV info

# 第三步:重啓 nginx 服務:
[root@web01 www]# /application/nginx/sbin/nginx -s reload
   
   
# 第四步:用瀏覽器測試 
用瀏覽器訪問: http://www.etiantian.org/AV/oldboy.html  返回403
 
   
# 用其餘主機測試:(須要先把該主機的 hosts 文件修改:172.16.1.7 www.etiantian.org)
[root@m01 ~]# curl www.etiantian.org/AV/oldboy.html
AV info
   

# location 區塊的用法:
Syntax:    location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default:    —
Context:    server, location
   
 =       表示精確匹配網站 uri 資源信息
 ~       表示區分大小寫匹配網站 uri 資源信息
 ~*      不區分地大小寫匹配網站 uri 資源信息
 ^~      優先匹配網站 uri 資源信息
 /AV/    指定匹配網站資源目錄信息
 /       默認匹配網站資源信息
 !       對匹配的內容進行取反
 
# 示例:
location = / {                        # =  的優先級最高 (優先級:1)
    [ configuration A ]
}

location / {                        # 當其它的全部匹配都不知足時候,則匹配這個默認的 location (優先級別:4)
    [ configuration B ]
}

location /documents/ {                # 根據資源目錄進行匹配 (優先級別:3)
    [ configuration C ]
}

location ^~ /images/ {                # ^~  優先匹配(優先級別:2)
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {        # 不區分大小寫匹配網站資源 (優先級別:3)
    [ configuration E ]
}

11. nginx服務 rewrite 指定說明  

# 1. 實現域名地址信息跳轉
# 2. 用於作僞靜態
        www.etiantian.org/oldboy?edu.html    # --- 動態資源
        www.etiantian.org/oldboy-edu.html     # --- 僞靜態
        
# 實現相似百度重寫域名的功能:
    baidu.com        ===>  www.baidu.com
    etiantian.org   ===>  www.etiantian.org
    

# rewrite 用法:
Syntax:    rewrite regex replacement [flag];        # rewrite  正則  替換成什麼 [標識]
Default:    —
Context:    server, location, if    
    
An optional flag parameter can be one of:

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.
    
    
# 修改 www.conf 配置文件的內容爲以下:
    server {                                        # 新添加一個 server 區塊
        listen       80;
        server_name  etiantian.org;
        root   html/www;
        index  index.html index.htm;
    rewrite ^/(.*) http://www.etiantian.org/$1 permanent;    # ^/   ---> 表示 url ;(.*)  表示全部 uri 信息; $1 表示 後向引用 
    }
    server {
        listen       80;
        server_name  www.etiantian.org;
        root   html/www;
        index  index.html index.htm;
    }

 

LNMP架構

1.  LNMP架構說明

1)使前端web服務和後端存儲服務進行串聯
2)主要實現處理PHP程序動態請求

L Linux  N nginx M mysql P php

2. LNMP架構部署

  2.1  安裝LNMP相關軟件 (包括部署 mysql )

①. 部署Linux系統
    基礎優化操做要完成(防火牆關閉 關閉selinux /tmp權限爲1777)
②. 部署nginx服務
    暫時忽略
# ③. 部署mysql服務

# 一、yum部署軟件  二、編譯安裝軟件  三、二進制包方式部署mysql服務

#第一個步:下載並解壓mysql軟件程序
#mysql官方下載連接地址:ftp://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/
# 上傳mysql軟件程序,進行利用xftp軟件進行上傳
[root@web01 tools]# tar xf mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz
[root@web01 tools]# mv mysql-5.6.34-linux-glibc2.5-x86_64 /application/mysql-5.6.34

# 第二個步:建立軟件程序軟連接
[root@web01 ~]# ln -sf /application/mysql-5.6.34/ /application/mysql

# 第三個步:建立數據庫管理用戶,並受權數據目錄
[root@web01 ~]# useradd mysql -M -s /sbin/nologin 
[root@web01 ~]# chown -R mysql.mysql /application/mysql/data/

# 第四個步:對數據庫服務進行初始化
[root@web01 ~]# /application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data/ --user=mysql

# 第五個步:啓動mysql服務
[root@web01 ~]# cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld            # 建立 mysql 啓動入口
[root@web01 ~]# sed -ri 's#/usr/local#/application#g' /etc/init.d/mysqld /application/mysql/bin/mysqld_safe        # 修改這兩個文件中的 程序目錄  
[root@web01 ~]# cp /application/mysql/support-files/my-default.cnf /etc/my.cnf                # 把 mysql 的默認配置文件由 系統默認的/etc/my.cnf 改爲 mysql 自帶的 my-default.cnf
/etc/init.d/mysqld start        # 啓動 mysql 服務

# 第六個步:設置數據庫root用戶登陸密碼
[root@web01 ~]# /application/mysql/bin/mysqladmin -uroot password "oldboy123"    # mysqladmin 爲設置密碼的命令
[root@web01 ~]# /application/mysql/bin/mysql -uroot -poldboy123                    # 進入 mysql 的命令
        

④. PHP軟件安裝部署過程
# 第一步:解決PHP軟件的依賴關係 
[root@web01 ~]# 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軟件安裝---字符集轉換庫(默承認以不進行安裝了)
[root@web01 ~]# cd /server/tools
#wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
[root@web01 tools]# tar zxf libiconv-1.14.tar.gz
[root@web01 tools]# cd libiconv-1.14
[root@web01 libiconv-1.14]#  ./configure --prefix=/usr/local/libiconv
[root@web01 libiconv-1.14]# make
[root@web01 libiconv-1.14]# make install


#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
[root@web01 ~]# yum -y install libmcrypt-devel mhash mcrypt
[root@web01 ~]# rpm -qa libmcrypt-devel mhash mcrypt

# 第二步:下載解壓PHP軟件
# php官方網站下載:php.net
[root@web01 ~]# cd /server/tools/
[root@web01 tools]# tar xf php-5.5.32.tar.gz
[root@web01 tools]# cd php-5.5.32

# 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

    ##防錯(如下信息能夠不進行配置了)
    [root@web01 php-5.5.32]# ln -s /application/mysql/lib/libmysqlclient.so.18  /usr/lib64/
    [root@web01 php-5.5.32]# touch ext/phar/phar.phar
    [root@web01 php-5.5.32]# make
    [root@web01 php-5.5.32]# make install
    [root@web01 php-5.5.32]# ln -s /application/php-5.5.32/ /application/php    # 建立 軟連接

    
    # 第三步:設置PHP程序配置文件:php.ini php-fpm.ini
    [root@web01 php-5.5.32]# cp php.ini-production /application/php-5.5.32/lib/
    [root@web01 php-5.5.32]# cd /application/php/etc/
    [root@web01 php-5.5.32]# cp php-fpm.conf.default php-fpm.conf
    
    # 第四步:啓動php程序服務
    [root@web01 ~]# /application/php/sbin/php-fpm
    [root@web01 ~]# netstat -lntup|grep php
    tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      6251/php-fpm

  2.2 進行軟件直接的結合

# nginx與php結合:編寫 nginx 配置文件
[root@web01 ~]# cd /application/nginx/conf/extra/
[root@web01 extra]# vim blog.conf 
[root@web01 extra]# cat blog.conf
    server {
        listen       80;
        server_name  blog.etiantian.org;
        root   html/blog;
        index  index.html index.htm;
    
        location ~* .*\.(php|php5)?$ {        # nginx 與 php 程序結合的部分
          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 extra]# cd /application/nginx/html/blog/
[root@web01 blog]# \rm -rf ./*
[root@web01 blog]# vim test_info.php
[root@web01 blog]# cat test_info.php
<?php
phpinfo();
?>
[root@web01 blog]# 

# php與mysql結合:編寫php程序代碼
[root@web01 blog]# pwd
/application/nginx/html/blog
[root@web01 blog]# vim test_mysql.php
[root@web01 blog]# cat test_mysql.php
<?php
//$link_id=mysql_connect('主機名','用戶','密碼');
//mysql -u用戶 -p密碼 -h 主機
$link_id=mysql_connect('localhost','root','123456') or mysql_error();
if($link_id){
        echo "mysql successful by oldboy !\n";
       }else{
        echo mysql_error();
      }
?>
[root@web01 blog]# 

  2.3 部署一個真的網站

# 第一步:下載與上傳網站代碼

# 第二步:解壓程序代碼,將程序代碼保存到站點目錄並進行受權
tar xf wordpress-4.7.3-zh_CN.tar.gz 
mv wordpress/* /application/nginx/html/blog/
chown -R www.www /application/nginx/html/blog/

# 第三步:直接訪問blog網站,進行初始化操做
建立數據庫:
create database wordpress;
show databases;

# 建立鏈接數據庫用戶信息
mysql> grant all on wordpress.* to 'wordpress'@'localhost' identified by 'oldboy123';
mysql> select user,host from mysql.user;

 

nginx 反向代理負載均衡

1. 數據庫服務數據遷移

# 遷移數據庫:利用數據庫備份命令(mysql mysqladmin mysqldump)

# 1.1 備份數據庫數據庫信息
[root@web01 ~]# /application/mysql/bin/mysqldump -uroot -p123456 --all-databases >/tmp/bak.sql    # 數據庫遷移
[root@web01 ~]# scp /tmp/bak.sql 172.16.1.51:/tmp/                                                # 把 bak.sql 文件遠程複製到 51主機(db01)上


# 1.2 恢復數據庫數據庫信息
# 利用 bak.sql 文件把數據在51主機上恢復
[root@db01 tmp]# /application/mysql/bin/mysql -uroot -p123456 </tmp/bak.sql    # 恢復數據

###db01添加新的用戶 wordpress
# 172.16.1.51 主機上的 mysql 服務
mysql> grant all on wordpress.* to 'wordpress'@'172.16.1.0/255.255.255.0' identified by '123456';        
# 1. grant all on wordpress.*  --->  授予全部的權限給 wordpress數據庫中的全部表;
# 2. to 'wordpress'@'172.16.1.0/255.255.255.0'  ---> 受權給 wordpress 用戶, wordpress 這個用戶只能在 172.16.1.0/255.255.255.0 這個網段的主機上登錄
# 3. identified by '123456'  ---> 登錄密碼是 123456
mysql> flush privileges;    

# 在 172.16.1.7 這臺主機上登錄 172.16.1.51 主機上的 MySQL
[root@web01 ~]# /application/mysql/bin/mysql -uwordpress -p123456 -h 172.16.1.51    # -h 參數表示登錄的 MySQL的遠程地址


# 1.3 數據庫遷移完畢,修改網站鏈接數據庫的配置文件
[root@web01 ~]# mysql -uwordpress -poldboy123 -h 172.16.1.51       <-- 修改配置文件以前,先測試網站web服務器與遷移後的數據庫連通性    
[root@web01 ~]# cd /application/nginx/html/blog/
[root@web01 blog]# vim wp-config.php                                 <-- 修改wordpress上的數據庫鏈接參數信息
# 修改遠程主機地址
/** MySQL主機 */
define('DB_HOST', '172.16.1.51');

[root@web01 blog]# /etc/init.d/mysqld stop  # 關閉 172.16.1.7 主機上的 mysql 服務    <--- web服務器數據庫此時能夠關閉了


# 1.4 中止nginx服務器上MySQL服務 
[root@web01 blog]# /etc/init.d/mysqld stop

2. 數據遷移到NFS存儲

# 2.1:先將原有目錄中數據移出
[root@web01 ~]# cd /application/nginx/html/blog/wp-content/uploads
[root@web01 ~]# mkdir /tmp/wordpress_backup -p
[root@web01 uploads]# mv ./* /tmp/wordpress_backup/        # 把 uploads 目錄下全部的文件 移動到 /tmp/wordpress_backup/ 下面

    # 數據存儲到本地什麼位置,獲取方法:
       # ①. 經過網站頁面右鍵點擊,獲取資源地址信息
       ②. find命令利用-mmin 5 
       ③. 利用inotify服務監控目錄數據變化


# 2.2:NFS服務器上配置建立共享目錄:
# nfs詳細配置過程參考前面章節

[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
...
[root@web01 wp-content]# pwd
/application/nginx/html/blog/wp-content
[root@web01 wp-content]# mount -t nfs 172.16.1.31:/data/ ./uploads/   # 把 該web01主機上的 /application/nginx/html/blog/wp-content/uploads/ 目錄掛載到 遠程31主機上的 /data/ 目錄下
[root@web01 wp-content]# cd uploads
[root@web01 uploads]# mv /tmp/wordpress_backup/* ./                     # 把 /tmp/wordpress_backup/ 目錄下存儲的全部文件再移動到 uploads 目錄下

# 把 /application/nginx/html/blog/wp-content/uploads 改爲 777  

 

3. nginx反向代理負載均衡

# 客戶端 --- 代理服務器 --- web服務器    
# 客戶端看到的服務端 == 代理服務器    
# 代理服務器 --- web服務器


# 反向代理功能架構:
# 3臺web服務器,組建出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    

3.1. 部署web服務器:

# 第一步:安裝部署nginx軟件 (七、八、9主機都要部署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配置文件
# 修改 nginx.conf 文件爲以下:
[root@web01 ~]# cat /application/nginx/conf/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;
    
    server {                                    # 這個 server 是新添加的
        listen       80;
        server_name  www.etiantian.org;
        root   html/www;
        index  index.html index.htm;
    }
    server {                                    # 這個 server 也是新添加的
        listen       80;
        server_name  bbs.etiantian.org;
        root   html/bbs;
        index  index.html index.htm;
    }
}


[root@web01 ~]# scp -rp /application/nginx/conf/nginx.conf 172.16.1.8:/application/nginx/conf/    # 把修改後的配置文件複製到遠程的 8 主機
[root@web01 ~]# scp -rp /application/nginx/conf/nginx.conf 172.16.1.8:/application/nginx/conf/    # 把修改後的配置文件複製到遠程的 9 主機

# 第三步:建立模擬測試環境
[root@web01 ~]# mkdir /application/nginx/html/{www,bbs} -p
[root@web01 ~]# for name in www bbs;do echo "$(hostname) $name.etiantian.org" >/application/nginx/html/$name/oldboy.html;done
[root@web01 ~]# for name in www bbs;do cat /application/nginx/html/$name/oldboy.html;done

# 第四步:在負載均衡服務器上,進行測試訪問
[root@web01 ~]# curl -H host:www.etiantian.org 10.0.0.7/oldboy.html
web01 www.etiantian.org
[root@web01 ~]# curl -H host:bbs.etiantian.org 10.0.0.7/oldboy.html
web01 bbs.etiantian.org
[root@web01 ~]# curl -H host:www.etiantian.org 10.0.0.8/oldboy.html
web02 www.etiantian.org
[root@web01 ~]# curl -H host:bbs.etiantian.org 10.0.0.8/oldboy.html
web02 bbs.etiantian.org
[root@web01 ~]# curl -H host:www.etiantian.org 10.0.0.9/oldboy.html
web03 www.etiantian.org
[root@web01 ~]# curl -H host:bbs.etiantian.org 10.0.0.9/oldboy.html
web03 bbs.etiantian.org

3.2 部署負載均衡服務器

# 第一步:安裝部署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反向代理配置文件
[root@lb01 conf]# pwd
/application/nginx/conf
[root@lb01 conf]# grep -Ev "#|^$" nginx.conf.default >nginx.conf

# 官方連接:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream
Syntax:    upstream name { ... }
Default:    —
Context:    http
# 例如:
upstream oldboy {
   server 10.0.0.7:80;
   server 10.0.0.8:80;
   server 10.0.0.9:80;
}
# 說明:upstream模塊就相似定一個一個地址池或者說定一個web服務器組

# 官方連接: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模塊中的相應節點服務器

[root@lb01 conf]# pwd
/application/nginx/conf
[root@lb01 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;
      upstream oldboy {                # upstream 模塊 是定義一個集羣節點的池子(組)
          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;    # 進行調試;表示用 oldboy 這個集羣組;當用戶訪問到負載均衡器時,經過 proxy_pass 把請求發送到 相應的集羣組中,發送到集羣組後,再分配到集羣中的每一個節點中
          }   
       }
}
        

# 重啓 nginx
/application/nginx/sbin/nginx -t
/application/nginx/sbin/nginx -s reload

# 第三步:進行訪問負載均衡服務器測試
# 1)利用瀏覽器進行測試
   # 進行hosts解析:此時的 hosts文件 域名解析 應該是 10.0.0.5 這臺負載均衡器主機,由於用戶訪問的是 負載均衡服務器(05主機)
   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

注:日1000-2000W PV 或 併發請求1萬如下均可以考慮用 haproxy/Nginx (LVS的NAT模式)前端

 

4. Nginx反向代理負載均衡模塊功能詳述

4.1 ngx_http_upstream_module 模塊

連接:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstreammysql

# 4.1.1 模塊經常使用功能說明:
# 1)定義後端集羣web節點信息,定義一個地址的池子
upstream oldboy {
    server 10.0.0.7:80;
    server 10.0.0.8:80;
    server 10.0.0.9:80;
}

# 2)實現權重值負載訪問功能
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;
}

# 3)定義後端訪問的失敗次數-max_fails
upstream oldboy {
    server 10.0.0.7:80 weight=3 max_fails=3;
    server 10.0.0.8:80 weight=1 max_fails=3;
    server 10.0.0.9:80 weight=1 max_fails=3;
}

# 4)定義後端失敗重試的間隔-fail_timeout
upstream oldboy {
    server 10.0.0.7:80 weight=3 max_fails=3 fail_timeout=10s;
    server 10.0.0.8:80 weight=1 max_fails=3;
    server 10.0.0.9:80 weight=1 max_fails=3;
}
# 說明:在嘗試屢次失敗後,在超時時間過去以後,會再給相應節點一次機會

# 5)定義後端服務的熱備節點-backup
upstream oldboy {
    server 10.0.0.7:80;
    server 10.0.0.8:80;
    server 10.0.0.9:80 backup;
}
    

# 4.1.1 模塊經常使用調度算法:
# 1)定義輪詢調度算法-rr-默認調度算法
   採起平均分配
   
# 2)定義權重調度算法-wrr
   能者多勞
   
# 3)定義靜態調度算法-ip_hash
upstream oldboy {
    ip_hash;
    server 10.0.0.7:80;
    server 10.0.0.8:80;
    server 10.0.0.9:80 backup;
}
# 說明:配置ip_hash時,必定不能和backup與weight參數同時出現

# 4)定義最小的鏈接數-least_conn
upstream oldboy {
    least_conn;
    server 10.0.0.7:80;
    server 10.0.0.8:80;
    server 10.0.0.9:80 backup;
}

4.2  ngx_http_proxy_module 模塊

# 模塊經常使用功能:proxy_set_header

# (1) proxy_set_header ---> 設置反向代理服務器到web服務器的HTTP請求報文中的頭部信息

# 10.0.0.5 負載均衡服務器(05主機)上的 nginx.conf 文件的 server 修改成以下:    
    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 設置請求頭信息;host 表示請求頭中的 host ; $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;
        proxy_set_header host $host;
       }
    }
    # 說明:經過以上配置,能夠實現訪問負載均衡看到不一樣虛擬主機頁面信息
    
# 不設置proxy_set_header host $host 、只設置 proxy_pass http://oldboy 時,proxy_pass 會以 oldboy 這個集羣組的名字去羣集池中分配後端web服務器,此時用的是 IP地址(如10.0.0.7)訪問web服務器,因爲web服務器上沒有IP對應的虛擬主機,此時無論用戶要訪問哪一個主機,都會默認會匹配到第一個虛擬主機


# (2) proxy_set_header ---> 實現用戶訪問反向代理服務,讓web服務器日誌中記錄真實用戶IP地址信息 
# 10.0.0.5 負載均衡服務器(05主機)上的 nginx.conf 文件的 server 修改成以下:    
    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;    # $remote_addr 表示 用戶訪問反向代理服務器時的請求頭中的 遠程IP地址(即用戶的IP地址);不設置該配置時,web服務器上的日誌中只能記錄到 負載均衡服務器(10.0.0.5主機)的IP地址
    } 
    }
    server {
       listen       80;
       server_name  bbs.etiantian.org;
       root   html;
       index  index.html index.htm;
       location / {
       proxy_pass http://oldboy;
       proxy_set_header X-Forwarded-For $remote_addr;
      } 
    }

 

示例運用:

# 需求一:負載均衡反向代理根據請求地址分配
# 先進行企業案例需求梳理:
當用戶請求www.etiantian.org/upload/xx 地址時,實現由upload上傳服務器池處理請求。
當用戶請求www.etiantian.org/static/xx 地址時,實現由靜態服務器池處理請求。
除此之外,對於其餘訪問請求,全都由默認的動態服務器池處理請求。
用戶請求(URI)      處理請求服務器      站點目錄             功能
/upload               10.0.0.8:80         html/www/upload     upload服務器
/static               10.0.0.7:80         html/www/static     static靜態服務器
/                   10.0.0.9:80         html/www             默認


# 1)完成 nginx網站服務器 配置
# 第一步:建立測試環境
# 10.0.0.8 主機上建立upload目錄,而後生成網站測試頁面文件
[root@web02 html]# cd /application/nginx/html/www/
[root@web02 www]# mkdir uploads
[root@web02 www]# cp ./oldboy.html uploads/
[root@web02 www]# ll uploads/
total 4
-rw-r--r-- 1 root root 24 Jun 10 00:01 oldboy.html

# 10.0.0.7 主機上建立static目錄,而後生成網站測試頁面文件
[root@web01 ~]# cd /application/nginx/html/www/
[root@web01 www]# mkdir static
[root@web01 www]# cp oldboy.html static/
[root@web01 www]# ll static/
total 4
-rw-r--r-- 1 root root 24 Jun 10 00:04 oldboy.html

# 10.0.0.9 主機上建立默認測試頁面文件便可

# 第二步:利用lb01進行訪問測試
[root@lb01 ~]# curl -H host:www.etiantian.org 10.0.0.8/oldboy.html
web02 www.etiantian.org
[root@lb01 ~]# curl -H host:www.etiantian.org 10.0.0.7/oldboy.html
web01 www.etiantian.org
[root@lb01 ~]# curl -H host:www.etiantian.org 10.0.0.9/oldboy.html
web03 www.etiantian.org


# 2)完成 nginx反向代理服務器 配置
# 第一步:配置upstream模塊信息
# 修改 nginx.conf 文件中關於 upstream 的配置爲以下:
    upstream static {            # 指定 static 集羣組的 web服務器爲 07主機
        server 10.0.0.7:80;
    }
    upstream uploads {            # 指定 static 集羣組的 web服務器爲 08主機
        server 10.0.0.8:80;
    }
    upstream default {            # 指定 static 集羣組的 web服務器爲 09主機
        server 10.0.0.9:80;
    }

# 第二步:配置 proxy_pass 模塊信息
    server {
        listen       80;
        server_name  www.etiantian.org;
        root   html;
        index  index.html index.htm;
        location /static {                    # 定位 /static
             proxy_pass http://static;        # 分配到 static 集羣組
         proxy_set_header host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }   
        location /uploads {                    # 定位 /uploads
             proxy_pass http://uploads;        # 分配到 uploads 集羣組
         proxy_set_header host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }   
        location / {                        # 默認定位
             proxy_pass http://default;        # 分配到 default 集羣組
         proxy_set_header host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }   
    }



# 需求二:負載均衡反向代理根據訪問軟件分配
# 根據用戶請求客戶端軟件(如PC端和手機訪問等),顯示不一樣頁面信息
# 1)nginx 網站服務器 配置
# 第一步:建立測試環境 (與上面的大體相同)
# 在 0七、0八、09 主機上 建立網站測試頁面文件 oldboy.html 
# 測試訪問

# 2)nginx 反向代理服務器 配置
# 第一步:配置upstream模塊信息
# upstream 配置修改成以下:
    upstream android {
        server 10.0.0.7:80;
    }
    upstream iphone {
        server 10.0.0.8:80;
    }
    upstream pc {
        server 10.0.0.9:80;
    }

# 第二步:配置proxy_pass模塊信息
# proxy_pass 的配置爲以下:
    location / {
        if ($http_user_agent ~* "android"){      # $http_user_agent 表示 用戶終端的設置
             proxy_pass http://android;
        }
        if ($http_user_agent ~* "iphone"){
         proxy_pass http://iphone;
        }
        proxy_pass http://pc;                    # 其它狀況則分配給 pc 這個集羣組

        proxy_set_header host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
相關文章
相關標籤/搜索