======================================================================php
①. 利用DNS服務,將輸入的域名解析爲相應的IP地址css
回顧網絡基礎部分知識html
01 本地主機輸入域名後,會查詢本地緩存信息和本地hosts前端
02 本地主機會向遠程LDNS服務器,發送遞歸查詢請求mysql
LDNS是網卡配置的DNS服務(223.5.5.5 114.114.114.114)linux
03 LDNS服務器會向根域名服務器發出請求,將請求響應給LDNS服務器android
04 LDNS服務器會向頂級域名服務器發出請求,將請求響應給LDNS服務器nginx
05 LDNS服務器會向二級域名服務器發出請求,將請求響應給LDNS服務器web
06 LDNS服務器收到二級域名服務器響應過來的信息(解析記錄),進行本地緩存正則表達式
將解析記錄發送給本地主機
07 本地主機收到LDNS服務器的響應信息,也會將解析記錄進行緩存,利用IP地址訪問網站服務器
②. 利用已知的IP地址,進行網絡三次握手鍊接創建
③. 本地主機客戶端向網站服務端,發出請求 http請求數據包(http請求報文)
④. 網站服務端向本地主機客戶端,回覆響應 http響應數據包(http響應報文)
⑤. 完成網絡四次揮手斷開過程
* 請求方法: 但願客戶端完成個人什麼樣請求
get 獲取服務端的文件內容
post 存儲提交數據到服務端
* 協議版本:http1.0 http1.1 http2.0
http1.0: 屬於TCP短鏈接類型協議
http1.1:屬於TCP長鏈接類型協議
/n
* get方法:沒有請求主體內容
* post方法:會有請求主體內容
起始行:
* 狀態碼信息
web服務能夠處理接收的資源類型(text/html css jpg avi)
通常在web服務軟件程序中,會有一個文件來定義媒體資源類型(mime.type)
URL 統一資源定位符
URI 統一資源標識符
www.jd.com / error2.aspx
URL URI
靜態網頁資源有幾個重要的特徵:
1) 每一個頁面都有一個固定的URL地址,且URL通常以.html、.htm、.shtml等常見形式爲後綴,並且地址中不含有問號「?」或「&」等特殊符號。
2) 靜態網頁是實實在在保存在服務器上的文件實體,每一個網頁都是一個獨立的文件。
3) 網頁內容是固定不變的,所以,容易被搜索引擎收錄(容易被用戶找到)(優勢)。
4) 由於網頁沒有數據庫的支持,因此在網站製做和維護方面的工做量較大,當網站信息量很大時,徹底依靠靜態網頁比較困難(缺點)。
5) 網頁的交互性較差,在程序的功能實現方面有較大的限制(缺點)。
6) 網頁程序在用戶瀏覽器端解析,如IE瀏覽器,程序解析效率很高,因爲服務器端不進行解析,而且不須要讀取數據庫,所以服務器端能夠接受更多的併發訪問。當客戶端向服務器請求數據時,服務器會直接從磁盤文件系統上返回數據(不作任何解析)。待客戶端拿到數據後,在瀏覽器端解析並展示出來(優勢)。
1) 網頁擴展名後綴常見爲:.asp、.aspx、.php、.js、.do、.cgi 等。
2) 網頁通常以數據庫技術爲基礎,大大下降了網站維護的工做量。
3) 採用動態網頁技術的網站能夠實現更多的功能,如用戶註冊、用戶登陸、在線調查、投票、用戶管理、訂單處理、發博文等。
4) 動態網頁並非獨立存在於服務器上的網頁文件,當用戶請求服務器上的動態程序時,服務器解析這些程序並可能經過讀取數據庫來返回一個完整的網頁內容。
5) 動態網頁中的「?」在搜索引擎的收錄方面存在必定的問題,搜索引擎通常不會從一個網站的數據庫中訪問所有網頁,或者出於技術等方面的考慮,搜索蜘蛛通常不會去抓取網址中「?」後面的內容,所以在企業經過搜索引擎進行推廣時,須要針對採用動態網頁的網站作必定的技術處理(僞靜態技術),以便適應搜索引擎的抓取要求。
根本實質仍是動態資源,將動態資源假裝成靜態
動態不便於搜索引擎收錄 響應速度較慢
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:標識用戶主機身份信息
======================================================================
這是中小型Web服務的主流,Web服務器中的老大哥。
大型網站Web服務的主流,曾經Web服務器中的初生牛犢,現已長大。
Nginx的分支Tengine(http://tengine.taobao.org/)目前也在飛速發展。
這是一個不溫不火的優秀Web軟件,社區不活躍,靜態解析效率很高。
在Nginx流行前,它是大併發靜態業務的首選,國內百度貼吧、豆瓣等衆多網站都有Lighttpd奮鬥的身影。
大中小型網站都會使用,動態網頁語言PHP程序的解析容器。
它可配合Apache解析動態程序,不過,這裏的PHP不是FastCGI守護進程模式,而是mod_php5.so(module)。
也可配合Nginx解析動態程序,此時的PHP經常使用FastCGI守護進程模式提供服務。
中小企業動態Web服務主流,互聯網Java容器主流(如jsp、do)。
大型動態Web服務主流,互聯網Java容器主流(如jsp、do)。
若是你據說或使用過Apache軟件,那麼很快就會熟悉Nginx軟件,與Apache軟件相似,
Nginx(「engine x」)是一個開源的,支持高性能、高併發的WWW服務器和代理服務軟件。
它是由俄羅斯人lgor Sysoev開發的,最初被應用在俄羅斯的大型網站www.rambler.ru上。
後來做者將源代碼以類BSD許可證的形式開源出來供全球使用。
Nginx能夠運行在UNIX、Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操做系統中
· 支持高併發:能支持幾萬併發鏈接(特別是靜態小文件業務環境)
· 資源消耗少:在3萬併發鏈接下,開啓10個Nginx線程消耗的內存不到200MB
· 支持異步網絡I/O事件模型epoll(Linux 2.6+) apache(select)
1)做爲Web服務軟件(處理用戶訪問靜態請求)
2)反向代理或負載均衡服務
3)前端業務數據緩存服務
apache使用select模型
nginx使用epoll模型
select模型版管理員 會一個一個房間查詢人員
epoll模型版管理員 會進行檢索後,直接找到須要找的人
select模型版阿姨 會一個一個小朋友進行詢問,確認哪一個小朋友須要上廁所
epoll模型版阿姨 會告知想上廁所小朋友自覺站到響應位置
3種安裝方式:yum安裝、二進制包安裝、編譯安裝
編譯安裝至關於本身作飯
須要本身手動解決依賴包
pcre-devel: perl語言正則表達式兼容軟件包
openssl-devel:使系統支持https方式訪問
安裝命令:yum install -y pcre-devel openssl-devel
useradd www -s /sbin/nologin/ -M
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
ln -s /application/nginx-12.2 /application/nginx
惟一的命令
/application/nginx/sbin/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 再啓動
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 匹配或者定位區塊
[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中的多個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
[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
咱們能夠在默認的配置文件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級別時,錯誤日誌記錄的內容會更加豐富
===========================================================================================
一樣的,咱們能夠在默認的配置文件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
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
利用location區塊能夠用於定位或者匹配網站資源信息
搭建好一臺nginx的web服務器。配置好內網卡地址與外網卡地址
web服務的網站域名爲www.etiantian.org,站點目錄爲html/www
要求內網用戶能夠訪問網站http://www.etiantian.org/AV資源信息
要求外網用戶禁止訪問網站http://www.etiantian.org/AV資源信息
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
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
/application/nginx/sbin/nginx -t
/application/nginx/sbin/nginx -s reload
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 ]
}
實現相似百度重寫域名的功能?
baidu.com ===> www.baidu.com
etiantian.org ===> www.etiantian.org
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
======================================================================
0)nginx 沒法完成動態請求解析,只能處理靜態請求,因此要找幫手
1)使前端web服務和後端存儲服務進行串聯
2)主要實現處理PHP程序動態請求
L Linux N nginx M mysql P php
基礎優化操做要完成(防火牆關閉 關閉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/
暫時忽略,以前部署過
yum部署軟件 編譯安裝軟件 二進制包方式部署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.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
設置密碼,不是修改密碼
/application/mysql/bin/mysqladmin -uroot password "oldboy123"
登陸
/application/mysql/bin/mysql -uroot -poldboy123
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.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.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
/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
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)
[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成功
以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.etiantian.org,會出現403
這是由於,咱們blog.conf中的配置若是沒有指定後綴,默認是訪問index.html
可是,在咱們的目錄中沒有這個文件
[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;
======================================================================
咱們把全部的LNMP軟件都裝在了一臺服務器上,可是,這樣安裝會形成各個web服務器上的數據不一致,因此沒法統一數據資源。
如今,咱們須要把數據資源都存儲在一個地方,存儲在db01的服務器上。
遷移數據庫:利用數據庫備份命令(mysql mysqladmin mysqldump)
mysqldump -uroot -p123456 --all-databases >/tmp/bak.sql
ll /tmp/bak.sql -h
scp /tmp/bak.sql 172.16.1.51:/tmp/
注:數據庫沒有啓動,將沒法使用命令mysqldump
##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
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服務器數據庫此時能夠關閉了
/etc/init.d/mysql stop
cd /application/nginx/html/blog/wp-content/uploads
mkdir /tmp/wordpress_backup -p
mv ./* /tmp/wordpress_backup/
數據存儲到本地什麼位置,獲取方法
①. 經過網站頁面右鍵點擊,獲取資源地址信息
②. find命令利用-mmin 5
③. 利用inotify服務監控目錄數據變化
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/* ./
一羣完成相同工做的服務器
集羣概念做用說明:
一、提升網站處理請求能力;二、提升網站穩定運行,高可用性
集羣做用分類說明
一、高可用集羣HA;
二、負載均衡集羣LB
硬件實現:一、F5硬件設備;二、A10硬件設備;價格貴
軟件實現:一、Nginx(7層,19以後支持4層負載);二、LVS(4層);三、HAproxy(4層、7層)
負載均衡概念說明:
一、對用戶請求進行跳讀管理;二、對用戶的訪問請求進行壓力分擔
反向代理概念說明:
一、接受用戶請求代替用戶向後端訪問;二、反向代理與數據轉發概念區別說明
客戶端====代理服務器===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
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
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
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
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;
}
}
}
/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 保留原始訪問信息
進行hosts解析
10.0.0.5 www.etiantian.org
訪問http://www.etiantian.org/oldboy.html
--- >利用ctrl+F5刷新測試,檢查是否進行負載調度
[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
# 標準配置 upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; }
# 服務器的品質不必定是同樣的,因此,給好的服務器承擔多一點,數字越大,責任越大 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
# 咱們的負載服務器要隨時觀察,下面負責的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; }
# 好比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; }
# 誰都很差用的時候,我才用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; }
採起平均分配
能者多勞
# 配置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參數同時使用
誰的連接多,就不要再分配給她了,誰的連接少,給他多分配一點,達到最小鏈接數
# 做用:設置反向代理服務器到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 }
# 打開咱們我日誌監控 [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軟件起初是專爲LVS負載均衡軟件設計的,
用來管理並監控LVS集羣系統中各個服務節點的狀態,後來又加入了能夠實現高可用的VRRP功能
Keepalived軟件主要是經過VRRP協議實現高可用功能的。
VRRP是Virtual Router Redundancy Protocol(虛擬路由器冗餘協議)的縮寫,
VRRP出現的目的就是爲了解決靜態路由單點故障問題的,
它可以保證當個別節點宕機時,整個網絡能夠不間斷地運行
1)VRRP協議,全稱Virtual Router Redundancy Protocol,中文名爲虛擬路由冗餘協議,
VRRP的出現是爲了解決靜態路由的單點故障。
2)VRRP是用過IP多播的方式(默認多播地址(224.0.0.18))實現高可用對之間通訊的。
3)工做時主節點發包,備節點接包,當備節點接收不到主節點發的數據包的時候,
就啓動接管程序接管主節點的資源。備節點能夠有多個,經過優先級競選,
但通常Keepalived系統運維工做中都是一對。
①. 管理LVS負載均衡軟件
②. 實現對LVS集羣節點健康檢查功能
③. 做爲系統網絡服務的高可用功能
第一個里程:在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/ ---測試前同步lb01和lb02配置文件
第一個里程:安裝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這個地址
同時在keepalived高可用集羣中,出現了兩個虛擬IP地址信息,這種狀況就稱爲腦裂
1. 心跳線出現問題
網卡配置有問題
交換設備有問題
線纜鏈接有問題
2. 有防火牆軟件阻止問題
3. virtual_router_id配置數值不正確
總之:只要備服務器收不到組播包,就會成爲主,而主資源沒有釋放,就會出現腦裂
出問題要點:備用設備有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
爲了網站的安全性,在咱們的架構中,只給負載服務器提升外網網卡,
其餘的服務器都不設置外網網卡。
因此,負載服務器就成了可能被黑客攻擊的入口。
對於攻擊者而言,不要讓他看到服務器的IP(你訪問IP地址,我能夠不接受)
經過監聽網卡,
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
由於只能監聽網卡上有的地址,若是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
只能訪問10.0.0.3 記得修改hosts
服務器的地址已經沒法實現訪問,只有一個虛擬IP地址提供訪問
實現了提升了網站的安全性
爲何要部署高可用keepalived?你可能會說。是爲了是防止一臺宕機還能工做~!
可是,當咱們把nginx反向代理服務中止以後,keepalived服務並無進行主備切換!
那麼,咱們的頁面就這樣丟失了!這不是咱們但願看到的
咱們但願,
nginx反向代理服務中止以後,keepalived服務也中止!
#!/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 --- 修改腳本可執行權限
能夠編寫一個定時任務,也能夠編寫一個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。沒有找到緣由
再增長一個虛擬網卡
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
①. 網絡安全問題-數據機密性問題
傳輸的數據可能會被第三方隨時都能看到
②. 網絡安全問題-數據完整性問題
傳輸的數據不能隨意讓任何人進行修改
③. 網絡安全問題-身份驗證問題
第一次通信時,須要確認通信雙方的身份正確
利用相應算法,對傳輸數據(明文數據)進行加密(密文數據);
再利用對應算法,將加密數據解密變爲真實數據
優勢:實現了數據機密傳輸,避免了明文傳輸數據的危險性。
缺點:利用加密算法,將明文改密文,若是第三方得到加密算法,便可將傳輸密文再次變爲明文
對稱加密算法就比如將普通算法的規則手冊放入到了保險櫃裏,只有獲取保險櫃和保險櫃鑰匙才能獲取《算法手冊》
優勢:密鑰加密算法計算速度很是快;解決了普通加密算法的安全問題
缺點:加解密過程的安全性徹底依賴於密鑰,而且對稱加密密鑰是公開的,當通信加密對象過多時,沒法解決密鑰管理問題。
根據數據生成特徵碼(數據指紋信息);
接收數據方獲取數據信息算出特徵碼,驗證是否與發送過來的特徵碼一致 若特徵碼一致,表示數據完整性沒被破壞;若特徵碼不一致,表示數據已被破壞,直接丟棄 **************************************************************************** 擴展說明: 01:不一樣數據的特徵碼(數據指紋信息)是不可能一致的 單項加密算法特徵 · 數據輸入同樣,特徵碼信息輸出必然相同 · 雪崩效應,輸入的微小改變,將形成輸出的巨大改變 · 定長輸出,不管源數據多大,但結果都是同樣的 · 不可逆的,沒法根據數據指紋,還原出原來的數據信息。 **************************************************************************** 優勢:有效的解決了數據完整性問題 缺點:沒有考慮中間人攻擊對數據信息的影響
利用對稱加密算法對數據加密的同時,也對特徵碼進行加密; 接收方擁有和發送方同樣的密鑰,才能夠解密加密後的數據和特徵碼 而中間人加密的特徵碼是沒有辦法讓接收方進行解密的,因此接收方獲取不了特徵碼,直接丟棄數據 **************************************************************************** 擴展說明: 01:那麼對稱密鑰如何有效的讓通信雙方獲取呢 須要進行對稱密鑰協商過程,即經過密鑰交換機制(Internet key exchange IKE) 實現密鑰交換機制的協議稱爲diffie-hellman協議 ****************************************************************************
發送方創建私鑰和公鑰,將公鑰發送給接收方,從而實現發送數據方的身份驗證
讓你的母親驗證你的爸爸身份信息,你的母親就稱爲證書頒發機構
公鑰信息在網站訪問過程當中,被稱爲證書(身份證)
網絡安全問題結論:實現網絡安全性,須要解決問題的順序爲
1. 解決身份驗證問題
2. 解決數據完整性問題
3. 解決數據機密性問題
根據上述結論可知,網絡安全性最首先要解決的就是身份驗證問題;
而解決身份驗證問題,最主要的方式就是藉助私鑰和公鑰
默認公鑰在網絡中進行傳遞時,默認狀況下也是會出現問題的以下圖所示:
而最主要的公鑰信息獲取就變得尤其重要;利用第三方公正者,公正公鑰信息
因此爲了避免上述狀況的出現,須要引入一個新的概念:第三方CA證書簽發機構。
目前標準的證書存儲格式是x509,還有其餘的證書格式,須要包含的內容爲:
證書==身份證
公鑰信息,以及證書過時時間
證書的合法擁有人信息
證書該如何被使用(不用關注)
CA頒發機構信息
CA簽名的校驗碼
對稱加密算法特性是加密和解密使用同一個密鑰,利用對稱算法能夠將明文改成密文(加密),密文還原爲明文(解密)。
對稱加密算法常見的有:
最先期的稱爲DES(Data Encryption Standard),是美國國家安全局徵集加密算法時,由一個美國公司提出的,是公開可使用的,使用的是56位的密鑰長度,可是因爲計算機的發展,可使用計算機對56位的密鑰進行暴力破解了,所以DES漸漸再也不被使用。
一種新的算法,將DES加密後,再進行一次DES加密,而後再進行一次DES,稱爲3DES算法,是目前使用比較多的加密算法
更安全的加密算法,AES(高級加密標準)加密算法產生,默認使用128位的加密密鑰,可是也有特殊的AES(AES192 AES256 AES512等),密鑰越長安全性提升的同時,加密效率就會下降,所以應該選擇比較合適的加密算法
blowfish加密算法,加密不是按位進行加密的,而是將數據分紅大小相同的數據塊進行加密的
單項加密算法常見的有:
DH加密算法,主要用於密鑰的協商交換
MD4 MD5(128)
SHA1(160) SHA(192) SHA(256) SHA(384)
CRC-32(循環輸出校驗碼),不是加密機制,只是一種校驗機制,不提供安全性,正常加密算法是不容許出現輸入不同,輸出同樣的狀況,但CRC是能夠有這樣狀況的,由於CRC只是具備校驗功能,不具備加密功能
非對稱加密算法能夠實現身份認證功能(經過數字簽名實現),數據加密功能,以及現密鑰交換功能。
非對稱加密算法常見的有:
RSA,RSA既是一個公司的名稱,也是三個創始人的名稱,RSA既能夠加密又能夠進行簽名。
DSA,只能實現數字簽名功能
ELGamal,屬於商業化的加密算法
加密和解密須要算法來實現,所以須要主機上能夠有相應的軟件工具來控制加密和解密的算法,相應的工具就是加密和解密算法的具體實現,對稱加密算法能夠實現的工具:openssl、gpg。
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證書頒發機構去關注
實現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的基礎:
OSI7層模型以及不一樣層對應哪些協議?
TCP/IP三次握手,四次斷開的過程,TCP HEADER,狀態轉換
經常使用的服務端口要很是清楚瞭解。
經常使用服務協議原理http協議,icmp協議。
企業中安全配置原則:
儘量不給服務器配置外網IP,能夠經過代理轉發或者經過防火牆映射。
併發不是特別大狀況有外網IP,能夠開啓防火牆服務。
大併發的狀況,不能開iptables,影響性能,利用硬件防火牆提高架構安全。
真正實現防火牆的是一個內核netfiilter,咱們的iptables是控制內核的軟件。
Netfilter/Iptables(如下簡稱Iptables)是unix/linux自帶的一款優秀且開放源代碼的徹底自由的基於包過濾
的防火牆工具,它的功能十分強大,使用很是靈活,能夠對流入和流出服務器的數據包進行很精細的控制。
iptables是linux2.4及2.6內核中集成的服務。
iptables主要工做在OSI七層的二(MAC地址的過濾局域網之間的通信,通常不用)、三(IP地址)、四層(訪問服務的端口),若是從新編譯內核,iptables也能夠支持7層控制
容器:裝東西的器皿,docker容器技術,將鏡像裝在了一個系統中,這個系統就稱爲容器
iptables稱爲一個容器 --- 裝着防火牆的表
防火牆的表又是一個容器---裝着防火牆的鏈
防火牆的鏈也是一個容器---裝着防火牆的規則
iptables---表---鏈---規則
規則:防火牆一條一條安全策略
防火牆匹配規則流程:
1. 防火牆是層層過濾的,實際是按照配置規則的順序從上到下,從前到後進行過濾的。
2. 若是匹配上規則,即明確表示是阻止仍是經過,數據包就再也不向下匹配新的規則。
3. 若是規則中沒有明確代表是阻止仍是經過的,也就是沒有匹配規則,向下進行匹配,直到匹配默認規則獲得明確的阻止仍是經過。
4. 防火牆的默認規則是全部規則執行完才執行的。
表(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 進行管理
[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
# 上面的規則都是默認的
咱們但願,規則都是咱們本身設定的
/etc/init.d/iptables start
chkconfig iptables on
iptables -F --- 清除防火牆默認規則
iptables -X --- 清除防火牆自定義鏈
iptables -Z --- 清除防火牆計數器信息
/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 顯示規則序號信息
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(拒絕))
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鏈上
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
經過利用 !進行規則取反,進行策略控制
咱們設置的規則和默認的規則是如何配合的?默認的規則是最後採起匹配的
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 --- 能夠匹配多個不連續端口信息
實現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
NEW: 發送數據包裏面控制字段爲syn=1,其餘都是0,發送第一次握手的數據包
ESTABLISHED: 請求數據包發出以後,響應回來的數據包稱爲回覆的包
RELATED: 基於一個鏈接,而後創建新的鏈接,進行新數據包的通信(FTP傳輸-控制鏈接和傳輸鏈接)
INVALID: 無效的的數據包,數據包結構不符合正常要求的(損壞、被修改等)
容許哪些狀態包:
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
項目:部署一個最安全的企業級防火牆(案例)
兩種思想:針對默認規則而言。
逛公園:黑名單
1、默認規則默認是容許的狀態。
看電影:白名單(更安全,推薦配置)
2、默認規則默認是不容許的狀態。更安全。
看電影的思想更安全。
cp /etc/sysconfig/iptables{,.bak}
iptables -F <- 清空iptables全部規則信息(清除filter)
iptables -X <- 清空iptables自定義鏈配置(清除filter)
iptables -Z <- 清空iptables計數器信息(清除filter)
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
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
-P --- 指定相應鏈的默認規則策略,是容許仍是阻止
iptables -A INPUT -i lo -j ACCEPT --- 讓本身能夠ping本身
lo 全稱 loopback,指回環接口
爲的是數據要發出去的時候,經過loopback在回來
而若是是發到往卡上,就直接發出去了
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT --- 容許架構內部服務進行訪問
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數據包進不來
①. 利用防火牆啓動腳本命令參數,實現永久保存
/etc/init.d/iptables save
②. 利用防火牆配置信息保存命令,實現永久保存
iptables-save >/etc/sysconfig/iptables 原理是轉變成配置文件裏面的信息
實例拓展:避免本身被踢出門外
01. 去機房重啓系統或者登錄服務器刪除剛纔的禁止規則。
02. 讓機房人員重啓服務器或者讓機房人員拿用戶密碼登陸進去
03. 經過服務器的遠程管理卡管理(推薦)
04. 先寫一個定時任務,每5分鐘就中止防火牆
05. 測試環境測試好,寫成腳本,批量執行
以上內容爲防火牆filter表的配置實踐與原理說明
iptables NAT:(配置NAT表示就是配置如下兩個鏈)
01. postrouting(內網---外網-NAT 源私網IP地址---源公網IP地址)
路由以後,進行地址映射轉換,把源地址進行轉換(源私網地址==>源公網地址)
02. prerouting(外網---內網-NAT 目標公網IP地址---目標私網IP地址 映射目標端口)
路由以前,進行地址映射轉換,把目標地址進行轉換(目標公網地址==>目標變爲私網地址)
假設有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 -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地址
需求:將網關的IP和9000端口映射到內網服務器的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 目的地址改寫。