初級階段
-
Linux是由Unix作業系統為內核的類Unix作業系統,Mac OS也屬于類Unix作業系統的,
安裝&網路配置
-
安裝后好登錄的第一個用戶就是root,密碼默認沒有的可以直接進入,
-
登錄后最前方會出現一段字符,第一個代表用戶、@用于分割、第二個代表主機、~代表用戶家目錄、#代表是root登錄,普通用戶登錄是$,
-
遠程登陸我們可以使用X shell5軟體鏈接
ssh root@ip -
Linux查看IP有兩種:
ifconfig、ip addr -
配置網路
-
點擊編輯在下拉框中選擇虛擬網路編輯,選擇VMnet8后勾選Nat模式、將主機虛擬配接器鏈接此網路和使用本地DHCP,
-
設定子網和子網掩碼并點擊NAT設定,點進去之后設定網關即可,
-
配置Linux IP
vi /etc/sysconfig/network-scripts/ifcfg-ens33 #用于進入組態檔 #進入后不能直接編輯,需要按下i鍵才可以編輯,將下面的修改或添加 bootproto=static onboot=yes IPADDR=10.0.0.10 NETMASK=255.255.255.0 GATEWAY=10.0.0.2 DNS1=119.29.29.29 按下esc保存 :wq!強制退出 systemctl restart network #這條命令可以重啟網路
-
基本知識&使用
-
了解一些Linux的基礎只是可以讓你更加方便的使用Linux,
-
Linux快捷鍵
tab # 用于自動補全命令/檔案名/目錄名 ctrl+l # 清理終端顯示 clear/cls # 清理終端顯示 ctrl+c # 終止當前操作
目錄結構
-
Linux的目錄與win的不同,Linux是檔案系統下直接
/開始并沒有什么盤這個概念的,Linux使用正斜杠來跨檔案夾,它的結構是樹狀結構, -
登錄系統后,在當前命令視窗輸入命令:
ls / /bin:bin是Binary的縮寫, 這個目錄存放著最經常使用的命令, /boot:這里存放的是啟動Linux時使用的一些核心檔案,包括一些連接檔案以及鏡像檔案, /dev:dev是Device(設備)的縮寫, 該目錄下存放的是Linux的外部設備,在Linux中訪問設備的方式和訪問檔案的方式是相同的, /etc:這個目錄用來存放所有的系統管理所需要的組態檔和子目錄, /home:用戶的主目錄,在Linux中,每個用戶都有一個自己的目錄,一般該目錄名是以用戶的賬號命名的, /lib:這個目錄里存放著系統最基本的動態連接共享庫,其作用類似于Windows里的DLL檔案,幾乎所有的應用程式都需要用到這些共享庫, /lost+found:這個目錄一般情況下是空的,當系統非法關機后,這里就存放了一些檔案, /media:linux系統會自動識別一些設備,例如U盤、光驅等等,當識別后,linux會把識別的設備掛載到這個目錄下, /mnt:系統提供該目錄是為了讓用戶臨時掛載別的檔案系統的,我們可以將光驅掛載在/mnt/上,然后進入該目錄就可以查看光驅里的內容了, /opt:這是給主機額外安裝軟體所擺放的目錄,比如你安裝一個ORACLE資料庫則就可以放到這個目錄下,默認是空的, /proc:這個目錄是一個虛擬的目錄,它是系統記憶體的映射,我們可以通過直接訪問這個目錄來獲取系統資訊, 這個目錄的內容不在硬碟上而是在記憶體里,我們也可以直接修改里面的某些檔案,比如可以通過下面的命令來屏蔽主機的ping命令,使別人無法ping你的機器: echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all /root:該目錄為系統管理員,也稱作超級權限者的用戶主目錄, /sbin:s就是Super User的意思,這里存放的是系統管理員使用的系統管理程式, /selinux:這個目錄是Redhat/CentOS所特有的目錄,Selinux是一個安全機制,類似于windows的防火墻,但是這套機制比較復雜,這個目錄就是存放selinux相關的檔案的, /srv:該目錄存放一些服務啟動之后需要提取的資料, /sys:這是linux2.6內核的一個很大的變化,該目錄下安裝了2.6內核中新出現的一個檔案系統 sysfs , sysfs檔案系統集成了下面3種檔案系統的資訊:針對行程資訊的proc檔案系統、針對設備的devfs檔案系統以及針對偽終端的devpts檔案系統, 該檔案系統是內核設備樹的一個直觀反映, 當一個內核物件被創建的時候,對應的檔案和目錄也在內核物件子系統中被創建, /tmp:這個目錄是用來存放一些臨時檔案的, /usr:這是一個非常重要的目錄,用戶的很多應用程式和檔案都放在這個目錄下,類似于windows下的program files目錄, /usr/bin:系統用戶使用的應用程式, /usr/sbin:超級用戶使用的比較高級的管理程式和系統守護程式, /usr/src:內核源代碼默認的放置目錄, /var:這個目錄中存放著在不斷擴充著的東西,我們習慣將那些經常被修改的目錄放在這個目錄下,包括各種日志檔案, 在linux系統中,有幾個目錄是比較重要的,平時需要注意不要誤洗掉或者隨意更改內部檔案, /etc:上邊也提到了,這個是系統中的組態檔,如果你更改了該目錄下的某個檔案可能會導致系統不能啟動, /bin, /sbin, /usr/bin, /usr/sbin: 這是系統預設的執行檔案的放置目錄,比如 ls 就是在/bin/ls 目錄下的, 值得提出的是,/bin, /usr/bin 是給系統用戶使用的指令(除root外的通用戶),而/sbin, /usr/sbin 則是給root使用的指令, /var:這是一個非常重要的目錄,系統上跑了很多程式,那么每個程式都會有相應的日志產生,而這些日志就被記錄到這個目錄下,具體在/var/log 目錄下,另外mail的預設放置也是在這里, -
絕對路徑就是更目錄到檔案的唯一路徑,向對路徑是從某個檔案夾下的一段路徑,
-
計算機中檔案大小的表示方式,每一個單位乘以1024等于下一個單位,
單位 英文 單位 英文 位元組 B(Byte) 千 K(Kibibyte) 兆 M(Mebibyte) 千兆 G(Gigabyte) 太 T(Terabyte) 拍 P(Petabyte) 艾 E(Exabyte) 澤 Z(Zettabyte) 堯 Y(Yottabyte) -
Linux檔案的含義:綠色檔案代表可執行檔案、藍色檔案代表檔案夾、白色檔案代表普通檔案,
-
Linux的檔案系統
-
用戶在硬體存盤設備中執行的檔案建立,寫入,讀取,修改,轉存與控制等操作都是依賴檔案系統完成的,檔案系統的作用是合理規劃硬碟,保證用戶正常使用,
/etc/fstab是用來存放檔案系統的靜態資訊的檔案,cat /etc/fstab檢查Linux的檔案系統, -
Linux系統支持數十種檔案系統,常見檔案系統如下,
-
Ext3 是一款日志檔案系統,能夠在系統例外宕機時避免檔案系統資料丟失,并能 自動修復資料的不一致與錯誤,
-
Ext4 Ext3 的改進版本,作為 RHEL 6 系統中的默認檔案管理系統,它支持的存盤容 量高達 1EB(1EB=1,073,741,824GB),且能夠有無限多的子目錄,另外,Ext4 檔案系統能夠批量分配 block 塊,從而極大地提高了讀寫效率,
-
XFS 是一種高性能的日志檔案系統,而且是 RHEL 7 中默認的檔案管理系統,它的優勢在發生意外宕機后尤其明顯,即可以快速地恢復可能被破壞的檔案,而且強大的 日志功能只用花費極低的計算和存盤性能,并且它最大可支持的存盤容量為 18EB, 這幾乎滿足了所有需求,
-
-
基本命令
-
基礎命令的使用
ls # 查看當前檔案夾下內容 # 需要注意的是,在所有目錄底下都存在兩個目錄,分別是【.】和【..】,分別代表當前目錄,上層目錄!那么如何證明它的存在呢? ls -l / # 橫向顯示詳細等于ll ls -a / # 顯示檔案夾下所有 ls -h / # 配合-l個性化顯示檔案大小 ls -la / # 橫向顯示該檔案夾下的所有以詳細引數、-l:橫向顯示詳細、-a:顯示檔案夾下所有 man ls # Linux下的幫助指令 pwd # 查看當前所在檔案夾 cd "path" # 切換檔案夾 # 我們知道切換目錄的指令是cd,那么首先得知道如何切換目錄,這個得用心記呀! cd . # 當前目錄 cd .. # 回到上一層目錄 cd ../ # 回到指定的上一層目錄 cd - # 回傳前一個作業目錄 cd ~|cd # 進入家目錄 touch "file path" # 如果檔案不存在就創建檔案 touch xxx.py # 檔案存在代表觸摸,用于更新時間 touch -t'07101530' "file" # 修改檔案的時間,很多黑客就會在惡意修改檔案之后再修改成之前的時間 mkdir "name" # 創建檔案夾 mkdir -p "path name" # 遞回創建檔案夾,mkdir默認只能在當前目錄下創建 mkdir -p a/b c/d # 遞回創建兩組檔案夾 mkdir -p test/a,b,c,d # 遞回在指定檔案夾下創建多個檔案夾 mkdir -p test/{a,b,c,d} # 遞回在指定檔案夾下創建多個檔案夾 mkdir -p a/b/c/d/e # 遞回創建一套檔案夾 rmdir "name" # 洗掉空檔案夾 rm "file" # 洗掉指定檔案 -i # 需要洗掉確認 -f # 強制洗掉 -r # 遞回洗掉目錄和內容 clear # 清屏 echo "alex" # 表示輸出 echo $PATH # echo命令是有列印的意思、$符號后面跟上PATH,表示輸出PATH的變數 echo "sb666" > /tmp/chaoge.txt # 將需要的資訊寫入指定檔案 echo "sb666" > e.txt # 重定向>符號用于覆寫原有檔案內容 echo "sb666" >> e.txt # 重定向>>符號用于追加到原有檔案內容后面 which ls # 在哪、從哪來 vi "file" # 編輯文本檔案,相當于windows下的notepad++ mv "a.py" "b.py" # 重命名 mv "a" "b" # 移動 stat "file" # 顯示檔案的詳細資訊(最近訪問)Access、(最近更改)Modify、(最近改動)Change -L --dereference # 跟隨鏈接 -f --file-system # 顯示檔案系統狀態而非檔案狀態 # 格式化輸出引數:%a 八進制權限、%A 用可讀性較好的方式輸出權限 -c --format=%a # 使用指定輸出格式代替默認值,每用一次指定格式, -t --terse # 使用簡潔格式輸出 --help # 顯示此幫助資訊并退出 --version # 顯示版本資訊并退出 ctrl+alt+f[1~7] # 可以切換(linux有7個終端) tty # 查看當前終端 who am i # 查看當前用戶正在使用的終端和登陸時間 w # 查看所有終端 ls # 查看當前目錄的檔案和檔案夾 ls .la # 查看當前目錄的檔案和檔案夾(包括隱藏的) ls -l /tmp/ # 查看詳細資訊 cat name # 查看檔案 cat -n xxx.py # 顯示行號 cat -n /tmp/*.py # 找出以.py結尾的所有檔案 cat -E 1.txt # 在每一行的結尾加上$符 cat >>/tmp/oldboy.txt << EOF # 追加文字到檔案,追加完后使用EOF退出追加模式 more /etc/passwd # more命令文本會以百分比形式查看,按下空格space是翻頁、按下b鍵是上一頁、回車鍵向下讀取內容 ? cp xxx.py /tmp/ # 移動xxx.py到/tmp目錄下 cp xxx.py /tmp/c.py # 移動xxx.py并改名為c.py cp -r # 遞回,復制目錄以及目錄的子孫后代 cp -p # 復制檔案,同時保持檔案屬性不變 cp -a # 相當于-pdr find /tmp/ -name "o.py" # 再指定檔案夾中查找指定檔案 find /tmp/ -type f -name "o.py" # name后面加檔案名、type后面加引數 -name "file" # 按照檔案名查找檔案 -type "value" # 查找某一型別的檔案,諸如: -type b # 塊設備檔案, -type d # 目錄, -type c # 字符設備檔案, -type p # 管道檔案, -type l # 符號鏈接檔案, -type f # 普通檔案, -type s # socket檔案 cat x.py|> x.txt # Linux提供的管道符“|”講兩條命令隔開,管道符左邊命令的輸出會作為管道符右邊命令的輸入, ls /tmp|grep '.txt' # 找到/tmp目錄下所有txt檔案 netstat -tunlp |grep nginx # 檢查nginx的埠是否存活 grep "wuddi" /tmp/oldboy.txt # 全面搜索正則運算式并把行列印出來 -i # 忽略大小寫 -n # 輸出行號 -v # 反向選擇 --color = auto # 給關鍵詞部分添加顏色 head # 顯示檔案前幾行,默認前10行 tail # 顯示檔案后幾行,默認后10行 head -2 /tmp/oldboy.txt # 查看前兩行 tail -2 /tmp/oldboy.txt # 查看后兩行 tail -f xx.log # 監聽檔案持續重繪顯示 alias a=ls # 給命令起別名,簡單命令的書寫 unalias a # 取消別名 alias cp='cp -i' # 默認別名 alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' which python # 查找環境變數中保存過的目錄的檔案絕對路徑 scp e.py [email protected]:/home/ # 傳輸本地檔案到遠程地址 scp [email protected]:/y.txt # 復制遠程檔案到本地 -r # 遞回復制整個目錄 -v # 詳細方式輸出 -q # 不顯示傳輸進度條 -C # 允許壓縮 du -h /tmp # 顯示指定的目錄或檔案所占用的磁盤空間, -s # 顯示總計 -h # 以k,M,G為單位顯示,可讀性強 date # 顯示當前系統時間 -d --date=string # 顯示指定的時間,而不是當前時間 date +"%Y-%m-%d %T" # 以年-月-日 時分秒 顯示當前時間 hwclock # 硬體始終的查看 hwclock -w # 以系統時間為基準,修改硬體時間 hwclock -s # 以硬體時間為基準,修改系統時間 cal # 查看日志的意思 -1, --one # 只顯示當前月份(默認) -3, --three # 顯示上個月、當月和下個月 -s, --sunday # 周日作為一周第一天 -m, --monday # 周一用為一周第一天 -j, --julian # 輸出儒略日 -y, --year # 輸出整年 -V, --version # 顯示版本資訊并退出 -h, --help # 顯示此幫助并退出 ntpdate -u ntp.aliyun.com # 由于我們只需要用作客戶端更新時間 reboot # 用于重啟機器 poweroff # 用于關閉系統 chattr +a test.py # 給檔案加鎖,只能寫入資料,無法洗掉檔案 chattr -a test.py # 給檔案去鎖,可完全控制資料 lsattr test.py # 查看檔案隱藏屬性 -
Linux系統命令操作語法格式,一般情況下引數和檔案路徑都是可選的,Linux命令,引數之間,普遍應該用一個或多個空格分割!
TOP命令
-
TOP命令用于動態地監視行程活動與系統負載等資訊
# 第一行 (uptime):系統時間 主機運行時間 用戶連接數(who) 系統1,5,15分鐘的平均負載 # 第二行:行程資訊:行程總數 正在運行的行程數 睡眠的行程數 停止的行程數 僵尸行程數 # 第三行:cpu資訊 1.5 us # 用戶空間所占CPU百分比 0.9 sy # 內核空間占用CPU百分比 0.0 ni # 用戶行程空間內改變過優先級的行程占用CPU百分比 97.5 id # 空閑CPU百分比 0.2 wa # 等待輸入輸出的CPU時間百分比 0.0 hi # 硬體CPU中斷占用百分比 0.0 si # 軟中斷占用百分比 0.0 st # 虛擬機占用百分比 # 第四行:記憶體資訊(與第五行的資訊類似與free命令) 8053444 total # 物理記憶體總量 7779224 used # 已使用的記憶體總量 274220 free # 空閑的記憶體總量(free+used=total) 359212 buffers # 用作內核快取的記憶體量 # 第五行:swap資訊 8265724 total # 交換磁區總量 33840 used # 已使用的交換磁區總量 8231884 free # 空閑交換區總量 4358088 cached Mem # 緩沖的交換區總量,記憶體中的內容被換出到交換區,然后又被換入到記憶體,但是使用過的交換區沒有被覆寫,交換區的這些內容已存在于記憶體中的交換區的大小,相應的記憶體再次被換出時可不必再對交換區寫入,
報錯分析
-
我們常常會輸入錯一些命令導致報錯,這里我們總結一下創建的報錯,
command not found # 未(not)找到(found)命令(command) No such file or directory # 沒有(No)這樣的(such)檔案(file)或(or)目錄(directory) -
Linux的幫助是在命令后面加上
ls --help,想看更詳細的可以在命令前加上man ls
編輯器
-
使用一個好的編輯器可以讓作業事半功倍,
vim編輯器
-
所有的 Unix Like 系統都會內建 vi 文書編輯器,其他的文書編輯器則不一定會存在,
-
但是目前我們使用比較多的是 vim 編輯器,
-
vim 具有程式編輯的能力,可以主動的以字體顏色辨別語法的正確性,方便程式設計,
-
基本上 vi/vim 共分為三種模式,分別是命令模式(Command mode),輸入模式(Insert mode)和底線命令模式(Last line mode),
-
命令模式
w(e) # 移動游標到下一個單詞 b # 移動到游標上一個單詞 0 # 移動到本行開頭 $ # 移動游標到本行結尾 H # 移動游標到螢屏首行 M # 移動到游標到螢屏的中間一行 L # 移動游標到螢屏的尾行 gg # 移動游標到檔案的首行 G # 移動游標到檔案尾行 ctrl + f # 下一頁 ctrl + b # 上一頁 `. # 移動游標到上一次的修改行 # 查找 /chaoge # 在整篇檔案中搜索chaoge字串,向下查找 ?chaoge # 在整篇檔案中搜索chaoge字串,向上查找 * # 查找整個檔案,匹配游標所在的所有單詞,按下n查找下一處,N上一處 # # 查找整個檔案,匹配游標所在的所有單詞,按下n查找下一處,N上一處 gd # 找到游標所在單詞匹配的單詞,并停留在非注釋的第一個匹配上%找到括號的另一半!! # 復制,洗掉,粘貼 yy # 拷貝游標所在行 dd # 洗掉游標所在行 D # 洗掉當前游標到行尾的內容 dG # 洗掉當前行到檔案尾部的內容 p # 粘貼yy所復制的內容x 洗掉游標所在的字符u 撤銷上一步的操作 # 數字與命令 3yy # 拷貝游標所在的3行 5dd # 洗掉游標所在5行 -
默認是命令模式,需要輸入i進入編輯模式,然后輸入文本,
-
按下esc鍵,回到命令模式并輸入:到底線模式,
:q! # 強制退出 :wq! # 強制寫入退出:set nu 顯示行號:數字 調到數字那行隨時按下esc可以退出底線命令模式 :! command # 暫時離開vim指令模式,執行command的結果 -
vim按鍵
移動游標的方法 h 或 向左箭頭鍵(←) 游標向左移動一個字符 j 或 向下箭頭鍵(↓) 游標向下移動一個字符 k 或 向上箭頭鍵(↑) 游標向上移動一個字符 l 或 向右箭頭鍵(→) 游標向右移動一個字符 向下移動5行 5j 向右移動10字符 10l n(space) 按下數字n,例如10,然后按下空格,游標會向右移動10個字符
SED編輯器
-
SED是一種流編輯器,它是文本處理中非常重要的工具,能夠完美的配合正則運算式使用,功能不同凡響,處理時,把當前處理的行存盤在臨時緩沖區中,稱為“模式空間”(pattern space),接著用SED命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往螢屏,
-
接著處理下一行,這樣不斷重復,直到檔案末尾,檔案內容并沒有 改變,除非你使用重定向存盤輸出,SED主要用來自動編輯一個或多個檔案;簡化對檔案的反復操作;撰寫轉換程式等,
sed [options] 'command' file(s) sed [options] -f scriptfile file(s) # sed [options] -e <script> --expression=<script> # 以選項中的指定的script來處理輸入的文本檔案; -f <script "file"> --file=<script"file"> # 以選項中指定的script檔案來處理輸入的文本檔案; -h --help # 顯示幫助; -n --quiet ——silent # 僅顯示script處理后的結果; -V --version # 顯示版本資訊, -i # 插入, i的后面可以接字串 # sed "command" a\ # 在當前行下面插入文本, i\ # 在當前行上面插入文本, c\ # 把選定的行改為新的文本, d # 洗掉,洗掉選擇的行, D # 洗掉模板塊的第一行, s # 替換指定字符 h # 拷貝模板塊的內容到記憶體中的緩沖區, H # 追加模板塊的內容到記憶體中的緩沖區, g # 獲得記憶體緩沖區的內容,并替代當前模板塊中的文本, G # 獲得記憶體緩沖區的內容,并追加到當前模板塊文本的后面, l # 串列不能列印字符的清單, n # 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令, N # 追加下一個輸入行到模板塊后面并在二者間嵌入一個新行,改變當前行號碼, p # 列印模板塊的行, P #(大寫) 列印模板塊的第一行, q # 退出Sed, b # lable 分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾, r # file 從file中讀行, t # label if分支,從最后一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾, T # label 錯誤分支,從最后一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾, w # file 寫并追加模板塊到file末尾, W # file 寫并追加模板塊的第一行到file末尾, ! # 表示后面的命令對所有沒有被選定的行發生作用, = # 列印當前行號碼, # 把注釋擴展到下一個換行符以前, # sed 替換標記 g # 表示行內全面替換, p # 表示列印行, w # 表示把行寫入一個檔案, x # 表示互換模板塊中的文本和緩沖區中的文本, y # 表示把一個字符翻譯為另外的字符(但是不用于正則運算式) \1 # 子串匹配標記 & # 已匹配字串標記 # sed 元字符集 ^ # 匹配行開始,如:/^sed/匹配所有以sed開頭的行, $ # 匹配行結束,如:/sed$/匹配所有以sed結尾的行, . # 匹配一個非換行符的任意字符,如:/s.d/匹配s后接一個任意字符,最后是d, * # 匹配0個或多個字符,如:/*sed/匹配所有模板是一個或多個空格后緊跟sed的行, [] # 匹配一個指定范圍內的字符,如/[ss]ed/匹配sed和Sed, [^] # 匹配一個不在指定范圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行, \(..\) # 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers, & # 保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**, \< # 匹配單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行, \> # 匹配單詞的結束,如/love\>/匹配包含以love結尾的單詞的行, x\{m\} # 重復字符x,m次,如:/0\{5\}/匹配包含5個0的行, x\{m,\} # 重復字符x,至少m次,如:/0\{5,\}/匹配至少有5個0的行, x\{m,n\} # 重復字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10個0的行,
用戶管理&權限
-
現代作業系統一般屬于多用戶的作業系統,普通用戶相互之間不受影響,但是權限是有限制且用戶太多的話,管理就不便,
-
所以系統會有一個超級用戶來管理普通用戶,并所在的組稱為root組,“組”是具有相似權限的多個用戶的集合,
-
這個root管理員就是所有UNIX系統中的超級用戶,它擁有最高的系統所有權,能夠管理系統的各項功能,因此“能力越大,責任越大”,root權限必須很好的掌握,否則一個錯誤的命令可能會摧毀整個系統,
-
在系統中有一個UID來區分用戶0代表系統管理員、1~99是系統用戶(Linux安裝的服務程式都會創建獨有的用戶負責運行)、1000開始是普通用戶,
-
不管任何系統中都會組這個概念,Linux 系統中還引入了用戶組的概念,通過使用用戶組號碼(GID,Group IDentification),我們可以把多個用戶加入到同一個組中,從而方 便為組中的用戶統一規劃權限或指定任務,
-
對用戶與組的基本操作
id root # 查看自己的UID、GID、GROUP useradd oldboy # 添加用戶 passwd redhat # 設定密碼,root用戶可以修改其他所有人的密碼,且不需要驗證 echo "redhat"|passwd --stdin oldboy && history -c # 非互動式設定密碼 userdel -r pyyu # 洗掉pyyu用戶及家目錄 -f # 強制洗掉用戶 -r # 洗掉用戶以及家目錄 su - "username" # su命令可以切換用戶身份的需求,su命令中間的-號很重要,意味著完全切換到新的用戶,即環境變數 # group命令用于創建用戶組,為了更加高效的指派系統中各個用戶的權限,在作業中常常添加幾個用戶到一個組里面,這樣可以針對一類用戶安排權限, groupadd it_dep # 將用戶加入到it_dep組中 -
sudo命令用來以其他身份來執行命令,預設的身份為root,在
/etc/sudoers中設定了可執行sudo指令的用戶,若其未經授權的用戶使用sudo,則會發出郵件給管理員,用戶使用sudo時,必須先輸入密碼,之后有5分鐘的有效期限,超過期限則必須重新輸入密碼,visudo /etc/sudoers # 用visudo編輯sudoers表可以查錯,只有root可以修改, root ALL=(ALL) ALL # Allow root to run any commands anywhere chaoge ALL=(ALL) ALL # 允許chaoge在任何地方,執行任何命令 sudo ls /root/ # 普通用戶查看root用戶的家目錄 -b # 在后臺執行指令; -h # 顯示幫助; -H # 將HOME環境變數設為新身份的HOME環境變數; -k # 結束密碼的有效期限,也就是下次再執行sudo時便需要輸入密碼;, -l # 列出目前用戶可執行與無法執行的指令; -p # 改變詢問密碼的提示符號; -s<shell> # 執行指定的shell; -u<user> # 以指定的用戶作為新的身份,若不加上此引數,則預設以root作為新的身份; -v # 延長密碼有效期限5分鐘; -V # 顯示版本資訊,
權限
-
Linux權限的目的是保護賬戶的資料,Linux權限主要依據三種身份來決定、檔案屬于哪個用戶、檔案屬于哪個組、其他人,
-
權限就是對檔案的增刪改查的操作,有權限的就可以操作,沒權限的就不可以操作,
-
查看權限
ls -l /var/log/mysqld.log、以空格劃分分別為:權限、檔案連接數、屬主、屬組、檔案大小、修改日期時間、檔案名,權限有10個杠第一個代表檔案型別、2到4是當前用戶權限、5到7是組權限、8到10是其他用戶權限,# 型別 - # 一般檔案 d # 檔案夾 l # 軟連接(快捷方式) b # 塊設備,存盤媒體檔案為主 c # 代表鍵盤,滑鼠等設備 # 權限 r # 數字為4 read可讀,可以用cat等命令查看 w # 數字為2 write寫入,可以編輯或者洗掉這個檔案 x # 數字為1 executable,可以執行 -
修改檔案權限屬性
chmod [u|g|o|a][=|-|+][r|w|x] [file] # 修改權限,1.中是身份、2.是操作、3.是檔案權限(|代表或,之選其中之一、[]只做區分) chmod [0~7|0~7|0~7] [file] # 修改權限(|代表或,之選其中之一、[]只做區分) chown root pyyu.txt # 修改屬主為root ll pyyu.txt # 查看資訊 chgrp root pyyu.txt # 修改屬組
設定PS1
-
軟連接軟連接也叫做符號鏈接,類似于windows的快捷方式,創建軟鏈接
ln -s "file" "name", -
PS1變數是Linux命令提示符由PS1環境變數控制
echo $PS1 # 查看ps1變數[\u@\h \W]\$ # 可以自行調整全域變數/etc/profile檔案用于永久生效 PS1='[\u@\h \W\t]\$' \d # 日期 \H # 完整主機名 \h # 主機名第一個名字 \t # 時間24小時制HHMMSS \T # 時間12小時制 \A # 時間24小時制HHMM \u # 當前用戶賬號名 \v # BASH的版本 \w # 完整作業目錄 \W # 利用basename取得作業目錄名 \# # 下達的第幾個命令 \$ # 提示字符,root為#,普通用戶為$ # PS1顯示ip地址 export PS1="[\u@\h `/sbin/ifconfig ens33 | sed -nr 's/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'` \w]\$"
解壓命令
-
人們發明了各種各樣的包,無論是雙肩包,或者是裝在口袋,都是為了讓“檔案”更方便攜帶,linux的檔案打包工具最出名的是tar,
tar
-
tar 命令用來壓縮和解壓檔案,tar本身不具有壓縮功能,他是呼叫壓縮功能實作的,
tar -cf all_pic.tar *.jpg # 壓縮當前目錄所有jpg結尾的檔案 tar -xjf xx.tar.bz2 # 解壓縮bz2結尾的檔案 -A --catenate # 新增檔案到以存在的備份檔案; -B # 設定區塊大小; -c --create # 建立新的備份檔案; -C <"directory"> # 這個選項用在解壓縮,若要在特定目錄解壓縮,可以使用這個選項, -d # 記錄檔案的差別; -x --extract --get # 從備份檔案中還原檔案; -t --list # 列出備份檔案的內容; -z --gzip --ungzip # 通過gzip指令處理備份檔案; -Z --compress --uncompress # 通過compress指令處理備份檔案; -f<"backups file"> --file=<"backups file"> # 指定備份檔案; -v --verbose # 顯示指令執行程序; -r # 添加檔案到已經壓縮的檔案; -u # 添加改變了和現有的檔案到已經存在的壓縮檔案; -j # 支持bzip2解壓檔案; -v # 顯示操作程序; -l # 檔案系統邊界設定; -k # 保留原有檔案不覆寫; -m # 保留檔案不被覆寫; -w # 確認壓縮檔案的正確性; -p --same-permissions # 用原來的檔案權限還原檔案; -P --absolute-names # 檔案名使用絕對名稱,不移除檔案名稱前的“/”號; -N <"datetype"> --newer=<"datetime"> # 只將較指定日期更新的檔案保存到備份檔案里; --exclude=<"style"> # 排除符合范本樣式的檔案,
gzip
-
gzip用來壓縮檔案,是個使用廣泛的壓縮程式,被壓縮的以".gz"擴展名,gzip可以壓縮較大的檔案,以60%~70%壓縮率來節省磁盤空間,
gzip * # 壓縮當前目錄所有檔案為.gz檔案 gzip -dv * # 把上例中每個壓縮的檔案解壓,并列出詳細的資訊 -d --decompress ----uncompress # 解開壓縮檔案; -f ——force # 強行壓縮檔案, -h ——help # 在線幫助; -l ——list # 列出壓縮檔案的相關資訊; -L ——license # 顯示版本與著作權資訊; -r ——recursive # 遞回處理,將指定目錄下的所有檔案及子目錄一并處理; -v ——verbose # 顯示指令執行程序;
網路基本認識
-
如果電腦上找不到
ifconfig哪應該是你在安裝Linux時并沒有安裝上,如果向往下學就是用yum install net-tools -y它去下載即可, -
Linux的網路功能相當強悍,一時之間我們無法了解所有的網路命令,在配置服務器基礎環境時,先了解下網路引數設定命令,
ifup eth33 # 腳本命令,更簡單的方式啟動網路 ifdown eth33 # 腳本命令,更簡單的方式關閉網路 ip # 符合指令,直接修改上述功能,這個ip命令是結合了ifconfig和route兩個命令的功能, ip addr show # 查看ip資訊 cat /etc/redhat-release # 查看系統版本資訊 uname -r # 查看內核版本號 uname -m # 查看系統多少位 uname -a # 查看內核所有資訊 -
網卡組態檔詳解
/etc/sysconfig/network # 網路組態檔 /etc/sysconfig/network-scripts/ifcfg-INTERFACE_NAME # 網路介面組態檔 DEVICE= # 關聯的設備名稱,要與檔案名的后半部“INTERFACE_NAME”保持一致; BOOTPROTO={static|none|dhcp|bootp} # 引導協議;要使用靜態地址,使用static或none;dhcp表示使用DHCP服務器獲取地址; IPADDR= # IP地址 NETMASK= # 子網掩碼 GATEWAY= # 設定默認網關; ONBOOT= # 開機時是否自動激活此網路介面; HWADDR= # 硬體地址,要與硬體中的地址保持一致;可省; USERCTL={yes|no} # 是否允許普通用戶控制此介面; PEERDNS={yes|no} # 是否在BOOTPROTO為dhcp時接受由DHCP服務器指定的DNS地址; -
ifconfig是網路中必須要用到的,不然你是無法查看ip的除
IP addr,ifconfig # 查詢、設定網卡和ip等引數,其中inet代表ip地址、netmask代表子網掩碼、broadcast代表廣播地址 ifconfig eth0 # 單獨顯示eth0的資訊 eth0 # 網卡的代號 lo # 回環地址loopback inet # IPv4的Ip地址 netmask # 子網掩碼 broadcast # 廣播地址 RX/TX # 流量發/收情況 tx是發送(transport),rx是接收(receive) packets # 資料包數 errors # 資料包錯誤數 dropped # 資料包有問題被丟棄的數量 collisions # 資料包碰撞情況,數值太多代表網路狀況差 -
netstat命令用來列印Linux中網路系統的狀態資訊,可讓你得知整個Linux系統的網路情況,
netstat -tunlp # 查看網路資訊 -t --tcp # 顯示TCP傳輸協議的連線狀況; -u --udp # 顯示UDP傳輸協議的連線狀況; -n --numeric # 直接使用ip地址,而不通過域名服務器; -l --listening # 顯示監控中的服務器的Socket; -p --programs # 顯示正在使用Socket的程式識別碼和程式名稱;-a或--all:顯示所有連線中的Socket; -
ps 命令用于查看系統中的行程狀態,
ps # 查看系統中的行程狀態 -a # 顯示所有行程 -u # 用戶以及其他詳細資訊 -x # 顯示沒有控制終端的行程 -
kill命令用來洗掉執行中的程式或作業,kill可將指定的資訊送至程式,
ps -ef | grep vim # ps查找行程 kill 3268 # 用kill殺掉 -a # 當處理當前行程時,不限制命令名和行程號的對應關系; -l <"infonum"> # 若不加<資訊編號>選項,則-l引數會列出全部的資訊名稱; -p # 指定kill 命令只列印相關行程的行程號,而不發送任何信號; -s <"infoname or infonum"> # 指定要送出的資訊; -u # 指定用戶, # 只有第9種信號(SIGKILL)才可以無條件終止行程,其他信號行程都有權利忽略,**下面是常用的信號:** HUP 1 # 終端斷線 INT 2 # 中斷(同 Ctrl + C) QUIT 3 # 退出(同 Ctrl + \) TERM 15 # 終止 KILL 9 # 強制終止 CONT 18 # 繼續(與STOP相反, fg/bg命令) STOP 19 # 暫停(同 Ctrl + Z) # 通常來講,復雜軟體的程式會有多個行程提供服務,如果逐個去結束這些行程會比較麻煩,此時可以使用 killall 命令來批量結束某個服務程式帶有的全部行程, killall nginx
防火墻
SELinux功能
-
SELinux(Security-Enhanced Linux) 是美國國家安全域(NSA)對于強制訪問控制的實作,這個功能管理員又愛又恨,大多數生產環境也是關閉的做法,安全手段使用其他方法,
-
永久關閉方式
# 1.修改組態檔,永久生效關閉selinux cp /etc/selinux/config /etc/selinux/config.bak # 修改前備份 # 2.用sed替換 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 3.檢查狀態 grep "SELINUX=disabled" /etc/selinux/config -
臨時關閉selinux(命令列修改,重啟失效)
getenforce # 獲取selinux狀態 # 修改selinux狀態 setenforce usage: setenforce [ Enforcing | Permissive | 1 | 0 ] # 數字0 表示permissive,給出警告,不會阻止,等同disabled # 數字1表示enforcing,表示開啟
iptables防火墻
-
在學習階段,關閉防火墻可以更方便的學習,在企業環境中,一般只有配置外網ip的linux服務器才會開啟防火墻,但是對于高并發流量的業務服務器仍然是不能開啟的,會有很大性能損失,因此需要更nb的硬體防火墻,
-
關閉防火墻具體操作如下
# centos7默認已經使用firewall作為防火墻了 # 1.關閉防火墻 systemctl status firewalld # 查看防火墻狀態 systemctl stop firewalld # 關閉防火墻 systemctl disable firewalld # 關閉防火墻開機啟動systemctl is-enabled firewalld.service #檢查防火墻是否啟動
其他認識
-
其他一些配置的操作
# df命令用于顯示磁盤磁區上的可使用的磁盤空間,默認顯示單位為KB, df # 查看系統磁盤設備,默認是KB為單位: -h --human-readable # 以可讀性較高的方式來顯示資訊; -k --kilobytes # 指定區塊大小為1024位元組; -T --print-type # 顯示檔案系統的型別; --help # 顯示幫助; --version # 顯示版本資訊, tree # 命令以樹狀圖列出目錄的內容, -a # 顯示所有檔案和目錄; -A # 使用ASNI繪圖字符顯示樹狀圖而非以ASCII字符組合; -C # 在檔案和目錄清單加上色彩,便于區分各種型別; -d # 先是目錄名稱而非內容; -D # 列出檔案或目錄的更改時間; -f # 在每個檔案或目錄之前,顯示完整的相對路徑名稱; -F # 在執行檔案,目錄,Socket,符號連接,管道名稱名稱,各自加上"*","/","@","|"號; -g # 列出檔案或目錄的所屬群組名稱,沒有對應的名稱時,則顯示群組識別碼; -i # 不以階梯狀列出檔案和目錄名稱; -l # <范本樣式> 不顯示符號范本樣式的檔案或目錄名稱; -l # 如遇到性質為符號連接的目錄,直接列出該連接所指向的原始目錄; -n # 不在檔案和目錄清單加上色彩; -N # 直接列出檔案和目錄名稱,包括控制字符; -p # 列出權限標示; -P # <范本樣式> 只顯示符合范本樣式的檔案和目錄名稱; -q # 用“?”號取代控制字符,列出檔案和目錄名稱; -s # 列出檔案和目錄大小; -t # 用檔案和目錄的更改時間排序; -u # 列出檔案或目錄的擁有者名稱,沒有對應的名稱時,則顯示用戶識別碼; -x # 將范圍局限在現行的檔案系統中,若指定目錄下的某些子目錄,其存放于另一個檔案系統上,則將該目錄予以排除在尋找范圍外, hostnamectl set-hostname "pyyuc" # 設定主機名
Linux中文顯示設定
-
此項優化為可選項,根據個人情況選擇是否調整Linux系統的字符集,字符集就是一套文字符號以及編碼,
-
Linux下常用字符集有:GBK實際企業應用較少、UTF-8廣泛支持,MYSQL也使用UTF-8,企業廣泛使用,
echo $LANG # 查看系統當前字符集 #檢查xshell crt的字符集 # vim /etc/profile.d/locale.sh export LC_CTYPE=zh_CN.UTF-8 # 命令修改字符集 export LC_ALL=zh_CN.UTF-8 # vim /etc/locale.conf LANG=zh_CN.UTF-8 # vim /etc/sysconfig/i18n LANG=zh_CN.UTF-8 # vim /etc/environment LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8 -
英文版本
# vim /etc/profile.d/locale.sh export LC_CTYPE=en_US.UTF-8 export LC_ALL=en_US.UTF-8 # vim /etc/locale.conf LANG=en_US.UTF-8 # vim /etc/sysconfig/i18n LANG=en_US.UTF-8 # vim /etc/environment LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 -
亂碼核心解決辦法,:系統字符集utf8,xshell字符集utf8,檔案字符集一致zh_CN.UTF-8,
DNS
-
DNS(Domain Name System,域名系統),萬維網上作為域名和IP地址相互映射的一個分布式資料庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串,
-
通過域名,最終得到該域名對應的IP地址的程序叫做域名決議(或主機名決議),
-
查看Linux的dns,唯一組態檔
cat /etc/resolv.conf,本地強制dns決議檔案vi /etc/hosts,前面是ip后面是域名,
nslookup
-
nslookup命令是常用域名查詢工具,就是查DNS資訊用的命令,
-
nslookup4有兩種作業模式,即“互動模式”和“非互動模式”,在“互動模式”下,用戶可以向域名服務器查詢各類主機、域名的資訊,或者輸出域名中的主機串列,而在“非互動模式”下,用戶可以針對一個主機或域名僅僅獲取特定的名稱或所需資訊,
-
進入互動模式,直接輸入nslookup命令,不加任何引數,則直接進入互動模式,此時nslookup會連接到默認的域名服務器(即
/etc/resolv.conf的第一個dns地址),或者輸入nslookup -nameserver/ip,進入非互動模式,就直接輸入nslookup 域名就可以了, -
決議
nslookup www.oldboyedu.com
crond
-
有些事情是要定時完成的,我們就要用到,crond服務相關的軟體包
rpm -qa |grep cron,crontab命令被用來提交和管理用戶的需要周期性執行的任務, -
這些包在最小化安裝系統時就已經安裝了,并且會開機自啟動crond服務,并為我們提供好撰寫計劃任務的crontab命令,
cat /etc/crontab # 在/etc目錄下有一個crontab檔案,這個就是系統任務調度的組態檔 crontab -e */3 * * * * /usr/sbin/ntpdate ntp1.aliyun.com # 每隔三分鐘執行下時間同步 -e # 編輯該用戶的計時器設定; -l # 列出該用戶的計時器設定; -r # 洗掉該用戶的計時器設定; -u<"username"> # 指定要設定計時器的用戶名稱,存放定時任務的檔案/var/spool/cron *****command # 代表,分鐘(0-59)、小時(0-23)、日期(1-31)、月份(1-12)、星期(0-6,0代表星期天)、命令 * # 代表所有可能的值 , # 可以用逗號隔開的值指定一個串列范圍,例如,“1,2,5,7,8,9” - # 可以用整數之間的中杠表示一個整數范圍,例如“2-6”表示“2,3,4,5,6” / # 可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次, -
注意:
-
查看計劃任務的執行:tail -f /var/log/cron
-
寫計劃任務時,命令必須加上絕對路徑,否則會出現這種情況:從日志中看,確實觸發了計劃任務的執行,但是命令卻沒有執行成功,比如* * * * * reboot就會出現這種情況,需要將reboot寫成/usr/sbin/reboot
-
計劃任務執行的命令 是否存在,軟體是否安裝
-
確保crontab服務運行 :
systemctl status cron&ps -ef|grep crond, -
檢測crontab是否開機啟動:
systemctl is-enabled crond -
crontab組態檔
-
系統服務管理命令
-
如果大家之前學習或者使用過RHEL6系統,應該已經習慣了service、chkconfig等命令來管理系統服務,但是在RHEL7系統中改變了systemctl來管理系統服務,
# System V init(RHEL6) service foo start # 啟動服務 service foo restart # 重啟服務 service foo stop # 停止服務 service foo reload # 重新加載組態檔(不終止服務) service foo status # 查看服務狀態 chkconfig foo on # 開機自動啟動 chkconfig foo off # 開機不自動啟動 chkconfig foo # 查看特定服務是否為啟動 # System V init(RHEL7) systemctl start foo.service # 啟動服務 systemctl restart foo.service # 重啟服務 systemctl stop foo.service # 停止服務 systemctl reload foo.service # 重新加載組態檔(不終止服務) systemctl status foo.service # 查看服務狀態 systemctl enable foo.service # 開機自動啟動 systemctl disable foo.service # 開機不自動啟動 systemctl is-enabled foo.service # 查看特定服務是否為啟動
/etc下的目錄知識
-
/etc:這個目錄用來存放所有的系統管理所需要的組態檔和子目錄,
/etc/sysconfig/network-script/ifcfg-eth0 # 網卡組態檔 /etc/sysconfig/network # 修改機器名以及網卡,網管等配置 /etc/resolv.conf # linux的dns客戶端組態檔,實作域名和ip的互相決議 /etc/hosts/ # 本地dns決議檔案,設定ip和域名的對應決議,開發測驗最常用的臨時域名決議 /etc/profile # 系統全域環境變數永久生效的組態檔,如PATH等 ~/.bash_profile # 用戶的環境變數 ~/.bashrc # 用戶的環境變數 /usr/sbin # 存放可執行程式的目錄,大多是系統管理命令 /usr/local # 存放用戶自編譯安裝軟體的目錄 > 等同于C:\Program files (windows) /proc/cpuinfo # 關于處理器的資訊,還可以top指令查看 /proc/meminfo # 查看記憶體資訊,還可以free -m
軟體包管理
-
軟體包顧名思義就是將應用程式、組態檔和資料打包的產物,所有的linux發行版都采用了某種形式的軟體包系統,這使得linux軟體管理和在windows下一樣方便,suse、red hat、fedora等發行版都是用rpm包,Debian和Ubuntu則使用.deb格式的軟體包,
RPM
-
軟體包管理器核心功能,制作軟體包.rpm,安裝、卸載、升級、查詢、校驗,
-
在 RPM(紅帽軟體包管理器)公布之前,要想在 Linux 系統中安裝軟體只能采取原始碼包 的方式安裝,早期在 Linux 系統中安裝程式是一件非常困難、耗費耐心的事情,
-
RPM 機制則為解決這些問題而設計的,RPM 有點像 Windows 系統中的控制面板,會建 立統一的資料庫檔案,詳細記錄軟體資訊并能夠自動分析依賴關系,
-
相關操作
wget https://xx.net/xx.rpm # 下載軟體包 rpm -i filename.rpm i # 表示安裝 v # 顯示詳細程序 h # 以進度條顯示 rpm -ivh filename.rpm # 安裝軟體的命令格式 rpm -Uvh filename.rpm # 升級軟體的命令格式 rpm -e filename.rpm # 卸載軟體的命令格式,需要手動解決依賴,不如 yum remove rpm -qpi filename.rpm # 查詢軟體描述資訊的命令格式 rpm -qpl filename.rpm # 列出軟體檔案資訊的命令格式 rpm -qf filename # 查詢檔案屬于哪個 RPM 的命令格式
yum
-
yum命令是在Fedora和RedHat以及SUSE中基于rpm的軟體包管理器,它可以使系統管理人員互動和自動化地更細與管理RPM軟體包,能夠從指定的服務器自動下載RPM包并且安裝,可以自動處理依賴性關系,并且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝,
-
盡管 RPM 能夠幫助用戶查詢軟體相關的依賴關系,但問題還是要運維人員自己來解決, 而有些大型軟體可能與數十個程式都有依賴關系,在這種情況下安裝軟體會是非常痛苦的, Yum 軟體倉庫便是為了進一步降低軟體安裝難度和復雜度而設計的技術,Yum 軟體倉庫可以 根據用戶的要求分析出所需軟體包及其相關的依賴關系,然后自動從服務器下載軟體包并安 裝到系統,
-
Yum 軟體倉庫中的 RPM 軟體包可以是由紅帽官方發布的,也可以是第三方發布的,當然也可以是自己撰寫的,
-
yum提供了查找、安裝、洗掉某一個、一組甚至全部軟體包的命令,而且命令簡潔而又好記,
yum install yum-fastestmirror # 自動搜索最快鏡像插件 -h # 顯示幫助資訊; -y # 對所有的提問都回答“yes”; -c # 指定組態檔; -q # 安靜模式; -v # 詳細模式; -d # 設定除錯等級(0-10); -e # 設定錯誤等級(0-10); -R # 設定yum處理一個命令的最大等待時間; -C # 完全從快取中運行,而不去下載或者更新任何頭檔案, -
yum源配置,說到yum源就必須說到linux系統中特有的依賴關系問題,yum就是為了解決依賴關系而存在的,yum源就相當是一個目錄項,當我們使用yum機制安裝軟體時,若需要安裝依賴軟體,則yum機制就會根據在yum源中定義好的路徑查找依賴軟體,并將依賴軟體安裝好,
-
YUM的基本作業機制如下:
-
服務器端:在服務器上面存放了所有的RPM軟體包,然后以相關的功能去分析每個RPM檔案的依賴性關系,將這些資料記錄成檔案存放在服務器的某特定目錄內,
-
客戶端:如果需要安裝某個軟體時,先下載服務器上面記錄的依賴性關系檔案(可通過WWW或FTP方式),通過對服務器端下載的紀錄資料進行分析,然后取得所有相關的軟體,一次全部下載下來進行安裝,
-
-
yum源的目錄
ll /etc/yum.repos.d/,查看yum源檔案,以repo結尾的都是yum源組態檔,BASE.repo是主檔案, -
配置阿里云yum源
mkdir /repo_bak # 創建備份檔案夾 cp *.repo /repo_bak/ # 將yum源備份到創建的檔案下 wget http://mirrors.aliyun.com/repo/Centos-7.repo # 下載阿里云repo檔案 yum clean allyum makecache # 清空yum快取并且生成新的yum快取 yum install -y epel-release # 安裝軟體擴展源 -
yum的操作
yum repolist all # 列出所有倉庫 yum list all # 列出倉庫所有軟體包 yum info "appname" # 查看軟體包資訊 yum install "appname" # 安裝軟體包 yum reinstall "appname" # 重新安裝軟體包 yum update "appname" # 升級軟體包 yum remove "appname" # 移除軟體包 yum clean all # 清楚所有倉庫快取 yum check-update # 檢查可以更新的軟體包 yum grouplist # 查看系統中已安裝的軟體包 yum groupinstall "appgroup" # 安裝軟體包組
中級階段
python3部署
-
安裝python前的庫環境,非常重要
yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y -
下載,解壓安裝原始碼包
# 用它下載會慢也可以使用下面的一種 wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz # 在win系統上用迅雷到https://www.python.org/downloads/release/python-362/地址下載后,在Linux上安裝 yum install lrzsz rz -y xz -d Python-3.6.7.tar.xz # 解壓xz tar -xf Python-3.6.7.tar # 解壓tar -
這一步一般用來生成 Makefile,為下一步的編譯做準備,你可以通過在 configure 后加上引數來對安裝進行控制,
/opt/Python-3.4.7 ./configure --prefix=/usr -
然后這兩句可以一局就執行成功
make && make install編譯 -
設定快捷方式或加入環境變數
# 配置軟連接,快捷啟動python3和pip3 ln -s /opt/python347/bin/python3 /usr/bin/python3 ln -s /opt/python347/bin/pip3 /usr/bin/pip3 # 配置系統環境變數,配置PATH,加入python3的目錄 PATH=$PATH:/opt/python347/bin/
虛擬環境
-
在使用
Python開發的程序中,工程一多,難免會碰到不同的工程依賴不同版本的庫的問題; -
我們需要對于不同的工程使用不同的虛擬環境來保持開發環境以及宿主環境的清潔,
-
virtualenv 可以在系統中建立多個不同并且相互不干擾的虛擬環境,
# 指定清華源下載pip的包 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv # 升級pip工具 pip3 install --upgrade pip -
virtualenv的使用方式,
pip3 install virtualenv # 安裝virtualenv mkdir Myproject|cd Myproject # 創建存放虛擬解釋器的目錄 virtualenv --no-site-packages --python=python3 venv # 創建獨立運行環境-命名,得到獨立第三方包的環境,并且指定解釋器是python3 source venv/bin/activate # 進入虛擬環境,此時進入虛擬環境(venv)Myproject (venv)Myproject: pip3 install django==1.9.8 # 安裝第三方包 # 此時pip的包都會安裝到venv環境下,venv是針對Myproject創建的 deactivate # 退出venv環境 # virtualenv原理很簡單,就是把系統Python復制一份到virtualenv的環境,用命令source venv/bin/activate進入一個virtualenv環境時,virtualenv會修改相關環境變數,讓命令python和pip均指向當前的virtualenv環境,
自動虛擬環境
-
virtualenv的一個最大的缺點就是:每次開啟虛擬環境之前要去虛擬環境所在目錄下的
bin目錄下source一下activate,這就需要我們記住每個虛擬環境所在的目錄,并且還有可能你忘記了虛擬環境放在哪,,, -
一種可行的解決方案是,將所有的虛擬環境目錄全都集中起來,例如/opt/all_venv/,并且針對不同的目錄做不同的事,
-
使用virtualenvwrapper管理你的虛擬環境(virtualenv),其實他就是統一管理虛擬環境的目錄,并且省去了source的步驟,
pip3 install virtualenvwrapper # 安裝virtualenvwrapper # 設定Linux的環境變數,每次啟動就加載virtualenvwrapper # 把下面兩行代碼添加到 ~/.bashrc檔案中 vim ~/.bashrc # 寫入以下兩行代碼 export WORKON_HOME=~/Envs # 設定virtualenv的統一管理目錄 export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages' # 添加virtualenvwrapper的引數,生成干凈隔絕的環境 export VIRTUALENVWRAPPER_PYTHON=/opt/python347/bin/python3 # 指定python解釋器 source /opt/python34/bin/virtualenvwrapper.sh # 執行virtualenvwrapper安裝腳本 -
基本使用virtualenvwrapper
mkvirtualenv my_django115 # 創建一個虛擬環境,這會在 ~/Envs 中創建 my_django115 檔案夾, workon my_django115 # 在虛擬環境上作業:激活虛擬環境my_django115 mkvirtualenv my_django2 # 再創建一個新的虛擬環境 virtualenvwrapper # 提供環境名字的tab補全功能. workon # 可以列出所有虛擬環境, workon django1.15 # 可以在多個虛擬環境中來回切換 deactivate # 也可以手動停止虛擬環境 rmvirtualenv my_django115 # 洗掉虛擬環境,需要先退出虛擬環境 -
常用其他命令
lsvirtualenv # 列舉所有的環境, cdvirtualenv # 導航到當前激活的虛擬環境的目錄中,比如說這樣您就能夠瀏覽它的 site-packages , cdsitepackages # 和上面的類似,但是是直接進入到 site-packages 目錄中, lssitepackages # 顯示 site-packages 目錄中的內容,完整官網介紹:https://virtualenvwrapper.readthedocs.io/en/latest/command_ref.html
確保開發環境的一致性
-
假設我們在本地開發環境,準備好了專案+依賴包環境
-
現在需要將專案上傳至服務器,上線發布,那么就要保證服務器的python環境一致性,
-
解決方案:
pip3 freeze > requirements.txt # 通過命令保證環境的一致性,匯出當前python環境的包 pip3 install -r requirements.txt # 上傳至服務器后,在服務器下創建virtualenv,在venv中匯入專案所需的模塊依賴 -
這將會創建一個 requirements.txt 檔案,其中包含了當前環境中所有包及 各自的版本的簡單串列,可以使用 “pip list”在不產生requirements檔案的情況下, 查看已安裝包的串列,
MySQL部署
-
MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社區在維護,采用GPL授權許可,開發這個分支的原因之一是:甲骨文公司收購了MySQL后,有將MySQL閉源的潛在風險,因此社區采用分支的方式來避開這個風險,MariaDB的目的是完全兼容MySQL,包括API和命令列,使之能輕松成為MySQL的代替品,
-
yum安裝mariadb,Red Hat Enterprise Linux/CentOS 7.0 發行版已將默認的資料庫從 MySQL 切換到 MariaDB,
-
安裝 MariaDB
vi /etc/yum.repos.d/MariaDB.repo # 編輯創建mariadb.repo倉庫檔案 [mariadb] # 添加repo倉庫配置 name = MariaDB baseurl = http://yum.mariadb.org/10.1/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 yum install MariaDB-server MariaDB-client -y # 當 MariaDB 倉庫地址添加好后,你可以通過下面的一行命令輕松安裝 MariaDB, # 啟動mariadb相關命令 systemctl start mariadb # 啟動MariaDB systemctl stop mariadb # 停止MariaDB systemctl restart mariadb # 重啟MariaDB systemctl enable mariadb # 設定開機啟動
初始化mysql
-
在確認 MariaDB 資料庫軟體程式安裝完畢并成功啟動后請不要立即使用,為了確保資料 庫的安全性和正常運轉,需要先對資料庫程式進行初始化操作,這個初始化操作涉及下面 5 個 步驟, ? 設定 root 管理員在資料庫中的密碼值(注意,該密碼并非 root 管理員在系統中的密 碼,這里的密碼值默認應該為空,可直接按回車鍵), ? 設定 root 管理員在資料庫中的專有密碼, ? 隨后洗掉匿名賬戶,并使用 root 管理員從遠程登錄資料庫,以確保資料庫上運行的業 務的安全性, ? 洗掉默認的測驗資料庫,取消測驗資料庫的一系列訪問權限, ? 重繪授權串列,讓初始化的設定立即生效,
-
確保mariadb服務器啟動后,執行命令初始化
mysql_secure_installation # 初始化mariadb Set root password? # 設定root用戶密碼? Remove anonymous users? # 洗掉匿名用戶? Disallow root login remotely? # 禁止root遠程登陸? Remove test database and access to it? # 洗掉test資料庫并取消對它的訪問權限? Reload privilege tables now? # 重繪授權表,讓初始化后的設定立即生效? -
用戶的基本操作
set password = PASSWORD('redhat123'); # 修改mysql密碼 # 為了資料庫的安全以及和其他用戶協同管理資料庫,就需要創建其他資料庫賬戶,然后分配權限,滿足作業需求, create user yuch@'127.0.0.1' identified by 'redhat123'; # 創建新用戶 use mysql; # 進入mysql資料庫 select host,user,password from user where user='yuch'; # 查看指定用戶的連接、密碼、用戶名 mysql -uyuchao -p -h 127.0.0.1 # 切換普通用戶yuch -
資料庫權限設定,權限就是“create、insert、update、delete......”
# mysql使用grant命令對賬戶進行授權,grant命令常見格式如下 grant "permissions" on "database"."tablename" to "username"@"computername" # 對特定資料庫中的特定表授權 grant "permissions" on "database".* to "username"@"computername" # 對特定資料庫中的所有表給與授權 grant "permissions","permissions" on *.* to "username"@"computername" # 對所有庫中的所有表給與多個授權 grant all privileges on *.* to "username"@"computername" # 對所有庫和所有表授權所有權限 revoke all privileges on *.* to "username"@"computername" # 移除權限
配置mysql
-
中文編碼設定,編輯mysql組態檔/etc/my.cnf,下入以下內容
[mysqld] character-set-server=utf8 collation-server=utf8_general_ci log-error=/var/log/mysqld.log [client] default-character-set=utf8 [mysql] default-character-set=utf8 -
授權配置
grant all privileges on *.* to root@'%' identified by 'password'; # 遠程連接設定哦設定所有庫,所有表的所有權限,賦值權限給所有ip地址的root用戶 mysql > create user 'username'@'%' identified by 'password'; # 創建用戶 flush privileges; # 重繪權限 -
資料庫備份與恢復
mysqldump -u root -p --all-databases > /tmp/db.dump # mysqldump命令用于備份資料庫資料 mysqldump -uroot -proot --databases db1 db2 >/tmp/user.sql # 匯出db1、db2兩個資料庫的所有資料 drop database s11; # 進入mariadb資料庫,洗掉一個db mysql -uroot -p < /tmp/db.dump # 進行資料恢復,吧剛才重定向備份的資料庫檔案匯入到mysql中
MYSQL主從復制
-
MySQL資料庫的主從復制方案,是其自帶的功能,并且主從復制并不是復制磁盤上的資料庫檔案,而是通過binlog日志復制到需要同步的從服務器上,
-
MySQL資料庫支持單向、雙向、鏈式級聯,等不同業務場景的復制,在復制的程序中,一臺服務器充當主服務器(Master),接收來自用戶的內容更新,而一個或多個其他的服務器充當從服務器(slave),接收來自Master上binlog檔案的日志內容,決議出SQL,重新更新到Slave,使得主從服務器資料達到一致,
-
在生產環境中,MySQL主從復制都是異步的復制方式,即不是嚴格的實時復制,但是給用戶的體驗都是實時的, MySQL主從復制集群功能使得MySQL資料庫支持大規模高并發讀寫成為可能,且有效的保護了服務器宕機的資料備份,
master主
-
配置主庫
systemctl status mariadb # 查看資料庫狀態 systemctl stop mariadb # 停mariadb vim /etc/my.cnf # 修改組態檔 [mysqld] server-id=1 # 解釋:server-id服務的唯一標識(主從之間都必須不同); log-bin=mysql-bin # log-bin啟動二進制日志名稱為mysql-bin systemctl start mariadb # 重啟mariadb -
master主庫添加從庫賬號
create user 'chaoge'@'192.168.178.130' identified by 'redhat'; # 新建用于主從同步的用戶chaoge,允許登錄的從庫是'192.168.178.130' set global validate_password_policy=0; # 題外話:如果提示密碼太簡單不復合策略加在前面加這句 grant replication slave on *.* to 'chaoge'@'192.168.178.130'; # 給從庫賬號授權,說明給chaoge從庫復制的權限,在192.168.178.130機器上復制 select user,host from mysql.user; # 檢查主庫創建的復制賬號 show grants for chaoge@'192.168.178.130'; # 檢查授權賬號的權限 flush table with read lock; # 實作對主資料庫鎖表只讀,防止資料寫入,資料復制失敗 show master status # 檢查主庫的狀態,File是二進制日志檔案名,Position 是日志開始的位置, mysqldump -uroot -p --all-databases > /data/all.sql # 鎖表后,一定要單獨再打開一個SSH視窗,匯出資料庫的所有資料, show master status; # 確保資料匯出后,沒有資料插入,完畢再查看主庫狀態 unlock tables; # 匯出資料完畢后,解鎖主庫,恢復可寫; scp /data/all.sql [email protected]:/data/ # 將備份匯出的資料scp至Slave資料庫
slave從庫配置
-
方式一
# 設定server-id值并關閉binlog功能引數,資料庫的server-id在主從復制體系內是唯一的,Slave的server-id要與主庫和其他從庫不同,并且注釋掉Slave的binlog引數, # 因此修改Slave的/etc/my.cnf,寫入 [mysqld] server-id=3 systemctl restart mariadb # 重啟資料庫 # 檢查Slava從資料庫的各項引數 show variables like 'log_bin'; show variables like 'server_id'; source /data/all.sql; # 恢復主庫Master的資料匯入到Slave庫,匯入資料(注意sql檔案的路徑) -
方法二
#mysql -uroot -p < abc.sql # 配置復制的引數,Slave從庫連接Master主庫的配置 change master to master_host='192.168.178.129', master_user='chaoge', master_password='redhat', master_log_file='mysql-bin.000001', master_log_pos=575; start slave; # 啟動從庫的同步開關,測驗主從復制的情況 show slave status\G; # 查看復制狀態 -
注意此處還未配置從庫的只讀模式,只需在slave服務器上配置/etc/my.cnf,加上以下配置,并且在slave上創建普通用戶,使用普通用戶主從同步即可達到只讀的效果
[mysqld] character-set-server=utf8 collation-server=utf8_general_ci log-error=/var/log/mysqld.log server-id=3 read-only=true [client] default-character-set=utf8 [mysql] default-character-set=utf8
NoSQL學習與部署
-
存盤結構與mysql這一種關系型資料庫完全不同,nosql存盤的是KV形式,nosql有很多產品,都有自己的api和語法,以及業務場景,
-
Nosql和sql的區別,應用場景不同,sql支持關系復雜的資料查詢,nosql反之,sql支持事務性,nosql不支持
-
redis特性,Redis 是一個開源(BSD許可)的,記憶體中的資料結構存盤系統,它可以用作資料庫、快取和訊息中間件,redis是c語言撰寫的,支持資料持久化,是key-value型別資料庫,
-
redis優勢,性能高,讀取速度10萬次每秒,寫入速度8萬次每秒,所有操作支持原子性用作快取資料庫,資料放在記憶體中替代某些場景下的mysql,如社交類app大型系統中,可以存盤session資訊,購物車訂單,
-
yum安裝redis
# 前提得配置好阿里云yum源,epel源 yum list redis # 查看是否有redis包 redisyum install redis -y # 安裝 redissystemctl start redis # 安裝好,啟動 redis-cli # redis 客戶端工具 ping # 進入互動式環境后,執行ping,回傳pong表示安裝成功 -
原始碼安裝redis,編譯安裝,大家用過yum,是相當省事好用吧,為什么還要學習原始碼安裝?
-
編譯安裝的優勢是:編譯安裝時可以指定擴展的module(模塊),php、apache、nginx都是一樣有很多第三方擴展模塊,如mysql,編譯安裝時候,如果需要就定制存盤引擎(innodb,還是MyIASM)、編譯安裝可以統一安裝路徑,linux軟體約定安裝目錄在/opt/下面、軟體倉庫版本一般比較低,編譯原始碼安裝可以根據需求,安裝最新的版本,
wget http://download.redis.io/releases/redis-4.0.10.tar.gz # 下載redis原始碼 tar -zxf redis-4.0.10.tar.gz # 解壓縮 cd redis-4.0.10.tar.gz # 切換redis原始碼目錄 make|make install # 編譯源檔案,安裝到指定目錄,默認在/usr/local/bin # 編譯好后,src/目錄下有編譯好的redis指令 -
redis可執行檔案
./redis-benchmark # 用于進行redis性能測驗的工具 ./redis-check-dump # 用于修復出問題的dump.rdb檔案 ./redis-cli # redis的客戶端 ./redis-server # redis的服務端 ./redis-check-aof # 用于修復出問題的AOF檔案 ./redis-sentinel # 用于集群管理 -
redis組態檔,redis組態檔名為redis.conf 這個檔案可以自定義,
# redis.conf核心配置項 bind 127.0.0.1 # 系結ip,如需要遠程訪問,需要填寫服務器ip port # 埠,redis啟動埠 daemonize yes # 守護行程方式運行 dbfilename dump.rdb # rdb資料檔案 dir /var/lib/redis/ # 資料檔案存放路徑 logfile /var/log/redis/redis-server.log # 日志檔案 slaveof # 主從復制 -
啟動redis服務端,啟動redis非常簡單,直接
./redis-server就可以啟動服務端了,還可以用下面的方法指定要加載的組態檔:./redis-server,../redis.conf默認情況下,redis-server會以非daemon的方式來運行,且默認服務埠為6379, -
使用redis客戶端
./redis-cli # 執行客戶端命令即可進入 ping # 測驗是否連接上redis,回傳pong代表連接上了 set name "chaoge" # 用set來設定key、value get name # get獲取name的值
Redis資料結構
-
redis是一種高級的key:value存盤系統,其中value支持五種資料型別:字串(strings)、散列(hashes)、串列(lists)、集合(sets)、有序集合(sorted sets),
keys * # 查看所有key type key # 查看key型別 expire key seconds # 過期時間 ttl key # 查看key過期剩余時間,-2表示key已經不存在了 persist # 取消key的過期時間,-1表示key存在,沒有過期時間 exists key # 判斷key存在,存在回傳1,否則0 del keys # 洗掉key,可以洗掉多個 dbsize # 計算key的數量 -
strings
set name 'yu' # 設定key get name # 獲取value append name ' dsb' # 追加key的string mset user1 'alex' user2 'xiaopeiqi' # 設定多個鍵值對 keys * # 找到所有key mget user1 user2 name # 獲取多個value del name # 洗掉key incr num # 遞增+1 decr num # 遞減1 -
list
lpush duilie 'alex' 'peiqi' 'ritian' # 新建一個duilie,從左邊放入三個元素 rpush duilie 'chaoge' # 從右邊插入chaoge lrange duilie 0 -1 # 查看duilie所有元素 ltrim duilie 0 2 # 截取佇列的值,從索引0取到2,洗掉其余的元素 lpop # 洗掉左邊的第一個 rpop # 洗掉右邊的第一個 llen duilie # 查看duilie長度 lpushx duilie2 'dsb' # key存在則添加 dsb元素,key不存在則不作處理 -
sets集合型別,redis的集合,是一種無序的集合,集合中的元素沒有先后順序,
sadd zoo wupeiqi yuanhao # 添加集合,有三個元素,不加引號就當做字串處理 srem zoo wupeiqi # 洗掉zoo里面的alex smembers zoo # 查看集合zoo成員 sismember zoo wupeiqi # 回傳改是否是zoo的成員資訊,不存在回傳0,存在回傳1 sdiff zoo zoo2 # 差集 sinter zoo zoo1 # 交集 sunion zoo zoo1 # 并集 -
有序集合都是以z開頭的命令,zset的每一個成員都有一個分數與之對應,并且分數是可以重復的,有序集合的增刪改由于有啦排序,執行效率就是非常快速的,即便是訪問集合中間的資料也是非常高效的,
ZADD zoo wupeiqi yuanhao # 添加集合,有三個元素,不加引號就當做字串處理 ZREVRANGE mid_test 0 -1 withscores # 降序 ZRANGE mid_test 0 -1 withscores # 升序 ZREM mid_test xiaofneg # 洗掉一個 ZCARD mid_test # 基數 ZSCORE mid_test alex # score值 ZRANK mid_test wusir # zrank回傳有序集合中,成員的排名,默認按score,從小到大排序, -
哈希資料結構,哈希結構就是 k1 -> k1 : v1 如同字典 套字典 { k1 : { k2: v2 } } ,取出v2 必須 k1,取出k2,
hset news1 title "first news title" # 設定第一條新聞 news的id為1,添加資料title的值是"news title" hget news1 content # 獲取news的內容 hmget news1 title content # 獲取多對news:1的 值 hmset news2 title "second news title" content "second Contents2" # 設定第二條新聞news:2 多個field hkeys news1 # 獲取新聞news:1的所有key hvals news1 # 獲取新聞news:1的所有值 hlen news1 # 獲取新聞news:1的長度 hdel news1 title # 洗掉新聞news:1的title hexists news1 title # 判斷新聞1中是否有title,不存在回傳0,存在回傳1 hsetnx # 如果散列已經存在,則不設定(防止覆寫key)
Redis安全
-
由于發現眾多同學,在使用云服務器時,安裝的redis3.0+版本都關閉了protected-mode,因而都遭遇了挖礦病毒的攻擊,使得服務器99%的占用率!!因此我們在使用redis時候,最好更改默認埠,并且使用redis密碼登錄,
-
redis沒有用戶概念,redis只有密碼、redis默認在作業在保護模式下,不允許遠程任何用戶登錄的(protected-mode),
# redis.conf設定 protected-mode yes # 打開保護模式 port 6380 # 更改默認啟動埠 requirepass xxxxxx # 設定redis啟動密碼,xxxx是自定義的密碼 # 啟動redis服務端 redis-server /opt/redis-4.0.10/redis.conf & # 指定組態檔啟動redis,且后臺啟動 # 使用密碼登錄redis,使用6380埠 # 方法1,使用這個 redis-cli -p 6380 auth xxxx # 方法2,此方案不安全,容易暴露密碼 redis-cli -p 6380 -a xxxx Warning: Using a password with '-a' option on the command line interface may not be safe. ping # CONFIG set requirepass "xxxxxx" # 如果沒有,也可以給redis設定密碼(命令方式)
Redis主從同步
-
原理:
-
從服務器向主服務器發送 SYNC 命令,
-
接到 SYNC 命令的主服務器會呼叫BGSAVE 命令,創建一個 RDB 檔案,并使用緩沖區記錄接下來執行的所有寫命令,
-
當主服務器執行完 BGSAVE 命令時,它會向從服務器發送 RDB 檔案,而從服務器則會接收并載入這個檔案,
-
主服務器將緩沖區儲存的所有寫命令發送給從服務器執行,
-
-
在開啟主從復制的時候,使用的是RDB方式的,同步主從資料的
-
同步開始之后,通過主庫命令傳播的方式,主動的復制方式實作
-
2.8以后實作PSYNC的機制,實作斷線重連
-
環境準備
mkdir /data/638{0..2} # 創建6380 6381 6382檔案夾 # 組態檔示例: vim /data/6380/redis.conf port 6380 daemonize yes pidfile /data/6380/redis.pid loglevel notice logfile "/data/6380/redis.log" dbfilename dump.rdb dir /data/6380 protected-mode no vim /data/6381/redis.conf port 6381 daemonize yes pidfile /data/6381/redis.pid loglevel notice logfile "/data/6381/redis.log" dbfilename dump.rdb dir /data/6381 protected-mode no vim /data/6382/redis.conf port 6382 daemonize yes pidfile /data/6382/redis.pid loglevel notice logfile "/data/6382/redis.log" dbfilename dump.rdb dir /data/6382 protected-mode no # 啟動三個redis實體 redis-server /data/6380/redis.conf redis-server /data/6381/redis.conf redis-server /data/6382/redis.conf # 配置主從同步, 6381/6382命令列 redis-cli -p 6381 SLAVEOF 127.0.0.1 6380 # 指明主的地址 redis-cli -p 6382 SLAVEOF 127.0.0.1 6380 # 指明主的地址 # 檢查主從狀態 # 從庫: 127.0.0.1:6382> info replication 127.0.0.1:6381> info replication # 主庫: 127.0.0.1:6380> info replication -
手動進行主從故障切換
redis-cli -p 6380 shutdown # 關閉主庫6380 # 既然主庫掛了,我想要在6381 6382之間選一個新的主庫 # 1.關閉6381的從庫身份 redis-cli -p 6381 info replication slaveof no one # 2.將6382設為6381的從庫 redis-cli -p 6382 SLAVEOF no one SLAVEOF 127.0.0.1 6381
Redis-Sentinel
-
Redis-Sentinel是redis官方推薦的高可用性解決方案,當用redis作master-slave的高可用時,如果master本身宕機,redis本身或者客戶端都沒有實作主從切換的功能,
-
而redis-sentinel就是一個獨立運行的行程,用于監控多個master-slave集群,自動發現master宕機,進行自動切換slave > master,
-
sentinel主要功能如下:
-
不時的監控redis是否良好運行,如果節點不可達就會對節點進行下線標識
-
如果被標識的是主節點,sentinel就會和其他的sentinel節點“協商”,如果其他節點也人為主節點不可達,就會選舉一個sentinel節點來完成自動故障轉義
-
在master-slave進行切換后,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換
-
Sentinel的作業方式
-
每個Sentinel以每秒鐘一次的頻率向它所知的Master,Slave以及其他 Sentinel 實體發送一個 PING 命令
-
如果一個實體(instance)距離最后一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實體會被 Sentinel 標記為主觀下線,
-
如果一個Master被標記為主觀下線,則正在監視這個Master的所有 Sentinel 要以每秒一次的頻率確認Master的確進入了主觀下線狀態,
-
當有足夠數量的 Sentinel(大于等于組態檔指定的值)在指定的時間范圍內確認Master的確進入了主觀下線狀態, 則Master會被標記為客觀下線
-
在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有Master,Slave發送 INFO 命令
-
當Master被 Sentinel 標記為客觀下線時,Sentinel 向下線的 Master 的所有 Slave 發送 INFO 命令的頻率會從 10 秒一次改為每秒一次
-
若沒有足夠數量的 Sentinel 同意 Master 已經下線, Master 的客觀下線狀態就會被移除,
-
若 Master 重新向 Sentinel 的 PING 命令回傳有效回復, Master 的主觀下線狀態就會被移除,
-
主觀下線和客觀下線
-
主觀下線:Subjectively Down,簡稱 SDOWN,指的是當前 Sentinel 實體對某個redis服務器做出的下線判斷,
-
客觀下線:Objectively Down, 簡稱 ODOWN,指的是多個 Sentinel 實體在對Master Server做出 SDOWN 判斷,并且通過 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下線判斷,然后開啟failover.
-
-
SDOWN適合于Master和Slave,只要一個 Sentinel 發現Master進入了ODOWN, 這個 Sentinel 就可能會被其他 Sentinel 推選出, 并對下線的主服務器執行自動故障遷移操作,
-
ODOWN只適用于Master,對于Slave的 Redis 實體,Sentinel 在將它們判斷為下線前不需要進行協商, 所以Slave的 Sentinel 永遠不會達到ODOWN,
redis主從復制背景問題
-
Redis主從復制可將主節點資料同步給從節點,從節點此時有兩個作用:
-
一旦主節點宕機,從節點作為主節點的備份可以隨時頂上來,
-
擴展主節點的讀能力,分擔主節點讀壓力,
-
-
但是問題是:
-
一旦主節點宕機,從節點上位,那么需要人為修改所有應用方的主節點地址(改為新的master地址),還需要命令所有從節點復制新的主節點
-
-
那么這個問題,redis-sentinel就可以解決了,
Redis Sentinel架構
-
redis的一個行程,但是不存盤資料,只是監控redis,
-
Sentinel會通過命令連接向被監視的主從服務器發送“HELLO”資訊,該訊息包含Sentinel的ip、埠號、ID等內容,以此來向其他Sentinel發布自己的存在,與此同時Sentinel會通過訂閱連接接收其他Sentinel的“HELLO”資訊,以此來發現監視同一個主服務器的其他Sentinel,
-
Redis Sentinel故障轉移
-
多個sentinel發現并確認master有問題后,選舉出一個sentinel作為領導,
-
選出一個slave作為master,通知其余slave成為新的master的slave,
-
通知客戶端主從變化,等待老的master復活成為新master的slave,
-
-
redis命令整理
# 官網地址:http://redisdoc.com/ redis-cli info # 查看redis資料庫資訊 redis-cli info replication # 查看redis的復制授權資訊 redis-cli info sentinel # 查看redis的哨兵資訊
安裝與配置
-
本實驗是在測驗環境下,考慮到學生機器較弱,因此只準備一臺linux服務器用作環境!!
-
服務器環境,一臺即可完成操作
master 192.168.119.10, -
主節點master的redis-6379.conf
port 6379 daemonize yes logfile "6379.log" dbfilename "dump-6379.rdb" dir "/var/redis/data/" -
從節點slave的redis-6380.conf
port 6380 daemonize yes logfile "6380.log" dbfilename "dump-6380.rdb" dir "/var/redis/data/" slaveof 127.0.0.1 6379 // 從屬主節點 -
從節點slave的redis-6381.conf
port 6381 daemonize yes logfile "6380.log" dbfilename "dump-6380.rdb" dir "/var/redis/data/" slaveof 127.0.0.1 6379 // 從屬主節點 -
啟動redis主節點
redis-server /etc/redis-6379.conf -
測驗redis主節點是否通信
redis-cli ping, -
啟動兩slave節點
-rw-r--r-- 1 root root 145 Nov 7 17:44 /etc/redis-6379.conf # 這個為主,port是6379 -rw-r--r-- 1 root root 93 Nov 7 17:42 /etc/redis-6380.conf # 這個是從,port6380,并且得加上新的引數slaveof -rw-r--r-- 1 root root 115 Nov 7 17:42 /etc/redis-6381.conf # 這個是從,port6381,并且得加上新的引數slaveof # redis-6380.conf slave組態檔詳解,6381埠的組態檔,僅僅和6380埠不一樣 port 6380 daemonize yes logfile "6379.log" dbfilename "dump-6379.rdb" dir "/var/redis/data" # Generated by CONFIG REWRITE slaveof 127.0.0.1 6379 -
redis組態檔
# Redis 組態檔 # 當配置中需要配置記憶體大小時,可以使用 1k, 5GB, 4M 等類似的格式,其轉換方式如下(不區分大小寫) # # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1mb => 1024*1024 bytes # 1g => 1000000000 bytes # 1gb => 1024*1024*1024 bytes # # 記憶體配置大小寫是一樣的.比如 1gb 1Gb 1GB 1gB # daemonize no 默認情況下,redis不是在后臺運行的,如果需要在后臺運行,把該項的值更改為yes daemonize yes # 當redis在后臺運行的時候,Redis默認會把pid檔案放在/var/run/redis.pid,你可以配置到其他地址, # 當運行多個redis服務時,需要指定不同的pid檔案和埠 pidfile /var/run/redis.pid # 指定redis運行的埠,默認是6379 port 6379 # 指定redis只接收來自于該IP地址的請求,如果不進行設定,那么將處理所有請求, # 在生產環境中最好設定該項 # bind 127.0.0.1 # Specify the path for the unix socket that will be used to listen for # incoming connections. There is no default, so Redis will not listen # on a unix socket when not specified. # # unixsocket /tmp/redis.sock # unixsocketperm 755 # 設定客戶端連接時的超時時間,單位為秒,當客戶端在這段時間內沒有發出任何指令,那么關閉該連接 # 0是關閉此設定 timeout 0 # 指定日志記錄級別 # Redis總共支持四個級別:debug、verbose、notice、warning,默認為verbose # debug 記錄很多資訊,用于開發和測驗 # varbose 有用的資訊,不像debug會記錄那么多 # notice 普通的verbose,常用于生產環境 # warning 只有非常重要或者嚴重的資訊會記錄到日志 loglevel debug # 配置log檔案地址 # 默認值為stdout,標準輸出,若后臺模式會輸出到/dev/null #logfile stdout logfile /var/log/redis/redis.log # To enable logging to the system logger, just set 'syslog-enabled' to yes, # and optionally update the other syslog parameters to suit your needs. # syslog-enabled no # Specify the syslog identity. # syslog-ident redis # Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7. # syslog-facility local0 # 可用資料庫數 # 默認值為16,默認資料庫為0,資料庫范圍在0-(database-1)之間 databases 16 ################################ 快照 ################################# # # 保存資料到磁盤,格式如下: # # save <seconds> <changes> # # 指出在多長時間內,有多少次更新操作,就將資料同步到資料檔案rdb, # 相當于條件觸發抓取快照,這個可以多個條件配合 # # 比如默認組態檔中的設定,就設定了三個條件 # # save 900 1 900秒內至少有1個key被改變 # save 300 10 300秒內至少有300個key被改變 # save 60 10000 60秒內至少有10000個key被改變 save 900 1 save 300 10 save 60 10000 # 存盤至本地資料庫時(持久化到rdb檔案)是否壓縮資料,默認為yes rdbcompression yes # 本地持久化資料庫檔案名,默認值為dump.rdb dbfilename dump.rdb # 作業目錄 # # 資料庫鏡像備份的檔案放置的路徑, # 這里的路徑跟檔案名要分開配置是因為redis在進行備份時,先會將當前資料庫的狀態寫入到一個臨時檔案中,等備份完成時, # 再把該該臨時檔案替換為上面所指定的檔案,而這里的臨時檔案和上面所配置的備份檔案都會放在這個指定的路徑當中, # # AOF檔案也會存放在這個目錄下面 # # 注意這里必須制定一個目錄而不是檔案 dir ./ ################################# 復制 ################################# # 主從復制. 設定該資料庫為其他資料庫的從資料庫. # 設定當本機為slav服務時,設定master服務的IP地址及埠,在Redis啟動時,它會自動從master進行資料同步 # # slaveof <masterip> <masterport> # 當master服務設定了密碼保護時(用requirepass制定的密碼) # slav服務連接master的密碼 # # masterauth <master-password> # 當從庫同主機失去連接或者復制正在進行,從機庫有兩種運行方式: # # 1) 如果slave-serve-stale-data設定為yes(默認設定),從庫會繼續相應客戶端的請求 # # 2) 如果slave-serve-stale-data是指為no,出去INFO和SLAVOF命令之外的任何請求都會回傳一個 # 錯誤"SYNC with master in progress" # slave-serve-stale-data yes # 從庫會按照一個時間間隔向主庫發送PINGs.可以通過repl-ping-slave-period設定這個時間間隔,默認是10秒 # # repl-ping-slave-period 10 # repl-timeout 設定主庫批量資料傳輸時間或者ping回復時間間隔,默認值是60秒 # 一定要確保repl-timeout大于repl-ping-slave-period # repl-timeout 60 ################################## 安全 ################################### # 設定客戶端連接后進行任何其他指定前需要使用的密碼, # 警告:因為redis速度相當快,所以在一臺比較好的服務器下,一個外部的用戶可以在一秒鐘進行150K次的密碼嘗試,這意味著你需要指定非常非常強大的密碼來防止暴力破解 # # requirepass foobared # 命令重命名. # # 在一個共享環境下可以重命名相對危險的命令,比如把CONFIG重名為一個不容易猜測的字符, # # 舉例: # # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 # # 如果想洗掉一個命令,直接把它重命名為一個空字符""即可,如下: # # rename-command CONFIG "" ################################### 約束 #################################### # 設定同一時間最大客戶端連接數,默認無限制,Redis可以同時打開的客戶端連接數為Redis行程可以打開的最大檔案描述符數, # 如果設定 maxclients 0,表示不作限制, # 當客戶端連接數到達限制時,Redis會關閉新的連接并向客戶端回傳max number of clients reached錯誤資訊 # # maxclients 128 # 指定Redis最大記憶體限制,Redis在啟動時會把資料加載到記憶體中,達到最大記憶體后,Redis會先嘗試清除已到期或即將到期的Key # Redis同時也會移除空的list物件 # # 當此方法處理后,仍然到達最大記憶體設定,將無法再進行寫入操作,但仍然可以進行讀取操作 # # 注意:Redis新的vm機制,會把Key存放記憶體,Value會存放在swap區 # # maxmemory的設定比較適合于把redis當作于類似memcached的快取來使用,而不適合當做一個真實的DB, # 當把Redis當做一個真實的資料庫使用的時候,記憶體使用將是一個很大的開銷 # maxmemory <bytes> # 當記憶體達到最大值的時候Redis會選擇洗掉哪些資料?有五種方式可供選擇 # # volatile-lru -> 利用LRU演算法移除設定過過期時間的key (LRU:最近使用 Least Recently Used ) # allkeys-lru -> 利用LRU演算法移除任何key # volatile-random -> 移除設定過過期時間的隨機key # allkeys->random -> remove a random key, any key # volatile-ttl -> 移除即將過期的key(minor TTL) # noeviction -> 不移除任何可以,只是回傳一個寫錯誤 # # 注意:對于上面的策略,如果沒有合適的key可以移除,當寫的時候Redis會回傳一個錯誤 # # 寫命令包括: set setnx setex append # incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd # sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby # zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby # getset mset msetnx exec sort # # 默認是: # # maxmemory-policy volatile-lru # LRU 和 minimal TTL 演算法都不是精準的演算法,但是相對精確的演算法(為了節省記憶體),隨意你可以選擇樣本大小進行檢測, # Redis默認的灰選擇3個樣本進行檢測,你可以通過maxmemory-samples進行設定 # # maxmemory-samples 3 ############################## AOF ############################### # 默認情況下,redis會在后臺異步的把資料庫鏡像備份到磁盤,但是該備份是非常耗時的,而且備份也不能很頻繁,如果發生諸如拉閘限電、拔插頭等狀況,那么將造成比較大范圍的資料丟失, # 所以redis提供了另外一種更加高效的資料庫備份及災難恢復方式, # 開啟append only模式之后,redis會把所接收到的每一次寫操作請求都追加到appendonly.aof檔案中,當redis重新啟動時,會從該檔案恢復出之前的狀態, # 但是這樣會造成appendonly.aof檔案過大,所以redis還支持了BGREWRITEAOF指令,對appendonly.aof 進行重新整理, # 你可以同時開啟asynchronous dumps 和 AOF appendonly no # AOF檔案名稱 (默認: "appendonly.aof") # appendfilename appendonly.aof # Redis支持三種同步AOF檔案的策略: # # no: 不進行同步,系統去操作 . Faster. # always: always表示每次有寫操作都進行同步. Slow, Safest. # everysec: 表示對寫操作進行累積,每秒同步一次. Compromise. # # 默認是"everysec",按照速度和安全折中這是最好的, # 如果想讓Redis能更高效的運行,你也可以設定為"no",讓作業系統決定什么時候去執行 # 或者相反想讓資料更安全你也可以設定為"always" # # 如果不確定就用 "everysec". # appendfsync always appendfsync everysec # appendfsync no # AOF策略設定為always或者everysec時,后臺處理行程(后臺保存或者AOF日志重寫)會執行大量的I/O操作 # 在某些Linux配置中會阻止過長的fsync()請求,注意現在沒有任何修復,即使fsync在另外一個執行緒進行處理 # # 為了級訓這個問題,可以設定下面這個引數no-appendfsync-on-rewrite # # This means that while another child is saving the durability of Redis is # the same as "appendfsync none", that in pratical terms means that it is # possible to lost up to 30 seconds of log in the worst scenario (with the # default Linux settings). # # If you have latency problems turn this to "yes". Otherwise leave it as # "no" that is the safest pick from the point of view of durability. no-appendfsync-on-rewrite no # Automatic rewrite of the append only file. # AOF 自動重寫 # 當AOF檔案增長到一定大小的時候Redis能夠呼叫 BGREWRITEAOF 對日志檔案進行重寫 # # 它是這樣作業的:Redis會記住上次進行些日志后檔案的大小(如果從開機以來還沒進行過重寫,那日子大小在開機的時候確定) # # 基礎大小會同現在的大小進行比較,如果現在的大小比基礎大小大制定的百分比,重寫功能將啟動 # 同時需要指定一個最小大小用于AOF重寫,這個用于阻止即使檔案很小但是增長幅度很大也去重寫AOF檔案的情況 # 設定 percentage 為0就關閉這個特性 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb ################################## SLOW LOG ################################### # Redis Slow Log 記錄超過特定執行時間的命令,執行時間不包括I/O計算比如連接客戶端,回傳結果等,只是命令執行時間 # # 可以通過兩個引數設定slow log:一個是告訴Redis執行超過多少時間被記錄的引數slowlog-log-slower-than(微妙), # 另一個是slow log 的長度,當一個新命令被記錄的時候最早的命令將被從佇列中移除 # 下面的時間以微妙微單位,因此1000000代表一分鐘, # 注意制定一個負數將關閉慢日志,而設定為0將強制每個命令都會記錄 slowlog-log-slower-than 10000 # 對日志長度沒有限制,只是要注意它會消耗記憶體 # 可以通過 SLOWLOG RESET 回收被慢日志消耗的記憶體 slowlog-max-len 1024 ################################ VM ############################### ### WARNING! Virtual Memory is deprecated in Redis 2.4 ### The use of Virtual Memory is strongly discouraged. # Virtual Memory allows Redis to work with datasets bigger than the actual # amount of RAM needed to hold the whole dataset in memory. # In order to do so very used keys are taken in memory while the other keys # are swapped into a swap file, similarly to what operating systems do # with memory pages. # # To enable VM just set 'vm-enabled' to yes, and set the following three # VM parameters accordingly to your needs. vm-enabled no # vm-enabled yes # This is the path of the Redis swap file. As you can guess, swap files # can't be shared by different Redis instances, so make sure to use a swap # file for every redis process you are running. Redis will complain if the # swap file is already in use. # # The best kind of storage for the Redis swap file (that's accessed at random) # is a Solid State Disk (SSD). # # *** WARNING *** if you are using a shared hosting the default of putting # the swap file under /tmp is not secure. Create a dir with access granted # only to Redis user and configure Redis to create the swap file there. vm-swap-file /tmp/redis.swap # vm-max-memory configures the VM to use at max the specified amount of # RAM. Everything that deos not fit will be swapped on disk *if* possible, that # is, if there is still enough contiguous space in the swap file. # # With vm-max-memory 0 the system will swap everything it can. Not a good # default, just specify the max amount of RAM you can in bytes, but it's # better to leave some margin. For instance specify an amount of RAM # that's more or less between 60 and 80% of your free RAM. vm-max-memory 0 # Redis swap files is split into pages. An object can be saved using multiple # contiguous pages, but pages can't be shared between different objects. # So if your page is too big, small objects swapped out on disk will waste # a lot of space. If you page is too small, there is less space in the swap # file (assuming you configured the same number of total swap file pages). # # If you use a lot of small objects, use a page size of 64 or 32 bytes. # If you use a lot of big objects, use a bigger page size. # If unsure, use the default :) vm-page-size 32 # Number of total memory pages in the swap file. # Given that the page table (a bitmap of free/used pages) is taken in memory, # every 8 pages on disk will consume 1 byte of RAM. # # The total swap size is vm-page-size * vm-pages # # With the default of 32-bytes memory pages and 134217728 pages Redis will # use a 4 GB swap file, that will use 16 MB of RAM for the page table. # # It's better to use the smallest acceptable value for your application, # but the default is large in order to work in most conditions. vm-pages 134217728 # Max number of VM I/O threads running at the same time. # This threads are used to read/write data from/to swap file, since they # also encode and decode objects from disk to memory or the reverse, a bigger # number of threads can help with big objects even if they can't help with # I/O itself as the physical device may not be able to couple with many # reads/writes operations at the same time. # # The special value of 0 turn off threaded I/O and enables the blocking # Virtual Memory implementation. vm-max-threads 4 ############################### ADVANCED CONFIG ############################### # 當hash中包含超過指定元素個數并且最大的元素沒有超過臨界時, # hash將以一種特殊的編碼方式(大大減少記憶體使用)來存盤,這里可以設定這兩個臨界值 # Redis Hash對應Value內部實際就是一個HashMap,實際這里會有2種不同實作, # 這個Hash的成員比較少時Redis為了節省記憶體會采用類似一維陣列的方式來緊湊存盤,而不會采用真正的HashMap結構,對應的value redisObject的encoding為zipmap, # 當成員數量增大時會自動轉成真正的HashMap,此時encoding為ht, hash-max-zipmap-entries 512 hash-max-zipmap-value 64 # list資料型別多少節點以下會采用去指標的緊湊存盤格式, # list資料型別節點值大小小于多少位元組會采用緊湊存盤格式, list-max-ziplist-entries 512 list-max-ziplist-value 64 # set資料型別內部資料如果全部是數值型,且包含多少節點以下會采用緊湊格式存盤, set-max-intset-entries 512 # zsort資料型別多少節點以下會采用去指標的緊湊存盤格式, # zsort資料型別節點值大小小于多少位元組會采用緊湊存盤格式, zset-max-ziplist-entries 128 zset-max-ziplist-value 64 # Redis將在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進行重新hash,可以降低記憶體的使用 # # 當你的使用場景中,有非常嚴格的實時性需要,不能夠接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置為no, # # 如果沒有這么嚴格的實時性要求,可以設定為yes,以便能夠盡可能快的釋放記憶體 activerehashing yes ################################## INCLUDES ################################### # 指定包含其它的組態檔,可以在同一主機上多個Redis實體之間使用同一份組態檔,而同時各個實體又擁有自己的特定組態檔 # include /path/to/local.conf # include /path/to/other.conf -
啟動slave從節點的redis服務:
redis-server /etc/redis-6380.conf和redis-server /etc/redis-6381.conf, -
驗證從節點的redis服務:
redis-cli -p 6380 ping和redis-cli -p 6381 ping, -
確定主從關系
# 在主節點上查看主從通信關系 [root@master ~]# redis-cli -p 6379 info replication # Replication role:master connected_slaves:2 slave0:ip=192.168.119.10,port=6380,state=online,offset=407,lag=0 slave1:ip=192.168.119.10,port=6381,state=online,offset=407,lag=0 master_repl_offset:407 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:406 # 在從節點上查看主從關系(6380、6379) [root@slave 192.168.119.11 ~]$redis-cli -p 6380 info replication # Replication role:slave master_host:192.168.119.10 master_port:6379 master_link_status:up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_repl_offset:505 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 -
開始配置Redis Sentinel
[root@master tmp]# ll /etc/redis-* -rw-r--r-- 1 root root 556 Nov 7 17:42 /etc/redis-sentinel-26379.conf # redis-sentinel-26379.conf組態檔寫入如下資訊redis-sentinel-26379.conf組態檔寫入如下資訊 // Sentinel節點的埠 port 26379 dir /var/redis/data/ logfile "26379.log" // 當前Sentinel節點監控 192.168.119.10:6379 這個主節點 // 2代表判斷主節點失敗至少需要2個Sentinel節點節點同意 // mymaster是主節點的別名 sentinel monitor mymaster 192.168.119.10 6379 2 //每個Sentinel節點都要定期PING命令來判斷Redis資料節點和其余Sentinel節點是否可達,如果超過30000毫秒30s且沒有回復,則判定不可達 sentinel down-after-milliseconds mymaster 30000 //當Sentinel節點集合對主節點故障判定達成一致時,Sentinel領導者節點會做故障轉移操作,選出新的主節點,原來的從節點會向新的主節點發起復制操作,限制每次向新的主節點發起復制操作的從節點個數為1 sentinel parallel-syncs mymaster 1 //故障轉移超時時間為180000毫秒 sentinel failover-timeout mymaster 180000 redis-sentinel-26380.conf和redis-sentinel-26381.conf的配置僅僅差異是port(埠)的不同, # 然后啟動三個sentinel哨兵 redis-sentinel /etc/redis-sentinel-26379.conf redis-sentinel /etc/redis-sentinel-26380.conf redis-sentinel /etc/redis-sentinel-26381.conf # 此時查看哨兵是否成功通信 [root@master ~]# redis-cli -p 26379 info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=192.168.119.10:6379,slaves=2,sentinels=3#看到最后一條資訊正確即成功了哨兵,哨兵主節點名字叫做mymaster,狀態ok,監控地址是192.168.119.10:6379,有兩個從節點,3個哨兵
redis高可用故障實驗
-
大致思路
-
殺掉主節點的redis行程6379埠,觀察從節點是否會進行新的master選舉,進行切換
-
重新恢復舊的“master”節點,查看此時的redis身份
-
-
首先查看三個redis的行程狀態:
ps -ef|grep redis, -
檢查三個節點的復制身份狀態,
# 第一個 [root@master tmp]# redis-cli -p 6381 info replication # Replication role:slave master_host:127.0.0.1 master_port:6380 # 第二個 [root@master tmp]# redis-cli -p 6380 info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6381,state=online,offset=54386,lag=0 slave1:ip=127.0.0.1,port=6379,state=online,offset=54253,lag=0 # 第三個 [root@master tmp]# redis-cli -p 6379 info replication # Replication role:slave master_host:127.0.0.1 master_port:6380 # 此時,干掉master!!!然后等待其他兩個節點是否能自動被哨兵sentienl,切換為master節點 ps -ef|grep 6380 # 干掉master行程 # 此時查看兩個slave的狀態,精髓就是查看一個引數 master_link_down_since_seconds:13 # 稍等片刻之后,發現slave節點成為master節點!! [root@master tmp]# redis-cli -p 6379 info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6381,state=online,offset=41814,lag=1
Redis-Cluster配置
-
并發問題:redis官方生成可以達到 10萬/每秒,每秒執行10萬條命令,假如業務需要每秒100萬的命令執行呢?
-
資料量太大:一臺服務器記憶體正常是16~256G,假如你的業務需要500G記憶體,新浪微博作為世界上最大的redis存盤,就超過1TB的資料,去哪買這么大的記憶體條?各大公司有自己的解決方案,推出各自的集群功能,核心思想都是將資料分片(sharding)存盤在多個redis實體中,每一片就是一個redis實體,
-
解決方案:正確的應該是考慮分布式,加機器,把資料分到不同的位置,分攤集中式的壓力,一堆機器做一件事,
-
客戶端分片:redis3.0集群采用P2P模式,完全去中心化,將redis所有的key分成了16384個槽位,每個redis實體負責一部分slot,集群中的所有資訊通過節點資料交換而更新,redis實體集群主要思想是將redis資料的key進行散列,通過hash函式特定的key會映射到指定的redis節點上,
-
資料分布理論:分布式資料庫首要解決把整個資料集按照磁區規則映射到多個節點的問題,即把資料集劃分到多個節點上,每個節點負責整個資料的一個子集,
-
常見的磁區規則有哈希磁區和順序磁區,
Redis Cluster采用哈希磁區規則,因此接下來會討論哈希磁區規則,節點取余磁區、一致性哈希磁區、虛擬槽磁區(redis-cluster采用的方式),-
順序磁區是在3個節點獲得3分支1的任務,并且資源從小到大一次分配,
-
哈希磁區,節點取余的方式,分三個節點1~100的資料對3取余,可以分為三類,0、1、2,
-
一致性哈希,客戶端進行分片,哈希+順時針取余,
-
-
虛擬槽磁區
-
Redis Cluster采用虛擬槽磁區 -
虛擬槽磁區巧妙地使用了哈希空間,使用分散度良好的哈希函式把所有的資料映射到一個固定范圍內的整數集合,整數定義為槽(slot),
-
Redis Cluster槽的范圍是0 ~ 16383,槽是集群內資料管理和遷移的基本單位,采用大范圍的槽的主要目的是為了方便資料的拆分和集群的擴展,每個節點負責一定數量的槽,
-
搭建redis cluster
-
搭建集群分為幾部:準備節點、節點通信、分配槽位給節點,
-
redis-cluster集群架構:多個服務端,負責讀寫,彼此通信,redis指定了16384個槽,多匹馬兒,負責運輸資料,馬兒分配16384個槽位,管理資料,ruby的腳本自動就把分配槽位這事做了
-
安裝方式:官方提供通過ruby語言的腳本一鍵安裝,
-
環境準備:通過配置,開啟redis-cluster
port 7000 daemonize yes dir "/opt/redis/data" logfile "7000.log" dbfilename "dump-7000.rdb" cluster-enabled yes #開啟集群模式 cluster-config-file nodes-7000.conf #集群內部的組態檔 cluster-require-full-coverage no #redis cluster需要16384個slot都正常的時候才能對外提供服務,換句話說,只要任何一個slot例外那么整個cluster不對外提供服務, 因此生產環境一般為no -
redis支持多實體的功能,我們在單機演示集群搭建,需要6個實體,三個是主節點,三個是從節點,數量為6個節點才能保證高可用的集群,
-
每個節點僅僅是埠運行的不同!
[root@yugo /opt/redis/config 17:12:30]#ls redis-7000.conf redis-7002.conf redis-7004.conf redis-7001.conf redis-7003.conf redis-7005.conf#確保每個組態檔中的埠修改!! -
運行redis實體:創建6個節點的redis實體
1855 2018-10-24 15:46:01 redis-server redis-7000.conf 1856 2018-10-24 15:46:13 redis-server redis-7001.conf 1857 2018-10-24 15:46:16 redis-server redis-7002.conf 1858 2018-10-24 15:46:18 redis-server redis-7003.conf 1859 2018-10-24 15:46:20 redis-server redis-7004.conf 1860 2018-10-24 15:46:23 redis-server redis-7005.conf -
檢查日志檔案:
cat 7000.log, -
檢查redis服務的埠、行程:
netstat -tunlp|grep redis和ps -ef|grep redis, -
此時集群還不可用,可以通過登錄redis查看
redis-cli -p 7000 set hello world -
創建開啟redis-cluster,準備ruby環境:下載、編譯、安裝Ruby|安裝rubygem redis|安裝redis-trib.rb命令,
-
安裝ruby(這些命令可以放入一個sh腳本檔案里)
#下載ruby wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz #安裝ruby tar -xvf ruby-2.3.1.tar.gz ./configure --prefix=/opt/ruby/ make && make install #準備一個ruby命令#準備一個gem軟體包管理命令 #拷貝ruby命令到path下/usr/local/ruby cp /opt/ruby/bin/ruby /usr/local/cp bin/gem /usr/local/bin -
安裝ruby gem 包管理工具
wget http://rubygems.org/downloads/redis-3.3.0.gem gem install -l redis-3.3.0.gem #查看gem有哪些包 gem list -- check redis gem -
安裝redis-trib.rb命令:
cp /opt/redis/src/redis-trib.rb /usr/local/bin/,
-
-
一鍵開啟redis-cluster集群
#每個主節點,有一個從節點,代表--replicas 1 redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 #集群自動分配主從關系 7000、7001、7002為 7003、7004、7005 主動關系 -
查看集群狀態
redis-cli -p 7000 cluster info redis-cli -p 7000 cluster nodes #等同于查看nodes-7000.conf檔案節點資訊 集群主節點狀態 redis-cli -p 7000 cluster nodes | grep master 集群從節點狀態 redis-cli -p 7000 cluster nodes | grep slave -
安裝完畢后,檢查集群狀態:
redis-cli -p 7000 cluster info, -
測驗寫入集群資料,登錄集群必須使用redis-cli -c -p 7000必須加上-c引數
127.0.0.1:7000> set name chao -> Redirected to slot [5798] located at 127.0.0.1:7001 OK 127.0.0.1:7001> exit [root@yugo /opt/redis/src 18:46:07]#redis-cli -c -p 7000 127.0.0.1:7000> ping PONG 127.0.0.1:7000> keys * (empty list or set) 127.0.0.1:7000> get name -> Redirected to slot [5798] located at 127.0.0.1:7001 "chao"
高級階段
Web服務基礎
-
用戶訪問網站的基本流程:我們每天都會用web客戶端上網,瀏覽器就是一個web客戶端,例如谷歌瀏覽器,以及火狐瀏覽器等,
-
老男孩教育某python總監,講了一天課感覺很累,下了班躺床上打開他的macbook pro,雙擊瀏覽器,輸入www.pornhub.com網址后,系統首先會查找本地的DNS快取以及hosts檔案資訊,確定是否存在www.pornhub.com域名對應的ip決議記錄,如果有就直接獲取ip進行訪問服務器,第一次請求時,dns快取是沒有決議記錄的,hosts檔案多數是開發臨時測驗用
-
如果本地dns快取和hosts檔案都沒有域名決議記錄,系統就會把某python總監訪問的網址決議請求發送給客戶端設定的DNS服務器去決議,也叫做Local DNS,如果LDNS服務器的本地快取有對應的決議記錄就會直接回傳給客戶端IP地址,如果沒有LDNS就會繼續請求其他的DNS服務器
-
LDNS繼續從DNS系統的"."(根)開始請求www.pornhub.com域名的決議,并且根據每個層級的DNS服務器系統進行系列的查找,最終在DNS網路上找到www.pornhub.com域名對應的授權DNS服務器,這個授權DNS服務器就是企業(個人)購買域名時用于管理域名決議的服務器,服務器上有對應的域名(IP)決議,
-
此時授權的DNS服務器就會把www.pornhub.com對應的IP決議記錄,例如(1.1.1.1)發送給LDNS
-
此時LDNS會把決議記錄發給瀏覽器,并且快取域名和IP的決議記錄,便于下一次更快的回傳請求
-
瀏覽器獲得ip,請求對應的服務器,網站服務器接收到客戶端的請求開始回應處理,將內容回傳給瀏覽器,然后某python總監拿出了一盒清風牌抽紙,,,,
-
HTTP協議
-
Http協議,全稱是HyperText Tansfer Protocol,中文叫超文本傳輸協議,是互聯網最常見的協議,Http最重要的是www(World Wide Web)服務,也叫web服務器,中文叫“萬維網”,web服務埠默認是80,另外一個加密的www服務應用https默認埠是443,主要用于支付,網銀相關業務
-
版本
-
http協議誕生以來有若干個版本,主要是http/1.0 http/1.1
-
http/1.0規定瀏覽器和服務器只能保持短暫的連接,瀏覽器的每次請求都需要和服務器建立一個TCP連接,服務器完成請求后即斷開TCP連接,服務器不跟蹤每個鏈接,也不記錄請求
-
http/1.1是對HTTP的缺陷進行重點修復,從可擴展性,快取,帶寬優化,持久連接,host頭,錯誤通知等訪問改進,
-
http/1.1支持長連接,增加了更多的請求頭和回應頭資訊,例如配置請求頭的Connection的值為keep-alive,表示請求結果回傳后保持連接
-
-
Http請求方法:在HTTP通信中,每個請求報文都包含一個方法,以告訴web服務器端需要執行哪些操作,這些動作被稱為HTTP的請求方法
1 GET # 請求指定的頁面資訊,并回傳物體主體, 2 HEAD # 類似于get請求,只不過回傳的回應中沒有具體的內容,用于獲取報頭 3 POST # 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案),資料被包含在請求體中,POST請求可能會導致新的資源的建立和/或已有資源的修改, 4 PUT # 從客戶端向服務器傳送的資料取代指定的檔案的內容, 5 DELETE # 請求服務器洗掉指定的頁面, 6 CONNECT # HTTP/1.1協議中預留給能夠將連接改為管道方式的代理服務器, 7 OPTIONS # 允許客戶端查看服務器的性能, 8 TRACE # 回顯服務器收到的請求,主要用于測驗或診斷, -
HTTP狀態碼,HTTp狀態碼表示web服務器回應http請求狀態的數字代碼
常見狀態碼以及作用是 1** 資訊,服務器收到請求,需要請求者繼續執行操作 2** 成功,操作被成功接收并處理 3** 重定向,需要進一步的操作以完成請求 4** 客戶端錯誤,請求包含語法錯誤或無法完成請求 5** 服務器錯誤,服務器在處理請求的程序中發生了錯誤 -
HTTP狀態碼的命令查看
curl -I www.oldboyedu.com Server: OES Date: Sun, 12 Aug 2018 04:18:24 GMT Content-Type: text/html Content-Length: 152 Connection: keep-alive Location: https://www.oldboyedu.com/
Http報文
-
HTTP請求由請求行,請求頭部,空行,請求報文主體幾個部分組成
-
HTTP報文:它是HTTP應用程式之間發送的資料塊,這些資料塊以一些文本形式的元資訊開頭,這些資訊描述了報文的內容及含義,后面跟著可選的資料部分,這些報文都是在客戶端、服務器和代理之間流動,
請求報文的格式: 起始行: <method> <request-URL> <version> 頭部: <headers> 主體: <entity-body> -
請求行:請求報文第一行,表示客戶端想要什么,由請求方法 url 協議版本 組成,
-
請求頭部:請求頭由 關鍵字 : 值 組成,通過客戶端把請求相關資訊告訴服務器,
-
空行:請求頭資訊之后是一個空行,發送回車和換行符,通知web服務器以下沒有請求頭資訊了,
-
請求報文主體
POST / HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Content-Type: application/x-www-form-urlencoded Content-Length: 40 Connection: Keep-Alive sex=man&name=Professional -
請求體中包含了要發送給web服務器的資料資訊,請問報文主體不用于get方法,而是用于post方法,post方法適用于客戶端填寫表單的場合,
HTTP回應報文
-
HTTP 回應與 HTTP 請求相似,HTTP回應也由3個部分構成,分別是:狀態行、回應頭(Response Header)、回應正文,
-
狀態行由協議版本、數字形式的狀態代碼、及相應的狀態描述,各元素之間以空格分隔,
-
狀態行,用來說明服務器回應客戶端的狀況,一般分為協議版本號,數字狀態碼,狀態情況,
常見回應頭資訊 Connection: Keep-Alive Content-Encoding: gzip Content-Type: text/html;charset=utf-8 Date: Mon, 13 Aug 2018 06:06:54 GMT Expires: Mon, 13 Aug 2018 06:06:54 GMT -
空白行,通知客戶端空行以下沒有頭部資訊了,回應報文主體,主要包含了回傳給客戶端的資料,可以是文本,二進制(圖片,視頻),
URl介紹
-
url中文叫“統一資源識別符號”,是一個用于標識某一互聯網資源名稱的字串,在世界范圍內標識定位某一個唯一資訊資源,
-
url主要用在各種www客戶端和服務器程式上,url可以用一種統一的格式來描述各種資訊資源,包括檔案,服務器地址和目錄等
-
url組成
協議 \\\\主機ip或域名\主機資源具體地址,
靜態網頁資源
-
在網頁設計中,純HTMl格式的網頁(包含圖片,視頻,JS,CSS等樣式)通常被稱作“靜態網頁”,
-
靜態網頁是相對于動態網頁而言的,是指沒有后臺資料庫,不包含程式,不可互動的網頁,
-
開發人員寫了什么,顯示就是什么,一旦撰寫完成,就不會有任何改變,靜態網頁一般適用于更新較少的展示型網頁,例如(酒水,家具,水果等宣傳頁),是很多中小網站的展示方式,
-
靜態網頁重要特性
-
每個頁面有一個固定的url地址,url地址不含有問號"?"或"&"等符號
-
網頁一經發布到服務器,網頁內容是保存在服務器檔案系統上的,每個網頁都是獨立的一個檔案
-
網頁內容固定不變,容易被搜索引擎收錄(優點)
-
網頁沒有資料庫支撐,在網站制作和維護上作業量很大(缺點)
-
網頁的互動性很差,缺少程式的功能實作(缺點)
-
客戶端決議網址時,由于不需要讀取資料庫,因此服務器端可以接受更高的并發訪問,請求到來時,直接從磁盤上回傳資料,(優點)
-
-
有關高并發架構思想:在高并發,高訪問量的場景下做架構優化時,比較關鍵的就是把動態網頁轉化成靜態網頁,而不是直接請求資料庫和動態服務器,并且可以吧靜態內容推到快取中,這樣就提升用戶體驗,節約服務器壓力成本,
動態網頁資源
-
動態網頁是和靜態網頁相對而言的,動態網頁的url后綴一般是.asp .aspx .php .js .cgi 并且動態網頁都有標志性的符號"? &",后端都有資料庫的支持,
-
動態網頁資源特點:
-
網頁以資料庫技術為支撐,大大降低網站維護的作業量,
-
動態網頁技術的網站可以實作更多的功能,如用戶注冊,用戶登錄,投票,用戶管理,博客管理等,
-
動態網頁不是獨立存在服務器上的網頁檔案,用戶請求動態程式時,服務器決議程式并且可能讀取資料庫回傳一個完整的網頁內容,
-
搜索引擎(爬蟲)一般不會抓取網址中的“?”后面的內容,因此企業都會做偽靜態技術頁面,
-
網站流量術語
-
網站統計一般以數值較大的IP,PV統計,比較好看
-
IP:IP即Internet Protocol,這里是指獨立ip數,不同的ip地址的計算機訪問網站時被計算的總次數,獨立ip數是網站流量的一個重要指標,一般相同ip地址的客戶端訪問網站頁面一天內只會被計算一次,
-
PV:pv(Page View)即是頁面瀏覽量,不管客戶端是不是相同,也不管ip是否相同,用戶只要訪問網站頁面就會被計算PV,一次計算一個PV,pv的度量方法就是客戶端從瀏覽器發出一個web請求(request),服務器接收請求回傳一個頁面給客戶端,這樣就產生一個pv,pv是衡量網站被訪問的一個標準,但并不準確有多少人訪問了網站,
-
UV:UV即unique visitor,同一個客戶端(pc或移動端)訪問網站被計算為一個訪客,一天內相同的客戶端訪問同一個網站只計一次uv,uv是以cookie等技術為統計依據,實際統計存在誤差,一臺計算機可能有多人使用,因此uv也不是最準確的,
-
并發數:并發數指系統同時能處理的請求數量,也反應了系統的負載能力,
-
回應時間:回應時間是指執行一個請求從開始到最后收到回應資料所花費的總體時間,
-
QPS:Query Per Second每秒查詢數,服務器在一秒內處理了多少個請求,顯然數字越大代表服務器的負載越高,處理能力越強,
Web服務軟體
-
互聯網主流web服務軟體:Apache、IIS、Nginx、Tengine、Tomcat、Lighthttpd,
-
主流web服務軟體說明:Apache,中小型 web服務器的老大哥、Nginx ,大型網址web服務,其分支Tengine也在飛速發展、Lighthttpd nginx流行前的一款web軟體,
-
提供動態服務的軟體:php(fastcgi) 大中小的公司都會使用,動態網頁語言php程式的決議容器,常配合apache決議動態程式、tomcat,中小企業動態web服務,互聯網java容器主流、IIS 微軟下的web服務軟體,
nginx部署
-
nginx是一個開源的,支持高性能,高并發的www服務和代理服務軟體,它是一個俄羅斯人lgor sysoev開發的,作者將源代碼開源出來供全球使用,
-
nginx比它大哥apache性能改進許多,nginx占用的系統資源更少,支持更高的并發連接,有更高的訪問效率,
-
nginx不但是一個優秀的web服務軟體,還可以作為反向代理,負載均衡,以及快取服務使用,安裝更為簡單,方便,靈活,nginx可以說是非常nb了,
網站服務
-
想必我們大多數人都是通過訪問網站而開始接觸互聯網的吧,我們平時訪問的網站服務 就是 Web 網路服務,一般是指允許用戶通過瀏覽器訪問到互聯網中各種資源的服務,
-
Web 網路服務是一種被動訪問的服務程式,即只有接收到互聯網中其他主機發出的 請求后才會回應,最終用于提供服務程式的 Web 服務器會通過 HTTP(超文本傳輸協議)或 HTTPS(安全超文本傳輸協議)把請求的內容傳送給用戶,
-
目前能夠提供 Web 網路服務的程式有 IIS、Nginx 和 Apache 等,其中,IIS(Internet Information Services,互聯網資訊服務)是 Windows 系統中默認的 Web 服務程式,
-
2004 年 10 月 4 日,為俄羅斯知名門戶站點而開發的 Web 服務程式 Nginx 橫空出世, Nginx 程式作為一款輕量級的網站服務軟體,因其穩定性和豐富的功能而快速占領服務器市 場,但 Nginx 最被認可的還當是系統資源消耗低且并發能力強,因此得到了國內諸如新浪、 網易、騰訊等門戶站的青睞,
-
web服務器和web框架的關系
-
web服務器(nginx):接收HTTP請求(例如www.pythonav.cn/xiaocang.jpg)并回傳資料
-
web框架(django,flask):開發web應用程式,處理接收到的資料
-
-
面試回答nginx技巧:支持高并發,能支持幾萬并發連接;資源消耗少,在3萬并發連接下開啟10個nginx執行緒消耗的記憶體不到200M;可以做http反向代理和負載均衡;支持異步網路i/o事件模型epoll,
-
Tengine是由淘寶網發起的Web服務器專案,它在Nginx的基礎上,針對大訪問量網站的需求,添加了很多高級功能和特性,Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等得到了很好的檢驗,它的最終目標是打造一個高效、穩定、安全、易用的Web平臺,
安裝
-
gcc 安裝 nginx 需要先將官網下載的原始碼進行編譯,編譯依賴 gcc 環境,如果沒有 gcc 環境,則需要安裝:
yum install gcc-c++, -
PCRE(Perl Compatible Regular Expressions) 是一個Perl庫,包括 perl 兼容的正則運算式庫,nginx 的 http 模塊使用 pcre 來決議正則運算式,所以需要在 linux 上安裝 pcre 庫,pcre-devel 是使用 pcre 開發的一個二次開發庫,nginx也需要此庫,命令:
yum install -y pcre pcre-devel, -
zlib 庫提供了很多種壓縮和解壓縮的方式, nginx 使用 zlib 對 http 包的內容進行 gzip ,所以需要在 Centos 上安裝 zlib 庫
yum install -y zlib zlib-devel, -
OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼演算法、常用的密鑰和證書封裝管理功能及 SSL 協議,并提供豐富的應用程式供測驗或其它目的使用,
-
nginx 不僅支持 http 協議,還支持 https(即在ssl協議上傳輸http),所以需要在 Centos 安裝 OpenSSL 庫,
-
下載
# 下載依賴 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y wget -c https://nginx.org/download/nginx-1.12.0.tar.gz # 下載原始碼包 tar -zxvf nginx-1.12.0.tar.gz # 解壓縮原始碼 # 配置,編譯安裝 開啟nginx狀態監測功能 ./configure --prefix=/opt/nginx1-12/ --with-http_ssl_module --with-http_stub_status_module make && make install 4.啟動nginx,進入sbin目錄,找到nginx啟動命令 cd sbin ./nginx # 啟動 ./nginx -s stop # 關閉 ./nginx -s reload # 重新加載 -
安裝完成后檢測服務
netstat -tunlp |grep 80 curl -I 127.0.0.1 # 如果訪問不了,檢查selinux,iptables -
部署一個web站點
-
nginx默認站點是Nginx目錄下的html檔案夾,這里可以從nginx.conf中查到
location /{ root html; # 這里是默認的站點html檔案夾,也就是 /opt/nginx1-12/html/檔案夾下的內容 index index.html index.htm; # 站點首頁檔案名是index.html } -
如果要部署網站業務資料,只需要把開發好的程式全放到
/opt/nginx1-12/html/目錄下即可, -
因此只需要通過域名/資源,即可訪問
http://www.pyyuc.cn/man.jpg,
-
-
Nginx的目錄結構:conf 存放nginx所有組態檔的目錄,主要nginx.conf、html 存放nginx默認站點的目錄,如index.html、error.html等、logs 存放nginx默認日志的目錄,如error.log access.log、sbin 存放nginx主命令的目錄,sbin/nginx,
Nginx主組態檔決議
-
Nginx主組態檔
/etc/nginx/nginx.conf是一個純文本型別的檔案,整個組態檔是以區塊的形式組織的,一般,每個區塊以一對大括號{}來表示開始與結束,######Nginx組態檔nginx.conf中文詳解##### user www www; # 定義Nginx運行的用戶和用戶組 worker_processes 8; # #nginx行程數,建議設定為等于CPU總核心數, error_log /usr/local/nginx/logs/error.log info; # 全域錯誤日志定義型別,[ debug | info | notice | warn | error | crit ] pid /usr/local/nginx/logs/nginx.pid; # 行程pid檔案 # 指定行程可以打開的最大描述符:數目 # 作業模式與連接數上限 # 這個指令是指當一個nginx行程打開的最多檔案描述符數目,理論值應該是最多打開檔案數(ulimit -n)與nginx行程數相除,但是nginx分配請求并不是那么均勻,所以最好與ulimit -n 的值保持一致, # 現在在linux 2.6內核下開啟檔案打開數為65535,worker_rlimit_nofile就相應應該填寫65535, # 這是因為nginx調度時分配請求到行程并不是那么的均衡,所以假如填寫10240,總并發量達到3-4萬時就有行程可能超過10240了,這時會回傳502錯誤, worker_rlimit_nofile 65535; events { # 參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型 # 是Linux 2.6以上版本內核中的高性能網路I/O模型,linux建議epoll,如果跑在FreeBSD上面,就用kqueue模型, # 補充說明: # 與apache相類,nginx針對不同的作業系統,有不同的事件模型 # A)標準事件模型 # Select、poll屬于標準事件模型,如果當前系統不存在更有效的方法,nginx會選擇select或poll # B)高效事件模型 # Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS X系統使用kqueue可能會造成內核崩潰, # Epoll:使用于Linux內核2.6版本及以后的系統, # /dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+, # Eventport:使用于Solaris 10, 為了防止出現內核崩潰的問題, 有必要安裝安全補丁, use epoll; # 單個行程最大連接數(最大連接數=連接數*行程數) # 根據硬體調整,和前面作業行程配合起來用,盡量大,但是別把cpu跑到100%就行,每個行程允許的最多連接數,理論上每臺nginx服務器的最大連接數為, worker_connections 65535; # keepalive超時時間, keepalive_timeout 60; # 客戶端請求頭部的緩沖區大小,這個可以根據你的系統分頁大小來設定,一般一個請求頭的大小不會超過1k,不過由于一般系統分頁都要大于1k,所以這里設定為分頁大小, # 分頁大小可以用命令getconf PAGESIZE 取得, # [root@web001 ~]# getconf PAGESIZE # 4096 # 但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設定為“系統分頁大小”的整倍數, client_header_buffer_size 4k; # 默認是沒有啟用的,max指定快取數量,建議和打開檔案數一致,inactive是指經過多長時間檔案沒被請求后洗掉快取, open_file_cache max=65535 inactive=60s; # 這個是指多長時間檢查一次快取的有效資訊, # 語法:open_file_cache_valid time 默認值:open_file_cache_valid 60 使用欄位:http, server, location 這個指令指定了何時需要檢查open_file_cache中快取專案的有效資訊. open_file_cache_valid 80s; # open_file_cache指令中的inactive引數時間內檔案的最少使用次數,如果超過這個數字,檔案描述符一直是在快取中打開的,如上例,如果有一個檔案在inactive時間內一次沒被使用,它將被移除, # 語法:open_file_cache_min_uses number 默認值:open_file_cache_min_uses 1 使用欄位:http, server, location 這個指令指定了在open_file_cache指令無效的引數中一定的時間范圍內可以使用的最小檔案數,如果使用更大的值,檔案描述符在cache中總是打開狀態. open_file_cache_min_uses 1; # 語法:open_file_cache_errors on | off 默認值:open_file_cache_errors off 使用欄位:http, server, location 這個指令指定是否在搜索一個檔案是記錄cache錯誤. open_file_cache_errors on; } # 設定http服務器,利用它的反向代理功能提供負載均衡支持 http { # 檔案擴展名與檔案型別映射表 include mime.types; # 默認檔案型別 default_type application/octet-stream; # 默認編碼 # charset utf-8; # 服務器名字的hash表大小 # 保存服務器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的,引數hash bucket size總是等于hash表的大小,并且是一路處理器快取大小的倍數,在減少了在記憶體中的存取次數后,使在處理器中加速查找hash表鍵值成為可能,如果hash bucket size等于一路處理器快取的大小,那么在查找鍵的時候,最壞的情況下在記憶體中查找的次數為2,第一次是確定存盤單元的地址,第二次是在存盤單元中查找鍵 值,因此,如果Nginx給出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一個引數的大小. server_names_hash_bucket_size 128; # 客戶端請求頭部的緩沖區大小,這個可以根據你的系統分頁大小來設定,一般一個請求的頭部大小不會超過1k,不過由于一般系統分頁都要大于1k,所以這里設定為分頁大小,分頁大小可以用命令getconf PAGESIZE取得, client_header_buffer_size 32k; # 客戶請求頭緩沖大小,nginx默認會用client_header_buffer_size這個buffer來讀取header值,如果header過大,它會使用large_client_header_buffers來讀取, large_client_header_buffers 4 64k; # 設定通過nginx上傳檔案的大小 client_max_body_size 8m; # 開啟高效檔案傳輸模式,sendfile指令指定nginx是否呼叫sendfile函式來輸出檔案,對于普通應用設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設定為off,以平衡磁盤與網路I/O處理速度,降低系統的負載,注意:如果圖片顯示不正常把這個改成off, # sendfile指令指定 nginx 是否呼叫sendfile 函式(zero copy 方式)來輸出檔案,對于普通應用,必須設為on,如果用來進行下載等應用磁盤IO重負載應用,可設定為off,以平衡磁盤與網路IO處理速度,降低系統uptime, sendfile on; # 開啟目錄串列訪問,合適下載服務器,默認關閉, autoindex on; # 此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用 tcp_nopush on; tcp_nodelay on; # 長連接超時時間,單位是秒 keepalive_timeout 120; # FastCGI相關引數是為了改善網站的性能:減少資源占用,提高訪問速度,下面引數看字面意思都能理解, fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; # gzip模塊設定 gzip on; # 開啟gzip壓縮輸出 gzip_min_length 1k; # 最小壓縮檔案大小 gzip_buffers 4 16k; # 壓碩訓沖區 gzip_http_version 1.0; # 壓縮版本(默認1.1,前端如果是squid2.5請使用1.0) gzip_comp_level 2; # 壓縮等級 gzip_types text/plain application/x-javascript text/css application/xml; # 壓縮型別,默認就已經包含textml,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn, gzip_vary on; # 開啟限制IP連接數的時候需要使用 # limit_zone crawler $binary_remote_addr 10m; # 負載均衡配置 upstream jh.w3cschool.cn { # upstream的負載均衡,weight是權重,可以根據機器配置定義權重,weigth引數表示權值,權值越高被分配到的幾率越大, server 192.168.80.121:80 weight=3; server 192.168.80.122:80 weight=2; server 192.168.80.123:80 weight=3; # nginx的upstream目前支持4種方式的分配 # 1、輪詢(默認) # 每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除, # 2、weight # 指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況, # 例如: # upstream bakend { # server 192.168.0.14 weight=10; # server 192.168.0.15 weight=10; #} #2、ip_hash #每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題, #例如: #upstream bakend { # ip_hash; # server 192.168.0.14:88; # server 192.168.0.15:80; #} #3、fair(第三方) #按后端服務器的回應時間來分配請求,回應時間短的優先分配, #upstream backend { # server server1; # server server2; # fair; #} #4、url_hash(第三方) #按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為快取時比較有效, #例:在upstream中加入hash陳述句,server陳述句中不能寫入weight等其他的引數,hash_method是使用的hash演算法 #upstream backend { # server squid1:3128; # server squid2:3128; # hash $request_uri; # hash_method crc32; #} #tips: #upstream bakend{#定義負載均衡設備的Ip及設備狀態}{ # ip_hash; # server 127.0.0.1:9090 down; # server 127.0.0.1:8080 weight=2; # server 127.0.0.1:6060; # server 127.0.0.1:7070 backup; #} #在需要使用負載均衡的server中增加 proxy_pass http://bakend/; #每個設備的狀態設定為: #1.down表示單前的server暫時不參與負載 #2.weight為weight越大,負載的權重就越大, #3.max_fails:允許請求失敗的次數默認為1.當超過最大次數時,回傳proxy_next_upstream模塊定義的錯誤 #4.fail_timeout:max_fails次失敗后,暫停的時間, #5.backup: 其它所有的非backup機器down或者忙的時候,請求backup機器,所以這臺機器壓力會最輕, #nginx支持同時設定多組的負載均衡,用來給不用的server來使用, #client_body_in_file_only設定為On 可以講client post過來的資料記錄到檔案中用來做debug #client_body_temp_path設定記錄檔案的目錄 可以設定最多3層目錄 #location對URL進行匹配.可以進行重定向或者進行新的代理 負載均衡 } #虛擬主機的配置 server { #監聽埠 listen 80; #域名可以有多個,用空格隔開 server_name www.w3cschool.cn w3cschool.cn; index index.html index.htm index.php; root /data/www/w3cschool; #對******進行負載均衡 location ~ .*.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } #圖片快取時間設定 location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10d; } #JS和CSS快取時間設定 location ~ .*.(js|css)?$ { expires 1h; } #日志格式設定 #$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址; #$remote_user:用來記錄客戶端用戶名稱; #$time_local: 用來記錄訪問時間與時區; #$request: 用來記錄請求的url與http協議; #$status: 用來記錄請求狀態;成功是200, #$body_bytes_sent :記錄發送給客戶端檔案主體內容大小; #$http_referer:用來記錄從那個頁面鏈接訪問過來的; #$http_user_agent:記錄客戶瀏覽器的相關資訊; #通常web服務器放在反向代理的后面,這樣就不能獲取到客戶的IP地址了,通過$remote_add拿到的IP地址是反向代理服務器的iP地址,反向代理服務器在轉發請求的http頭資訊中,可以增加x_forwarded_for資訊,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址, log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; #定義本虛擬主機的訪問日志 access_log /usr/local/nginx/logs/host.access.log main; access_log /usr/local/nginx/logs/host.access.404.log log404; #對 "/" 啟用反向代理 location / { proxy_pass http://127.0.0.1:88; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #以下是一些反向代理的配置,可選, proxy_set_header Host $host; #允許客戶端請求的最大單檔案位元組數 client_max_body_size 10m; #緩沖區代理緩沖用戶端請求的最大位元組數, #如果把它設定為比較大的數值,例如256k,那么,無論使用firefox還是IE瀏覽器,來提交任意小于256k的圖片,都很正常,如果注釋該指令,使用默認的client_body_buffer_size設定,也就是作業系統頁面大小的兩倍,8k或者16k,問題就出現了, #無論使用firefox4.0還是IE8.0,提交一個比較大,200k左右的圖片,都回傳500 Internal Server Error錯誤 client_body_buffer_size 128k; #表示使nginx阻止HTTP應答代碼為400或者更高的應答, proxy_intercept_errors on; #后端服務器連接的超時時間_發起握手等候回應超時時間 #nginx跟后端服務器連接超時時間(代理連接超時) proxy_connect_timeout 90; #后端服務器資料回傳時間(代理發送超時) #后端服務器資料回傳時間_就是在規定時間之內后端服務器必須傳完所有的資料 proxy_send_timeout 90; #連接成功后,后端服務器回應時間(代理接收超時) #連接成功后_等候后端服務器回應時間_其實已經進入后端的排隊之中等候處理(也可以說是后端服務器處理請求的時間) proxy_read_timeout 90; #設定代理服務器(nginx)保存用戶頭資訊的緩沖區大小 #設定從被代理服務器讀取的第一部分應答的緩沖區大小,通常情況下這部分應答中包含一個小的應答頭,默認情況下這個值的大小為指令proxy_buffers中指定的一個緩沖區的大小,不過可以將其設定為更小 proxy_buffer_size 4k; #proxy_buffers緩沖區,網頁平均在32k以下的設定 #設定用于讀取應答(來自被代理服務器)的緩沖區數目和大小,默認情況也為分頁大小,根據作業系統的不同可能是4k或者8k proxy_buffers 4 32k; #高負荷下緩沖大小(proxy_buffers*2) proxy_busy_buffers_size 64k; #設定在寫入proxy_temp_path時資料的大小,預防一個作業行程在傳遞檔案時阻塞太長 #設定快取檔案夾大小,大于這個值,將從upstream服務器傳 proxy_temp_file_write_size 64k; } #設定查看Nginx狀態的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file confpasswd; #htpasswd檔案的內容可以用apache提供的htpasswd工具來產生, } #本地動靜分離反向代理配置 #所有jsp的頁面均交由tomcat或resin處理 location ~ .(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } #所有靜態檔案由nginx直接讀取不經過tomcat或resin location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt| pdf|xls|mp3|wma)$ { expires 15d; } location ~ .*.(js|css)?$ { expires 1h; } } } ######Nginx配置文件nginx.conf中文詳解##### -
CoreModule核心模塊
user www; #Nginx行程所使用的用戶 worker_processes 1; #Nginx運行的work行程數量(建議與CPU數量一致或auto) error_log /log/nginx/error.log #Nginx錯誤日志存放路徑 pid /var/run/nginx.pid #Nginx服務運行后產生的pid行程號 -
events事件模塊
events { worker_connections # 每個worker行程支持的最大連接數 use epool; # 事件驅動模型, epoll默認 } -
http內核模塊
//公共的配置定義在http{} http { //http層開始 ... //使用Server配置網站, 每個Server{}代表一個網站(簡稱虛擬主機) 'server' { listen 80; //監聽埠, 默認80 server_name localhost; //提供服務的域名或主機名 access_log host.access.log //訪問日志 //控制網站訪問路徑 'location' / { root /usr/share/nginx/html; //存放網站代碼路徑 index index.html index.htm; //服務器回傳的默認頁面檔案 } //指定錯誤代碼, 統一定義錯誤頁面, 錯誤代碼重定向到新的Locaiton error_page 500 502 503 504 /50x.html; } ... //第二個虛擬主機配置 'server' { ... } include /etc/nginx/conf.d/*.conf; //包含/etc/nginx/conf.d/目錄下所有以.conf結尾的檔案 } //http層結束
Nginx虛擬主機
-
如果每臺linux服務器只運行了一個小網站,那么人氣低,流量小的草根站長需要承擔高額的服務器租賃費,也造成了硬體資源浪費,
-
虛擬主機就是將一臺服務器分割成多個“虛擬服務器”,每個站點使用各自的硬碟空間,由于省資源,省錢,眾多網站都使用虛擬主機來部署網站,
-
虛擬主機的概念就是在web服務里的一個獨立的網站站點,這個站點對應獨立的域名(IP),具有獨立的程式和資源目錄,可以獨立的對外提供服務,
-
這個獨立的站點配置是在nginx.conf中使用server{}代碼塊標簽來表示一個虛擬主機,
-
Nginx支持多個server{}標簽,即支持多個虛擬主機站點,
-
虛擬主機型別:基于域名的虛擬主機,通過不同的域名區分不同的虛擬主機,是企業應用最廣的虛擬主機,基于埠的虛擬主機通過不同的埠來區分不同的虛擬主機,一般用作企業內部網站,不對外直接提供服務的后臺,例如www.pythonav.cn:9000基于IP的虛擬主機通過不同的IP區分不同的虛擬主機,此類比較少見,一般業務需要多IP的常見都會在負載均衡中系結VIP,
-
Nginx狀態資訊(status)配置
Nginx狀態資訊(status)配置及資訊詳解 nginx與php-fpm一樣內建了一個狀態頁,對于想了解nginx的狀態以及監控nginx非常有幫助,為了后續的zabbix監控,我們需要先了解一下nginx的狀態頁, Nginx狀態資訊(status)介紹 Nginx軟體在編譯時又一個with-http_stub_status_module模塊,這個模塊功能是記錄Nginx的基本訪問狀態資訊,讓使用者了解Nginx的作業狀態,要想使用狀態模塊,在編譯時必須增加--with-http_stub_status_module引數, -
監測你的nginx是否安裝了status模塊
[root@master conf]# /opt/nginx/sbin/nginx -V nginx version: nginx/1.12.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) configure arguments: --prefix=/opt/nginx/ --with-http_stub_status_module -
啟動status狀態功能,修改組態檔
#在訪問ip/status的時候,進入狀態功能 location /status { #開啟nginx狀態功能 stub_status on; } -
平滑重啟nginx
./sbin/nginx -s reload, -
通過ab壓測命令檢測
yum -y install httpd-tools,-
-n requests #執行的請求數,即一共發起多少請求,
-
-c concurrency #請求并發數,
-
-k #啟用HTTP KeepAlive功能,即在一個HTTP會話中執行多個請求,
-
ab -kc 1000 -n 100000 http://192.168.119.10/,
-
-
檢查nginx語法重新加載nginx
../sbin/nginx -t, -
平滑重啟nginx
../sbin/nginx -s reload, -
檢查nginx埠,行程,訪問pyyuc虛擬站點
netstat -tunlp|grep nginx ps -ef|grep nginx # 我這里是有dns決議,沒有的話則需要/etc/hosts決議 # 成功配置了pyyuc虛擬主機站點 curl www.pyyuc.cn <meta charset=utf8>我是pyyuc站點
Nginx其他
配置多個域名的虛擬主機
-
其實就是新增一個server{}虛擬主機
egrep -v '#|^$' /opt/nginx1-12/conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.pyyuc.cn; location /{ root html/pyyuc; index index.html index.htm; } } server { listen 80; server_name www.pythonav.cn; location /{ root html/pythonav; index index.html index.htm; } } } -
創建pythonav虛擬主機站點的目錄和檔案
mkdir -p /opt/nginx1-12/html/pythonav echo "<meta charset=utf8>我是pythonav,未成年禁止入內"> /opt/nginx1-12/html/pythonav/index.html ./sbin/nginx -t nginx: the configuration file /opt/nginx1-12/conf/nginx.conf syntax is ok nginx: configuration file /opt/nginx1-12/conf/nginx.conf test is successful ./sbin/nginx -s reload
nginx訪問日志(access_log)
-
日志功能對每個用戶訪問網站的日志資訊記錄到指定的日志檔案里,開發運維人員可以分析用戶的瀏覽器行為,此功能由ngx_http_log_module模塊負責,官網地址是:
http://nginx.org/en/docs/http/ngx_http_log_module.html, -
控制日志的引數
log_format 記錄日志的格式,可定義多種格式 accsss_log 指定日志檔案的路徑以及格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; -
對應引數決議
$remote_addr 記錄客戶端ip $remote_user 遠程用戶,沒有就是 “-” $time_local 對應[14/Aug/2018:18:46:52 +0800] $request 對應請求資訊"GET /favicon.ico HTTP/1.1" $status 狀態碼 $body_bytes_sent 571位元組 請求體的大小 $http_referer 對應“-” 由于是直接輸入瀏覽器就是 - $http_user_agent 客戶端身份資訊 $http_x_forwarded_for 記錄客戶端的來源真實ip 97.64.34.118 -
日志效果如下
66.102.6.6 - - [14/Aug/2018:18:46:52 +0800] "GET /favicon.ico HTTP/1.1" 404 571 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon" "97.64.34.118" -
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/access.log main; -
日志格式配置定義:log_format是日志關鍵字引數,不能變,main是日志格式指定的標簽,記錄日志時通過main標簽選擇指定的格式,
-
nginx限制網站來源IP訪問,如果哪天發現你的nginx很慢,或者檢查access.log時候,有一個some body瘋狂請求你的nginx server,那么可以禁止這個IP訪問,
限制ip或ip段訪問禁止訪問/av/底下的資源 location /av { deny 122.71.240.254; #alias /opt/nginx1-12/html/av; allow 10.1.1.0/16; }
Nginx錯誤頁面優化
-
在網站運行程序中,可能因為頁面不存在等原因,導致網站無法正常回應請求,此時web服務會回傳系統的錯誤碼,但是默認的錯誤頁面很不友好,
-
因此我們可以將404,403等頁面的錯誤資訊重定向到網站首頁或者其他指定的頁面,提升用戶訪問體驗,
server { listen 80; server_name www.pythonav.cn; root html/pythonav; location /{ index index.html index.htm; } #在pythonav路徑下的40x.html錯誤頁面 error_page 400 403 404 405 /40x.html; } -
40x.html
<img style='width:100%;height:100%;' src=https://pic1.zhimg.com/80/v2-77a9281a2bebc7a2ea5e02577af266a8_hd.png> -
此時訪問www.pythonav.cn/asdasd錯誤頁面已經優化了
Nginx代理
-
正向代理,也就是傳說中的代理,他的作業原理就像一個跳板(VPN),簡單的說:我是一個用戶,我訪問不了某網站,但是我能訪問一個代理服務器,這個代理服務器呢,他能訪問那個我不能訪問的網站,于是我先連上代理服務器,告訴他我需要那個無法訪問網站的內容,代理服務器去取回來,然后回傳給我,
-
反向代理,對于客戶端而言,代理服務器就像是原始服務器,
-
nginx實作負載均衡的組件
ngx_http_proxy_module proxy代理模塊,用于把請求拋給服務器節點或者upstream服務器池
實作一個簡單的反向代理
-
機器準備,兩臺服務器
master 192.168.11.63 主負載 slave 192.168.11.64 web1 -
主負載均衡節點的組態檔nginx.conf
worker_processes 1; error_log logs/error.log; pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; keepalive_timeout 65; upstream slave_pools{ server 192.168.11.64:80 weight=1; } server { listen 80; server_name localhost; location / { proxy_pass http://slave_pools; root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } -
檢查語法并啟動nginx
[root@master 192.168.11.63 /opt/nginx1-12]$/opt/nginx1-12/sbin/nginx -t nginx: the configuration file /opt/nginx1-12/conf/nginx.conf syntax is ok nginx: configuration file /opt/nginx1-12/conf/nginx.conf test is successful #啟動nginx [root@master 192.168.11.63 /opt/nginx1-12]$/opt/nginx1-12/sbin/nginx #檢查埠 [root@master 192.168.11.63 /opt/nginx1-12]$netstat -tunlp|grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 8921/nginx: master -
此時訪問master的服務器192.168.11.63:80地址,已經會將請求轉發給slave的80埠,除了頁面效果的展示以外,還可以通過log(access.log)查看代理效果
nginx語法之location詳解
-
Location語法優先級排列
匹配符 匹配規則 優先級 = 精確匹配 1 ^~ 以某個字串開頭 2 ~ 區分大小寫的正則匹配 3 ~* 不區分大小寫的正則匹配 4 !~ 區分大小寫不匹配的正則 5 !~* 不區分大小寫不匹配的正則 6 / 通用匹配,任何請求都會匹配到 7 -
nginx.conf組態檔實體
server { listen 80; server_name pythonav.cn; #優先級1,精確匹配,根路徑 location =/ { return 400; } #優先級2,以某個字串開頭,以av開頭的,優先匹配這里,區分大小寫 location ^~ /av { root /data/av/; } #優先級3,區分大小寫的正則匹配,匹配/media*****路徑 location ~ /media { alias /data/static/; } #優先級4 ,不區分大小寫的正則匹配,所有的****.jpg|gif|png 都走這里 location ~* .*\.(jpg|gif|png|js|css)$ { root /data/av/; } #優先7,通用匹配 location / { return 403; } } -
nginx語法之root和alias區別實戰
nginx指定檔案路徑有root和alias兩種方法 區別在方法和作用域: 方法: root 語法 root 路徑; 默認值 root html; 配置塊 http{} server {} location{} alias 語法: alias 路徑 配置塊 location{} root和alias區別在nginx如何解釋location后面的url,這會使得兩者分別以不同的方式講請求映射到服務器檔案上 root引數是root路徑+location位置 root實體: location ^~ /av { root /data/av; 注意這里可有可無結尾的 / } 請求url是pythonav.cn/av/index.html時 web服務器會回傳服務器上的/data/av/av/index.html root實體2: location ~* .*\.(jpg|gif|png|js|css)$ { root /data/av/; } 請求url是pythonav.cn/girl.gif時 web服務器會回傳服務器上的/data/static/girl.gif alias實體: alias引數是使用alias路徑替換location路徑 alias是一個目錄的別名 注意alias必須有 "/" 結束! alias只能位于location塊中 請求url是pythonav.cn/av/index.html時 web服務器會回傳服務器上的/data/static/index.html location ^~ /av { alias /data/static/; }
Keepalived高可用軟體
-
什么是keepalived:Keepalived是一個用C語言撰寫的路由軟體,該專案的主要目標是為Linux系統和基于Linux的基礎架構提供簡單而強大的負載均衡和高可用性設施, 還可以作為其他服務(nginx,mysql)的高可用軟體keepalived主要通過vrrp協議實作高可用功能,vrrp叫(virtual router redundancy protocol)虛擬路由器冗余協議,目的為了解決單點故障問題,他可以保證個別節點宕機時,整個網路可以不間斷的運行,
-
高可用故障切換原理
-
在keepalived作業時,主master節點會不斷的向備節點發送心跳訊息,告訴備節點自己還活著,當master節點故障時,就無法發送心跳訊息,備節點就無法檢測到來自master的心跳了,于是呼叫自身的接管程式,接管master節點的ip資源以及服務,當master主節點恢復時,備backup節點又會釋放接管的ip資源和服務,回復到原本的備節點角色,
-
-
硬體環境準備
實驗環境應該最好是4臺虛擬機,環境有限因此用2臺機器 master slave -
centos系統和nginx代理環境
docker入門
-
Docker 最初是 dotCloud 公司創始人 Solomon Hykes 在法國期間發起的一個公司內部專案,于 2013 年 3 月以 Apache 2.0 授權協議開源,主要專案代碼在 GitHub 上進行維護,
-
Docker 使用 Google 公司推出的 Go 語言 進行開發實作,
-
docker是linux容器的一種封裝,提供簡單易用的容器使用介面,它是最流行的Linux容器解決方案,
-
docker的介面相當簡單,用戶可以方便的創建、銷毀容器,
-
docker將應用程式與程式的依賴,打包在一個檔案里面,運行這個檔案就會生成一個虛擬容器,
-
程式運行在虛擬容器里,如同在真實物理機上運行一樣,有了docker,就不用擔心環境問題了,
-
ocke用場景:web應用的自動化打包和發布,自動化測驗和持續集成、發布,在服務型環境中部署和調整資料庫或其他應用,
-
但是虛擬化也是有局限性的,每一個虛擬機都是一個完整的作業系統,要分配系統資源,虛擬機多道一定程度時,作業系統本身資源也就消耗殆盡,或者說必須擴容
-
docker與虛擬機的區別:
特性 容器 虛擬機 啟動 秒級 分鐘級 硬碟使用 一般為 MB 一般為 GB 性能 接近原生 弱 系統支持量 單機支持上千個容器 一般幾十個 -
環境配置的難題:讓開發人員最頭疼的麻煩事之一就是環境配置了,每臺計算機的環境都不相同,應該如何確保自己的程式換一臺機器能運行起來呢?
-
用戶必須確保的是:作業系統的相同、各種平臺庫和組件的安裝、例如python依賴包,環境變數等,
-
解決方案,虛擬機
-
虛擬機也可以制作模板,基于模板創建虛擬機,保證環境問題一致,虛擬機(virtual machine)就是帶環境安裝的一種解決方案,它可以在一種作業系統里面運行另一種作業系統,比如在 Windows 系統里面運行 Linux 系統,應用程式對此毫無感知,因為虛擬機看上去跟真實系統一模一樣,而對于底層系統來說,虛擬機就是一個普通檔案,不需要了就刪掉,對其他部分毫無影響,
-
雖然用戶可以通過虛擬機還原軟體的原始環境,但是,這個方案有幾個缺點,
-
資源占用多:虛擬機會獨占一部分記憶體和硬碟空間,它運行的時候,其他程式就不能使用這些資源了,哪怕虛擬機里面的應用程式,真正使用的記憶體只有 1MB,虛擬機依然需要幾百 MB 的記憶體才能運行,
-
冗余步驟多:虛擬機是完整的作業系統,一些系統級別的操作步驟,往往無法跳過,比如用戶登錄,
-
啟動慢:啟動作業系統需要多久,啟動虛擬機就需要多久,可能要等幾分鐘,應用程式才能真正運行,
-
-
解決方案,Linux容器
-
現在:自從用上docker容器后,可以實作開發、測驗和生產環境的統一化和標準化,
-
鏡像作為標準的交付件,可在開發、測驗和生產環境上以容器來運行,最終實作三套環境上的應用以及運行所依賴內容的完全一致,
-
由于虛擬機的諸多問題,Linux發展出了另一種虛擬化技術:Linux容器(Linux Containers,縮寫LXC),
-
Linux容器不是模擬一個完整的作業系統,而是對行程進行隔離,在正常行程的外面套了一個保護層,對于容器里面行程來說,它接觸的資源都是虛擬的,從而實作和底層系統的隔離,
-
啟動快:容器里面的應用,直接就是底層系統的一個行程,而不是虛擬機內部的行程,所以,啟動容器相當于啟動本機的一個行程,而不是啟動一個作業系統,速度就快很多,
-
資源占用少:容器只占用需要的資源,不占用那些沒有用到的資源;虛擬機由于是完整的作業系統,不可避免要占用所有資源,另外,多個容器可以共享資源,虛擬機都是獨享資源,
-
體積小:容器只要包含用到的組件即可,而虛擬機是整個作業系統的打包,所以容器檔案比虛擬機檔案要小很多,
-
-
docker容器的優勢
-
更高效的利用系統資源:由于容器不需要進行硬體虛擬以及運行完整作業系統等額外開銷,Docker 對系統 資源的利用率更高,無論是應用執行速度、記憶體損耗或者檔案存盤速度,都要比傳 統虛擬機技術更高效,因此,相比虛擬機技術,一個相同配置的主機,往往可以運 行更多數量的應用,
-
更快速的啟動時間:傳統的虛擬機技術啟動應用服務往往需要數分鐘,而 Docker 容器應用,由于直接 運行于宿主內核,無需啟動完整的作業系統,因此可以做到秒級、甚至毫秒級的啟 動時間,大大的節約了開發、測驗、部署的時間,
-
一致的運行環境:開發程序中一個常見的問題是環境一致性問題,由于開發環境、測驗環境、生產環 境不一致,導致有些 bug 并未在開發程序中被發現,而 Docker 的鏡像提供了除內 核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現 “這段代碼 在我機器上沒問題啊” 這類問題,
-
持續交付和部署:對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以在任意 地方正常運行,
-
使用 Docker 可以通過定制應用鏡像來實作持續集成、持續交付、部署,開發人員 可以通過 Dockerfile 來進行鏡像構建,并結合 持續集成(Continuous Integration) 系 統進行集成測驗,而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合 持續部署(Continuous Delivery/Deployment) 系統進行自動部署,而且使用 Dockerfile 使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環 境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像,
-
更輕松的遷移:由于 Docker 確保了執行環境的一致性,使得應用的遷移更加容易,Docker 可以在 很多平臺上運行,無論是物理機、虛擬機、公有云、私有云,甚至是筆記本,其運 行結果是一致的,因此用戶可以很輕易的將在一個平臺上運行的應用,遷移到另一 個平臺上,而不用擔心運行環境的變化導致應用無法正常運行的情況,
-
-
docker三大概念:鏡像 image、容器 container、倉庫 repositorydocker整個生命周期就是這三個概念,
-
docker鏡像,Docker鏡像就是一個只讀的模板,鏡像可以用來創建Docker容器,Docker提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那里下載一個已經做好的鏡像來直接使用,
-
image的分層存盤,因為鏡像包含完整的root檔案系統,體積是非常龐大的,因此docker在設計時按照Union FS的技術,將其設計為分層存盤的架構,鏡像不是ISO那種完整的打包檔案,鏡像只是一個虛擬的概念,他不是一個完整的檔案,而是由一組檔案組成,或者多組檔案系統聯合組成,
-
docker容器(container),image和container的關系,就像面向物件程式設計中的 類和實體一樣,鏡像是靜態的定義(class),容器是鏡像運行時的物體(object),
-
Docker利用容器來運行應用,容器是從鏡像創建的運行實體,它可以被啟動、開始、停止、洗掉,
-
每個容器都是相互隔離的,保證安全的平臺,可以把容器看做是一個簡易版的Linux環境(包括root用戶權限、行程空間、用戶空間和網路空間等)和運行在其中的應用程式,
-
注意:鏡像是只讀的,容器在啟動的時候創建一層可寫層作為最上層,
-
-
docker倉庫(repository)
-
倉庫是集中存放鏡像檔案的場所,有時候把倉庫和倉庫注冊服務器(Registry)混為一談,并不嚴格區分,實際上,倉庫注冊服務器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag),
-
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式,
-
最大的公開倉庫是Docker Hub,存放了數量龐大的鏡像供用戶下載,國內的公開倉庫包括Docker Pool等,可以提供大陸用戶更穩定快讀的訪問,
-
當用戶創建了自己的鏡像之后就可以使用push命令將它上傳到公有或者私有倉庫,這樣下載在另外一臺機器上使用這個鏡像時候,只需需要從倉庫上pull下來就可以了,
-
注意:Docker倉庫的概念跟Git類似,注冊服務器可以理解為GitHub這樣的托管服務,
-
-
-
docker Registry
-
Docker Registry 公開服務是開放給用戶使用、允許用戶管理鏡像的 Registry 服 務,一般這類公開服務允許用戶免費上傳、下載公開的鏡像,并可能提供收費服務 供用戶管理私有鏡像,
-
最常使用的 Registry 公開服務是官方的 Docker Hub,這也是默認的 Registry,并 擁有大量的高質量的官方鏡像,除此以外,還有 CoreOS 的 Quay.io,CoreOS 相 關的鏡像存盤在這里;Google 的 Google Container Registry,Kubernetes 的鏡像 使用的就是這個服務,
-
由于某些原因,在國內訪問這些服務可能會比較慢,國內的一些云服務商提供了針 對 Docker Hub 的鏡像服務(Registry Mirror),這些鏡像服務被稱為加速器,常見 的有 阿里云加速器、DaoCloud 加速器、靈雀云加速器等,使用加速器會直接從國內的地址下載 Docker Hub 的鏡像,比直接從官方網站下載速度會提高很多,在后 面的章節中會有進一步如何配置加速器的講解,
-
國內也有一些云服務商提供類似于 Docker Hub 的公開服務,比如 時速云鏡像倉 庫、網易云鏡像服務、DaoCloud 鏡像市場、阿里云鏡像庫等,
-
安裝docker
-
安裝步驟
1.卸載舊版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 2.設定存盤庫 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 3.安裝docker社區版 sudo yum install docker-ce 4.啟動關閉docker systemctl start docker -
docker版本:Docker 是一個開源的商業產品,有兩個版本:社區版(Community Edition,縮寫為 CE)和企業版(Enterprise Edition,縮寫為 EE),企業版包含了一些收費服務,個人開發者一般用不到,本文的介紹都針對社區版,
-
系統環境準備:docker最低支持centos7且在64位平臺上,內核版本在3.10以上
uname -r, -
Docker鏡像加速器
https://www.daocloud.io/mirror#accelerator-doc #一條命令加速 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
使用docker
-
docker基礎命令注釋
[root@docker ~]# docker --help Usage: docker [OPTIONS] COMMAND [arg...] docker daemon [ --help | ... ] docker [ --help | -v | --version ] A self-sufficient runtime for containers. Options: --config=~/.docker Location of client config files #客戶端組態檔的位置 -D, --debug=false Enable debug mode #啟用Debug除錯模式 -H, --host=[] Daemon socket(s) to connect to #守護行程的套接字(Socket)連接 -h, --help=false Print usage #列印使用 -l, --log-level=info Set the logging level #設定日志級別 --tls=false Use TLS; implied by--tlsverify # --tlscacert=~/.docker/ca.pem Trust certs signed only by this CA #信任證書簽名CA --tlscert=~/.docker/cert.pem Path to TLS certificate file #TLS證書檔案路徑 --tlskey=~/.docker/key.pem Path to TLS key file #TLS密鑰檔案路徑 --tlsverify=false Use TLS and verify the remote #使用TLS驗證遠程 -v, --version=false Print version information and quit #列印版本資訊并退出 Commands: attach Attach to a running container #當前shell下attach連接指定運行鏡像 build Build an image from a Dockerfile #通過Dockerfile定制鏡像 commit Create a new image from a container's changes #提交當前容器為新的鏡像 cp Copy files/folders from a container to a HOSTDIR or to STDOUT #從容器中拷貝指定檔案或者目錄到宿主機中 create Create a new container #創建一個新的容器,同run 但不啟動容器 diff Inspect changes on a container's filesystem #查看docker容器變化 events Get real time events from the server#從docker服務獲取容器實時事件 exec Run a command in a running container#在已存在的容器上運行命令 export Export a container's filesystem as a tar archive #匯出容器的內容流作為一個tar歸檔檔案(對應import) history Show the history of an image #展示一個鏡像形成歷史 images List images #列出系統當前鏡像 import Import the contents from a tarball to create a filesystem image #從tar包中的內容創建一個新的檔案系統映像(對應export) info Display system-wide information #顯示系統相關資訊 inspect Return low-level information on a container or image #查看容器詳細資訊 kill Kill a running container #kill指定docker容器 load Load an image from a tar archive or STDIN #從一個tar包中加載一個鏡像(對應save) login Register or log in to a Docker registry#注冊或者登陸一個docker源服務器 logout Log out from a Docker registry #從當前Docker registry退出 logs Fetch the logs of a container #輸出當前容器日志資訊 pause Pause all processes within a container#暫停容器 port List port mappings or a specific mapping for the CONTAINER #查看映射埠對應的容器內部源埠 ps List containers #列出容器串列 pull Pull an image or a repository from a registry #從docker鏡像源服務器拉取指定鏡像或者庫鏡像 push Push an image or a repository to a registry #推送指定鏡像或者庫鏡像至docker源服務器 rename Rename a container #重命名容器 restart Restart a running container #重啟運行的容器 rm Remove one or more containers #移除一個或者多個容器 rmi Remove one or more images #移除一個或多個鏡像(無容器使用該鏡像才可以洗掉,否則需要洗掉相關容器才可以繼續或者-f強制洗掉) run Run a command in a new container #創建一個新的容器并運行一個命令 save Save an image(s) to a tar archive#保存一個鏡像為一個tar包(對應load) search Search the Docker Hub for images #在docker hub中搜索鏡像 start Start one or more stopped containers#啟動容器 stats Display a live stream of container(s) resource usage statistics #統計容器使用資源 stop Stop a running container #停止容器 tag Tag an image into a repository #給源中鏡像打標簽 top Display the running processes of a container #查看容器中運行的行程資訊 unpause Unpause all processes within a container #取消暫停容器 version Show the Docker version information#查看容器版本號 wait Block until a container stops, then print its exit code #截取容器停止時的退出狀態值 Run 'docker COMMAND --help' for more information on a command. #運行docker命令在幫助可以獲取更多資訊 -
使用docker鏡像:從倉庫獲取鏡像,管理本地主機的鏡像,
-
獲取鏡像
-
從docker registry獲取鏡像的命令是docker pull,命令格式是:
docker pull [選項][docker registry地址] 倉庫名:標簽, -
docker register地址:地址的格式一般是 域名:埠,默認地址是docker hub,倉庫名:倉庫名是兩段格式,用戶名/軟體名,如果不寫用戶,默認docker hub用戶名是library,也就是官方鏡像,
-
-
鏡像檔案
-
docker是把應用程式和其依賴打包在image檔案里面,只有通過這個鏡像檔案才能生成docker容器,一個image檔案可以生成多個容器實體,image檔案是通用,可以共享的,為了節省時間,我們盡量,
-
列出服務器所有鏡像檔案:列出所有的image檔案
docker image ls,洗掉image檔案docker image rm [imagename],
-
-
搜索docker鏡像:
docker search centos,搜索所有centos的docker鏡像, -
獲取docker鏡像:可以使用docker pull命令來從倉庫獲取所需要的鏡像,下面的例子將從Docker Hub倉庫下載一個Centos作業系統的鏡像,
docker pull centos,獲取centos鏡像,docker run -it centos /bin/bash,完成后可以使用該鏡像創建一個容器, -
查看docker鏡像:鏡像的ID唯一標識了鏡像,如果ID相同,說明是同一鏡像,TAG資訊來區分不同發行版本,如果不指定具體標記,默認使用latest標記資訊,
docker images,查看docker鏡像, -
洗掉Docker鏡像:如果要移除本地的鏡像,可以使用docker rmi命令(在洗掉鏡像之前先用docker rm洗掉依賴于這個鏡像的所有容器),注意docker rm 命令是移除容器,
docker rmi imageID,洗掉docker鏡像, -
匯出docker鏡像:如果要匯出鏡像到本地檔案,可以使用docker save命令,
docker save centos > /opt/centos.tar.gz,匯出docker鏡像至本地, -
匯入docker鏡像:可以使用docker load從本地檔案中匯入到本地docker鏡像庫
docker load < /opt/centos.tar.gz,匯入本地鏡像到docker鏡像庫,
-
-
啟動docker容器的方式:啟動容器有兩種方式,一種是基于鏡像新建一個容器并啟動,另外一個是將在終止狀態(stopped)的容器重新啟動,因為Docker的容器實在太輕量級了,很多時候用戶都是隨時洗掉和新創建容器,
-
新建容器并且啟動
所需要的命令主要為docker run 例如,下面的命令輸出一個hehe,之后終止容器, [root@docker ~]# docker run centos /bin/echo "hehe" #這跟在本地直接執行 /bin/echo'hehe' hehe [root@docker ~]# docker run --name mydocker -it centos /bin/bash#啟動一個bash終端,允許用戶進行互動, [root@1c6c3f38ea07 /]# pwd / [root@1c6c3f38ea07 /]# ls anaconda-post.log bindev etc homelib lib64 lost+foundmedia mnt optproc root runsbin srv systmp usr var --name:給容器定義一個名稱 -i:則讓容器的標準輸入保持打開, -t:讓Docker分配一個偽終端,并系結到容器的標準輸入上 /bin/bash:執行一個命令
-
-
當利用docker run來創建容器時,Docker在后臺運行的標準操作包括
-
檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載、利用鏡像創建并啟動一個容器、分配一個檔案系統,并在只讀的鏡像層外面掛在一層可讀寫層、從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中去、從地址池配置一個ip地址給容器、執行用戶指定的應用程式、執行完畢后容器被終止,
-
-
docker與"hello docker",hello world是程式員啟蒙語言,我們通過最簡單的image檔案“hello-world”,來感受一下docker,
docker pull hello-world # 獲取鏡像 hello-world docker images # 檢查鏡像 # 運行image檔案,可以用容器id docker run hello-world # 檢查docker容器行程docker ps#檢查所有運行過的容器docker ps -a -
運行一個ubuntu容器 :咱們要在cenots7作業系統下,以docker下載一個ubuntu image檔案,然后以image啟動容器,
[root@oldboy_python ~ 11:52:22]#docker pull ubuntu:14.04#如圖,烏班圖的鏡像下載,是下載每一層的檔案Trying to pull repository docker.io/library/ubuntu ... 14.04: Pulling from docker.io/library/ubuntu 8284e13a281d: Pull complete 26e1916a9297: Pull complete 4102fc66d4ab: Pull complete 1cf2b01777b2: Pull complete 7f7a2d5e04ed: Pull complete Digest: sha256:4851d1986c90c60f3b19009824c417c4a0426e9cf38ecfeb28598457cefe3f56 Status: Downloaded newer image for docker.io/ubuntu:14.04-
下載程序可以看出鏡像是由多層存盤構成的,下載也是一層一層,并非單一的檔案,
-
下載程序中給出每一層的前12位ID,下載結束后會給出sha246的檔案一致性校驗值,
-
-
運行這個烏班圖容器!
[root@oldboy_python ~ 12:18:53]#docker run -it --rm ubuntu:14.04 bash#此時會進入互動式的shell界面,即可以使用烏班圖作業系統 root@3efbb2749d7c:/# cat /etc/os-release NAME="Ubuntu" VERSION="14.04.5 LTS, Trusty Tahr" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 14.04.5 LTS" VERSION_ID="14.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"#使用exit退出容器exit docker run就是運行容器的命令, 引數 -it : -i 是互動式操作,-t是終端 -rm : 容器退出后將其洗掉,也可以不指定引數,手動docker rm,使用-rm可以避免浪費空間, ubuntu:14.04 這指的是鏡像檔案 bash : 指定用互動式的shell,因此需要bash命令
Docker與CentOS
-
docker允許在容器內運行應用程式,使用docker run命令來在容器內運行應用程式,
# 加速docker鏡像下載 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io docker pull docker.io/centos Using default tag: latest Trying to pull repository docker.io/library/centos ... latest: Pulling from docker.io/library/centos 256b176beaff: Pull complete Digest: sha256:fc2476ccae2a5186313f2d1dadb4a969d6d2d4c6b23fa98b6c7b0a1faad67685 Status: Downloaded newer image for docker.io/centos:latest -
運行一個互動式的容器
docker run -it centos /bin/bash#此時進入docker容器 cat /etc/redhat-release 引數決議: - **-t:**在新容器內指定一個偽終端或終端, - **-i:**允許你對容器內的標準輸入 (STDIN) 進行互動, 此時就進入了centos系統 可以查看系統相關資訊,內核版本資訊 cat /proc/versionls / 此時想要退出容器,使用exit命令 -
后臺模式啟動docker
-
-d引數:后臺運行容器,回傳容器ID
docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done", -
查看容器內的標準輸出
docker logs c02, -
停止容器
docker stop c02, -
啟動容器
docker start c02和洗掉容器docker rm c02, -
Docker鏡像常用命令
docker images # 列出所有本級鏡像 docker pull centos # 獲取新的centos鏡像 docker search nginx # 搜索nginx鏡像 -
構建鏡像,通過commit修改鏡像,撰寫dockerfile,
-
-
進入容器
-
使用-d引數時,容器啟動后會進入后臺,某些時候需要進入容器進行操作,有很多種方法,包括使用docker attach命令或nsenter工具等,
docker exec -it # 容器id docker attach # 容器id
-
-
提交創建自定義的鏡像(docker container commit)
1.我們進入互動式的centos容器中,發現沒有vim命令 docker run -it centos 2.在當前容器中,安裝一個vim yum install -y vim 3.安裝好vim之后,exit退出容器 exit 4.查看剛才安裝好vim的容器記錄 docker container ls -a 5.提交這個容器,創建新的image docker commit 059fdea031ba chaoyu/centos-vim 6.查看鏡像檔案 [root@master /home]docker images REPOSITORY TAG IMAGE ID CREATED SIZE chaoyu/centos-vim latest fd2685ae25fe 5 minutes ago 348MB -
外部訪問容器
-
容器中可以運行網路應用,但是要讓外部也可以訪問這些應用,可以通過-p或-P引數指定埠映射,-P 引數會隨機映射埠到容器開放的網路埠
docker run -d -P training/webapp python app.py, -
查映射的埠,宿主機ip:32768 映射容器的5000埠
docker ps -l, -
查看容器日志資訊,不間斷顯示log
docker logs -f cfd, -
也可以通過-p引數指定映射埠,指定服務器的9000埠,映射到容器內的5000埠
docker run -d -p 9000:5000 training/webapp python app.py, -
查看指定容器的埠映射
docker port c0b, -
查看容器內的行程
docker top c0b,
-
-
利用dockerfile定制鏡像
-
鏡像是容器的基礎,每次執行docker run的時候都會指定哪個鏡像作為容器運行的基礎,我們之前的例子都是使用來自docker hub的鏡像,直接使用這些鏡像只能滿足一定的需求,當鏡像無法滿足我們的需求時,就得自定制這些鏡像,
-
鏡像的定制就是定制每一層所添加的配置、檔案,如果可以吧每一層修改、安裝、構建、操作的命令都寫入到一個腳本,用腳本來構建、定制鏡像,這個腳本就是dockerfile,
-
Dockerfile 是一個文本檔案,其內包含了一條條的指令(Instruction),每一條指令 構建一層,因此每一條指令的內容,就是描述該層應當如何構建,
FROM scratch #制作base image 基礎鏡像,盡量使用官方的image作為base image FROM centos #使用base image FROM ubuntu:14.04 #帶有tag的base image LABEL version=“1.0” #容器元資訊,幫助資訊,Metadata,類似于代碼注釋 LABEL maintainer=“[email protected]" #對于復雜的RUN命令,避免無用的分層,多條命令用反斜線換行,合成一條命令! RUN yum update && yum install -y vim \ Python-dev #反斜線換行 RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME” WORKDIR /root #相當于linux的cd命令,改變目錄,盡量使用絕對路徑!!!不要用RUN cd WORKDIR /test #如果沒有就自動創建 WORKDIR demo #再進入demo檔案夾 RUN pwd #列印結果應該是/test/demo ADD and COPY ADD hello / #把本地檔案添加到鏡像中,吧本地的hello可執行檔案拷貝到鏡像的/目錄 ADD test.tar.gz / #添加到根目錄并解壓 WORKDIR /root ADD hello test/ #進入/root/ 添加hello可執行命令到test目錄下,也就是/root/test/hello 一個絕對路徑 COPY hello test/ #等同于上述ADD效果 ADD與COPY - 優先使用COPY命令 -ADD除了COPY功能還有解壓功能 添加遠程檔案/目錄使用curl或wget ENV #環境變數,盡可能使用ENV增加可維護性 ENV MYSQL_VERSION 5.6 #設定一個mysql常量 RUN yum install -y mysql-server=“${MYSQL_VERSION}” ------這里需要稍微理解一下了-------中級知識---先不講 VOLUME and EXPOSE 存盤和網路 RUN and CMD and ENTRYPOINT RUN:執行命令并創建新的Image Layer CMD:設定容器啟動后默認執行的命令和引數 ENTRYPOINT:設定容器啟動時運行的命令 Shell格式和Exec格式 RUN yum install -y vim CMD echo ”hello docker” ENTRYPOINT echo “hello docker” Exec格式 RUN [“apt-get”,”install”,”-y”,”vim”] CMD [“/bin/echo”,”hello docker”] ENTRYPOINT [“/bin/echo”,”hello docker”] 通過shell格式去運行命令,會讀取$name指令,而exec格式是僅僅的執行一個命令,而不是shell指令 cat Dockerfile FROM centos ENV name Docker ENTRYPOINT [“/bin/echo”,”hello $name”]#這個僅僅是執行echo命令,讀取不了shell變數 ENTRYPOINT [“/bin/bash”,”-c”,”echo hello $name"] CMD 容器啟動時默認執行的命令 如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略 如果定義多個CMD,只有最后一個執行 ENTRYPOINT 讓容器以應用程式或服務形式運行 不會被忽略,一定會執行 最佳實踐:寫一個shell腳本作為entrypoint COPY docker-entrypoint.sh /usr/local/bin ENTRYPOINT [“docker-entrypoint.sh] EXPOSE 27017 CMD [“mongod”] [root@master home]# more Dockerfile FROm centos ENV name Docker #CMD ["/bin/bash","-c","echo hello $name"] ENTRYPOINT ["/bin/bash","-c","echo hello $name”]
-
-
發布docker image到倉庫
-
docker hub公有鏡像發布
1.docker提供了一個類似于github的倉庫dockerhub, 網址https://hub.docker.com/需要注冊使用 2.注冊docker id后,在linux中登錄dockerhub docker login注意要保證image的tag是賬戶名,如果鏡像名字不對,需要改一下tagdocker tag chaoyu/centos-vim yuchao163/centos-vim語法是: docker tag 倉庫名 yuchao163/倉庫名 3.推送docker image到dockerhub docker push yuchao163/centps-cmd-exec:latest 4.在dockerhub中檢查鏡像 https://hub.docker.com/ 5.洗掉本地鏡像,測驗下載pull 鏡像檔案 docker pull yuchao163/centos-entrypoint-exec -
私有倉庫:但是這種鏡像倉庫是公開的,其他人也是可以下載,并不安全,因此還可以使用docker registry官方提供的私有倉庫,
1.官方提供的私有倉庫docker registry用法 https://yeasy.gitbooks.io/docker_practice/repository/registry.html 2.一條命令下載registry鏡像并且啟動私有倉庫容器 私有倉庫會被創建在容器的/var/lib/registry下,因此通過-v引數將鏡像檔案存盤到本地的/opt/data/registry下 埠映射容器中的5000埠到宿主機的5000埠 docker run -d \ -p 5000:5000 \ -v /opt/data/registry:/var/lib/registry \ registry 3.檢查啟動的registry容器 docker ps 4.測驗連接容器 telnet 192.168.119.10 5000 5.修改鏡像tag,以docker registry的地址埠開頭 docker tag hello-world:latest 192.168.119.10:5000/hello-world:latest 6.查看docker鏡像,找到registry的鏡像 docker images 7.Docker 默認不允許非 HTTPS 方式推送鏡像,我們可以通過 Docker 的配置選項來取消這個限制,這里必須寫正確json資料 [root@master /]# cat /etc/docker/daemon.json {"registry-mirrors": ["http://95822026.m.daocloud.io"], "insecure-registries":["192.168.119.10:5000"] } 寫入到docker服務中,寫入到[Service]配置塊中,加載此組態檔 [root@master home]# grep 'EnvironmentFile=/etc/docker/daemon.json' /lib/systemd/system/docker.service EnvironmentFile=-/etc/docker/daemon.json 8.修改了docker組態檔,重新加載docker systemctl daemon-reload 9.重啟docker systemctl restart docker 10.重啟了docker,剛才的registry容器行程掛掉了,因此重新啟動它 docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry --privileged=true docker容器的安全機制:設定特權級運行的容器 11.推送本地鏡像 docker push 192.168.119.10:5000/hello-world 12.由于docker registry沒有web節目,但是提供了API資料 官網教程:https://docs.docker.com/registry/spec/api/#listing-repositories curl http://192.168.119.10:5000/v2/_catalog 或者瀏覽器訪問http://192.168.119.10:5000/v2/_catalog13.洗掉本地鏡像,從私有倉庫中下載docker pull 192.168.119.10:5000/hello-world
-
-
打包flask程式與dockerfile
-
超哥構建好的鏡像,只要丟給武沛奇,說“小沛奇,拿去用吧,這個鏡像你直接docker run就能用了,不需要你管環境問題了,有沒有很崇拜我”,沛奇說,“超哥真牛逼”
確保app.py和dockerfile在同一個目錄! 1.準備好app.py的flask程式 [root@master home]# cat app.py#coding:utf8 from flask import Flask app=Flask(__name__) @app.route('/') def hello(): return "hello docker" if __name__=="__main__": app.run(host='0.0.0.0',port=8080) [root@master home]# ls app.py Dockerfile 2.撰寫dockerfile FROM centos COPY CentOS-Base.repo /etc/yum.repos.d/ COPY epel.repo /etc/yum.repos.d/ RUN yum clean all RUN yum install python-setuptools -y RUN easy_install flask COPY s16-flask.py /opt/ WORKDIR /opt EXPOSE 8080 CMD ["python","s16-flask.py"] 3.構建鏡像image docker build -t yuchao163/flask-hello-docker . 4.查看創建好的images docker image ls 5.啟動此flask-hello-docker容器,映射一個埠供外部訪問 docker run -d -p 8080:8080 yuchao163/flask-hello-docker 6.檢查運行的容器 docker container ls
-
-
docker跑一個selenium腳本
-
運行完整流程
[root@chaogelinux tmp]# pip3 list |grep selenium selenium 3.141.0 [root@chaogelinux tmp]# cat baidu.py from selenium import webdriver chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') #不需要可視化界面,linux無圖形化 chrome_options.add_argument('--no-sandbox') #以最高權限運行 driver = webdriver.Chrome(executable_path='/tmp/chromedriver', options=chrome_options) #找到webdriver瀏覽器驅動 driver.get("http://www.baidu.com") print(driver.title) driver.close() \#獲取瀏覽器驅動 wget http://npm.taobao.org/mirrors/chromedriver/71.0.3578.33/chromedriver_linux64.zip [root@chaogelinux tmp]# python3 baidu.py -
使用容器
1.準備好一個裝好selenium的鏡像,并且是執行baidu.py功能的,準備好Dockerfile [root@chaogelinux selenium_docker]# cat Dockerfile FROM python:3.7 RUN echo 'nameserver 119.29.29.29' >> /etc/resolv.conf RUN pip3 install -i https://pypi.douban.com/simple selenium ADD baidu.py /opt/ WORKDIR /opt/ CMD ['python3','/opt/baidu.py'] 2.構建鏡像 [root@chaogelinux selenium_docker]# docker build -t se_python . 3.如果構建失敗,網速問題,則 vim /etc/sysctl.conf #添加,修改代碼 net.ipv4.ip_forward=1 systemctl restart network 檢查sysctl net.ipv4.ip_forward4.檢查鏡像 [root@chaogelinux selenium_docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE se_python latest 2b9508d00eb9 6 minutes ago 926 MB
-
-
docker網路
-
Docker 允許通過外部訪問容器或容器互聯的方式來提供網路服務,埠映射允許外部訪問容器、--link 容器互聯、容器橋接網路,
1.通過--link容器通信,給test2添加一個hosts決議記錄 docker run -d --name test2 --link test1 busybox /bin/sh -c "while true;do sleep 3600;done" test2可以ping通test1,反之不可以 -
但是--link是不推薦使用的,而是更強大的自定義docker網路鏈接容器
1.新建一個docker網路 docker network create -d bridge my-net -d 引數指定 Docker 網路型別,有 bridge overlay 2.連接容器 運行一個容器并連接到新建的 my-net 網路 $ docker run -it --rm --name busybox1 --network my-net busybox sh 打開新的終端,再運行一個容器并加入到 my-net 網路 $ docker run -it --rm --name busybox2 --network my-net busybox sh 再打開一個新的終端查看容器資訊 $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b47060aca56b busybox "sh" 11 minutes ago Up 11 minutes busybox2 8720575823ec busybox "sh" 16 minutes ago Up 16 minutes busybox1 下面通過 ping 來證明 busybox1 容器和 busybox2 容器建立了互聯關系, 在 busybox1 容器輸入以下命令 / # ping busybox2 PING busybox2 (172.19.0.3): 56 data bytes 64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms 64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms 用 ping 來測驗連接 busybox2 容器,它會決議成 172.19.0.3, 同理在 busybox2 容器執行 ping busybox1,也會成功連接到, / # ping busybox1 PING busybox1 (172.19.0.2): 56 data bytes 64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms 64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.143 ms 這樣,busybox1 容器和 busybox2 容器建立了互聯關系,
-
-
外部訪問容器
-
容器中可以運行網路應用,但是要讓外部也可以訪問這些應用,可以通過-p或-P引數指定埠映射,
-P 引數會隨機映射埠到容器開放的網路埠 [root@oldboy_python ~ 16:31:37]#docker run -d -P training/webapp python app.py -
檢查映射的埠
#宿主機ip:32768 映射容器的5000埠[root@oldboy_python ~ 16:34:02]#docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cfd632821d7a training/webapp "python app.py" 21 seconds ago Up 20 seconds 0.0.0.0:32768->5000/tcp brave_fermi -
查看容器日志資訊
#不間斷顯示log docker logs -f cfd -
也可以通過-p引數指定映射埠
#指定服務器的9000埠,映射到容器內的5000埠[root@oldboy_python ~ 16:46:13]#docker run -d -p 9000:5000 training/webapp python app.py c0b5a6278d0f4f2e9b9eba8680451111d8b911b61de0c37ea64cb337aefb854e
-
-
查看指定容器的埠映射
docker port c0b 5000/tcp -> 0.0.0.0:9000 -
查看容器內的行程
[root@oldboy_python ~ 16:49:05]#docker top c0b UID PID PPID C STIME TTY TIME CMD root 3926 3912 0 16:46 ? 00:00:00 python app.py
Ubuntu安裝
-
烏班圖作業系統下載地址:
http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-amd64.iso, -
準備好vmware虛擬機,下載ubuntu后打開vmware并創建虛擬機,版本選擇16.2后客戶端型別選擇Linux,版本選擇Ubuntu64一直下一步即可,
-
安裝pycharm
-
pycharm之linux版本下載地址:
https://download.jetbrains.8686c.com/python/pycharm-community-2018.2.4.tar.gz, -
解壓縮pycharm:
yuchao@ubuntu:/tmp$ tar zxvf pycharm-professional-2018.2.4.tar.gz, -
解壓縮后進入檔案夾:
cd /tmp/pycharm-2018.2.4/bin, -
執行腳本,啟動pycharm
source pycharm.sh, -
配置桌面快捷啟動pycharm
-
在桌面創建一個文本檔案,名為Pycharm.desktop
-
在檔案中添加內容
[Desktop Entry] Version=1.0 Type=Application Name=Pycharm Icon=/home/yuchao/Downloads/pycharm-professional-2018.2.4/pycharm-2018.2.4/bin/pycharm.png Exec=/home/yuchao/Downloads/pycharm-professional-2018.2.4/pycharm-2018.2.4/bin/pycharm.sh MimeType=application/x-py Name[en_US]=pycharm -
修改屬性中選中Permissions后,勾選Allow executing file as pycharm,
-
-
Shell編程實戰
-
為什么要學習Shell編程,Shell腳本語言是實作Linux/Unix系統管理及自動化運維所必須的重要工具,Linux系統的底層以及基礎應用軟體的核心大都涉及Shell腳本的內容,一個合格的Linux系統管理員都必須熟練撰寫Shell腳本語言,從而提升運維人員的作業效率,減少不必要的重復性作業,
-
學習Shell所需的基礎知識
-
熟練使用VIm編輯器,熟悉SSH終端等配置
-
在Linux下開發shell腳本用的最多的就是vim編輯器,熟練使用vim可以使得shell腳本開發事半功倍!
-
-
有一定的Linux命令基礎,熟練掌握80個命令以上
-
shell和其他腳本語言不同,如python,Shell缺少可以直接使用的外部函式庫,因此Linux系統的命令就可以當做Shell的函式庫!
-
-
熟悉常見Linux服務部署,優化,分析與排錯
-
學習Shell直接的目的是在作業中對系統以及服務進行自動化管理,因此如果不熟悉服務操作,使用shell也就沒有意義了
-
-
-
什么是Shell
-
Shell存在于作業系統的最外層,負責與用戶直接對話,把用戶的輸入解釋給作業系統,處理作業系統的輸出結果,然后反饋給用戶,
-
Shell是一個命令解釋器,它的作用是解釋并執行用戶輸入的命令和程式等,用戶每輸入一條命令,Shell解釋器就執行一條,存在一種互動的方式,
-
從開機準備輸入用戶名和密碼,到登錄成功,所有的操作都是Shell解釋并執行的,
-
-
什么是Shell腳本
-
當命令或者程式陳述句不是在命令列中執行,而是通過一個程式檔案來執行時,這個程式就稱作Shell腳本,
-
一個簡單的Shell腳本
-
清除/var/log下的messages日志檔案
-
把所有命令放入一個檔案,堆積起來后就是一個腳本檔案!注意檔案的可執行權限,與用戶身份
# 清除腳本日志 cd /var/log cat /dev/null > messages echo "Logs cleaned up . done"
-
-
-
Shell腳本語言的種類
-
Shell腳本語言是弱型別語言(無須定義變數的型別即可使用),在Linux中有兩大Shell,一是Bourne shell,二是C shell我們需要知道的就是標準的Bourne Again shell(bash)所取代,
-
語言選擇:Shell腳本語言優勢在于處理系統底層的業務,基于linux命令處理也是最快的,常用語開發自動化安裝,監控報警,軟體啟動等腳本,
-
-
第一個Shell腳本與hello world
-
腳本開頭:一個規范的腳本檔案會在第一行指出由哪個程式來執行腳本的內容,必須位于第一行!!!如果你不加默認也會交給bash解釋,良好的編程習慣,最好加上開頭解釋器語言標識
#!/bin/bash#!/usr/bin/env python,
-
-
執行Shell腳本的方式
bash 腳本名 sh 腳本名 此方法是腳本沒有可執行權限時,或者檔案頭沒指定解釋器時用的方法path/scriptName./scriptName 此方法需要腳本有可執行權限,chmod +x scriptNamesource scriptName. scriptName加載并執行腳本檔案中的命令和陳述句 [root@oldboy_python /tmp 11:10:08]#sh test.sh chaoge nb [root@oldboy_python /tmp 11:10:18]#cat test.sh #!/bin/bash echo 'chaoge nb' [root@oldboy_python /tmp 11:10:21]#. test.sh chaoge nb [root@oldboy_python /tmp 11:10:33]#source test.sh chaoge nb#添加可執行權限給test.shchmod +x test.sh./test.sh
變數
-
環境變數一般指的是export內置命令匯出的變數,用于定義SHell的運行環境,
-
Shell通過環境變數來確定命令提示符,也就是超哥前面說的PS1變數
-
環境變數可以在命令列中設定和創建,但是用戶退出命令列時變數值就會丟失,因此可以寫入/etc/profile檔案中,每次用戶登錄時,變數都會被初始化!
-
環境變數名字均大寫,用env查看
-
設定登錄的提示
/etc/motd, -
定義變數,變數定義的注意點:變數名和等號之間不能有空格、命名只能用英文字母,數字,下劃線,首個字符不能用數字、不能用標點符號、不能用關鍵字,
name='chaoge' echo $name echo ${name} #幫助解釋器識別變數的邊界 #變數重新賦值 name='chaogenb' -
設定只讀變數
readonly name name='chaogenb3' -bash: name: 只讀變數 -
洗掉變數
unset name, -
變數型別:區域變數 在腳本或命令中定義,僅在當前shell有效、環境變數 所有的程式,shell程式都能訪問環境變數、shell變數 特殊變數 既有環境變數 又有區域變數,
字串
-
字串可以用單引號,也可以雙引號,也可以沒引號
addr='shahe' echo $addr shahe -
單引號的任何字串都會原樣輸出,單引號字串中的變數無效、單引號字串不能出現單一的單引號,轉義符也不可用,可用作字串拼接、雙引號里可以用變數,雙引號可以有轉義符,
addr='changpingshahe' name='yuchao' message="Hello,${name},Your addr is \"${addr}\" " echo $message Hello,yuchao,Your addr is "changpingshahe" -
獲取字串長度
str='abc' echo ${#str} 3 -
左閉又開規則
str='I am chaoge,hello world!' #取出0和10索引的字符 echo ${str:0:11} I am chaoge -
查找字符索引
str='I am chaoge,hello world!' echo `expr index "$str" e` 11
saltstack高效運維
-
概述
-
saltstack是由thomas Hatch于2011年創建的一個開源專案,設計初衷是為了實作一個快速的遠程執行系統,
-
系統管理員日常會進行大量的重復性操作,例如安裝軟體,修改組態檔,創建用戶,批量執行命令等等,如果主機數量龐大,單靠人工維護實在讓人難以忍受,
-
早期運維人員會根據自己的生產環境來寫特定腳本完成大量重復性作業,這些腳本復雜且難以維護,系統管理員面臨的問題主要是1、系統配置管理,2、遠程執行命令,因此誕生了很多開源軟體,系統維護方面有fabric、puppet、chef、ansible、saltstack等,這些軟體擅長維護系統狀態或方便的對大量主機進行批量的命令執行,
-
salt靈活性強大,可以進行大規模部署,也能進行小規模的系統部署,salt的設計架構適用于任意數量的服務器,從少量本地網路系統到跨越數個資料中心,拓撲架構都是c/s模型,配置簡單,
-
不管是幾臺、幾百臺、幾千臺服務器,都可以使用salt在一個中心節點上進行管控,靈活定位任意服務器子集來運行命令,
-
Salt是python撰寫的,支持用戶通過python自定義功能模塊,也提供了大量的python API介面,用戶可以根據需要進行簡單快速的擴展,
-
-
saltstack的運行方式,Local 本地運行,交付管理、Master/Minion <<< 常用方式 、Salt SSH 不需要客戶端,
-
salt部署基本架構
-
在安裝salt之前,先理解salt架構中各個角色,主要區分是salt-master和salt-minion,顧名思義master是中心控制系統,minion是被管理的客戶端,
-
salt架構中的一種就是master > minion,在遠程執行系統中,salt用python通過函式呼叫完成任務,
-
-
運行salt依賴包:python、zeromq、pyzmp、pycrypto、msgpack-python、yaml、jinja2,解決依賴包最簡單的辦法就是用安裝包管理器,yum工具
-
服務器環境準備
服務器環境 centos7(master) centos7(master) ip地址 192.168.178.131 192.168.178.132 身份 master slave 軟體包 salt-master salt-minion -
修改虛擬機ip地址為靜態地址,并且確保可上網
-
master網卡配置
TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="7d4f9ede-810f-4976-a01b-250b845c99cc" DEVICE="ens33" ONBOOT="yes" IPADDR=192.168.11.131 NETMASK=255.255.255.0 GATEWAY=192.168.11.1 DNS1=119.29.29.29 -
slave網卡配置
TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="f9fc5929-8594-466e-a041-34caee8c1e32" DEVICE="ens33" ONBOOT="yes" IPADDR=192.168.11.132 NETMASK=255.255.255.0 GATEWAY=192.168.11.1 DNS1=119.29.29.29 -
dns組態檔
# Generated by NetworkManager nameserver 119.29.29.29 -
/etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.11.132 slave 192.168.11.131 master
-
-
關閉服務器安全策略
關閉firewalld systemctl disable firewalld systemctl stop firewalld 關閉iptables iptables -F 關閉selinux -
安裝saltstack
-
salt軟體包需要epel源的支持,那么下載
-
EPEL的全稱叫 Extra Packages for Enterprise Linux ,EPEL是由 Fedora 社區打造,為 RHEL 及衍生發行版如 CentOS、Scientific Linux 等提供高質量軟體包的專案,裝上了 EPEL之后,就相當于添加了一個第三方源,
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum clean all #清空快取 yum makecache #生成yum快取 -
安裝好epel源就可以開始安裝salt了
查看salt包yum list salt安裝salt-master yum install salt-master -y 安裝salt-minion yum install salt-minion -y
-
-
salt埠,安裝好salt之后開始配置,salt-master默認監聽兩個埠:
4505 publish_port 提供遠程命令發送功能 4506 ret_port 提供認證,檔案服務,結果收集等功能 確保客戶端可以通信服務器的此2個埠,保證防火墻允許埠通過,因此在測驗環境直接關閉防火墻, -
組態檔
salt-master的組態檔是/etc/salt/master salt-minion的組態檔是/etc/salt/minion 組態檔中包含了大量可調整的引數,這些引數控制master和minion各個方面-
配置salt-master
# salt運行的用戶,影響到salt的執行權限 user: root #s alt的運行執行緒,開的執行緒越多一般處理的速度越快,但一般不要超過CPU的個數 worker_threads: 10 # master的管理埠 publish_port : 4505 # master跟minion的通訊埠,用于檔案服務,認證,接受回傳結果等 ret_port : 4506 # 如果這個master運行的salt-syndic連接到了一個更高層級的master,那么這個引數需要配置成連接到的這個高層級master的監聽埠 syndic_master_port : 4506 # 指定pid檔案位置 pidfile: /var/run/salt-master.pid -
超哥的salt-master檔案
[root@master ~]# grep -v ^# /etc/salt/master|grep -v ^$ interface: 0.0.0.0 #系結到本地的0.0.0.0地址 publish_port: 4505 #管理埠,命令發送 user: root #運行salt行程的用戶 worker_threads: 5 #salt運行執行緒數,執行緒越多處理速度越快,不要超過cpu個數 ret_port: 4506 #執行結果回傳埠 pidfile: /var/run/salt-master.pid #pid檔案位置 log_file: /var/log/salt/master #日志檔案地址#自動接收minion的keyauto_accept: False -
認識
# minion的識別ID,可以是IP,域名,或是可以通過DNS決議的字串 id: slave # salt運行的用戶權限 user: root # master的識別ID,可以是IP,域名,或是可以通過DNS決議的字串 master : master # master通信埠 master_port: 4506 # 備份模式,minion是本地備份,當進行檔案管理時的檔案備份模式 backup_mode: minion # 執行salt-call時候的輸出方式 output: nested # minion等待master接受認證的時間 acceptance_wait_time: 10 # 失敗重連次數,0表示無限次,非零會不斷嘗試到設定值后停止嘗試 acceptance_wait_time_max: 0 # 重新認證延遲時間,可以避免因為master的key改變導致minion需要重新認證的syn風暴 random_reauth_delay: 60 # 日志檔案位置 log_file: /var/logs/salt_minion.log -
超哥的satl-minion檔案
[root@slave ~]# grep -v ^# /etc/salt/minion|grep -v ^$ master: master master_port: 4506 user: root id: slave acceptance_wait_time: 10 log_file: /var/log/salt/minion
-
-
啟動salt-master和salt-minion
systemctl start salt-minion systemctl start salt-master#檢查salt狀態systemctl status salt-minionsystemctl status salt-master -
在master上接收minion秘鑰
-
在minion啟動后連接master會請求master為其簽發證書,等待證書簽發完成后,master可以信任minion,并且minion和master之間的通信是加密的,
-
在salt-master執行
-
salt-key命令用于管理mionion秘鑰
[root@master ~]# salt-key -L Accepted Keys: Denied Keys: Unaccepted Keys: slave #此時已經出現slave Rejected Keys: -
此時slave已經出現在unaccepted keys中,說明minion已經和master聯系,并且master已經獲取了minion的公鑰,等待下一步指令,
-
-
檢查master和minion的秘鑰匹配
-
在master上執行
salt-key -f slave, -
然后可以在minion上獲取minion的秘鑰
salt-call --local key.finger, -
因此可確認秘鑰匹配,在master上接收秘鑰
salt-key -a slave, -
確認接收秘鑰后,檢驗minion秘鑰是否被接收
salt-key -L,
-
-
salt-key
-
只有
Master接受了Minion Key后,才能進行管理,具體的認證命令為salt-key常用的有如下命令,[root@linux-node1 ~]# salt-key -L Accepted Keys: #已經接受的key Denied Keys: #拒絕的key Unaccepted Keys:#未加入的key Rejected Keys:#吊銷的key #常用引數 -L #查看KEY狀態 -A #允許所有 -D #洗掉所有 -a #認證指定的key -d #洗掉指定的key -r #注銷掉指定key(該狀態為未被認證) #在master端/etc/salt/master配置 auto_accept: True #如果對Minion信任,可以配置master自動接受請求 -
salt-key的使用
#列出當前所有的key [root@salt0-master ~]# salt-key Accepted Keys: salt1-minion.example.com salt2-minion.example.com salt3-minion.example.com salt4-minion.example.com Denied Keys: Unaccepted Keys: Rejected Keys: #添加指定minion的key [root@salt0-master ~]# salt-key -a salt1-minion.example.com -y #添加所有minion的key [root@salt0-master ~]# salt-key -A -y #洗掉指定的key [root@salt0-master ~]# salt-key -d salt1-minion.example.com -y #洗掉所有的key [root@salt0-master ~]# salt-key -D -y
-
-
日常命令引數
-
首先知道master和minion都安裝了什么檔案,然后才知道怎么操作
-
master端
rpm -ql salt-master,/etc/salt/master # salt master主組態檔 /usr/bin/salt #salt master 核心操作命令 /usr/bin/salt-cp #salt 檔案傳輸命令 /usr/bin/salt-key #salt證書管理 /usr/bin/salt-master #salt master 服務命令 /usr/bin/salt-run #salt master runner命令 -
slave端
[root@slave ~]$rpm -ql salt-minion /etc/salt/minion #minion組態檔 /usr/bin/salt-call #拉取命令 /usr/bin/salt-minion #minion服務命令 /usr/lib/systemd/system/salt-minion.service #minion啟動腳本
-
-
第一條salt命令
-
salt '*' test.ping,salt 是一個命令 # * 表示目標主機, 在這里代表所有目標主機 # test.ping是salt遠程執行的一個模塊下面的方法, -
這是條很簡單的探測minion主機存活命令,也是遠程執行命令,我們通過master發送訊息給"*"所有的minion,并且告訴他們運行salt內置的命令(也是python模塊中的一個函式),回傳true表示slave機器監控存活,
-
test模塊實際上還有許多其他的函式
salt '*' sys.list_functions test, -
測驗下test.echo
salt '*' test.echo 'chaoge nb666', -
test.fib生成斐波那契數列,菲波那切數列定義是第0項是0,第1項是1,數列從第3項開始,每一項等于前兩項之和,
salt '*' test.fib 50, -
小結:此前在機器上安裝了salt minion和salt master,進行了最簡單的連接,然后master接受了minion的秘鑰,運行了第一條test.ping命令
-
-
salt命令組成結構
-
在命令列輸入的命令都是執行模塊,等到命令寫入到檔案中,就叫做狀態模塊,
salt --help,即可查看salt幫助, -
完整的五部分命令--summary引數顯示salt命令的概要
salt --summary '*' cmd.run 'hostname', -
列出所有salt的sys模塊
salt 'slave' sys.list_modules, -
遠程執行命令模塊,cmd是超級模塊,所有shell命令都能執行,
salt 'slave' cmd.run 'ps -ef|grep python' -
遠程安裝nginx
#在minion上安裝nginx [root@master 192.168.11.72 ~]$salt 'slave' pkg.install "nginx" #卸載minion上的nginx [root@master 192.168.11.72 ~]$salt 'slave' pkg.remove "nginx" #檢查pkg包的版本 [root@master 192.168.11.72 ~]$salt 'slave' pkg.version "nginx" -
遠程管理服務模塊,管理服務是系統管理員的重要任務,通過salt管理minion服務會很簡單,使用service模塊,
salt 'slave' service.start "nginx" salt 'slave' service.status "nginx" salt 'slave' service.stop "nginx"
-
-
與標準的Linux命令一樣,salt的命令一樣用法,--out控制salt命令結果輸出的格式,
-
JSON
[root@master 192.168.199.155 ~]$salt --out=json '*' cmd.run_all 'hostname' { "slave": { "pid": 2268, "retcode": 0, "stderr": "", "stdout": "slave" } } -
YAML
[root@master 192.168.199.155 ~]$salt --out=yaml '*' cmd.run_all 'hostname' slave: pid: 2289 retcode: 0 stderr: '' stdout: slave
-
-
YAML講解
在學習saltstack程序中,第一要點就是States撰寫技巧,簡稱SLS檔案,這個檔案遵循YAML語法,初學者看這玩意很容易懵逼,來,超哥拯救你學習YAML語法 json xml yaml 資料序列化格式 yaml容易被決議,應用于組態檔 salt的組態檔是yaml組態檔,不能用tab saltstack,k8s,ansible都用的yaml格式組態檔 語法規則 大小寫敏感 使用縮進表示層級關系 縮進時禁止tab鍵,只能空格 縮進的空格數不重要,相同層級的元素左側對其即可 # 表示注釋行 yaml支持的資料結構 物件: 鍵值對,也稱作映射 mapping 哈希hashes 字典 dict 冒號表示 key: value key冒號后必須有 陣列: 一組按次序排列的值,又稱為序列sequence 串列list 短橫線 - list1 純量: 單個不可再分的值 物件:鍵值對 yaml first_key: second_key:second_value python { 'first_key':{ 'second_key':'second_value', } } YAML是YAML Ain't Markup Language的首字母縮寫,YAML的語法簡單, 結構體通過空格展示 專案使用 '-' 代表 鍵值對通過 ':' 分割 YAML語法遵循固定的縮進風格,表示資料層級結構關系,saltstack需要每個縮進級別由2個空格組成,禁止用tabs!!! Python中的字典是簡單的鍵值對,go語言中稱作哈希表map 字典的key通過冒號分割 key在YAML中表現形式是一個冒號結果的字串 my_key: my_value 轉化到python語法中,上述命令為 {'my_key':'my_value'} value還可以通過縮進和key關聯,四個空格!! my_key: my_value 轉化為python語法同樣的 {'my_key':'my_value'} YAML語法中字典是可以嵌套的 one_dict_key: two_dict_key:value_dict 轉化為python語法 { 'one_dict_key':{ 'two_dict_key':'value_dict' } } 短橫杠 YAML語法表示串列,使用一個橫杠加一個空格 多個項使用同樣的縮進級別作為同一個串列的部分 - list_value_one - list_value_two - list_value_three串列可以作為一個鍵值對的value,例如一次性要安裝多個軟體my_dict: - l1 - l2 - l3轉化為python代碼理解就是 { 'my_dict':['l1','l2',;l3] } -
目標定位字串
-
之前的salt命令我們都是使用 salt '*'控制所有minion,并且我們只有一個“slave”,但是生產環境的服務器很可能是成千上百的minion,因此需要靈活地定位所需的服務器并且執行遠程命令,
-
全域匹配
salt '*' test.ping -
Linux通配符
Linux通配符 * 代表任意字符,或空字串 ? 代表一個字符,不可以為空 [a-z] [0-9] 代表任何一個小寫字母 [root@master 192.168.11.72 ~]$salt 'slav?' test.ping slave: True [root@master 192.168.11.72 ~]$salt '[a-z]lave' test.ping slave: True salt海支持python的re正則運算式
-
-
state模塊定義主機狀態
-
之前執行的遠程命令,都是一個程序式的,類似一段shell或者python腳本執行,執行一次觸發一次相同的功能,
-
那么大量的minion上運行遠程命令就必須使用salt提供的“狀態管理”了,狀態是對minion的一種描述和定義,運維不需要關心部署是如何完成的,只需要描述minion需要達到什么狀態,
-
接下來通過state模塊部署nginx
-
master端
vim /etc/salt/master #打開注釋,寫入以下,必須嚴格遵循語法,空格 file_roots: base: - /srv/salt/base dev: - /srv/salt/dev test: - /srv/salt/test prod: - / srv/salt/prod \#此步驟在master和minion都需要執行,都需要檔案夾,和nginx.sls檔案 [root@master ~]$mkdir -p /srv/salt/{base,dev,test,prod} [root@slave ~]$mkdir -p /srv/salt/{base,dev,test,prod} #這個nginx.sls狀態檔案,在master和minion上都得有[root@master /srv/salt/base]$cat nginx.sls nginx-install: pkg.installed: - name: nginx nginx-service: service.running: - name: nginx - enable: True -
解釋下nginx.sls描述檔案sls組態檔都遵循YAML語言描述,第一條命令使用了pkg.install安裝命令,相對于運行了yum install,而此時state模塊會判斷nginx是否安裝了,如果沒有安裝就進行安裝,安裝了就什么都不做,狀態描述都會遵循這個原則,只有檢測到真實狀態和所需狀態不一就會執行此功能,這種性質叫做冪等性,
-
此時用state模塊部署nginx軟體,通過我們撰寫的nginx.sls描述性組態檔,命令列呼叫state模塊的sls函式,
#啟動命令,此時slave已經安裝且存活了nginx,進行狀態管理 [root@master /srv/salt/base]$salt 'slave' state.sls nginx -
可以去slave測驗關閉nginx,洗掉nginx,重新執行命令,一樣可以安裝啟動nginx,通過master檢查slave的nginx狀態,
[root@master 192.168.199.155 /srv/salt/base]$salt 'slave' cmd.run 'ps -ef|grep nginx' slave: root 8543 1 0 Sep14 ? 00:00:00 nginx: master process /usr/sbin/nginx nginx 8544 8543 0 Sep14 ? 00:00:00 nginx: worker process root 8592 8591 0 00:03 ? 00:00:00 /bin/sh -c ps -ef|grep nginx root 8594 8592 0 00:03 ? 00:00:00 /bin/sh -c ps -ef|grep nginx
-
-
Salt采集靜態資訊之Grains
-
如果你入職了,你的老板讓你收集公司300臺服務器的相關硬體資訊,你是一臺臺登錄呢?還是選擇用salt收集呢?又或者用python的salt-api寫腳本呢
-
Grains 是saltstack組件中非常重要之一,在配置部署時候回經常使用,Grains記錄minion的靜態資訊,比如常用屬性,CPU、記憶體、磁盤、網路資訊等,
-
Minions的Grains資訊是Minion啟動時采集匯報給Master的Grains是以 key value形式存盤的資料庫,可以看做Host的元資料(metadata)Grains保存著收集到的客戶端的詳細資訊如果slave機器資料變化,grains就過期了
-
在生產環境中需要自定義Grains,可以通過
-
Minion組態檔
-
Grains相關模塊定義
-
Python腳本定義salt 'slave' sys.doc grains#查看grains的命令用法
-
Grains人為是描述minion本身固有的靜態屬性資料,列出主機所有Grains資料
[root@master 192.168.11.72 ~]$salt 'slave' grains.items slave: \---------- SSDs: biosreleasedate: 05/19/2017 biosversion: 6.00 資訊過長,已經省略 salt 'slave' grains.ls #列出所有grains方法 -
檢索某些資料
[root@master 192.168.11.72 ~]$salt 'slave' grains.item os id host slave: ---------- host: slave id: slave os: CentOS -
利用Grains靜態資訊定位主機,超哥以前公司有100+的redhat作業系統,80+的centos,在不知道salt之前很是懵逼,,
兩種寫法:salt '*' grains.item key1 key2 key3salt '*' -G#定位Cenots的機器[root@master 192.168.11.72 ~]$salt -G 'os:CentOS' test.ping slave: True#定位作業系統系統是7系列的機器 [root@master 192.168.11.72 ~]$salt -G 'osrelease:7*' test.ping slave: True \#找出ip地址 salt '*' grains.item fqdn_ip4 -
因此用grains.items列出所有的資料匹配主機,以及根據單一資訊定位資料,Grains還可以自定義來滿足不同的需求,
-
-
自定義設定Grains資料
-
設定資料
salt 'slave' grains.setval cpu_num 8和查詢資料salt 'slave' grains.item cpu_num, -
在master端設定Grains靜態資料,原理會將此資料添加到minion服務器的組態檔的/etc/salt/grains
-
對于復雜的資料結構,可以添加靈活的JSON語法
[root@master 192.168.11.72 ~]$salt 'slave' grains.setval cpu_info '["Intel","Xeon","10"]' slave: ---------- cpu_info: - Intel - Xeon - 10 [root@master 192.168.11.72 ~]$salt 'slave' grains.item cpu_info slave: ---------- cpu_info: - Intel - Xeon - 10 -
此時可以檢查minion服務器上的grains檔案
[root@slave 192.168.11.71 ~]$cat /etc/salt/grains cpu_info: - Intel - Xeon - '10' cpu_num: 8 -
因此Grains資料寫入組態檔后,重啟salt-minion服務,資料也不會丟失;想要洗掉可以通過grains.delval命令洗掉,或者去minion的組態檔洗掉配置一樣完成操作(或者洗掉檔案),
1.方法一,清空值 [root@master 192.168.11.72 ~]$salt 'slave' grains.delval cpu_info slave: None [root@master 192.168.11.72 ~]$salt 'slave' grains.delval cpu_num slave: None2.方法二 洗掉minion的grains組態檔,重啟服務 [root@slave 192.168.11.71 ~]$rm -rf /etc/salt/grains [root@slave 192.168.11.71 ~]$!sys systemctl restart salt-minion
-
資料管理中心之Pillar組件
-
Pillar也是saltstack組件中非常重要的組件之一,稱作資料管理中心,經常配合states在大規模的配置管理中使用,
-
Pillar是動態的,存盤在master端,提供和給minion端
-
Pillar在SaltStack中主要的作用是存盤和定義配置管理中需要的一些資料,比如軟體版本號,用戶賬號密碼等,保證敏感資料不被其他minion看到
-
存盤格式與Grains類似,都是YAML格式
-
在master組態檔中有一段Pillar settings選項專門定義Pillar的引數
cat /etc/salt/master #此配置代表pillar的作業根目錄,在/srv/pillar下,然后可以新建sls檔案 #pillar_roots: # base: # - /srv/pillar -
默認pillar的作業目錄在/srv/pillar目錄下,執行如下代碼
mkdir -p /srv/pillar #指定環境,標記,參考packages.sls和services.sls vim /srv/pillar/top.sls base: '*': - packages - services vim /srv/pillar/packages.sls nginx: packages-name: nginx version: 1.12.2 vim /srv/pillar/packages.sls nginx: port: 80 user: root -
檢查我們設定的pillar值
[root@master 192.168.199.155 /srv/pillar]$salt '*' pillar.item nginx slave: ---------- nginx: ---------- packages-name: nginx port: 80 user: root version: 1.12.2 -
Pillar與Grains對比
pillar與Grains對比 型別 資料采集方式 應用場景 定義位置 Grains 靜態 minion啟動時收集 資料查詢 目標選擇 配置管理 minion Pillar 動態 master進行自定義 目標選擇 配置管理 敏感資料 master
Python API呼叫SaltStack
-
SaltStack本身提供salt(usr/bin/salt)來互動管理,但是去服務器上敲命令肯定不是一個長遠之計,這時候python就體現了nb的功能,
-
Python API就是給Python提供的API使用,需要在SaltStack master上運行
[root@master ~]$python Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import salt.client >>> local = salt.client.LocalClient() #<salt.client.LocalClient object at 0x7f886dbdd850> >>> local.cmd('*','cmd.run',['hostname'])#向所有minion發送命令 {'slave': 'slave'} -
通過API獲取saltstack的組態檔
-
獲取master組態檔
>>> import salt.config #匯入salt配置模塊 >>> m_opts=salt.config.client_config('/etc/salt/master') #讀取salt組態檔,得到一個字典資料 -
獲取minion組態檔
Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import salt.client >>> salt.config.minion_config('/etc/salt/minion') #讀取minion組態檔,得到字典資料,通過字典方法可以查看資訊
-
-
Python API介紹
/usr/bin/salt默認使用的介面是LocalClient,該介面只能在salt master上使用 [root@master ~]$python Python 2.7.5 (default, Jul 13 2018, 13:06:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import salt.client >>> local = salt.client.LocalClient() #<salt.client.LocalClient object at 0x7f886dbdd850> >>> local.cmd('*','cmd.run',['hostname'])#向所有minion發送命令 {'slave': 'slave'}-
逐潭訓傳結果,local.cmd_iter()
>>> ret=local.cmd_iter('*','test.ping') >>> ret <generator object cmd_iter at 0x7f886d455c80> >>> for i in ret: ... print i ... {'slave': {'retcode': 0, 'ret': True}} -
菲波那切數列
>>> local.cmd('*','test.fib',[10]) {'slave': [[0, 1, 1, 2, 3, 5, 8], 2.1457672119140625e-06]} -
檢查minion服務器資訊
>>> local.cmd('*','cmd.run',['hostname']) {'slave': 'slave'} >>> local.cmd('*','cmd.run',['ifconfig']) >>> local.cmd('*','cmd.run',['crontab -l']) >>> local.cmd('*','cmd.run',['df -h']) -
啟停minion的服務,如nginx
>>> local.cmd('*','service.stop',['nginx']) {'slave': True} >>> local.cmd('*','service.status',['nginx']) {'slave': False} >>> local.cmd('*','service.start',['nginx']) {'slave': True}
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/543831.html
標籤:Linux
上一篇:Vim 編輯器
下一篇:STM32 SPI硬體NSS
