-
arp欺騙、ssh密鑰對、tcp wrappers
-
arp欺騙
原理:在主機a上arp –a發現b,c的mac地址是相同的,該mac地址都是b的mac地址
實驗環境:
客戶機a:
欺騙機b:導入arp.iso
客戶機c:
安裝步驟:
欺騙機b
traceroute IP #可以測試連通性
mount -o loop /root/arp.iso /root/dir
yum -y install *
vim /etc/sysctl.conf
修改:
net.ipv4.ip_forward = 1
sysctl -p
arpspoof -i eth0 -t IP-a IP-c #b監聽網卡a到c的數據
iptables -A FORWARD -s IP-a -j REJECT/DROP
#b配置防火牆規則,丟棄a的數據包
-A FOREARD:指定從哪限制,經過是限制
-s IP-a:指定限制的主機IP
-j DORP:指定動作,丟棄
客戶機a
ping 客戶機c #發送數據
arp欺騙的解決方法
arp -s IP-c c-mac #將主機c的ip與mac地址捆綁在一起
-
ssh密鑰對驗證
原理
加密方式:
rsa:長,更安全
dsa:短,快,不安全
#dsa不支持免密登入
#同IP不同主機使用秘鑰對認證,會被拒絕,需要刪除know_hosts文件
環境准備:
iptables –F #清空防火牆規則
setenforce 0 #關閉SELinux
ssh-keygen -t rsa/dsa
實現windows與linux之間的秘鑰連接
使用windows的Xshell軟件生成秘鑰對,免密只能使用rsa
/etc/ssh/sshd_config
修改:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
#上面兩條,默認開啟,取消注釋即可,秘鑰認證
touch ~/.ssh/authorized_keys
vim ~/.ssh/authorized_keys #把生成的公鑰復制到authorized_keys文件中
windows登入方式改為kublic Key登入
實現linux與linux之間的秘鑰連接
ssh-keygen -b 1024/2048/3072 -t rsa/dsa
#客戶機生成秘鑰對,b指定長度,t指定類型
/etc/ssh/sshd_config
修改:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
#上面兩條,默認開啟,取消注釋即可,秘鑰認證
touch ~/.ssh/authorized_keys
ssh-copy-id root@IP #傳輸公鑰到服務器兩種方式
scp id_rsa.pub root@192.168.12.253:/root/.ssh/ #傳輸公鑰到服務器兩種方式
ssh root@IP #登入測試
配置文件選項/etc/ssh/sshd_config
PubkeyAuthentication yes和AuthorizedKeysFile
#開啟服務機鑰匙對功能:取消注釋(默認就生效)
PasswordAuthentication no #禁止密碼安全驗證
PermitRootLogin yes #此選項默認為允許root遠程登錄
MaxAuthTries 6 #設置密碼錯誤后的嘗試次數
Port 22 #默認端口
TMOUT=300 #登錄超時時間,需要在/etc/profile添加
service sshd restart #配置后需要重啟服務
-
tcp wrappers(簡化版的防火牆)
作用:用於跳板機搭建,只允許跳板機訪問后台服務器,批量化比較簡單
基本簡介:tcp wrappers是對部分的tcp應用數據進行訪問控制(允許某些數據包通過和拒絕某些數據包通過)
linux四層安全訪問控制:
第一層:acl
用於用戶空間中拒絕
第二層:TCPwrappers
用於libwrap.so庫中拒絕
第三層:iptables
用於內核空間,消耗資源最小
第四層:selinux
應用程序調用數據是拒絕
庫(庫文件libwrap.so):
內核和應用程序之前的橋梁
支持的服務類型:
which 查詢某服務命令所在位置
ldd 查詢某命令調用的相關庫文件
配置文件:
/etc/hosts.allow(允許訪問)
/etc/hosts.deny(拒絕訪問)
格式:服務列表:客戶端地址列表
訪問規則:
策略即時生效
默認情況下,允許訪問
網段不可以使用/8 /16 /24
可以通過 .開始或.結束
通配符不可以和.開始或.結束的格式混用(如:192.*168.34.)
可以使用宏(ALL LOCAL)
多個匹配條件之間用逗號隔開
通過@符號指定特定網卡ip
策略的應用順序:
優先查看hosts.allow,之后再查deny
允許個別,拒絕所有:hosts.allow文件添加允許的策略,hosts.deny文件添加all
拒絕個別,允許所有:hosts.allow文件為空,hosts.deny文件添加單個拒絕的策略
-
-
網絡服務—DHCP
DHCP
概念:DHCP(Dynamic Host Configuration Protocol,動態主機配置協議)是一個局域網的網絡協議,使用UDP協議工作
用途:給內部網絡或網絡服務供應商自動分配IP地址、子網掩碼、網關以及DNS等tcp/ip信息,給用戶或者內部網絡管理員作為對所有計算機作中央管理的方法
作用:
- 給客戶機自動分配IP
- 還可以分配IP,掩碼,網關,DNS等
- DHCP服務器需要固定IP
優點:提高IP利用率
缺點:不可控(如果局域網中有多台DHCP服務器,選擇接受最快的那台)
- DHCP四步租約過程
A:客戶端進行IP請求
源IP:0.0.0.0
源端口:68
目的IP:255.255.255.255
目的端口:67
發送discover包內容:客戶機MAC地址,計算機名
當一個DHCP客戶機啟動時,會自動將自己的IP地址配置成0.0.0.0,由於使用0.0.0.0不能進行正常通信,所以客戶機就必須通過DHCP服務器來獲取一個合法的地址。由於客戶機不知道DHCP服務器的IP地址,所以它使用0.0.0.0的地址作為源地址,使用UDP68端口作為源端口,使用255.255.255.255作為目標地址,使用UDP67端口作為目的端口來廣播請求IP地址信息。廣播信息中包含了DHCP客戶機的MAC地址和計算機名,以便使DHCP服務器能確定是哪個客戶機發送的請求。
B:服務器響應
源IP:DHCP服務器IP
源端口:67
目的IP:255.255.255.255
目的端口:68
發送offer包內容:DHCP客戶機的MAC地址;DHCP服務器提供的合法IP地址;子網掩碼;默認網關(路由);租約的期限;DHCP服務器的IP地址
當DHCP服務器接收到客戶機請求IP地址的信息時,它就在自己的IP地址池中查找是否有合法的IP地址提供給客戶機。如果有,DHCP服務器就將此IP地址做上標記,加入到DHCPOFFER的消息中,然后DHCP服務器就廣播一則包括下列信息的DHCPOFFER消息:
DHCP客戶機的MAC地址;DHCP服務器提供的合法IP地址;子網掩碼;默認網關(路由);租約的期限;DHCP服務器的IP地址。
因為DHCP客戶機還沒有IP地址,所以DHCP服務器使用自己的IP地址作為源地址,使用UDP67端口作為源端口,使用255.255.255.255作為目標地址,使用UDP68端口作為目的端口來廣播DHCPOFFER信息
C:客戶機選擇IP
源IP:0.0.0.0
源端口:68
目的IP:255.255.255.255
目的端口:67
發送request包內容:該客戶機提供IP配置的服務器的服務標識符(IP地址)
DHCP客戶機從接收到的第一個DHCPOFFER消息中選擇IP地址,發出IP地址的DHCP服務器將該地址保留,這樣該地址就不能提供給另一個DHCP客戶機。當客戶機從第一個DHCP服務器接收DHCPOFFER並選擇IP地址后,DHCP租約的第三過程發生。客戶機將DHCPREQUEST消息廣播到所有的DHCP服務器,表明它接受提供的內容。DHCPREQUEST消息包括為該客戶機提供IP配置的服務器的服務標識符(IP地址)。DHCP服務器查看服務器標識符字段,以確定它自己是否被選擇為指定的客戶機提供IP地址,如果那些DHCPOFFER被拒絕,則DHCP服務器會取消提供並保留其IP地址以用於下一個IP租約請求。
在客戶機選擇IP的過程中,雖然客戶機選擇了IP地址,但是還沒有配置IP地址,而在一個網絡中可能有幾個DHCP服務器,所以客戶機仍然使用0.0.0.0的地址作為源地址,使用UDP68端口作為源端口,使用255.255.255.255作為目標地址,使用UDP67端口作為目的端口來廣播DHCPREQUEST信息
D:服務器確認租約
源IP:DHCP服務器IP
源端口:67
目的IP:255.255.255.255
目的端口:68
發送ack/nack包內容:IP地址的有效租約和其他可能配置的信息
服務器確認租約:DHCPNACK
DHCP服務器接收到DHCPREQUEST消息后,以DHCPACK消息的形式向客戶機廣播成功的確認,該消息包含有IP地址的有效租約和其他可能配置的信息。雖然服務器確認了客戶機的租約請求,但是客戶機還沒有收到服務器的DHCPACK消息,所以服務器仍然使用自己的IP地址作為源地址,使用UDP67端口作為源端口,使用255.255.255.255作為目標地址,使用UDP68端口作為目的端口來廣播DHCPACK信息。當客戶機收到DHCPACK消息時,它就配置了IP地址,完成了TCP/IP的初始化。
服務器確認租約:DHCPNACK
如果DHCPREQUEST不成功,例如客戶機試圖租約先前的IP地址,但該IP地址不再可用,或者因為客戶機移到其他子網,該IP無效時,DHCP服務器將廣播否定確認消息DHCPNACK。當客戶機接收到不成功的確認時,它將重新開始DHCP租約過程。
注1:如果DHCP客戶機無法找到DHCP服務器,它將從TCP/IP的B類網段169.254.0.0/16中挑選一個IP地址作為自己的IP地址,繼續每隔5分鍾嘗試與DHCP服務器進行通訊,一旦與DHCP服務器取得聯系,則客戶機放棄自動配置的IP地址,而使用DHCP服務器分配的IP地址。
注2:DHCP客戶機收到DHCP服務器回應的ACK報文后,通過地址沖突檢測(arp)發現服務器分配的地址沖突或者由於其他原因導致不能使用,則發送DECLINE報文,通知服務器所分配的IP地址不可用。
-
DHCP續租
DHCP客戶機會在租期過去50%的時候,直接向為其提供IP地址的DHCP服務器發送DHCPREQUEST消息包。如果客戶機接收到該服務器回應的DHCPACK消息包,客戶機就根據包中所提供的新的租期以及其它已經更新的TCP/IP參數,更新自己的配置,IP租用更新完成。如果沒有收到該服務器的回復,則客戶機繼續使用現有的IP地址,因為當前租期還有50%。
如果在租期過去50%的時候沒有更新,則DHCP客戶機將在租期過去87.5%的時候再次向為其提供IP地址的DHCP服務器聯系。如果還不成功,到租約的100%時候,DHCP客戶機必須放棄這個IP地址,重新申請。如果此時無DHCP服務器可用,DHCP客戶機會使用169.254.0.0/16中隨機的一個地址,並且每隔5分鍾再進行嘗試。
-
DHCP服務基本搭建
准備環境:
一台主機為DHCP服務器
一台主機為客戶機
iptables -F #防火牆
setenforce 0 #SELinux
關閉Vmware虛擬網絡編輯器的DHCP功能
安裝DHCP服務:dhcp與dhcp-common
配置文件:
dhcpd /etc/dhcp/dhcpd.conf
修改:
- 源配置文件為空內容需要復制模板文件
/usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample覆蓋到目錄下
2. 刪除一些不需要的subnet配置
格式:
subnet 192.168.88.0 netmask 255.255.255.0{
#聲明要分配的網段和子網掩碼
range 192.168.88.3 192.168.88.254;
#聲明可用IP地址池
option domain-name " linuxlc.com" ;
#設置DNS域
option domain-name-servers 8.8.8.8,114.114.114.114 ;
#設置DNS服務器地址,中間需要逗號隔開
option routers 192.168.88.2;
#默認網關的地址(可不改)
option broadcast-address 192.168.88.255;
#廣播地址(可有可無)
default-lease-time 600;
#默認租約(s)
max-lease-time 7200;
#最大租限
}
步驟:
1.修改配置文件
2.修改本機IP,保證同網段
3.重啟服務:service dhcpd start
4.重啟客戶機的網卡 ifdown eth0;ifup eth0
5.監聽/var/log/messages日志文件,查錯誤
6.客戶機網卡改為dhcp自動獲取
7.重啟網絡服務獲取IP,或ifdown/ifup eth0
-
DHCP中繼搭建(用於不同網段)
准備環境:
1.一台主機為DHCP服務器,一台中繼服務器,兩台主機為客戶機
2.iptables -F #防火牆
3.setenforce 0 #SELinux
4.關閉Vmware虛擬網絡編輯器的DHCP功能
5.安裝DHCP服務:dhcp與dhcp-common
6.安裝dhcrelay /etc/sysconfig/dhcrelay(中繼配置文件),單獨服務
修改:
INTERFACES=""
#添加網卡名,DHCP服務器要寫第一個
DHCPSERVERS=""
#指向服務器的IP地址
步驟:
- 搭建dhcp服務器,添加多網卡和網段
-
搭建中繼服務器
- VMware添加網卡,關閉VM的dhcp服務
- 復制網卡文件修改(不會自動生成網卡文件),修改網卡名,刪除UUID和MAC地址,IP設置為其他網段的網關
- 重啟網卡
- 配置中繼文件dhcrelay
- 啟動動中繼 service dhcrelay restart(獨立服務)
- 配置數據轉發(可以互相通信)/etc/sysctl.conf
-
客戶機配置
- 網卡配置文件中,改為dhcp模式
- 網關指向中繼對應網段
- 重啟網卡
4.dhcp服務器監控日志文件,客戶機開啟網卡獲取IP
-
固定地址綁定
步驟:
1.arp -a 查看客戶機的mac地址
2.修改/etc/dhcp/dhcpd.conf文件:
host fantasia {
hardware ethernet 客戶機的mac地址;
#想要固定ip的客戶機的mac地址
fixed-address 地址池外的某一IP
#固定分配給客戶機的ip地址
}
3.service dhcpd restart
#重啟客戶機網卡驗證IP獲取是否成功
注:改地址不要事已分配地址池的IP
-
超級作用域(同一局域網)
超級作用域:
#之前的網段聲明和主機聲明全都注釋掉!
例:shared-network public {
subnet 192.168.88.0 netmask 255.255.254.0{
option routers 192.168.88.1;
range 192.168.88.3 192.168.88.3;}
subnet 192.168.88.0 netmask 255.255.254.0{
option routers 192.168.88.1;
range 192.168.89.3 192.168.89.5;}
}
#下面幾行都刪掉
重啟:service dhcpd restart
分別重啟兩台機器的網卡,查看獲取的地址
-
dns域名服務器
-
介紹
1984年,加州大學伯克利分校的幾個學生完成了Unix名稱服務的實現,起名叫Berkeley Internet Name Domain(BIND)。目前,它是互聯網上使用最為廣泛的DNS服務軟件
注:北京網通DNS為202.106.0.20(最早的DNS,也最穩定)
定義:域名系統
作用:域名解析
Host域名解析文件
位置:windows c:\windows\system\drivers\etc\hosts
Linux /etc/hosts
優缺點
- 優先級大於DNS
- 純文本文件,手工維護太過麻煩
- 主機名重復
遞歸查詢:客戶機向首選DNS服務器查詢,一定要返回准確(無論對錯)結果
迭代查詢:首選DNS服務器向其他DNS服務器查詢,可以返回近似結果
正向查詢:域名查找IP地址
反向查詢:IP地址查找域名
Wins:把IP翻譯成主機名或主機名翻譯成IP
DNS作用
正向解析:域名-->IP
反向解析:IP-->域名
DNS管理
IANA 分配ip地址和域名
ICANN 互聯網名稱與數字地址分配機構
A.通過文件管理:hosts
從文件服務器下載,覆蓋/etc/hosts里的內容(設置的有定時任務)
B.搭建域名服務器:DNS
降低了客戶端的操作的復雜難度
加重了服務器端的維護難度
C.分布式DNS:
優點:減輕單台服務器壓力
缺點:時間過長;管理麻煩
解決方案:每級服務器只管理直連下級、允許重名
-
工作原理

(1)客戶機首先查看查找本地hosts文件,如果有則返回,否則進行下一步
(2)客戶機查看本地緩存,是否存在本條目的緩存,如果有則直接返回,不再向外發出請求,否則進行下一步,轉發。
(3)將請求轉發本地DNS服務器。
(4)查看域名是否本地解析,是則本地解析返回,否則進行下一步。
(5)本地DNS服務器首先在緩存中查找,有則返回,無則進行下一步。
(6)向全球13個根域服務器發起DNS請求,根域返回org域的地址列表。
(7)使用某一個org域的IP地址,發起DNS請求,org域返回kernel域服務器地址列表。
(8)使用某一個kernel域IP地址,發起DNS請求,kernel域返回www.kernel.org主機的IP地址,本地DNS服務收到后,返回給客戶機。
注:遞歸查詢:壓力在服務器端
迭代查詢:壓力在客戶端(直接返回結果到客戶機)
-
DNS搭建
搭建步驟:
- 一台主機為dns服務器,一台為客戶機,同一局域網
- 安裝dns軟件bind
- 修改主配置文件/etc/named.conf

- 修改文件區域文件/etc/named.rfc1912.zones

#刪除多余的模板,只留下一個正向和一個反向
#可刪除反向解析,不常用
#先對區域文件進行備份,因為這個文件需要刪除一些設置
-
修改配置文件/var/named/xx.xx
- 先用cp -p 復制解析文件,文件名區域設置時定義的
- 編輯是注意域后面加點(完全合格域名)


- 重啟DNS服務service named restart
- 在客戶機網卡配置文件中添加DNS服務器的地址,然后用nslookup測試
-
從DNS服務器搭建
目的:減輕主服務器的壓力
搭建步驟:
- 一台主服務器、一台從服務器、一台測試機,同一局域網
- 先關閉服務器和客戶機上的防火牆和SELinux
- 主服務器搭建dns服務器
#但有一點需要注意:主DNS的區域配置文件中allow-updata參數添加從服務器IP地址
-
從服務器搭建
- 安裝bind軟件
- 修改主配置文件/etc/named.conf

#都可以指向any(任何IP)
5. 配置區域文件/etc/named.rfc1912.zones
#file選項需要更改為 file "slaves/域.后綴"
6. 重啟服務
7. 在測試機上寫從服務器的IP
-
DNS緩存服務器
作用:加快解析速度提高工作效率
搭建步驟:
- 關閉服務器和客戶機上的防火牆和SELinux
- 一台主服務器,一台緩存服務器,一台測試機,同一局域網
- 安裝軟件dnsmasq
- 修改配置文件/etc/dnsmasq.conf
domain=域名 #需要解析的域名 #添加
server=ip #主DNS服務器IP #添加
cache-size=15000 #聲明緩存條數 #修改
- 重啟服務:service dnsmasq restart
- 在測試機上填寫DNS為緩存服務器的ip地址,先訪問,在停止主服務器,再訪問
-
DNS分離解析
搭建步驟:
- 先關閉服務器和客戶機上的防火牆和SELinux
- 一台內網(client)1塊網卡;一台網關(dns)2塊網卡,一台外網1塊網卡,一台內網web服務器
- web服務器安裝httpd,只設置IP和掩碼,兩張網卡
- 內網客戶機修改網卡,網關和dns都指向網關內網IP
- 外網客戶機修改網卡,網關和dns都指向網關外網IP
-
網關dns服務器修改
- 模擬路由器,把0改成1模擬數據包轉發(實際生產中必不可少),修改/etc/sysctl.conf,sysctl -p重新加載
- cp -a 復制網卡改名,重啟網卡
- 內網網卡IP修改為內網網關,外網網卡IP修改為外網網關,刪除除eth0以外網卡的MAC和UUID
- 安裝bind服務,修改主配置文件/etc/named.conf


- 生成自己定義的區域文件cp -a /etc/named.rfc1912.zones /etc/


- 配置內網的正向解析文件:IP指向web服務器IP

配置內網的反向解析文件:

配置外網的正向解析文件:

配置外網的反向解析文件:

- 重啟服務service named restart
- 測試
-
資源解析記錄
注:SOA與PTR的域名格式必須一致(二級或三級)
- SOA起始授權記錄:記錄DNS的基本信息(FQDN,刷新時間,更新時間,緩存時間)
- NS名稱服務器:記錄FQDN
- A主機:正向解析,域名解析IP
- PTR指針:反向解析,IP解析域名
- MX郵件交叉記錄:用於標識郵件等級
- SRV服務
- CNAME別名
A記錄
A記錄也稱為主機記錄,是使用最廣泛的DNS記錄,A記錄的基本作用就是說明一個域名對應的IP是多少,它是域名和IP地址的對應關系,表現形式為www.linuxlc.com 192.168.1.1 這就是一個A記錄!A記錄除了進行域名IP對應以外,還有一個高級用法,可以作為低成本的負載均衡的解決方案,比如說,www.linuxlc.com 可以創建多個A記錄,對應多台物理服務器的IP地址,可以實現基本的流量均衡!
NS記錄
NS記錄和SOA記錄是任何一個DNS區域都不可或缺的兩條記錄,NS記錄也叫名稱服務器記錄,用於說明這個區域有哪些DNS服務器負責解析,SOA記錄說明負責解析的DNS服務器中哪一個是主服務器。因此,任何一個DNS區域都不可能缺少這兩條記錄。NS記錄,說明了在這個區域里,有多少個服務器來承擔解析的任務,
SOA記錄
NS記錄說明了有多台服務器在進行解析,但哪一個才是主服務器呢,NS並沒有說明,這個就要看SOA記錄了,SOA名叫起始授權機構記錄,SOA記錄說明了在眾多NS記錄里那一台才是主要的服務器!
MX記錄
全稱是郵件交換記錄,在使用郵件服務器的時候,MX記錄是無可或缺的,比如A用戶向B用戶發送一封郵件,那么他需要向DNS查詢B的MX記錄,DNS在定位到了B的MX記錄后反饋給A用戶,然后A用戶把郵件投遞到B用戶的MX記錄服務器里!
CNAME記錄
又叫別名記錄,我們可以這么理解,我們小的時候都會有一個小名,長大了都是學名,那么正規來說學名的符合公安系統的,那個小名只是我們的一個代名詞而已,這也存在一個好處,就是比暴漏自己,比如一個網站a.com 在發布的時候,他可以建立一個別名記錄,把B.com發不出去,這樣不容易被外在用戶所察覺!達到隱藏自己的目的!
PTR記錄
PTR記錄也被稱為指針記錄,PTR記錄是A記錄的逆向記錄,作用是把IP地址解析為域名。由於我們在前面提到過,DNS的反向區域負責從IP到域名的解析,因此如果要創建PTR記錄,必須在反向區域中創建。
-
-
網絡服務—VSFTP
FTP
是File Transfer Protocol(文件傳輸協議)的英文簡稱,用於Internet上的文件的雙向傳輸。使用 FTP 來傳輸時,其實是具有一定程度的『危險性』,因為數據在因特網上面是完全沒有受到保護的『明文』傳輸方式!
VSFTP
是一個基於GPL發布的類Unix系統上使用的FTP服務器軟件,它的全稱是Very Secure FTP,從名稱定義上基本可以看出,這是為了解決ftp傳輸安全性問題的。
特點:
vsftp程序的運行者一般是普通用戶,降低了相對應進程的權限,提高了安全性
任何需要執行較高權限的指令都需要上層程序許可
ftp所需要使用的絕大多數命令都被整合到了vsftp中,基本不需要系統額外提供命令
擁有chroot功能,可以改變用戶的根目錄,限制用戶只能在自己的家目錄
VSFTP連接類型
控制連接(持續連接) à TCP21(命令信道) à 用戶收發FTP命令
數據連接(按需連接) à TCP20(數據信道) à 用於上傳下載數據
-
VSFTP工作模式

注意:很多防火牆在設置的時候都是不允許接受外部發起的連接的,所以許多位於防火牆后或內網的FTP服務器不支持PASV模式,因為客戶端無法穿過防火牆打開FTP服務器的高端端口,而許多內網的客戶端不能用PORT模式登陸FTP服務器,因為從服務器的TCP 20無法和內部網絡的客戶端建立一個新的連接,造成無法工作。
VSFTP傳輸模式
ASCII傳輸模式(文本)
假定用戶正在拷貝的文件包含的簡單ASCII碼文本,如果在遠程機器上運行的不是UNIX,當文件傳輸時ftp通常會自動地調整文件的內容以便於把文件解釋成另外那台計算機存儲文本文件的格式。(Linuxàwindows)但是常常有這樣的情況,用戶正在傳輸的文件包含的不是文本文件,它們可能是程序,數據庫,字處理文件或者壓縮文件。在拷貝任何非文本文件之前,則使用binary模式。
二進制傳輸模式(Binary模式)
在二進制傳輸中,保存文件的位序,以便原始和拷貝的是逐位一一對應的。即使目的地機器上包含位序列的文件是沒意義的。例如,mp3、jpg、exe等
VSFTP安裝配置
服務端:
安裝包vsftpd 高性能、高安全性
客戶端:
安裝包ftp
配置文件:
/etc/vsftpd/vsftpd.conf
登錄驗證方式
匿名用戶驗證:
a. 用戶賬號名稱:ftp或anonymous
b. 用戶賬號密碼:空或任意字符
c. 服務器目錄:/var/ftp
d. 權限:可下載不可上傳,上傳權限由兩部分組成(主配置文件和文件系統)
e. 匿名權限控制:
anonymous_enable=YES 啟用匿名訪問
anon_umask=022 匿名用戶所上傳文件的權限掩碼
anon_root=/var/ftp 匿名用戶的FTP根目錄
anon_upload_enable=YES 允許上傳文件
anon_mkdir_write_enable=YES 允許創建目錄
anon_other_write_enable=YES 開放其他寫入權
anon_max_rate=0 限制最大傳輸速率
f. 特點:配置簡單,所有用戶使用相同的用戶登錄
本地用戶驗證:
a. 用戶賬號名稱:本地用戶(/etc/passwd)
b. 用戶賬號密碼:用戶密碼(/etc/shadow)
c. 工作目錄為:登錄用戶的宿主目錄
d. 權限:最大權限(drwx------)
e. 本地用戶權限控制:
local_enable=YES 是否啟用本地系統用戶
local_umask=022 本地用戶所上傳文件的權限掩碼
local_root=/var/ftp 設置本地用戶的FTP根目錄
chroot_local_user=YES 是否將用戶禁錮在主目錄
local_max_rate=0 限制最大傳輸速率
ftpd_banner=Welcome to blah FTP service 用戶登錄時顯示的歡迎信息
banner_file=/目錄 彈出一個說明,可以做哪些操作
userlist_enable=YES & userlist_deny=YES
禁止/etc/vsftpd/user_list文件中出現的用戶名登錄FTP
userlist_enable=YES & userlist_deny=NO
僅允許/etc/vsftpd/user_list文件中出現的用戶名登錄FTP
ftpusers
禁止/etc/vsftpd/ftpusers文件中出現的用戶名登錄FTP,權限比user_list更高,即時生效
f. 特點:配置相對復雜,可以設置嚴格的權限,有安全隱患
虛擬(virtual)用戶驗證:
能夠設置嚴格的權限(為每一個用戶生成單獨的配置文件)
減少了系統中本地用戶的數量,提高了安全性。
-
匿名用戶驗證實驗:
#先關閉服務器和客戶機上的防火牆和SELinux
#在客戶端登錄后,默認情況下是可以下載的,但不能上傳
anon_upload_enable = YES #實現可以上傳
anon_mkdir_write_enable=YES #允許創建目錄
anon_other_write_enable=YES #允許刪除文件,改名,覆蓋
dirmessage_enable=YES #確認是否啟用,用戶進入某個文件夾時,彈出相應的說明,在對應目錄下創建 .message 文件,並寫入相應內容
-
本地用戶驗證實驗:
服務端需要創建用戶並設置密碼
客戶端上安裝相對應的ftp客戶端,然后登錄
將所有用戶禁錮在自己的家目錄下
注:默認沒有禁錮用戶時,客戶端登錄后可以隨意切換目錄,查看文件所在位置和文件名
chroot_local_user=YES #限制所有用戶不能隨便切換目錄
chroot_list_enable=YES #將部分用戶禁錮在自己的家目錄下
chroot_list_file=/etc/vsftpd/chroot_list
#開啟白名單功能,允許白名單中的用戶隨意切換目錄
#白名單文件所在位置(需自己創建)
ftpusers 文件 #所有寫入此文件內的用戶名都不允許登錄ftp,立刻生效,優先級比黑名單高
pasv_enable=YES
pasv_min_port=3000
pasv_max_port=3010
修改被動模式數據傳輸使用端口
客戶端下載文件,查看服務器上使用的端口號
-
虛擬用戶驗證實驗
1.在/etc/vsftpd/創建ftp軟件的認證配置文件(虛擬用戶的認證文件)
vim vsftpd.user
奇數行:用戶
偶數行:密碼
#添加多個用戶和密碼組合
2.將產生的認證文件轉化為數據庫文件
db_load -T -t hash -f vsftpd.user vsftpd.db (后綴一定要是*.db)
將產生的*.db文件修改權限,chmod 600 *.db
3.為虛擬用戶創建映射用戶:
useradd -d /var/ftproot -s /sbin/nologin virtual
4.修改ftp的認證機制為虛擬用戶認證
/etc/pam.d/ #各個軟件服務的認證機制配置文件
1. cp -a vsftpd vsftpd.pam
#用默認使用的認證配置文件生成新的認證配置文件
2. 修改vsftpd.pam文件
#刪除所有,添加自定義的兩行
auth required pam_userdb.so db=/etc/vsftpd/vsftpd #指定自定義生成的數據庫文件
account required pam_userdb.so db=/etc/vsftpd/vsftpd
#借助pam_userdb.so 函數文件幫助vsftpd軟件解讀認證虛擬用戶的登錄
5.修改/etc/vsftpd/vsftpd.conf配置文件,
修改:
pam_service_name=vsftpd.pam #將認證配置文件指向自己創建的
添加:
guest_enable=YES #開機虛擬用戶
guest_username=virtual #指定虛擬用戶的映射用戶為virtual
user_config_dir=/etc/vsftpd/dir #每一個虛擬用戶的配置文件保存路徑
6.為虛擬用戶創建配置文件和目錄(/etc/vsftpd/dir/)
虛擬用戶的配置文件文件名和用戶名同名即可
a1用戶的配置文件
anon_upload_enable=YES
a2用戶的配置文件
anon_mkdir_write_enable=YES
a3用戶的配置文件
anon_upload_enable=YES
anon_other_write_enable=YES
#注意:要保證虛擬用戶上傳的文件能下載,必須在配置文件中添加anon_umask=022
#讓上傳的文件其他人位置有r權限
#注:做虛擬用戶配置文件設置時,將主配置文件中匿名用戶相關設置注釋掉。
7.啟動服務:service vsftpd restart
測試連接:ftp 服務端IP
-
openssl+vsftpd 加密驗證方式
1.查看是否安裝了openssl rpm –q openssl
2.查看vsftpd 是否支持openssl ldd /usr/sbin/vsftpd | grep libssl
3.生成加密信息
openssl req –new –x509 –nodes –out vsftpd.pem –keyout vsftpd.pem
req 標注格式
-new 創建一個新的證書
-x509 證書內容格式
-nodes 不使用密碼
-out 生成文件名
-keyout 生成的秘鑰文件名
創建過程當中根據提示要一次填寫:國家、省份、城市、組織、部門、個人或主機名、郵箱
4.把證書存放到特定目錄
cp –a vsftpd.pem /etc/ssl/certs/
chmod 500 /etc/ssl/certs/
5.修改添加主配置文件/etc/vsftpd/vsftpd.conf
ssl_enable=YES #啟用ssl認證
ssl_tlsv1=YES #開啟tlsv1、sslv2、sslv3都支持
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=YES #允許匿名用戶
force_anon_logins_ssl=YES #匿名登錄強制使用ssl
force_anon_data_ssl=YES #匿名傳輸時強制使用ssl
force_local_logins_ssl=YES #本地登錄時強制使用ssl
force_local_data_ssl=YES #本地傳輸時強制使用ssl rsa_cert_file=/etc/ssl/certs/vsftpd.pem #證書文件所在目錄
6.重啟服務service vsftpd restart
7.測試(使用第三方客戶端連接) FileZilla-FTP(第三方客戶端工具)
新建站點
連接測試時選擇:
服務器類型:通過顯式 TLS/SSL
登錄類型:一般或匿名
8.抓包
使用tcpdump 工具進行指定端口抓包,抓取ftp登錄過程中的數據包
tcpdump –i eth0 –nn –X –vv tcp port 21 and ip host 來源ip
-i interface:指定tcpdump需要監聽的接口
-n:對地址以數字方式顯式,否則顯式為主機名
-nn:除了-n的作用外,還把端口顯示為數值,否則顯示端口服務名
-X:輸出包的頭部數據,會以16進制和ASCII兩種方式同時輸出
-vv:產生更詳細的輸出
自定義私鑰文件和證書文件:
注:私鑰文件要在配置文件中單獨聲明
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt #rsa格式的證書
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key #rsa格式的密鑰
至於證書分開創建的步驟:
(umask 077;openssl genrsa -out vsftpd.key 2048;) #創建密鑰
openssl req -new -key vsftpd.key -out vsftpd.csr #用創建的秘鑰生成證書
-
vsftpd配置文件詳解
默認配置:
- 允許匿名用戶和本地用戶登陸。
anonymous_enable=YES
local_enable=YES
2. 匿名用戶使用的登陸名為ftp或anonymous,口令為空;匿名用戶不能離開匿名用戶家目錄/var/ftp,且只能下載不能上傳。
3. 本地用戶的登錄名為本地用戶名,口令為此本地用戶的口令;本地用戶可以在自己家目錄中進行讀寫操作;本地用戶可以離開自家目錄切換至有權限訪問的其他目錄,並在權限允許的情況下進行上傳/下載。
write_enable=YES
4. 寫在文件/etc/vsftpd.ftpusers中的本地用戶禁止登陸。
匿名用戶(anonymous)設置
anonymous_enable=YES/NO(YES)
#控制是否允許匿名用戶登入,YES 為允許匿名登入,NO 為不允許。默認值為YES。
write_enable=YES/NO(YES)
#是否允許登陸用戶有寫權限。屬於全局設置,默認值為YES。
no_anon_password=YES/NO(NO)
#若是啟動這項功能,則使用匿名登入時,不會詢問密碼。默認值為NO。
ftp_username=ftp
#定義匿名登入的使用者名稱。默認值為ftp。
anon_root=/var/ftp
#使用匿名登入時,所登入的目錄。默認值為/var/ftp。注意ftp目錄不能是777的權限屬性,即匿名用戶的家目錄不能有777的權限。
anon_upload_enable=YES/NO(NO)
#如果設為YES,則允許匿名登入者有上傳文件(非目錄)的權限,只有在write_enable=YES時,此項才有效。當然,匿名用戶必須要有對上層目錄的寫入權。默認值為NO。
anon_world_readable_only=YES/NO(YES)
#如果設為YES,則允許匿名登入者下載可閱讀的檔案(可以下載到本機閱讀,不能直接在FTP服務器中打開閱讀)。默認值為YES。
anon_mkdir_write_enable=YES/NO(NO)
#如果設為YES,則允許匿名登入者有新增目錄的權限,只有在write_enable=YES時,此項才有效。當然,匿名用戶必須要有對上層目錄的寫入權。默認值為NO。
anon_other_write_enable=YES/NO(NO)
#如果設為YES,則允許匿名登入者更多於上傳或者建立目錄之外的權限,譬如刪除或者重命名。(如果anon_upload_enable=NO,則匿名用戶不能上傳文件,但可以刪除或者重命名已經存在的文件;如果anon_mkdir_write_enable=NO,則匿名用戶不能上傳或者新建文件夾,但可以刪除或者重命名已經存在的文件夾。)默認值為NO。
chown_uploads=YES/NO(NO)
#設置是否改變匿名用戶上傳文件(非目錄)的屬主。默認值為NO。
chown_username=username
#設置匿名用戶上傳文件(非目錄)的屬主名。建議不要設置為root。
anon_umask=077
#設置匿名登入者新增或上傳檔案時的umask 值。默認值為077,則新建檔案的對應權限為700。
deny_email_enable=YES/NO(NO)
#若是啟動這項功能,則必須提供一個檔案/etc/vsftpd/banner_emails,內容為email address。若是使用匿名登入,則會要求輸入email address,若輸入的email address 在此檔案內,則不允許進入。默認值為NO。
banned_email_file=/etc/vsftpd/banner_emails
#此文件用來輸入email address,只有在deny_email_enable=YES時,才會使用到此檔案。若是使用匿名登入,則會要求輸入email address,若輸入的email address 在此檔案內,則不允許進入。
本地用戶設置
local_enable=YES/NO(YES)
#控制是否允許本地用戶登入,YES 為允許本地用戶登入,NO為不允許。默認值為YES。
local_root=/home/username
當本地用戶登入時,將被更換到定義的目錄下。默認值為各用戶的家目錄。
write_enable=YES/NO(YES)
是否允許登陸用戶有寫權限。屬於全局設置,默認值為YES。
local_umask=022
本地用戶新增檔案時的umask 值。默認值為077。
file_open_mode=0755
本地用戶上傳檔案后的檔案權限,與chmod 所使用的數值相同。默認值為0666。
歡迎語設置
dirmessage_enable=YES/NO(YES)
如果啟動這個選項,那么使用者第一次進入一個目錄時,會檢查該目錄下是否有.message這個檔案,如果有,則會出現此檔案的內容,通常這個檔案會放置歡迎話語,或是對該目錄的說明。默認值為開啟。
message_file=.message
設置目錄消息文件,可將要顯示的信息寫入該文件。默認值為.message。
banner_file=/etc/vsftpd/banner
當使用者登入時,會顯示此設定所在的檔案內容,通常為歡迎話語或是說明。默認值為無。如果歡迎信息較多,則使用該配置項。
ftpd_banner=Welcome to BOB's FTP server
這里用來定義歡迎話語的字符串,banner_file是檔案的形式,而ftpd_banner 則是字符串的形式。預設為無。
控制用戶是否允許切換到上級目錄
在默認配置下,本地用戶登入FTP后可以使用cd命令切換到其他目錄,這樣會對系統帶來安全隱患。可以通過以下三條配置文件來控制用戶切換目錄。
chroot_list_enable=YES/NO(NO)
設置是否啟用chroot_list_file配置項指定的用戶列表文件。默認值為NO。
chroot_list_file=/etc/vsftpd.chroot_list
用於指定用戶列表文件,該文件用於控制哪些用戶可以切換到用戶家目錄的上級目錄。
chroot_local_user=YES/NO(NO)
用於指定用戶列表文件中的用戶是否允許切換到上級目錄。默認值為NO。
通過搭配能實現以下幾種效果:
①當chroot_list_enable=YES,chroot_local_user=YES時,在/etc/vsftpd.chroot_list文件中列出的用戶,可以切換到其他目錄;未在文件中列出的用戶,不能切換到其他目錄。
②當chroot_list_enable=YES,chroot_local_user=NO時,在/etc/vsftpd.chroot_list文件中列出的用戶,不能切換到其他目錄;未在文件中列出的用戶,可以切換到其他目錄。
③當chroot_list_enable=NO,chroot_local_user=YES時,所有的用戶均不能切換到其他目錄。
④當chroot_list_enable=NO,chroot_local_user=NO時,所有的用戶均可以切換到其他目錄。
數據傳輸模式設置
FTP在傳輸數據時,可以使用二進制方式,也可以使用ASCII模式來上傳或下載數據。
ascii_upload_enable=YES/NO(NO)
設置是否啟用ASCII 模式上傳數據。默認值為NO。
ascii_download_enable=YES/NO(NO)
設置是否啟用ASCII 模式下載數據。默認值為NO。
訪問控制設置
兩種控制方式:一種控制主機訪問,另一種控制用戶訪問。
①控制主機訪問:
tcp_wrappers=YES/NO(YES)
設置vsftpd是否與tcp wrapper相結合來進行主機的訪問控制。默認值為YES。如果啟用,則vsftpd服務器會檢查/etc/hosts.allow 和/etc/hosts.deny 中的設置,來決定請求連接的主機,是否允許訪問該FTP服務器。這兩個文件可以起到簡易的防火牆功能。
比如:若要僅允許192.168.0.1—192.168.0.254的用戶可以連接FTP服務器,則在/etc/hosts.allow文件中添加以下內容:
vsftpd:192.168.0. :allow
all:all :deny
②控制用戶訪問:
對於用戶的訪問控制可以通過/etc目錄下的vsftpd.user_list和ftpusers文件來實現。
userlist_file=/etc/vsftpd.user_list
控制用戶訪問FTP的文件,里面寫着用戶名稱。一個用戶名稱一行。
userlist_enable=YES/NO(NO)
是否啟用vsftpd.user_list文件。
userlist_deny=YES/NO(YES)
決定vsftpd.user_list文件中的用戶是否能夠訪問FTP服務器。若設置為YES,則vsftpd.user_list文件中的用戶不允許訪問FTP,若設置為NO,則只有vsftpd.user_list文件中的用戶才能訪問FTP。
/etc/vsftpd/ftpusers文件專門用於定義不允許訪問FTP服務器的用戶列表(注意:如果userlist_enable=YES,userlist_deny=NO,此時如果在vsftpd.user_list和ftpusers中都有某個用戶時,那么這個用戶是不能夠訪問FTP的,即ftpusers的優先級要高)。默認情況下vsftpd.user_list和ftpusers,這兩個文件已經預設置了一些不允許訪問FTP服務器的系統內部賬戶。如果系統沒有這兩個文件,那么新建這兩個文件,將用戶添加進去即可。
訪問速率設置
anon_max_rate=0
設置匿名登入者使用的最大傳輸速度,單位為B/s,0 表示不限制速度。默認值為0。
local_max_rate=0
本地用戶使用的最大傳輸速度,單位為B/s,0 表示不限制速度。預設值為0。
超時時間設置
accept_timeout=60
設置建立FTP連接的超時時間,單位為秒。默認值為60。
connect_timeout=60
PORT 方式下建立數據連接的超時時間,單位為秒。默認值為60。
data_connection_timeout=120
設置建立FTP數據連接的超時時間,單位為秒。默認值為120。
idle_session_timeout=300
設置多長時間不對FTP服務器進行任何操作,則斷開該FTP連接,單位為秒。默認值為300 。
日志文件設置
xferlog_enable= YES/NO(YES)
是否啟用上傳/下載日志記錄。如果啟用,則上傳與下載的信息將被完整紀錄在xferlog_file 所定義的檔案中。預設為開啟。
xferlog_file=/var/log/vsftpd.log
設置日志文件名和路徑,默認值為/var/log/vsftpd.log。
xferlog_std_format=YES/NO(NO)
如果啟用,則日志文件將會寫成xferlog的標准格式,如同wu-ftpd 一般。默認值為關閉。
log_ftp_protocol=YES|NO(NO)
如果啟用此選項,所有的FTP請求和響應都會被記錄到日志中,默認日志文件在/var/log/vsftpd.log。啟用此選項時,xferlog_std_format不能被激活。這個選項有助於調試。默認值為NO。定義用戶配置文件
在vsftpd中,可以通過定義用戶配置文件來實現不同的用戶使用不同的配置。
user_config_dir=/etc/vsftpd/userconf
設置用戶配置文件所在的目錄。當設置了該配置項后,用戶登陸服務器后,系統就會到/etc/vsftpd/userconf目錄下,讀取與當前用戶名相同的文件,並根據文件中的配置命令,對當前用戶進行更進一步的配置。
例如:定義user_config_dir=/etc/vsftpd/userconf,且主機上有使用者 test1,test2,那么我們就在user_config_dir 的目錄新增文件名為test1和test2兩個文件。若是test1 登入,則會讀取user_config_dir 下的test1 這個檔案內的設定。默認值為無。利用用戶配置文件,可以實現對不同用戶進行訪問速度的控制,在各用戶配置文件中定義local_max_rate=XX,即可。
FTP的工作方式與端口設置
FTP有兩種工作方式:PORT FTP(主動模式)和PASV FTP(被動模式)
listen_port=21
設置FTP服務器建立連接所監聽的端口,默認值為21。
connect_from_port_20=YES/NO
指定FTP使用20端口進行數據傳輸,默認值為YES。
ftp_data_port=20
設置在PORT方式下,FTP數據連接使用的端口,默認值為20。
pasv_enable=YES/NO(YES)
若設置為YES,則使用PASV工作模式;若設置為NO,則使用PORT模式。默認值為YES,即使用PASV工作模式。
pasv_max_port=0
在PASV工作模式下,數據連接可以使用的端口范圍的最大端口,0 表示任意端口。默認值為0。
pasv_min_port=0
在PASV工作模式下,數據連接可以使用的端口范圍的最小端口,0 表示任意端口。默認值為0。
與連接相關的設置
listen=YES/NO(YES)
設置vsftpd服務器是否以standalone模式運行。以standalone模式運行是一種較好的方式,此時listen必須設置為YES,此為默認值。建議不要更改,有很多與服務器運行相關的配置命令,需要在此模式下才有效。若設置為NO,則vsftpd不是以獨立的服務運行,要受到xinetd服務的管控,功能上會受到限制。
max_clients=0
設置vsftpd允許的最大連接數,默認值為0,表示不受限制。若設置為100時,則同時允許有100個連接,超出的將被拒絕。只有在standalone模式運行才有效。
max_per_ip=0
設置每個IP允許與FTP服務器同時建立連接的數目。默認值為0,表示不受限制。只有在standalone模式運行才有效。
listen_address=IP地址
設置FTP服務器在指定的IP地址上偵聽用戶的FTP請求。若不設置,則對服務器綁定的所有IP地址進行偵聽。只有在standalone模式運行才有效。
setproctitle_enable=YES/NO(NO)
設置每個與FTP服務器的連接,是否以不同的進程表現出來。默認值為NO,此時使用ps aux |grep ftp只會有一個vsftpd的進程。若設置為YES,則每個連接都會有一個vsftpd的進程。
虛擬用戶設置
虛擬用戶使用PAM認證方式。
pam_service_name=vsftpd
設置PAM使用的名稱,默認值為/etc/pam.d/vsftpd。
guest_enable= YES/NO(NO)
啟用虛擬用戶。默認值為NO。
guest_username=ftp
這里用來映射虛擬用戶。默認值為ftp。
virtual_use_local_privs=YES/NO(NO)
當該參數激活(YES)時,虛擬用戶使用與本地用戶相同的權限。當此參數關閉(NO)時,虛擬用戶使用與匿名用戶相同的權限。默認情況下此參數是關閉的(NO)。
其他設置
text_userdb_names= YES/NO(NO)
設置在執行ls –la之類的命令時,是顯示UID、GID還是顯示出具體的用戶名和組名。默認值為NO,即以UID和GID方式顯示。若希望顯示用戶名和組名,則設置為YES。
ls_recurse_enable=YES/NO(NO)
若是啟用此功能,則允許登入者使用ls –R(可以查看當前目錄下子目錄中的文件)這個指令。默認值為NO。
hide_ids=YES/NO(NO)
如果啟用此功能,所有檔案的擁有者與群組都為ftp,也就是使用者登入使用ls -al之類的指令,所看到的檔案擁有者跟群組均為ftp。默認值為關閉。
download_enable=YES/NO(YES)
如果設置為NO,所有的文件都不能下載到本地,文件夾不受影響。默認值為YES。
-
響應代碼解釋說明
110新文件指示器上的重啟標記
120服務器准備就緒的時間(分鍾數)
125打開數據連接,開始傳輸
150打開連接
200成功
202命令沒有執行
211系統狀態回復
212目錄狀態回復
213文件狀態回復
214幫助信息回復
215系統類型回復
220服務就緒
221退出網絡
225打開數據連接
226結束數據連接
227進入被動模式(IP 地址、ID 端口)
230登錄因特網
250文件行為完成
257路徑名建立
331要求密碼
332要求帳號
350文件行為暫停
421服務關閉
425無法打開數據連接
426結束連接
450文件不可用
451遇到本地錯誤
452磁盤空間不足
500無效命令
501錯誤參數
502命令沒有執行
503錯誤指令序列
504無效命令參數
530未登錄網絡
532存儲文件需要帳號
550文件不可用
551不知道的頁類型
552超過存儲分配
553文件名不允許
-
yum本地服務器源
服務端:
yum -y install vsftpd
mount /dev/sr0 /var/ftp/
service vsftpd start
客戶端:
yum -y install ftp
vim /etc/yum.repos.d/CentOS-Media.repo
baseurl=ftp://192.168.10.100
yum list
測試安裝
-
-
samba
-
原理
作用:客戶機通過該協議可以訪問服務器上的共享文件系統、打印機及其他資源。
協議:
smb協議:服務信息塊,為上層應用提供一個網絡訪問文件的接口
NMB協議:主機名與ip的解析
CIFS協議:通用文件互聯系統,CIFS+wins=局域網共享(windows)
Linux 之間的資源共享:NFS協議(網絡文件系統)
Windows之間的資源共享:CIFS協議
特點:
不支持公網傳輸
支持在服務器端直接修改文件內容(網絡磁盤)
-
實驗
准備環境:
關閉防火牆和selinux
yum -y install samba 服務器端安裝samba
yum -y install samba-client 客戶機安裝
yum -y install samba-common 客戶機安裝
步驟
- useradd 用戶名 -s /sbin/nologin
#創建linux用戶,指定不能登入系統
- pdbedit –a zhangsan
#轉換為samba用戶
- cp -a /etc/samba/smb.conf /etc/samba/smb.conf.bak
#需要刪除內容,先備份
-
添加自定義共享
[共享名]
comment = the share is zdy
path = /share/zdy
public = yes
browseable = yes
writable = yes
-
創建共享目錄並給定777權限,用smb控制權限
mkdir 目錄
chmod 777 目錄
-
測試配置文件並重啟服務
啟動:service smb start
重啟:testparm
-
登錄測試(上傳下載)
Window端:\\ip地址\共享名(網絡驅動器映射)
Linux端:smbclient -U 用戶名 //IP地址/共享名
-
客戶端查看共享文件夾並登錄測試
smbcient -U zhangsan –L IP地址
- 實驗類型
部分用戶登錄samba服務器
修改:/etc/samba/smb.conf
#自定義的共享區域
添加:valid users = 用戶,@組(多個逗號分隔)
#設置合法用戶列表
部分用戶對共享區域有寫權限
修改:/etc/samba/smb.conf
#自定義的共享區域
添加:開啟只讀,設置可寫列表
read only = yes
write list = 用戶名或@組
設置上傳文件的默認權限
修改:/etc/samba/smb.conf
添加:
create mask = 666 #文件上傳默認權限
directory mask = 777 #目錄上傳默認權限
設置用戶別名
添加別名(/etc/samba/smbusers)
添加:
zhangsan = zs
啟用別名(修改主配置文件)
vim /etc/samba/smb.conf
添加:
username map = /etc/samba/smbusers(要在全局配置寫)
Linux下掛載共享目錄
臨時掛載:
mount -t cifs -o username=xxx,password=xxx //服務器ip/服務器共享 /本地掛載目錄
永久掛載:
//服務器ip/服務器共享 /本地掛載目錄 cifs defaults,username=xxx,password=xxx 0 0
映射網絡驅動器Window下
我的電腦、計算機、此電腦、這台電腦等右鍵映射網絡驅動器:\\服務器IP\共享名
圖形化界面(centos中)
安裝(導入安裝包samba-swat)
使用yum -y install * 安裝所有上傳的rpm包
修改/etc/xinetd.d/swat
添加:
only_from = 登錄來源IP/24
disable = no
重啟xinetd服務:
service xinetd restart
測試:
瀏覽器:IP:901 #登錄時注意端口號,用戶名用root
-
相關命令
testparm #檢查配置文件語法問題
testparm -v #顯示samba所有支持的選項
pdbedit -a username #新建Samba賬戶
pdbedit -x username #刪除Samba賬戶
pdbedit -L #列出Samba用戶列表,讀取passdb.tdb數據庫文件
pdbedit -Lv #列出Samba用戶列表的詳細信息
pdbedit -c "[D]" -u username #暫停該Samba用戶的賬號
pdbedit -c "[]" -u username #恢復該Samba用戶的賬號
smbclient -U 用戶名 //服務器ip/共享名 #登入指定用戶服務器共享
smbclient -U 用戶名 -L 服務器IP #查看共享目錄
windows連接相關命令
\\服務器ip\共享名 #映射網絡驅動器格式,samba用戶登入
net use * /del #清空登錄緩存,命令提示符輸入
- 配置詳解
配置文件
smb.conf #主配置文件
lmhosts #類似於hosts 文件,用來進行主機名和ip的解析
smbusers #別名配置文件
自定義共享參數
[共享名]
#共享名
comment = 任意字符串
# comment是對該共享的描述,可以是任意字符串
path = 共享目錄路徑
# path用來指定共享目錄的路徑
browseable = yes/no
#用來指定該共享是否可以瀏覽查看
writable = yes/no
#writable用來指定該共享路徑是否可寫
available = yes/no
#用來指定該共享資源是否可用
admin users = 該共享的管理者
#用來指定該共享的管理員(對該共享具有完全控制權限)
valid users = 允許訪問該共享的用戶
# valid users用來指定允許訪問該共享資源的用戶,多個用戶或者組中間用逗號隔開,如果要加入一個組就用"@+組名"表示
invalid users = 禁止訪問該共享的用戶
# invalid users用來指定不允許訪問該共享資源的用戶
read only = yes
#只讀
write list = 允許寫入該共享的用戶
#用來指定可以在該共享下寫入文件的用戶
public = yes/no
#用來指定該共享是否允許guest賬戶訪問
guest ok = yes/no
#用來指定該共享是否允許guest賬戶訪問
[global]全局參數
config file = /usr/local/samba/lib/smb.conf.%m
#可以讓一台samba服務器模擬多台不同配置的服務器
1.先在/etc/samba/host/下為PC1配置一個名為smb.conf.pc1的文件
2.在smb.conf中加入:config file = /etc/samba/host/smb.conf.%m
3.那么主機名為PC1,訪問服務器,訪問的是smb.conf.pc1配置
workgroup = WORKGROUP
#Samba Server 所要加入的工作組或者域
server string = Samba Server Version %v
#Samba Server 的注釋,宏%v表示顯示Samba的版本號
netbios name = smbserver
#NetBIOS名稱,如果不填,則默認會使用該服務器的DNS名稱的第一部分,netbios name和workgroup名字不要設置成一樣了
interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
#監聽網卡,可以寫網卡名,也可以寫該網卡的IP地址
hosts allow = 127. 192.168.1. 192.168.10.1
#允許連接的客戶端,hosts deny 與hosts allow 剛好相反
例:hosts allow=172.17.2.EXCEPT172.17.2.50
#表示容許來自172.17.2.*.*的主機連接,但排除172.17.2.50
例:hosts allow=172.17.2.0/255.255.0.0
#表示容許來自172.17.2.0/255.255.0.0子網中的所有主機連接
例:hosts allow=M1,M2
#表示容許來自M1和M2兩台計算機連接(主機名)
例:hosts allow=@xq
#表示容許來自XQ網域的所有計算機連接
max connections = 0
#連接Samba Server的最大連接數目,0表示不限制
deadtime = 0
#斷掉沒有打開任何文件的連接的時間,單位是分鍾,0代表不自動切斷任何連接
log file = /var/log/samba/log.%m
#日志文件的存儲位置以及日志文件名稱,宏%m(主機名)表示客戶端單獨日志
max log size = 50
#日志文件的最大容量,單位為kB,0代表不限制
security = user
#centos7z中share級別無法使用,如果需要使用,在user底下添加map to guest = Bad User
#設置用戶訪問Samba Server的驗證方式,一共有四種驗證方式
# share:用戶訪問不需要提供用戶名和口令, 安全性能較低
# user:共享目錄只能被授權的用戶訪問,由Samba Server負責檢查賬號和密碼的正確性,賬號和密碼要在本Samba Server中建立
# server:依靠其他Windows NT/2000或Samba Server來驗證用戶的賬號和密碼,是一種代理驗證。此種安全模式下,系統管理員可以把所有的Windows用戶和口令集中到一個NT系統上,使用Windows NT進行Samba認證, 遠程服務器可以自動認證全部用戶和口令,如果認證失敗,Samba將使用用戶級安全模式作為替代的方式
# domain:域安全級別,使用主域控制器(PDC)來完成認證
passdb backend = tdbsam
# passdb backend就是用戶后台的意思
#smbpasswd:該方式是使用smb自己的工具smbpasswd來給系統用戶(真實用戶或者虛擬用戶)設置一個Samba密碼,客戶端就用這個密碼來訪問Samba的資源。smbpasswd文件默認在/etc/samba目錄下,不過有時候要手工建立該文件
# tdbsam:該方式則是使用一個數據庫文件來建立用戶數據庫。數據庫文件叫passdb.tdb,默認在/etc/samba目錄下。passdb.tdb用戶數據庫可以使用smbpasswd –a來建立Samba用戶,不過要建立的Samba用戶必須先是系統用戶。我們也可以使用pdbedit命令來建立Samba賬戶。pdbedit命令的參數很多,我們列出幾個主要的
# ldapsam:該方式則是基於LDAP的賬戶管理方式來驗證用戶。首先要建立LDAP服務,然后設置"passdb backend = ldapsam:ldap://LDAP Server"
encrypt passwords = yes/no
#是否將認證密碼加密,配置文件默認已開啟
username map = /etc/samba/smbusers
#用來定義用戶名映射,也就是別名
guest account = nobody
#用來設置guest用戶名,也就是匿名用戶
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
#用來設置服務器和客戶端之間會話的Socket選項,可以優化傳輸速度
domain master = yes/no
#:設置Samba服務器是否要成為網域主瀏覽器,網域主瀏覽器可以管理跨子網域的瀏覽服務
local master = yes/no
#是否試圖成為本地網域主瀏覽器,如果設為no,則永遠不會成為本地網域主瀏覽器。但是即使設置為yes,也不等於該Samba Server就能成為主瀏覽器,還需要參加選舉
preferred master = yes/no
#設置Samba Server一開機就強迫進行主瀏覽器選舉,可以提高Samba Server成為本地網域主瀏覽器的機會。如果該參數指定為yes時,最好把domain master也指定為yes。使用該參數時要注意:如果在本Samba Server所在的子網有其他的機器(不論是windows NT還是其他Samba Server)也指定為首要主瀏覽器時,那么這些機器將會因為爭奪主瀏覽器而在網絡上大發廣播,影響網絡性能,如果同一個區域內有多台Samba Server,將上面三個參數設定在一台即可
os level = 200
#設置samba服務器的os level。該參數決定Samba Server是否有機會成為本地網域的主瀏覽器。os level從0到255,winNT的os level是32,win95/98的os level是1。Windows 2000的os level是64。如果設置為0,則意味着Samba Server將失去瀏覽選擇。如果想讓Samba Server成為PDC,那么將它的os level值設大些
domain logons = yes/no
#設置Samba Server是否要做為本地域控制器。主域控制器和備份域控制器都需要開啟此項
logon . = %u.bat
#當使用者用windows客戶端登陸,那么Samba將提供一個登陸檔。如果設置成%u.bat,那么就要為每個用戶提供一個登陸檔。如果人比較多,那就比較麻煩。可以設置成一個具體的文件名,比如start.bat,那么用戶登陸后都會去執行start.bat,而不用為每個用戶設定一個登陸檔了。這個文件要放置在[netlogon]的path設置的目錄路徑下
wins support = yes/no
#設置samba服務器是否提供wins服務
wins server = wins服務器IP地址
#設置Samba Server是否使用別的wins服務器提供wins服務
wins proxy = yes/no
#設置Samba Server是否開啟wins代理服務
dns proxy = yes/no
#設置Samba Server是否開啟dns代理服務
load printers = yes/no
#設置是否在啟動Samba時就共享打印機
printcap name = cups
#設置共享打印機的配置文件
printing = cups
#設置Samba共享打印機的類型現在支持的打印系統有:bsd, sysv, plp, lprng, aix, hpux, qnx
-
-
網絡服務—NFS
什么是NFS
NFS 是Network File System的縮寫,即網絡文件系統,它的主要功能是通過網絡讓不同的機器系統之間可以彼此共享文件和目錄,NFS一般用來存儲共享視頻,圖片等靜態數據。

-
NFS通信原理
1)首先服務器端啟動RPC服務,並開啟111端口
2)啟動NFS服務,並向RPC注冊端口信息
3)客戶端啟動RPC(portmap服務),向服務端的RPC(portmap)服務請求服務端的NFS端口
4)服務端的RPC(portmap)服務反饋NFS端口信息給客戶端。
5)客戶端通過獲取的NFS端口來建立和服務端的NFS連接並進行數據的傳輸。

-
NFS服務搭建流程
- 關閉防火牆和selinux
-
安裝軟件
- rpcbind:支持安全NFS RPC服務的連接
- nfs-utils:包括基本的NFS命令與監控程序
- 修改配置文件/etc/exports
共享目錄客戶端1(訪問權限,用戶映射,其他)客戶端2(訪問權限,用戶映射,其他)
例:/nfs 192.168.10.0/24(rw,all_squash,anonuid=501,anongid=501)
客戶端常用的指定方式:
指定ip地址的主機:192.168.0.200
指定子網中的所有主機:192.168.0.0/24 192.168.0.0/255.255.255.0
指定域名的主機:www.linuxlc.com
指定域中的所有主機:*.linuxlc.com
所有主機:*
-
啟動服務和自啟動
- 先啟動RPC:service rpcbind start
- 再啟動NFS:service nfs start
- chkconfig 服務 on/off
- chkconfig --list 服務
- 查看rpcinfo -p localhost是否有nfs端口
- 修改服務器共享目錄權限,否則客戶端無法創建文件
-
客戶端掛載服務端共享目錄
- 臨時:mount -o vers=3 192.168.10.100:/nfs/ /mou
- 永久/etc/fstab: 192.168.10.100:/nfs /mou nfs defaults 0 0
-
如果修改配置文件,重啟服務多種方法
- exportfs -ra
- service nfs restart
- 訪問客戶端掛載目錄,自由設置服務端權限測試
nfs相關命令
- exportfs
格式:exportfs [-aruv]
-a 全部
-r 重新讀取/etc/exports 中的信息 ,並同步更新/etc/exports、/var/lib/nfs/xtab
-u 卸載單一目錄(和-a一起使用為卸載所有/etc/exports文件中的目錄)
-v 在export的時候,將詳細的信息輸出到屏幕上。
具體例子:
# exportfs -au 卸載所有共享目錄
# exportfs -ra 重新共享所有目錄
- rpcinfo -p 可以查看出RPC開啟的端口所提供的程序有哪些其中nfs 開啟的是2049,portmapper(rpcbind) 開啟的是111,其余則是rpc開啟的
- showmount -e NFS服務器IP #客戶機查看服務器共享目錄
-
服務器查看共享目錄
- showmount –e 本機ip
- exportfs
nfs相關權限內容
- 訪問權限選項
- 設置輸出目錄只讀:ro
- 設置輸出目錄讀寫:rw
- 用戶映射選項:
- root_squash:將root用戶的訪問映射為匿名(nfsnobody)用戶uid和gid
- no_root_squash:保留管理員權限,以服務器管理員的權限管理(客戶機以當前身份創建文件)
- all_squash:將遠程訪問的用戶及所屬組都映射為指定uid、gid的匿名用戶
- anonuid=xxx:將遠程訪問的所有用戶都映射為指定uid的匿名用戶
- anongid=xxx:將遠程訪問的所有用戶組都映射為指定gid匿名組賬戶
- 其它選項
- sync:將數據同步寫入內存緩沖區與磁盤中,效率低,但可以保證數據的一致性(同步)
- async:將數據先保存在內存緩沖區中,必要時才寫入磁盤(異步)
-
-
nfs ,ftp,tftp 和samba區別
NFS:Network File System 是已故的Sun公司制定的用於分布式訪問的文件系統,它的本質是文件系統。主要在Unix系列操作系統上使用,基於TCP/IP協議層,可以將遠程的計算機磁盤掛載到本地,像本地磁盤一樣操作。
samba是Unix系統下實現的 Windows文件共享協議-CIFS,由於Windows共享是基於NetBios協議,是基於Ethernet的廣播協議,在沒有透明網橋的情況下(如VPN)是不能跨網段使用的。它主要用於unix和windows系統進行文件和打印機共享,也可以通過samba套件中的程序掛載到本地使用。
FTP的目的是在Internet上共享文件而發明的一種協議,基於TCP/IP。世界上絕大多數系統都會有支持FTP的工具存在,通用性很強。目前少有人把VPS修改成支持FTP組件的形式,主要是因為FTP一開始就不是為了文件系統而設計的。
三種協議雖然都可以支持文件共享,但是其功能點和側重點上面各有所不同,協議格式不同。Authentication(鑒定)也就是你說的登陸方式也會隨着協議的內容也有所不同。
標准的FTP協議的登陸密碼是用明文傳輸的,沒有加密,這會有很大的安全隱患,目前有FTPs(FTP on SSL/TLS)和sFTP(SSH FTP)等基於通信層進行加密的FTP協議,這樣會有更好的安全性。
NFS的鑒定機制是基於IP地址的,沒有密碼這種東西。是控制本地映射的用戶權限來控制訪問者的權
ftp_tftp_nfs三種文件傳輸協議的區別
文件傳送協議FTP(File Transfer Protocol)是Internet上使用比較廣泛的文件傳送協議。FTP提供交互式的訪問,允許客戶指明文件的類型與格式,並允許文件具有存取權限。FTP屏蔽了各種計算機系統的細節,因此適用於在異構網絡中任意計算機之間傳送文件。它的基本應用就是將文件從一台計算機復制到另一台計算機中。它要存取一個文件,就必須先獲得一個本地文件的副本,如果修改文件,也只能對文件的副本進行修改,然后再將修改后的文件副本傳回到原節點。
您只要記住幾個關鍵詞:交互式、存取權限和副本。
簡單文件傳送協議TFTP(Trivial File Transfer Protocol)是一個小而易於實現的文件傳送協議。TFTP是基於UDP數據報,需要有自己的差錯改正措施。TFTP只支持文件傳輸,不支持交互,沒有龐大的命令集。也沒有目錄列表功能,以及不能對用戶進行身份鑒別。但它的代碼所占內存較小,不需要硬盤就可以固化TFTP代碼,很適合較小的計算機和特殊用途的設備。
您會發現TFTP和FTP一個主要的區別就是它沒有交互式,且不進行身份驗證。
NFS最初應用於UNIX操作系統下,它允許應用進程打開一個遠地文件,並能夠在該文件中某一個特定位置上開始讀寫數據。
FTP在修改數據文件時是需要首先獲得一個文件的副本,如果計算機A上運行的應用程序要在遠地計算機B的一個很大的文件中添加一行信息。那么就需要將此文件從計算機B傳送到計算機A,添加好信息后再回傳到計算機B。來回傳輸這樣大的文件很花費時間,而這種傳送是不必要的。而NFS可使用戶只復制一個大文件中的一個很小的片段,在網絡上傳送的只是少量的修改數據。
-
LAMP環境搭建
-
准備工作
- 安裝編譯工具gcc、gcc-c++
yum -y install gcc gcc-c++
或yum -y install gcc*
- 關閉系統RPM安裝包的Apache、MySQL的服務
service httpd stop
service mysqld stop
chkconfig --level 2345 httpd(mysqld) off
- 關閉SELinux,允許防火牆80端口訪問
vim /etc/selinux/config
SELINUX=disabled
修改后需重新啟動Linux方可生效!
- 關閉防火牆Netfilter/iptables
iptables -F * 如果沒有禁用防火牆,默認80端口禁止訪問
iptables –A INPUT –p tcp –dport 80 –j ACCEPT
iptables -Z
iptables -X
-
關閉不必要自啟動服務
# ntsysv
以下列出服務可保持自啟動,未列出的服務都可以關閉:
atd
crond # atd、crond計划任務
irqbalance
microcode_ctl # 系統irq端口調用,系統服務
network #網絡設置
sendmail #郵件
sshd #遠程管理
syslog #系統日志
- 查看確認磁盤空間未滿
df -h
- 如何確定報錯
安裝過程停止
停止后,一頁界面中出現error或者warning
如何確定安裝成功
進入安裝目錄,確認安裝程序出現,就是成功
-
安裝步驟
- 拷貝源碼包,解包解壓縮
建議將LAMP環境安裝源碼包統一存放在一個目錄下,如/lamp
可編寫個批量處理腳本,一次性把所有.tar.gz的安裝包解包解壓縮
# vim tar.sh
cd /lamp
/bin/ls *.tar.gz > ls.list
for TAR in `cat ls.list`
do
/bin/tar -zxf $TAR
done
/bin/rm ls.list
- 安裝libxml2
Libxml2 是一個xml c語言版的解析器, 它除了支持c語言版以外,還支持c++、PHP、Pascal、Ruby、Tcl等語言的綁定,能在Windows、Linux、Solaris、MacOsX等平台上運行
yum install -y libxml2-devel python-devel
cd /lamp/libxml2-2.9.1 && ./configure --prefix=/usr/local/libxml2/ && make && make install && echo $?
- 安裝libmcrypt
libmcrypt是加密算法擴展庫。支持DES, 3DES, RIJNDAEL, Twofish, IDEA, GOST, CAST-256, ARCFOUR, SERPENT, SAFER+等算法
cd /lamp/libmcrypt-2.5.8 && ./configure --prefix=/usr/local/libmcrypt/ && make && make install && echo $?
- 安裝libltdl,也在libmcrypt源碼目錄中,非新軟件
cd /lamp/libmcrypt-2.5.8/libltdl && ./configure --enable-ltdl-install && make && make install && echo $?
- 安裝mhash
Mhash是基於離散數學原理的不可逆向的php加密方式擴展庫,其在默認情況下不開啟。mhash的可以用於創建校驗數值,消息摘要,消息認證碼,以及無需原文的關鍵信息保存(如密碼)等
cd /lamp/mhash-0.9.9.9 && ./configure && make && make install && echo $?
- 安裝mcrypt
mcrypt 是 php 里面重要的加密支持擴展庫。Mcrypt庫支持20多種加密算法和8種加密模式LD_LIBRARY_PATH用於指定libmcrypt和mhash的庫的位置--with-libmcrypt-prefix用於指定libmcrypt軟件位置
cd /lamp/mcrypt-2.6.8 && LD_LIBRARY_PATH=/usr/local/libmcrypt/lib:/usr/local/lib ./configure --with-libmcrypt-prefix=/usr/local/libmcrypt && make && make install && echo $?
- 安裝zlib
zlib是提供數據壓縮用的函式庫
針對64位:cd /lamp/zlib-1.2.3 && ./configure && sed -i 's/CFLAGS=-O3 -DUSE_MMAP.*/CFLAGS=-O3 -DUSE_MMAP -fPIC/g' Makefile && make &&make install && echo $?
zlib指定安裝目錄可能造成libpng安裝失敗,故不指定,為卸載方便,建議make install執行結果輸出到安裝日志文件,便於日后卸載
針對32位:cd /lamp/zlib-1.2.3 && ./configure && make && make install && echo $?
- 安裝libpng
libpng 軟件包包含 libpng 庫.這些庫被其他程式用於解碼png圖片
cd /lamp/libpng-1.2.31 && ./configure --prefix=/usr/local/libpng && make && make install && echo $?
- 安裝jpeg6
用於解碼.jpg和.jpeg圖片, --enable-shared與--enable-static參數分別為建立共享庫和靜態庫使用的libtool
mkdir -p /usr/local/jpeg6 /usr/local/jpeg6/bin /usr/local/jpeg6/lib /usr/local/jpeg6/include /usr/local/jpeg6/man/man1
cd /lamp/jpeg-6b
yum -y install libtool*
\cp /usr/share/libtool/config/config.sub ./
\cp /usr/share/libtool/config/config.guess ./(64位中的問題,32位沒有此報錯)
./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static && make && make install && echo $?
- 安裝freetype
FreeType庫是一個完全免費(開源)的、高質量的且可移植的字體引擎,它提供統一的接口來訪問多種字體格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。支持單色位圖、反走樣位圖的渲染。FreeType庫是高度模塊化的程序庫,雖然它是使用ANSI C開發,但是采用面向對象的思想,因此,FreeType的用戶可以靈活地對它進行裁剪。
cd /lamp/freetype-2.3.5 && ./configure --prefix=/usr/local/freetype/ && make && make install && echo $?
- 安裝Apache
若前面配置zlib時沒有指定安裝目錄,Apache配置時不要添加--with-z=/usr/local/zlib/參數
yum -y install openssl-devel
cp -r /lamp/apr-1.4.6 /lamp/httpd-2.4.7/srclib/apr
cp -r /lamp/apr-util-1.4.1 /lamp/httpd-2.4.7/srclib/apr-util
cd /lamp/pcre-8.34 && ./configure && make && make install && echo $?
cd /lamp/httpd-2.4.7 && ./configure --prefix=/usr/local/apache2 --sysconfdir=/usr/local/apache2/etc --with-included-apr --enable-so --enable-deflate=shared --enable-expires=shared --enable-rewrite=shared && make && make install && echo $?
自啟動:echo "/usr/local/apache2/bin/apachectl start" >> /etc/rc.d/rc.local
- 安裝ncurses
Ncurses 提供字符終端處理庫,包括面板和菜單
如果報錯,包找不到,是*通配符沒有識別,給文件名加雙引號 "ncurses*"
若不安裝ncurses編譯MySQL時會報錯
--without-ada參數為設定不編譯為ada綁定,因進入chroot環境不能使用ada ;--enable-overwrite參數為定義把頭文件安裝到/tools/include下而不是/tools/include/ncurses目錄
--with-shared 生成共享庫
yum -y install ncurses-devel
cd /lamp/ncurses-5.9 && ./configure --with-shared --without-debug --without-ada --enable-overwrite && make && make install && echo $?
- 安裝cmake和bison
mysql在5.5以后,不再使用./configure工具,進行編譯安裝。而使用cmake工具替代了./configure工具。cmake的具體用法參考文檔cmake說明
yum -y install cmake bison
- 安裝MySQL
useradd -r -s /sbin/nologin mysql
#添加用戶組mysql ,將mysql用戶默認組設置為mysql用戶組
cd /lamp/mysql-5.5.48 && cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306 && make && make install && echo $?
cd /usr/local/mysql/
chown -R root .
chown -R mysql data
cp support-files/my-medium.cnf /etc/my.cnf
/usr/local/mysql/scripts/mysql_install_db --user=mysql
#創建數據庫授權表,初始化數據庫
/usr/local/mysql/bin/mysqld_safe --user=mysql &
#用原本源代碼的方式去使用和啟動mysql
/usr/local/mysql/bin/mysqladmin -uroot password 123
#設定mysql密碼
/usr/local/mysql/bin/mysql -u root -p
#登錄MySQL
echo "/usr/local/mysql/bin/mysqld_safe --user=mysql &" >> etc/rc.local
#自啟動
make clean
rm CMakeCache.txt
#如果報錯,清除緩存,請使用以上命令
- 安裝PHP
若前面配置zlib時沒有指定安裝目錄,PHP配置時不要添加--with-zlib-dir=/usr/local/zlib/參數
選項:
--with-config-file-path=/usr/local/php/etc/ 指定配置文件目錄
--with-apxs2=/usr/local/apache2/bin/apxs 指定apache動態模塊位置
--with-libxml-dir=/usr/local/libxml2/ 指定libxml位置
--with-jpeg-dir=/usr/local/jpeg6/ 指定jpeg位置
--with-png-dir=/usr/local/libpng/ 指定libpng位置
--with-freetype-dir=/usr/local/freetype/ 指定freetype位置
--with-mcrypt=/usr/local/libmcrypt/ 指定libmcrypt位置
--with-mysqli=/usr/local/mysql/bin/mysql_config 指定mysql位置
--with-gd 啟用gd庫
--enable-soap 支持soap服務
--enable-mbstring=all 支持多字節,字符串
--enable-sockets 支持套接字
--with-pdo-mysql=/usr/local/mysql 啟用mysql的pdo模塊支持
--without-pear 不安裝pear(安裝pear需要連接互聯網,PEAR是PHP擴展與應用庫)
cd /lamp/php-7.0.7 && ./configure --prefix=/usr/local/php/ --with-config-file-path=/usr/local/php/etc/ --with-apxs2=/usr/local/apache2/bin/apxs --with-libxml-dir=/usr/local/libxml2/ --with-jpeg-dir=/usr/local/jpeg6/ --with-png-dir=/usr/local/libpng/ --with-freetype-dir=/usr/local/freetype/ --with-mcrypt=/usr/local/libmcrypt/ --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-soap --enable-mbstring=all --enable-sockets --with-pdo-mysql=/usr/local/mysql --with-gd --without-pear && make && make install && echo $?
mkdir /usr/local/php/etc/
cp /lamp/php-7.0.7/php.ini-production /usr/local/php/etc/php.ini
vim /usr/local/apache2/etc/httpd.conf
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
echo -e "<?php\nphpinfo();\n?>" /usr/local/apache2/htdocs/test.php
/usr/local/apache2/bin/apachectl restart
http://Apache服務器地址/test.php
- 安裝openssl
OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用
yum -y install openssl-devel
cd /lamp/php-7.0.7/ext/openssl
mv config0.m4 config.m4
/usr/local/php/bin/phpize
./configure --with-openssl --with-php-config=/usr/local/php/bin/php-config && make && make install
- 編譯安裝memcache
Memcache是一個高性能的分布式的內存對象緩存系統, 簡單的說就是將數據調用到內存中,然后從內存中讀取,從而大大提高讀取速度
cd /lamp/pecl-memcache-php7
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config && make && make install
echo "extension_dir = "/usr/local/php/lib/php/extensions/no-debug-zts-20151012/"" >> /usr/local/php/etc/php.ini
echo "extension="openssl.so";" >> /usr/local/php/etc/php.ini
echo "extension="memcache.so";" >> /usr/local/php/etc/php.ini
/usr/local/apache2/bin/apachectl restart
yum -y install libevent libevent-devel
cd /lamp/memcached-1.4.17
./configure --prefix=/usr/local/memcache && make && make install
useradd -r -s /sbin/nologin memcache
/usr/local/memcache/bin/memcached -umemcache &
- 安裝phpMyAdmin
通過web管理數據庫
下載最新版phpMyAdmin-4.8.2-all-languages.zip
unzip phpMyAdmin-4.8.2-all-languages.zip
cp -r phpMyAdmin-4.8.2-all-languages /usr/local/apache2/htdocs/phpmyadmin
下載網站解壓復制到/usr/local/apache2/htdocs/就可以訪問
訪問網站設置數據庫內容,給htdocs目錄給相應權限,用戶是daemon用戶
-
yum簡易安裝LAMP環境
安裝httpd
- yum -y install httpd httpd-devel
- service httpd start
- chkconfig httpd on
安裝mysql
- yum -y install mysql mysql-server mysql-devel
- service mysqld start
- 設置mysql密碼
mysql>; USE mysql;
mysql>; UPDATE user SET Password=PASSWORD('newpassword') WHERE user='root';
mysql>; FLUSH PRIVILEGES;
#設置mysql密碼還可以用:mysql_secure_installation 命令
- 允許遠程登錄
mysql -u root -p
mysql>GRANT ALL PRIVILEGES ON *.* TO '用戶名'@'%' IDENTIFIED BY '密碼' WITH GRANT
- 設為開機啟動 chkconfig mysqld on
安裝php
- yum -y install php php-mysql php-common php-gd php-mbstring php-mcrypt php-devel php-xml
- service httpd restart
- 測試
在/var/www/html/新建個test.php文件,將以下內容寫入,然后保存。
<?
phpinfo();
?>
-
rpm包httpd基本配置與使用
httpd相關軟件包說明
httpd 主軟件包;
httpd-devel http相關的開發包;
httpd-manual 官方提供的手冊;
httpd-tools httpd相關的工具(包括一些測試工具);
httpd文件位置
服務腳本:/etc/rc.d/init.d/httpd
工作目錄:/etc/httpd
配置文件存放目錄:/etc/httpd/conf/
主配置文件:/etc/httpd/conf/httpd.con
擴展配置文件:/etc/httpd/conf.d/*.conf
socket:http(80/tcp),https(443/tcp)
網頁文件存放目錄:/var/www/html/
CGI腳本目錄:/var/www/cgi-bin/
模塊目錄:/etc/httpd/modules(鏈接到/usr/lib/httpd/modules)
日志目錄:/etc/httpd/logs(鏈接到/var/log/httpd)
啟動httpd服務:service httpd start
注意:在rhel系列中,啟動httpd后會默認打開一個測試頁面,如果不想顯示該測試頁,使用"mv -f /etc/httpd/conf.d/welcome.conf webcome.conf.bak",並重啟服務即可
主配置文件的構成
- 全局配置:對主服務器或虛擬主機都生效,並且有些功能是服務器自身的工作屬性
- 主服務器:與主站相關的設置
- 虛擬主機:虛擬主機相關的設置
主配置文件的設置:/etc/httpd/conf/httpd.conf;
ServerTokens OS #定義頁面顯示的服務器信息詳細程度,可以指定其他參數
ServerRoot "/etc/httpd" #定義服務器的工作的根目錄
PidFile run/httpd.pid #定義pid配置文件的路徑(這是一個相對路徑)
Timeout 60 #TCP連接的超時時間(如三次握手等等)
KeepAlive Off #是否打開長連接,開啟后有助於提升服務器性能,但如果在比較繁忙的服務器中,應考慮是否開啟
MaxKeepAliveRequests 100 #長連接請求的最大資源數,達到該限制后斷開鏈接
KeepAliveTimeout 15 #長連接請求的超時時間
<IfModule prefork.c> #prefork模型的相關設置;
StartServers 8 #服務器啟動多少個空閑進程;
MinSpareServers 5 #最少空閑進程(如果8個空閑進程使用了4個,則會再啟動一個空閑進程,保證存在5個空閑進程)
MaxSpareServers 20 #最大空閑進程(如果有500個用戶訪問,退出了450個,則kill掉30個);
ServerLimit 256 #為MaxClients設定的上限值(需要將服務器進程kill掉,然后在重啟)
MaxClients 256 #最大客戶端數量(最大允許多少個連接請求);
MaxRequestsPerChild 4000 一個進程最多響應多少個用戶請求,當接收用戶請求4000次后,將其kill掉,生成新的進程響應用戶請求;
</IfModule>
<IfModule worker.c> worker模型的相關設置;
StartServers 4 默認啟動的進程數;
MaxClients 300 最大客戶端數量(最大允許多少個連接請求);
MinSpareThreads 25 最小空閑線程(所有進程的線程數之和);
MaxSpareThreads 75 最大空閑線程(所有進程的線程數之和);
ThreadsPerChild 25 一個進程生成多少個線程;
MaxRequestsPerChild 0 每個進程響應多少個用戶請求(由於是由線程來控制,為0表示不限制);
</IfModule>Listen 12.34.56.78:80 httpd監聽的IP地址和端口,可以不指定IP地址表示監聽本機所有地址(listen可以出現多次,用於監聽多個端口);
LoadModule auth_basic_module modules/mod_auth_basic.so 指定httpd啟動時裝載的模塊(前后分別為"模塊名稱/模塊路徑",路徑為相對路徑);
Include conf.d/*.conf 裝載額外的配置文件(相對路徑);
ExtendedStatus On 使用status時,是否顯示更詳細的信息(默認注釋掉);
User apache httpd的work進程使用的用戶;
Group apache httpd的work進程使用的組名;
### Section 2: 'Main' server configuration
ServerAdmin root@localhost 服務器管理員的郵箱地址;
ServerName www.example.com:80 服務器名稱(如果不啟用此指令,則服務器啟動時會試圖反解當前主機的IP地址,如果解析成功,則引用此主機名作為服務器名稱,否則會使用"127.0.0.1"來作為默認主機名);
DocumentRoot "/var/www/html" 網頁文件存放的根目錄;
<Directory "/var/www/html"> 定義一個網站容器;
Options FollowSymLinks 定義容器名稱內文件被訪問時的訪問屬性;
Options的參數
Indexes 允許索引目錄,即沒有默認頁面時,列出網頁文件列表(生成環境中應該關閉,如果作為下載站點時可以開啟);
none 不支持任何參數;
FollowSymLinks 允許符號鏈接(是否允許訪問頁面中的符號鏈接所指向的源文件,如果沒有必要可以關閉,在一定程度上可以提高服務器性能);
Includes 允許執行服務器端包含"SSI"的文檔,為了安全起見,應該關閉;
ExecCGI 是否允許執行CGI腳本;
MultViews 內容協商機制,根據客戶端來源的語言來判定顯示相匹配的的網頁(消耗資源,沒有必要不必開啟);
All 支持所有參數;
AllowOverride None 是否使用.htacess覆寫訪問權限;
AuthConfig 需要進程用戶認證后才可以訪問網頁;
Order allow,deny 定義基於主機的訪問控制功能,可以實現基於IP、網絡地址或主機名來定義,deny寫在后面表示deny所有;
Allow from all 允許所有的主機訪問,或者使用Deny from all拒絕所有主機,也可以使用以下寫法:
Deny from 192.168.0.0/24
Allow from 192.168.1.0/24 172.16.100.0/24 .edu apache.org www.example.com 172.16
</Directory>
注意: 目錄可能會繼承父目錄的選項,在選擇前"-"符號表示取消從父目錄繼承的某項功能;
<IfModule mod_userdir.c> 是否支持用戶在個人的家目錄中建立網頁文件,使用http://xxx/~home/的方式訪問;
UserDir disabled 默認不允許,如果要啟用此功能,將此項注釋,去掉#UserDir public_html的注釋,用戶建立public_html目錄,然后將網頁文件放到該目錄即可;
</IfModule>
DirectoryIndex index.html index.html.var 定義訪問的默認頁面,從左向右匹配;
AccessFileName .htaccess apache的每目錄訪問控制,在對應的目錄下創建".htacess"文件,將訪問控制機制寫入即可,但會降低apache的執行效率,生產中通常禁用;
<Files ~ "^\.ht"> 模式匹配,以ht開頭的文件,保障此類開頭文件的安全性;
Order allow,deny
Deny from all
Satisfy All
</Files>TypesConfig /etc/mime.types 定義httpd支持的mime類型的文件;
DefaultType text/plain 如果沒有指定類型,默認使用的類型為:明文的純文本類型;
HostnameLookups Off 日志記錄中,是否將每個訪問用戶的IP地址反解成主機名(消耗系統資源,建議不啟用);
EnableSendfile off
ErrorLog logs/error_log 定義錯誤日志的存放位置;
LogLevel warn 定義日志級別;
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 定義日志格式,最后面的一項為日志格式的名稱;
%h 客戶端地址;
%l 遠端主機的登錄名稱(遠程主機登錄系統的用戶名);
%u 登錄網站使用的用戶;
%t 日志事件產生的時間;
%r 請求報文的第一行(訪問方法,URL獲取的資源以及版本號);
%>s 最后一個請求對應的狀態碼;
%b 響應報文的大小;
%{Referer}i 從哪個頁面的鏈接過來的;
%{User-Agent}i 客戶端瀏覽器的類型;
CustomLog logs/access_log combined 定義訪問日志格式的類型;
Alias /icons/ "/var/www/icons/" 定義路徑別名;
注意:Alias /luntan "/bbs/forum" 如果luntan后面加了/符號,后面forum也一定要加/符號,如果沒加則都不加;
ScriptAlias 定義執行CGI腳本的目錄;
配置用戶認證
<Directory "/var/www/html">
AllowOverride AuthConfig
AuthType Basic 使用基本用戶認證;
AuthName "Restricted Site..." 認證提示信息;
AuthUserFile "/etc/httpd/conf/htpasswd" 認證用戶的賬號密碼文件;
Require valid-user valid-user表示允許密碼文件中所有用戶登錄,也可以指定特定用戶;
AuthGroupFile "/etc/httpd/conf/group" 指定組名和包含的用戶(語法"myusers:hadoop tom");
Require group groupname 允許哪些組可以登錄;
Order allow,deny
Allow from all
</Directory>
### Section 3: Virtual Hosts
定義虛擬主機前,最好先取消中心主機,注釋中心的DocumentRoot即可;
配置基於IP的虛擬主機
<VirtualHost 192.168.1.1:80>
ServerName www.example.com 域名;
DocumentRoot "/var/www/html" 網頁文件存放目錄;
</VirtualHost>
<VirtualHost 192.168.1.2:80>
ServerName www.linux.com
DocumentRoot "/var/www/linux"
</VirtualHost>
配置基於端口的虛擬主機
<VirtualHost 192.168.1.1:80>
ServerName www.example.com
DocumentRoot "/var/www/html"
CustomLog logs/example.com-access_log common 訪問日志的記錄位置和類型;
</VirtualHost>
<VirtualHost 192.168.1.1:8080> 需要在Listen指令上添加監聽8080端口;
ServerName www.linux.com
DocumentRoot "/var/www/linux"
CustomLog logs/linux.com-access_log common 訪問日志的記錄位置和類型;
</VirtualHost>
配置基於域名的虛擬主機:使用基於域名的虛擬主機,需要啟用"NameVirtualHost *:80"指令,可以指定監聽的地址,*表示監聽所有IP;
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot "/var/www/html"
CustomLog logs/example.com-access_log common
<Directory "/var/www/html">
Options none
AllowOverride none
Order deny,allow
Deny from 192.168.10.1
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName www.linux.com
DocumentRoot "/var/www/linux"
CustomLog logs/linux.com-access_log common
<Directory "/var/www/linux">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "Restricted Site..."
AuthUserFile "/etc/httpd/conf/htpassw"
Require valid-user
</Directory>
</VirtualHost>
定義默認虛擬主機:需將其放在所有虛擬主機的最上面;
<VirtualHost _default_:80>
DocumentRoot "/var/www/default"
</VirtualHost>
配置httpd的status功能
<Location /status>
SetHandler server-status 實現所有匹配到的文件由一個處理器來處理,server-status可以顯示服務器的狀態信息;
Order deny,allow
Deny from all
Allow from .example.com 生產中應該對用戶訪問status做認證;
</Location>
配置基於openssl的https服務
1,安裝ssl模塊:yum install -y mod_ssl,安裝后會生成以下文件
/etc/httpd/conf.d/ssl.conf ssl的配置文件,需要裝載到httpd的主配置文件中(重啟httpd會自動裝載);
/usr/lib/httpd/modules/mod_ssl.so ssl的模塊;
/var/cache/mod_ssl ssl會話的緩存目錄
2,為服務器提供證書(測試環境中,可以自建CA,然后使用自簽名證書);
3,配置https服務:編輯/etc/httpd/conf.d/ssl.conf
<VirtualHost 192.168.1.1:443>
DocumentRoot "/var/www/html"
ServerName www.example.com
ErrorLog logs/ssl_error_log 錯誤日志的存放位置;
TransferLog logs/ssl_access_log 訪問日志的存放位置;
LogLevel warm 記錄日志的級別;
SSLengine on 是否啟用ssl功能;
SSLProtocal all -SSLv2 支持哪些ssl協議,ALL表示所有,-SSLv2表示不支持ssl v2;
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW SSL支持哪些加密機制,ALL表示所有,!表示排除;
SSLCertificateFile /etc/pki/tls/certs/localhost.crt 證書文件存放的位置;
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key 私鑰文件的存放位置;
注意
1,證書中的主機名稱必須與客戶瀏覽器訪問的名稱一致;
2,一個IP地址上只能建立一個SSL主機;
3,將CA的證書(如cacert.pem)下載到客戶機,改名為"cacert.crt",然后導入到客戶端瀏覽器的"受信任的根證書頒發機構"中,客戶端瀏覽器打開https就不會報錯;
4,生產環境中的服務器,建議向權威的CA機構申請證書;
httpd配置文件語法測試
service httpd configtest 或 httpd -t;兩個命令的效果是一樣的,前者也是調用的后者;
注意:大部分配置被修改后,使用"service httpd reload"即可生效,而修改監聽地址和端口需要重啟服務才生效;
htpasswd:創建用戶密碼文件的命令;
-c:創建密碼文件,只有在第一次的時候使用,如果密碼文件已經存在,則將文件內的用戶清空;
-m:用戶的密碼以md5格式加密存放;
-D:刪除一個用戶
htpasswd -c -m /etc/httpd/conf/htpasswd hadoop;
htpasswd -m /etc/httpd/conf/htpasswd tom;
關於<Directory>和<Location>的說明
<Directory "/var/a.org"></Directory> 定義用戶訪問某個文件系統路徑的時候,應該具有何種訪問屬性;
<Location "/images"></Location> 定義用戶訪問該URL的時候,具有何種的訪問屬性;
關於MPM:多道處理模塊,用於定義apache響應多個用戶請求時所工作的模型;
mpm_winnt:windows專用;
prefork:一個請求用一個進程響應;
worker:一個進程響應多個用戶請求;worker是基於線程,其啟動多個進程,進程啟動后啟動多個線程一個請求用一個線程響應;
enent:基於事件驅動模型,一個進程響應多個用戶請求;
httpd -l :查看httpd編譯所支持的模型,如果沒有編譯又想使用其他模型可以使用httpd.event或httpd.worker;
在/etc/sysconfig/httpd 文件中可以修改httpd啟動的默認模型,在2.2中event為測試模型,不建議使用;2.4默認為event模型;虛擬主機的類型
基於IP:每個虛擬主機使用不同的IP地址,但使用的端口相同;
基於端口:每個虛擬主機的IP地址相同,但端口不同;
基於域名:每個虛擬主機的IP和端口相同,但使用的域名不用;
配置基於openssl的https服務,不需要密碼認證
1. vi /etc/apache2/mods-available/ssl.conf
2. 注釋SSLPassPhraseDialog builtin,在后面加上
SSLPassPhraseDialog exec:/etc/apache2/ssl/ssl_pass.sh
3. vi /etc/apache2/ssl/ssl_pass.sh
4. 輸入
#!/bin/sh
echo "你的ssl證書密碼"5. chmod +x /etc/apache2/ssl/ssl_pass.sh
6. /etc/init.d/apache2 restart
這樣就直接重啟apache了,不需要再每次都輸入惱人的證書密碼
-
-
RSYNC服務
-
rsync概述
rsync是類unix系統下的數據鏡像備份工具——remote sync。一款支持快速增量備份的工具,支持本地復制,遠程同步等,rsync 命令來同步系統文件之前要先登錄remote 主機認證,認證過程中用到的協議有2種:ssh 協議和rsync協議。
rsync特性
- 能更新整個目錄和樹和文件系統
- 有選擇性的保持符號鏈接、硬鏈接、文件屬性、權限、設備以及時間等
- 對於安裝來說,無任何特殊權限要求
- 對於多個文件來說,文件傳輸效率高
- 能用rsh、ssh或直接端口作為傳輸入口端口
- 支持匿名rsync同步文件,是理想的鏡像工具
-
ssh同步源
作用:目標地址同名文件數據同步,文件同步,不刪除多余文件
准備環境
- 一台服務器,一台客戶端
- 在服務器和客戶端上創建單獨的測試目錄(/server/ssh、/client/ssh)
- 普通用戶需要對目錄有相應權限,最好使用setfacl權限
步驟:a)rsync -avz 用戶@服務器地址:/服務器目錄/* 本地目錄 #下行同步(下載)
-a:歸檔模式,遞歸並保留對象屬性
-v:顯示同步過程
-z:在傳輸文件時進行壓縮
b)rsync -avz /本地目錄/* 用戶@服務器地址:/服務器目錄 #上行同步(上傳)
4. 免密傳輸:ssh-keygen -t rsa ssh-copy-id root@192.168.10.100
-
構建rsync同步源
作用:設置虛擬用戶登錄,目標地址同名文件數據同步,文件同步
實驗環境
- 一台服務器,一台客戶端
- 在服務器和客戶端上創建單獨的測試目錄(/server/rsync、/client/rsync)
- 創建主配置文件(/etc/rsyncd.conf)
添加:
address = 192.168.10.200 #服務器地址
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
[share]
comment = this is share #描述
path = /server #共享目錄地址
read only = yes #只讀權限,改為no是可寫
dont compress = *.gz *.bz2
auth users = aa #自由定義虛擬用戶
secrets file = /etc/rsyncd_users.db #定義密碼文件
- 創建密碼文件
vim /etc/rsyncd_users.db
添加內容:aa:123456 #設置虛擬用戶密碼
- 修改密碼文件權限為600
-
啟動服務rsync --daemon
- netstat -antp | grep rsync
- 再次啟動需要先關閉kill -s QUIT 進程號
- 刪除進程號的文件,rm -rf /var/run/rsyncd.pid
- 最后重新啟動rsync --daemon
-
下行同步
- rsync -avz 用戶名@服務器地址::共享模塊名 /本地目錄
- rsync -avz rsync://用戶名@服務器地址/共享模塊名 /本地目錄
-
上行同步
- 修改etc/rsyncd.conf中read only = no,表示可寫
- 給nobody設置acl權限
- rsync -avz /本地目錄/* 用戶名@服務器地址::共享模塊名
- rsync -avz /本地目錄/* rsync://用戶名@服務器地址/共享模塊名
-
delete刪除共享目錄沒有有,而本機地址有的文件
- rsync -avz --delete rsync://aa@192.168.10.100/share /client/rsync
- 免密碼驗證:export RSYNC_PASSWORD=虛擬用戶密碼(客戶端生成)
-
單向實時同步
作用:客戶機目錄改變,服務機也改變,但服務機文件不會刪除
調整inotify內核參數(/etc/sysctl.conf)6.*下的優化
mak_queue_events
監控隊列大小(16384)
mak_user_instances
最多監控實例數(1024)
max_user_watches
每個實例最多監控文件數(1028576)
inotifywait:用於持續監控,實時輸出結果
inotifywatch:用於短期監控,任務完成后再出結果
監控的行為:modify(內容),create,attrib(權限),move,delete
步驟
- yum -y install gcc*
- 創建同步目錄
- 導入文件inotify-tools.iso
- 掛載:mount -o loop inotify-tools.iso 空目錄
- 安裝inotify-tools:./configure && make && make install
- 如果是普通用戶,給予目錄權限
- 創建監控腳本,添加以下內容
#!/bin/bash
a="inotifywait -mrq -e create,delete /client"
b="rsync -avz /client/* root@192.168.10.200:/server/"
$a | while read directory event file
do
$b
done
- 使用免密登入ssh-keygen -t rsa ssh-copy-id root@192.168.10.100
- 執行腳本放入后台
-
配置unison雙向實時同步
作用:主機之間目錄可以實現實時添加刪除數據同步
注:雙向自動同步,監控目錄和同步時,源目錄不能使用 * 通配傳輸,否則會變成死循環
inotify-tools:監控服務
ocaml:
unison:同步工具與rsync類似,專用於雙向同步
- yum -y install gcc*
- 服務器和客戶端創建同步目錄
- 導入文件inotify-tools.iso
- 掛載:mount -o loop inotify-tools.iso 空目錄
- 安裝inotify-tools:./configure && make && make install
- 安裝ocaml:./configure && make world opt && make install
- 安裝unison,已經有Makefile文件直接:make UISTYLE=text THREADS=true STATIC=true
- 復制命令:cp unison /usr/local/bin/
- 創建ssh免密設置
- 客戶機操作一樣,unison命令文件通用,可以復制到客戶機用
- 配置腳本
服務機:
#!/bin/bash
a="inotifywait -mrq -e create,delete /server"
b="/usr/local/bin/unison -batch /server/ ssh://192.168.10.101//client/"
$a | while read directory event file
do
$b
done
客戶機:
#!/bin/bash
a="inotifywait -mrq -e create,delete /client"
b="/usr/local/bin/unison -batch /client/ ssh://192.168.10.200//server/"
$a | while read directory event file
do
$b
done
- 運行腳本放入后台:bash 腳本 &(開機自啟,可以放入.bashrc)
- 測試,在共享目錄中創建,刪除
-
-
源碼包Apache
apache 加載模塊的方式: 慢,功能太多,
靜態加載--內存
DOS:動態共享對象--外存-解決apache慢
工作方式:APACHE + PHP以so 函數庫方式添加解析
Apache 2.X 支持插入式並行處理模塊,稱為多路處理模塊(MPM)。在編譯apache時必須選擇也只能選擇一個MPM,對類UNIX系統,有幾個不同的MPM可供選擇,它們會影響到apache的速度和可伸縮性。
prefork模式可以算是很古老但是非常穩定的模式。Apache在啟動之初,就預派生 fork一些子進程,然后等待請求進來,並且總是視圖保持一些備用的子進程。之所以這樣做,是為了減少頻繁創建和銷毀進程的開銷。每個子進程中只有一個線程,在一個時間點內,只能處理一個請求。
優點:成熟,兼容所有新老模塊。進程之間完全獨立,使得它非常穩定。同時,不需要擔心線程安全的問題。(我們常用的mod_php,PHP的拓展不需要支持線程安全)
缺點:一個進程相對占用更多的系統資源,消耗更多的內存。而且,它並不擅長處理高並發請求,在這種場景下,它會將請求放進隊列中,一直等到有可用進程,請求才會被處理。
worker模式比起上一個,是使用了多進程+多線程的模式。它也預先fork了幾個子進程(數量比較少),每個子進程能夠生成一些服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。 Apache總是試圖維持一個備用(spare)或是空閑的服務線程池。這樣,客戶端無須等待新線程或新進程的建立即可得到處理。在Unix中,為了能夠綁定80端口,父進程一般都是以root身份啟動,隨后,Apache以較低權限的用戶建立子進程和線程。User和Group指令用於配置Apache子進程的權限。雖然子進程必須對其提供的內容擁有讀權限,但應該盡可能給予他較少的特權。另外,除非使用了suexec ,否則,這些指令配置的權限將被CGI腳本所繼承。 線程比起進程會更輕量,因為線程通常會共享父進程的內存空間,因此,內存的占用會減少一些,在高並發的場景下,表現得比 prefork模式好。 有些人會覺得奇怪,那么這里為什么不直接使用多線程呢(即在一個進程內實現多進程),還要引入多進程? 原因主要是需要考慮穩定性,如果一個線程異常掛了,會導致父進程連同其他正常的子線程都掛了(它們都是同一個進程下的)。多進程+多線程模式中,各個進程之間都是獨立的,如果某個線程出現異常,受影響的只是Apache的一部分服務,而不是整個服務。其他進程仍然可以工作。
優點:占據更少的內存,高並發下表現更優秀。
缺點:必須考慮線程安全的問題,因為多個子線程是共享父進程的內存地址的。如果使用keep-alive的長連接方式,也許中間幾乎沒有請求,這時就會發生阻塞,線程被掛起,需要一直等待到超時才會被釋放。如果過多的線程,被這樣占據,也會導致在高並發場景下的無服務線程可用。(該問題在prefork模式下,同樣會發生)
event這個是 Apache中最新的模式,在現在版本里的已經是穩定可用的模式。它和 worker模式很像,最大的區別在於,它解決了 keep-alive 場景下 ,長期被占用的線程的資源浪費問題(某些線程因為被keep-alive,掛在那里等待,中間幾乎沒有請求過來,一直等到超時)。 event MPM中,會有一個專門的線程來管理這些 keep-alive 類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢后,又允許它釋放。這樣,一個線程就能處理幾個請求了,實現了異步非阻塞。 event MPM在遇到某些不兼容的模塊時,會失效,將會回退到worker模式,一個工作線程處理一個請求。官方自帶的模塊,全部是支持event MPM的。注意一點,event MPM需要Linux系統(Linux 2.6+)對Epoll的支持,才能啟用。
HTML
超文本標記語言,使用html語言編寫的文本叫超文本,"超文本"就是指頁面內可以包含圖片、鏈接,甚至音樂、程序等非文字元素
URL
統一資源定位符,是對可以從互聯網上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯網上標准資源的地址
URI
統一資源標志符,URI與URL都是定位資源位置的,就是表示這個資源的位置信息,就像經緯度一樣可以表示你在世界的哪個角落。URI是一種寬泛的含義更廣的定義,而URL則是URI的一個子集,就是說URL是URI的一部分。
HTTP協議
超文本傳輸協議,HTTP使用統一資源標識符(URL)來傳輸數據和建立連接。是一個基於TCP/IP通信協議來傳遞數據的協議,屬於應用層協議。
相關文件
apache配置文件
源碼包安裝:/usr/lcoal/apache2/etc/httpd.conf(主配置文件)
/usr/local/apache/etc/extra/*.conf(子配置文件)
rpm包安裝:/etc/httpd/conf/httpd.conf
網頁保存位置:
源碼包: /usr/local/apache2/htdocs/
rpm包安裝:/var/www/html/
日志保存位置
源碼包:/usr/local/apache2/logs/
rpm包:/var/log/httpd/
配置文件/usr/lcoal/apache2/etc/httpd.conf
注意:apache配置文件嚴格區分大小寫
- 針對主機環境的基本配置
ServerRoot #apache主目錄 /usr/local/apache2
Listen #監聽端口 :80
LoadModule #加載的相關模塊 php5
User
Group #用戶和組
ServerAdmin #管理員郵箱
ServerName #服務器名(沒有域名解析時,使用臨時解析。默認不開啟)
ErrorLog "logs/error_log #錯誤日志
CustomLog "logs/access_log" common #正確訪問日志
DirectoryIndex index.html index.php #默認網頁文件名,優先級順序
Include etc/extra/httpd-vhosts.conf #子配置文件中內容也會加載生效
- 主頁目錄及權限
DocumentRoot "/usr/local/apache2/htdocs" #網頁文件存放目錄(默認)
<Directory "/usr/local/apache2/htdocs"> #定義指定目錄的權限
Options Indexes FollowSymLinks #泛匹配域名
None #沒有任何額外權限
All #所有權限(除去MultiViews以外)
Indexes #瀏覽權限(當此目錄下沒有默認網頁文件時,顯示目錄內容)
FollowSymLinks #准許軟連接到其他目錄
MultiViews #准許文件名泛匹配(需要手動開啟模塊才有效negotiation)
AllowOverride None #定義是否允許目錄下.htaccess文件中的權限生效
None #.htaccess中權限不生效
All #文件中所有權限都生效
AuthConfig #文件中,只有網頁認證的權限生效
Require all granted #訪問控制列(黑白名單)
例1: 僅允許IP為192.168.1.1的主機訪問
<RequireAll>
Require all granted
Require ip 192.168.1.1
</RequireAll>
例2: 禁止192.168.1.2的主機訪問,其他的都允許訪問,
<RequireAll>
Require all granted
Require not ip 192.168.1.2
</RequireAll>
例3: 允許所有訪問,
Require all granted
例4: 拒絕所有訪問,
Require all denied
Apache 實驗
實驗環境:使用lamp環境安裝好的apache進行試驗
安裝完成后,先啟動apache進行服務驗證,是否安裝成功,並且主頁是否可以訪問。
注:發現啟動服務報錯:AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
解決辦法:打開主配置文件httpd.conf
搜索ServerName (約在200行左右)
修改為 ServerName localhost:80(並且去掉前面的#注釋)
-
實驗一:目錄別名
可以使特定的網站程序不出現在網站根目錄下面,而這樣的話,就可以避免和原來的程序本身發生混淆和沖突;縮短網頁目錄的縱深,減少URL的長度。
注:如果網頁目錄在htdocs下,需要修改主文件AllowOverride None
- 打開apache主配置文件
#Include etc/extra/httpd-autoindex.conf (將#號去掉)
-
進到子配置文件目錄extra下,打開httpd-autoindex.conf
仿照例子寫一個別名:
Alias /a/ "/www/a/" #實際目錄結束要有/
<Directory "/www/a/">
Options Indexes MultiViews
AllowOverride None
Require all granted
</Directory>
- 在/www/a/目錄下手動創建index.html文件
- 將apache服務重啟:
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
注:重啟源碼包安裝的apache需要先關閉,再啟動。
- 驗證試驗結果:瀏覽器輸入 服務器IP/a/
-
實驗二:用戶認證
提高網站安全性,保護個別頁面的信息,限制特定目錄,只有指定用戶可以訪問
注:在/usr/local/apache2/htdocs/下的目錄,可以不創建<Directory>,創建可以方便設置權限
- 打開主配置文件在最下面添加:
<Directory "/usr/local/apache2/htdocs/baohu"> #聲明被保護目錄
Options Indexes
AllowOverride All #開啟權限認證文件.htaccess
Require all granted
</Directory>
- 在指定目錄下創建權限文件.htaccess
vim /usr/local/apache2/htdocs/baohu/.htaccess
#創建 .htaccess文件,並添加下面的內容
AuthName "Welcome to linuxlc "
#提示信息
AuthType basic
#加密類型
AuthUserFile /usr/local/apache2/htdocs/baohu/apache.passwd
#密碼文件,文件名自定義。(但是路徑要對,使用絕對路徑)
require valid-user
#允許密碼文件中所有用戶訪問
- 建立密碼文件,加入允許訪問的用戶。(此用戶和系統用戶無關)
/usr/local/apache2/bin/htpasswd -c /usr/local/apache2/htdocs/baohu/apache.passwd test1
-c 建立密碼文件,只有添加第一個用戶時,才能-c
/usr/local/apache2/bin/htpasswd -m /usr/local/apache2/htdocs/baohu/apache.passwd test2
-m 再添加更多用戶時,使用-m 參數
4. 驗證訪問:(自己手動去目錄下創建index.html文件)
瀏覽器輸入服務器IP/baohu/index.html
-
實驗三:虛擬主機
虛擬主機的分類:
- 基於IP的虛擬主機:一台服務器,多個ip,搭
- 基於端口的虛擬主機:一台服務器,一個ip,搭建多個網站,每個網絡使用不同端口訪問
- 基於域名的虛擬主機:一台服務器,一個ip,搭建多個網站,每個網站使用不同域名訪問(常用)
步驟:
- 域名解析:准備兩個域名www.sohu.com,www.sina.com
- 沒搭建DNS,只能手動添加到本地hosts文件內進行解析hosts
- 在/htdocs/目錄下分別創建sohu 和 sina 兩個目錄,並且在分別在新建目錄內創建index.html文件(分別寫不一樣的內容)
- 修改配置文件
vi /usr/local/apache2/etc/httpd.conf
#修改主配置文件開啟文件關聯
Include etc//extra/httpd-vhosts.conf
#此行取消注釋
vi /usr/local/apache2/etc/extra/httpd-vhosts.conf
#添加下方內容(添加之前先把原先存在的示例刪除掉)
<Directory "/usr/local/apache2/htdocs/sina">
Options Indexes
AllowOverride None
Require all granted
</Directory>
<VirtualHost 192.168.150.253> #虛擬主機標簽
ServerAdmin webmaster@sina.com #管理員郵箱
DocumentRoot "/usr/local/apache2/htdocs/sina" #網站主目錄
ServerName www.sina.com #完整域名
ErrorLog "logs/sina-error_log" #錯誤日志
CustomLog "logs/sina-access_log" common #訪問日志
</VirtualHost>
<Directory "/usr/local/apache2/htdocs/sohu">
Options Indexes
AllowOverride None
Require all granted
</Directory>
<VirtualHost 192.168.150.253>
ServerAdmin webmaster@sohu.com
DocumentRoot "/usr/local/apache2/htdocs/sohu"
ServerName www.sohu.com
ErrorLog "logs/sohu.com-error_log"
CustomLog "logs/sohu.com-access_log" common
</VirtualHost>
- 重啟服務,驗證結果
Windows 下:瀏覽器下輸入兩個不同的域名驗證網頁內容
添加host文件
Linux下:通過elinks命令驗證:elinks 域名
-
實驗四:rewrite重寫功能
原理:在URL中輸入一個地址,會自動跳轉為另一個地址,多用於網站更換或者添加新域名
注:以舊域名跳轉到新域名
步驟
- 開啟重寫模塊(取消注釋)
LoadModule rewrite_module modules/mod_rewrite.so
-
修改主配置文件
vi */extra/httpd-vhosts.conf
<Directory "/usr/local/apache2/htdocs/sina">
Options Indexes FollowSymLinks
#添加FollowSymLinks
AllowOverride All
#把None改為All
Require all granted
</Directory>
-
創建規則匹配文件
vi */.htaccess
#在指定的網站目錄下創建文件,並添加以下內容
RewriteEngine on
#開啟rewrite功能
RewriteCond %{HTTP_HOST} www.sina.com
#把以www.sina.com 開頭的內容賦值給HTTP_HOST變量,用於跳轉到其它地址
RewriteRule .* http://www.sohu.com
#.* 輸入任何地址,都跳轉到http://www.sohu.com
- 重啟服務,測試
- 開啟偽靜態
RewriteEngine on
RewriteRule index(\d+).html index.php?id=$1
#可以把訪問html的跳轉到php主頁,index3123.html也可以訪問
-
常用配置文件
httpd-default.conf #apache線程控制,必須開啟
Timeout 300 #連接線程超時時間
KeepAlive On #開啟線程控制(不開啟的話用戶訪問頁面會產生一個進程,訪問其他頁面會產生另一個進程,這樣的話一個用戶會產生好多個進程,會降低apache性能。開啟此項,當用戶訪問網站時會產生一個進程,打開其他頁面時會產生線程,保證了一個用戶只產生一個進程。網站此項功能必須開啟。)
MaxKeepAliveRequests 100 #最大線程連接數
httpd-info.conf #apache狀態統計
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from .example.com
</Location>
#通過訪問www.domain.com/server-status可以查看apache狀態。如果頁面顯示not found 則需要修改目錄權限,在Deny from all下加上allow from ip(允許的ip)。注:通過日志文件統計,更准確,或現成工作
httpd-manual.conf #apache幫助文檔
#通過訪問www.domain.com/manual 查看apache幫助文檔,一般為英文。
httpd-languages.conf #語言編碼
#要使其生效需要在主配置文件中打開,如果中文亂碼不是瀏覽器編碼的原因可能是此配置文件注釋沒打開
Apache的三種工作模式
Apache 一共有3種穩定的 MPM 模式(多進程處理模塊),它們分別是 prefork、worker、event。http-2.2版本的httpd默認的mpm工作模式為prefork,2.4版本的httpd默認是event工作模式。可以通過 httpd -V 來查看
PATH=${PATH}:/usr/local/apache2/bin #變量疊加
../bin/httpd -v #查看版本
../bin/httpd -V |grep -i "server mpm" #查看系統工作模式
- prefork 工作模式
Apache在啟動之初,就預先fork一些子進程,然后等待請求進來。之所以這樣做,是為了減少頻繁創建和銷毀進程的開銷。每個子進程只有一個線程,在一個時間點內,只能處理一個請求。
優點:成熟穩定,兼容所有新老模塊。同時,不需要擔心線程安全的問題。
缺點:一個進程相對占用更多的系統資源,消耗更多的內存。而且,它並不擅長處理高並發請求。
- worker 工作模式
使用了多進程和多線程的混合模式。它也預先fork了幾個子進程(數量比較少),然后每個子進程創建一些線程,同時包括一個監聽線程。每個請求過來,會被分配到1個線程來服務。線程比起進程會更輕量,因為線程通常會共享父進程的內存空間,因此,內存的占用會減少一些。在高並發的場景下,因為比起prefork有更多的可用線程,表現會更優秀一些。
優點:占據更少的內存,高並發下表現更優秀。
缺點:必須考慮線程安全的問題。
- event 工作模式
它和worker模式很像,最大的區別在於,它解決了keep-alive(線程處理時間)場景下,長期被占用的線程的資源浪費問題。event MPM中,會有一個專門的線程來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢后,又允許它釋放。這樣增強了高並發場景下的請求處理能力。
HTTP采用keepalive方式減少TCP連接數量,但是由於需要與服務器線程或進程進行綁定,導致一個繁忙的服務器會消耗完所有的線程。Event MPM是解決這個問題的一種新模型,它把服務進程從連接中分離出來。在服務器處理速度很快,同時具有非常高的點擊率時,可用的線程數量就是關鍵的資源限制,此時Event MPM方式是最有效的,但不能在HTTPS訪問下工作。
優點:Event MPM方式是最有效的
缺點:不能在HTTPS訪問下工作。
-
二、Apache的用戶認證
有時候,我們需要給一些特殊的訪問設置一個用戶認證機制,增加安全。比如我們的個人網站,一般都是有一個管理后台的,雖然管理后台本身就有密碼,但我們為了更加安全,可以再設置一層用戶認證。
1、編輯配置文件
vim /usr/local/apache2/conf/extra/httpd-vhosts.conf在對應的虛擬主機配置中加入如下配置:(加粗部分是添加內容)
<VirtualHost *:80>DocumentRoot "/usr/local/apache2/htdocs"ServerName www.123.comServerAlias www.abc.com<Directory /usr/local/apache2/htdocs/admin.php>AllowOverride AuthConfigAuthName "Please input you acount."AuthType BasicAuthUserFile /usr/local/apache2/htdocs/.htpasswdrequire valid-user</Directory></VirtualHost>說明:首先指定要對哪個目錄進行驗證,AuthName自定義,AuthUserFile指定用戶密碼文件在哪里。
2、創建加密用的用戶名和密碼文件
htpasswd -c /usr/local/apache2/htdocs/.htpasswd liweihtpasswd -m /usr/local/apache2/htdocs/.htpasswd admin創建第一個用戶時-c選項創建.htpasswd文件,-m選項增加用戶,根據提示輸入密碼。
3、重啟apache服務
apachectl -tapachectl graceful先檢查配置是否正確,然后用graceful相當於是reload配置,不用重啟apache服務,效果一樣。測試,通過瀏覽器輸入 www.123.com/admin.php 提示輸入密碼。
-
三、設置默認虛擬主機
默認虛擬主機就是配置文件里的第一個虛擬主機。關於默認虛擬主機有個特點,凡是解析到這台服務器的域名,不管是什么域名,只要在配置文件中沒有配置,那么都會訪問到這個主機上來。如果我們直接用IP訪問,會訪問到這個站點上來。為了避免別人亂解析,所以應該把默認也就是第一個虛擬主機給禁止掉。我們使用allow,deny語句,已經禁止掉了。
1、配置默認虛擬主機
vim /usr/local/apache2/conf/extra/httpd-vhosts.conf添加一個虛擬主機的記錄:
<VirtualHost *:80>DocumentRoot "/var/123"ServerName xxxxx.com.cn<Directory /var/123>Order allow,denyDeny from all</Directory></VirtualHost>創建/var/123目錄,並且設置600權限,daemon用戶無法訪問:
mkdir /var/123chmod -R 600 /var/1232、重啟apache服務器
apachectl -tapachectl graceful如果用IP或其它解析的域名訪問,發現提示:
ForbiddenYou don't have permission to access / on this server. -
四、域名301跳轉
一個站點難免會有多個域名,而多個域名總得有一個主次,比如我的網站可以用兩個域名訪問:www.itepub.cn 和 www.linuxblogs.cn 但大家發現不管我用哪個域名訪問,最終都會跳轉到www.linuxblogs.con 上來。這個行為就叫做域名跳轉,這里的301只是一個狀態碼,跳轉除了301還有302,301是永久跳轉,302是臨時跳轉,網站上一定要設置為301,這樣對搜索引擎是比較友好的。
1、配置域名跳轉
# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf<IfModule mod_rewrite.c>RewriteEngine onRewriteCond %{HTTP_HOST} ^www.abc.com$RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]</IfModule>配置為:當訪問aaa時,跳轉到123的網站。
2、配置多個域名跳轉
<IfModule mod_rewrite.c>RewriteEngine onRewriteCond %{HTTP_HOST} ^www.abc.com$ [OR]RewriteCond %{HTTP_HOST} ^www.abcd.com$RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]</IfModule>3、重啟服務器並測試
apachectl -tapachectl graceful測試:
# curl -x192.168.0.8:80 www.abc.com -IHTTP/1.1 301 Moved PermanentlyDate: Tue, 25 Oct 2016 15:48:10 GMTServer: Apache/2.2.31 (Unix) PHP/5.5.38Location: http://www.123.com/Content-Type: text/html; charset=iso-8859-1# curl -x192.168.0.8:80 www.abcd.com -IHTTP/1.1 301 Moved PermanentlyDate: Tue, 25 Oct 2016 15:48:49 GMTServer: Apache/2.2.31 (Unix) PHP/5.5.38Location: http://www.123.com/Content-Type: text/html; charset=iso-8859-1通過上述測試,發現無論是abc或abcd都可以跳轉到 www.123.com 域名上來,通過瀏覽器訪問也一樣。
-
五、Apache日志切割
我們每訪問一次網站,那么就會記錄若干條日志。當然前提是已經設置了日志,日志不去管理,時間長了日志文件會越來越大,如何避免產生這么大的日志文件?其實apache有相關的配置,使日志按照我們的需求進行歸檔,比如每天一個新日志,或者每小時一個新的日志。
1、首先簡單設置日志的路徑名稱
vim /usr/local/apache2/conf/extra/httpd-vhosts.conf編輯添加內容如下:
ErrorLog "logs/error.log"CustomLog "logs/access.log" combined指定了日志存放在/usr/local/apache2/logs目錄下分別為error.log和access.log,combined為日志顯示的格式,日志格式可以參考配置文件httpd.conf中格式的指定,如下:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%h %l %u %t \"%r\" %>s %b" common2、設置apache日志分割
同樣編輯配置文件httpd-vhosts.conf
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-error_%Y%m%d.log 86400"CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-access_%Y%m%d.log 86400" combinedErrorLog是錯誤日志,CustomLog是訪問日志。|就是管道符,意思是把產生的日志交給rotatelog這個工具,而這個工具就是apache自帶的切割日志的工具。-l的作用是校准時區為UTC,也就是北京時間。86400,單位是秒,正好是一天,那么日志會每天切割一次。而最后面的combined為日志的格式,在httpd.conf中有定義。
-
六、不記錄指定文件類型的日志
如果一個網站訪問量特別大,那么訪問日志就會很多,但有一些訪問日志我們其實是可以忽略掉的,比如網站的一些圖片,還有js、css等靜態對象。而這些文件的訪問往往是巨量的,而且即使記錄這些日志也沒有什么用,那么如何忽略不記錄這些日志呢?
1、配置日志不記錄圖片的訪問
vim /usr/local/apache2/conf/extra/httpd-vhosts.conf相關配置為:
SetEnvIf Request_URI ".*\.gif$" image-requestSetEnvIf Request_URI ".*\.jpg$" image-requestSetEnvIf Request_URI ".*\.png$" image-requestSetEnvIf Request_URI ".*\.bmp$" image-requestSetEnvIf Request_URI ".*\.swf$" image-requestSetEnvIf Request_URI ".*\.js$" image-requestSetEnvIf Request_URI ".*\.css$" image-requestCustomLog "|/usr/local ... _%Y%m%d.log 86400" combined env=!image-request說明:在原來日志配置基礎上,增加了一些image-request的定義,比如把gif、jpg、bmp、swf、js、css等結尾的全標記為image-request,然后在配置日志后加一個標記env=!image-request,表示取反。
-
七、Apache配置靜態緩存
所說的靜態文件指的是圖片、js、css等文件,用戶訪問一個站點,其實大多數元素都是圖片、js、css等,這些靜態文件其實是會被客戶端的瀏覽器緩存到本地電腦上的,目的就是為了下次再請求時不再去服務器上下載,這樣就加快了速度,提高了用戶體驗。但這些靜態文件總不能一直緩存,它總有一些時效性,那么就得設置這個過期時間。
1、配置靜態緩存
# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf<IfModule mod_expires.c>ExpiresActive onExpiresByType image/gif "access plus 1 days"ExpiresByType image/jpeg "access plus 24 hours"ExpiresByType image/png "access plus 24 hours"ExpiresByType text/css "now plus 2 hour"ExpiresByType application/x-javascript "now plus 2 hours"ExpiresByType application/javascript "now plus 2 hours"ExpiresByType application/x-shockwave-flash "now plus 2 hours"ExpiresDefault "now plus 0 min"</IfModule>或者使用 mod_headers 模塊實現:
<IfModule mod_headers.c># htm,html,txt 類的文件緩存一個小時<filesmatch "\.(html|htm|txt)$">header set cache-control "max-age=3600"</filesmatch># css, js, swf 類的文件緩存一個星期<filesmatch "\.(css|js|swf)$">header set cache-control "max-age=604800"</filesmatch># jpg,gif,jpeg,png,ico,flv,pdf 等文件緩存一年<filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">header set cache-control "max-age=29030400"</filesmatch></IfModule>說明:這里的時間單位可以 days、 hours 甚至是 min,兩種不同的方法,上面使用的是mod_expires,而下面用的是 mod_headers,要想使用這些模塊,必須要事先已經支持。如何查看是否支持,使用命令:
# /usr/local/apache2/bin/apachectl -M2、重啟服務器並驗證
apachectl -tapachectl graceful驗證:
# curl -x127.0.0.1:80 'http://www.123.com/static/image/common/online_admin.gif' -IHTTP/1.1 200 OKDate: Wed, 26 Oct 2016 03:51:26 GMTServer: Apache/2.2.31 (Unix) PHP/5.5.38Last-Modified: Tue, 31 May 2016 03:08:36 GMTETag: "46891b-16b-5341ab0597500"Accept-Ranges: bytesContent-Length: 363Cache-Control: max-age=86400Expires: Thu, 27 Oct 2016 03:51:26 GMTContent-Type: image/gif -
八、Apache配置防盜鏈
如果你的網站有很多漂亮的圖片,比如你網站域名 www.123.com,圖片地址為 www.123.com/image/111.jpg,那么其它人就可以直接把這個地址放到他自己的網站上,他的用戶可以直接從他網站查看這張圖片,而實際圖片是從你的網站訪問的,所產生的帶寬消耗對你沒有任何意義,應該對這些圖片限制一下,凡是在第三方站點上,嚴禁訪問你站點的圖片,如何配置呢?
1、配置防盜鏈
# vim /usr/local/apache2/conf/extra/httpd-vhosts.confSetEnvIfNoCase Referer "^http://.*\.123\.com" local_refSetEnvIfNoCase Referer ".*\.abc\.com" local_refSetEnvIfNoCase Referer "^$" local_ref<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">Order Allow,DenyAllow from env=local_ref</filesmatch>說明:在這段配置中涉及到一個名詞referer,其實就是上次訪問的網站鏈接。配置referer是根據來源鏈接做限制的,如果來源鏈接不是我們想要的,就直接拒絕,這就是防盜鏈的原理。當然不止是圖片,mp3、rar、zip等文件同樣支持。上述配置中默認是除了定義的列表中的referer,其它都拒絕。
-
九、Apache訪問控制
其實我們可以對apache的訪問進行控制,可以設置白名單或黑名單。前面更改httpd.conf時候就已經看到了allow,deny這兩個關鍵詞,先來看看allow和deny的規則。
1、舉例1
Order deny,allowdeny from allallow from 127.0.0.1我們的判斷依據是這樣的:
-
看Order后面的,哪個在前,哪個在后
-
如果deny在前,那么就需要看deny from這句,然后看allow from這句
-
規則是一條一條匹配的,不管是deny在前還是allow在前,都會生效的。
2、舉例2
Order allow,denydeny from allallow from 127.0.0.1這個就會deny所有了,127.0.0.1也會被deny。因為順序是先allow然后deny,雖然開始allow了127,但是后面又拒絕了它。
3、舉例3
Order allow,denydeny from all上面的規則就表示,全部都不能通過。
4、舉例4
Order deny,allowdeny from all上面的規則表示,全部都不能通。Order deny,allow只有順序,沒有具體規則,表示全部都可以通行(默認的),因為allow在最后了。Order allow,deny這個表示,全部都不能通行(默認的),因為deny在最后。5、針對某個目錄限制
比如這個目錄很重要,只允許我們公司的IP訪問,當然這個目錄可以是網站根目錄,也就是整個站點。
<Directory /usr/local/apache2/htdocs>Order deny,allowDeny from allAllow from 127.0.0.1</Directory>6、針對請求的URL去限制
<filesmatch "(.*)admin(.*)">Order deny,allowDeny from allAllow from 127.0.0.1</filesmatch>這里用到了filesmatch語法,表示匹配的意思。
7、驗證
# curl -x192.168.0.8:80 www.123.com/admin.php -IHTTP/1.1 403 ForbiddenDate: Wed, 26 Oct 2016 06:24:54 GMTServer: Apache/2.2.31 (Unix) PHP/5.5.38Content-Type: text/html; charset=iso-8859-1# curl -x127.0.0.1:80 www.123.com/admin.php -IHTTP/1.1 401 Authorization RequiredDate: Wed, 26 Oct 2016 06:25:03 GMTServer: Apache/2.2.31 (Unix) PHP/5.5.38WWW-Authenticate: Basic realm="Please input you acount."Content-Type: text/html; charset=iso-8859-1
-
十、禁止解析PHP
某個目錄下禁止解析PHP,這個很有作用,我們做網站安全的時候,這個用的很多,比如某些目錄可以上傳文件,為了避免上傳的文件有木馬,所以我們禁止這個目錄下面的訪問解析PHP。
1、配置禁止解析php
<Directory /usr/local/apache2/htdocs/data>php_admin_flag engine off<filesmatch "(.*)php">Order deny,allowDeny from all</filesmatch></Directory>說明:php_admin_flag engine off這個語句就是禁止解析php的控制語句,但只這樣配置還不夠,因為這樣配置后用戶依然可以訪問php文件,只不過不解析了,但可以下載,用戶下載php文件也是不合適的,所以有必要再禁止一下。
-
十一、禁止指定user_agent
user_agent叫做瀏覽器標識,目前主流的瀏覽器有IE、chrome、Firefox、360、iphone的Safari、Android手機上的、百度搜索引擎、google搜索引擎等很多,每一種瀏覽器都有對應的user_agent。為了避免一些無用的搜索引擎或機器爬蟲之類引起的帶寬的無辜消耗。
<IfModule mod_rewrite.c>RewriteEngine onRewriteCond %{HTTP_HOST} ^www.abc.com$ [OR]RewriteCond %{HTTP_HOST} ^www.abcd.com$RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]RewriteCond %{HTTP_USER_AGENT} ".*Firefox.*" [NC,OR]RewriteCond %{HTTP_USER_AGENT} ".*Tomato Bot.*" [NC]RewriteRule .* - [F]</IfModule>同樣是使用rewrite模塊來實現限制指定user_agent。本例中,RewriteRule .* - [F]可以直接禁止訪問,rewritecond用user_agent來匹配,NC表示不區分大小寫,OR表示或者,連接下一個條件。假如我們要把百度的搜索引擎限制掉,可以加一條這樣的規則:
RewriteCond %{HTTP_USER_AGENT} ^.*Baiduspider/2.0.* [NC]RewriteRule .* - [F] -
十二、限制某個目錄
我們可以allow和deny去現在網站根目錄下的某個子目錄,當然這個rewrite也可以實現,配置如下:
<IfModule mod_rewrite.c>RewriteEngine onRewriteCond %{REQUEST_URI} ^.*/tmp/* [NC]RewriteRule .* - [F]</IfModule>這段配置,會把只要是包含 /tmp/ 字樣的請求都限制了。
-
請求碼
200 #服務器成功處理請求
301 #永久移動,地址跳轉
302 #暫時移動,地址跳轉
400 #錯誤請求
403 #服務器拒絕請求
404 #服務器找不到請求網頁
503 #服務器不可用,由於超載或停機維護,暫時狀態
-
LNMP搭建

工作模式:Nginx + PHP通過FastCGI 協議調用FPM
一個主進程管理多個從進程,每個進程管理多個線程,每個線程維持一個連接
網絡IO模型:epoll,操作系統跟應用程序進行通行時,調用一定的函數,也就是開發包
-
安裝Nginx
導入LNMP.iso
yum -y install pcre zlib pcre-devel zlib-devel gcc* #安裝所依賴的庫文件
useradd -r -s /sbin/nologin nginx #Nginx服務程序默認以nobody身份運行,建議為其創建專門的用戶賬號,以便更准確地控制其訪問權限,增加靈活性、降低安全風險
tar -xf nginx-1.0.8.tar.gz
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
注:配置前可以參考:./configure --help給出說明
--prefix:設定Nginx的安裝目錄
--user和--group:指定Nginx運行用戶和組
--with-http_stub_status_module
啟用http_stub_status_module模塊以支持狀態統計
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ #至此Nginx安裝完成,為了使Nginx服務器的運行更加方便,可以為主程序nginx創建鏈接文件,以便管理員直接執行nginx命令就可以調用
nginx -t #配置文件nginx.conf默認位於安裝目錄下的conf/子目錄中。若要檢查位於其他位置的配置文件,可使用"-c"選項來指定路徑。
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
nginx #啟動nginx
Killall nginx #停止nginx
-
安裝mysql
yum -y install ncurses-devel
tar -xf mysql-5.1.55.tar.gz
./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charset=gbk.gb2312 && make && make install
注:--with-charset:指定默認使用的字符集編碼
--with-collation:指定默認使用的字符集校對規則
utf8_general_ci是適用於UTF-8字符集的通用規則
--with-extra-charsets:指定額外支持的其他字符集編碼
優化調整:
\cp -a support-files/my-medium.cnf /etc/my.cnf
cp -a support-files/mysql.server /etc/init.d/mysqld
chmod a+x /etc/init.d/mysqld
chkconfig --add mysqld
ln -s /usr/local/mysql/bin/* /usr/local/bin
ln -s /usr/local/mysql/lib/mysql/* /usr/lib/
ln -s /usr/local/mysql/include/mysql/* /usr/include
useradd -r -s /sbin/nologin mysql
cd /usr/local/mysql/bin/
./mysql_install_db --user=mysql #初始化數據庫
chown -R root.mysql /usr/local/mysql/
chown -R mysql /usr/local/mysql/var/
service mysqld start #啟動sql
mysqladmin -u root password 123456 #設置數據庫密碼
mysql -u root -p123456 #進入數據庫
-
安裝PHP環境
yum -y install libxml2-devel libpng-devel #5.3版本以上的PHP已經自帶FPM(fastCGI process manager,FastCGI進程管理器)模塊,用來對PHP解析實例進行管理,優化解析效率,因此在配置PHP編譯選項時應添加"--enable-fpm"以啟用此模塊。
tar -xf php-5.3.6.tar.gz
ln -s /usr/lib64/libpng.so /usr/lib #解決系統版本問題
./configure --prefix=/usr/local/php5 --with-gd --with-zlib --with-mysql=/usr/local/mysql/ --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm && make && make install
優化調整:
cp -a php.ini-development /usr/local/php5/php.ini
ln -s /usr/local/php5/bin/* /usr/local/bin/
ln -s /usr/local/php5/sbin/* /usr/local/sbin/
tar -xf ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz
cd ZendGuardLoader-php-5.3-linux-glibc23-x86_64/php-5.3.x/
cp ZendGuardLoader.so /usr/local/php5/lib/php/ #安裝ZendGuardLander
echo "zend_extension=/usr/local/php5/lib/php/ZendGuardLoader.so" /usr/local/php5/php.ini
echo "zend_loader.enable=1" >> /usr/local/php5/php.ini #為了提高PHP解析效率,安裝相應版本ZendGuardLander
cd /usr/local/php5/etc/
cp -a php-fpm.conf.default php-fpm.conf # php-fpm.conf.default為模板文件
sed -i '25c pid = run/php-fpm.pid' /usr/local/php5/etc/php-fpm.conf #確認PID文件
sed -i '122c user = nginx' /usr/local/php5/etc/php-fpm.conf #指定運行php的用戶
sed -i '123c group = nginx' /usr/local/php5/etc/php-fpm.conf #指定運行php的組
sed -i '157c pm.start_servers = 20' /usr/local/php5/etc/php-fpm.conf #啟動時開啟的進程數
sed -i '162c pm.min_spare_servers = 5' /usr/local/php5/etc/php-fpm.conf #最少空閑進程數
sed -i '167c pm.max_spare_servers = 35' /usr/local/php5/etc/php-fpm.conf #最多空閑進程數
/usr/local/sbin/php-fpm #啟動php-fpm,端口9000
vim /usr/local/nginx/conf/nginx.conf #添加配置文件
location ~ \.php$ {
root html; #PHP網頁文檔根目錄
fastcgi_pass 127.0.0.1:9000; #php-fpm的監聽地址
fastcgi_index index.php; #PHP首頁文件
include fastcgi.conf; #用include調用fastcgi.conf樣本配置(查找文件所在位置並修改)
}
killall nginx
nginx
在html/創建test.php文件測試
<?php
phpinfo();
?>
-
Nginx 配置詳解
全局配置
配置文件:/usr/local/nginx/conf/nginx.conf
注:所有設置以分號結尾
user www www;
#程序運行用戶和組
worker_processes auto;
#啟動進程,指定nginx啟動的工作進程數量,建議按照cpu數目來指定,一般等於cpu核心數目
error_log /home/wwwlogs/nginx_error.log crit;
#全局錯誤日志,這個是一鍵安裝包產生的配置,源碼包不是這個位置
pid /usr/local/nginx/logs/nginx.pid;
#主進程PID保存文件
worker_rlimit_nofile 51200;
#文件描述符數量,限制對文件訪問次數,同事打開的數目
events
{
use epoll;
#使用epoll模型,對於2.6以上的內核,建議使用epoll模型以提高性能
worker_connections 51200;
#工作進程的最大連接數量,根據硬件調整,和前面工作進程配合起來用,盡量大,但是別把cpu跑到100%就行每個進程允許的最多連接數,理論上每台nginx服務器的最大連接數為worker_processes*worker_connections,具體還要看服務器的硬件、帶寬等。
}
網頁配置
http
#整體環境配置--網站配置
{
include mime.types;
default_type application/octet-stream;
#設定mime類型,文件傳送類型由mime.type文件定義
server_names_hash_bucket_size 128;
#保存服務器名字的hash表大小
client_header_buffer_size 32k;
#客戶端請求頭部緩沖區大小
large_client_header_buffers 4 32k;
#最大客戶端頭緩沖大小
client_max_body_size 50m;
#客戶端最大上傳文件大小(M)
sendfile on;
#sendfile 指令指定 nginx 是否調用 sendfile 函數來輸出文件,對於普通應用,必須設為on。如果用來進行下載等應用磁盤IO重負載應用,可設置為off,以平衡磁盤與網絡I/O處理速度,降低系統的uptime.
tcp_nopush on;
#這個是默認的,結果就是數據包不會馬上傳送出去,等到數據包最大時,一次性的傳輸出去,這樣有助於解決網絡堵塞。(只在sendfile on時有效)
keepalive_timeout 60;
#連接超時時間
tcp_nodelay on;
#禁用nagle算法,也即不緩存數據。有效解決網絡阻塞
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 256k;
#fastcgi設置
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application xml+rss;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
#limit_conn_zone $binary_remote_addr zone=perip:10m;
##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.
server_tokens off;
#隱藏nginx版本號(curl -I 192.168.4.154可以查看,更加安全)
#log format
log_format access '$remote_addr - $remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定義日志格式
server
{
listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;
#監聽80端口,WEB服務的監聽設置,可以采用"IP地址:端口"形式
server_name www.lnmp.org;
#服務器名,可以寫多個域名,用空格分隔
index index.html index.htm index.php;
#默認網頁文件
root /home/wwwroot/default;
#網頁主目錄
#error_page 404 /404.html;
include enable-php.conf;
location /nginx_status
{
stub_status on;
access_log off;
}
#開啟status狀態監測
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
#靜態文件處理,保存期30天
location ~ .*\.(js|css)?$
{
expires 12h;
}
#js和css文件處理,保存期12小時
location ~ /\.
{
deny all;
}
access_log /home/wwwlogs/access.log access;
#正確訪問日志
}
include vhost/*.conf;
#vhost/下子配置文件生效
}
Nginx相關實驗
注意事項
注意配置文件中的結尾有;作為結束~!(切記....)
每次實驗修改完配置文件后需要重啟nginx才會生效
pkill -hup nginx #熱重啟
-
實驗1:Nginx的狀態統計
a、安裝nginx時將 --with-http_stub_status_module 模塊開啟
b、修改nginx配置文件
location /nginx_status{
stub_status on;
access_log off;
}
c、客戶端訪問網址:http://IP/nginx_status
#"Active connections"表示當前的活動連接數;
#"server accepts handled requests"表示已經處理的連接信息
#三個數字依次表示已處理的連接數、成功的TCP握手次數、已處理的請求數
-
實驗2:目錄保護
a、原理和apache的目錄保護原理一樣(利用上一個實驗接着完成)
b、在狀態統計的location中添加:
auth_basic "Welcome to nginx!";
auth_basic_user_file /usr/local/nginx/html/htpasswd.nginx;
c、使用http的命令htpasswd進行用戶密碼文件的創建(生成在上面指定的位置)
htpasswd -c /usr/local/nginx/html/htpasswd.nginx user
d、重啟nginx並再次訪問統計頁面
-
實驗3:基於IP的身份驗證(訪問控制)
a、接着上一個實驗完成操作
b、在狀態統計的location中添加:
allow 192.168.88.1;
deny 192.168.88.0/24;
#僅允許192.168.88.1訪問服務器
-
實驗4:nginx的虛擬主機
注:如果需要使用域名訪問,則需要通過dns解析或者hosts文件解析
格式:
http{
server{
listen 80;
.........;
location {
root html;
}
}
server{
listen 80;
.........;
}
}
A、基於端口的虛擬主機
server
{
listen 80;
server_name www.lnmp.org;
index index.html index.htm index.php;
root /home/wwwroot/blog;
include enable-php.conf;
location ~ /\.
{
deny all;
}
access_log /home/wwwlogs/blog-access.log access;
}
server
{
listen 8080;
server_name www.lnmp.org;
index index.html index.htm index.php;
root /home/wwwroot/bbs;
include enable-php.conf;
location ~ /\.
{
deny all;
}
access_log /home/wwwlogs/bbs-access.log access;
}
B、基於域名的虛擬主機
server {
listen 80;
server_name www.xiao.com;
location / {
root html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root html; #PHP網頁文檔根目錄
fastcgi_pass 127.0.0.1:9000; #php-fpm的監聽地址
fastcgi_index index.php; #PHP首頁文件
include fastcgi.conf; #用include調用fastcgi.conf樣本配置(查找文件所在位置並修改)
}
location ~ /\. {
deny all;
}
#拒絕訪問隱藏文件
}
server {
listen 80;
server_name www.huang.com;
location / {
root html/huang;
index index.php index.html index.htm;
}
location ~ \.php$ {
root html/huang;
fastcgi_pass 127.0.0.1:9000; #php-fpm的監聽地址
fastcgi_index index.php; #PHP首頁文件
include fastcgi.conf; #用include調用fastcgi.conf樣本配置(查找文件所在位置並修改)
}
location ~ /\. {
deny all;
}
#拒絕訪問隱藏文件
}
-
實驗5:nginx的反向代理
a、在另外一台機器上安裝apache,並填寫測試頁面
b、在nginx服務器的配置文件中添加,apache服務器的ip
location ~ \.php$ {
proxy_pass http://192.168.10.100;
}
#必須在原服務器下也有同名目錄
#取消nginx聲明的解析php的設置
# index index.php index.html index.htm;添加index.php
#可以設置apache服務器其它端口
c、重啟nginx,並使用客戶端訪問測試
-
實驗6:負載調度(負載均衡)
a、使用默認的rr輪訓算法,修改nginx配置文件
在http標簽添加,upstream,表示輪替的IP池
upstream bbs {
server 192.168.88.100:80;
server 192.168.88.200:80;
}
server {
location ~ \.php$ {
proxy_pass http://bbs;
}
#添加反向代理,代理地址填寫upstream聲明的名字
}
c、開啟並設置兩台88.100 & 88.200的主機
安裝apache並設置不同的index.html頁面內容
d、重啟nginx,並使用客戶端訪問測試
rr算法實現加權輪詢
upstream itxdl.com {
server 192.168.88.100:80 weight=1;
server 192.168.88.200:80 weight=2;
}
-
實驗7:nginx實現https
- 安裝nginx時,需要將--with-http_ssl_module 模塊開啟,重新編譯覆蓋安裝
- 如果編譯時沒有添加該模塊,安裝yum -y install openssl openssl-devel
- 重新編譯./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module && make && make install
- 新增server要進行加密的server標簽中添加以下內容開啟SSL,或開啟模板
e、生成證書和秘鑰文件
注意:在實驗環境中可以用命令生成測試,在生產環境中必須要在https證書廠商注冊(否則瀏覽器不識別)
mkdir usr/local/nginx/conf/ssl/
cd ssl
openssl genrsa -des3 -out itxdl.key 1024
#建立服務器私鑰(過程需要輸入密碼,請記住這個密碼)生成RSA密鑰
openssl req -new -key itxdl.key -out itxdl.csr
#需要依次輸入國家,地區,組織,email。最重要的是有一個common name,可以寫你的名字或者域名。如果為了https申請,這個必須和域名吻合,否則會引發瀏覽器警報。生成的csr文件交給CA簽名后形成服務端自己的證書
openssl x509 -req -days 365 -sha256 -in itxdl.csr -signkey itxdl.key -out itxdl.crt
#命令生成v1版證書
rewrite ^(.*)$ https://www.itxdl.com permanent;
#在需要跳轉的原IP或域名添加重寫規則
server {
listen 443;
server_name www.xiao.com;
location / {
root html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root html; #PHP網頁文檔根目錄
fastcgi_pass 127.0.0.1:9000; #php-fpm的監聽地址
fastcgi_index index.php; #PHP首頁文件
include fastcgi.conf; #用include調用fastcgi.conf樣本配置(查找文件所在位置並修改)
}
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/itxdl.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/itxdl.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}
#啟動nginx,必須用以下命令,否則無法停止nginx
killall -9 nginx
nginx
-
nginx-http2.0搭建
環境要求:
上傳nginx-1.13.8.tar.gz和openssl-1.0.2h.tar.gz
yum -y install pcre pcre-devel zlib zlib-devel gcc*
tar xf openssl-1.0.2h.tar.gz
tar xf nginx-1.13.8.tar.gz
useradd -s /sbin/nologin -M nginx
cd nginx-1.13.8
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-openssl=/root/openssl-1.0.2h
#--with-openssl=/root/openssl-1.0.2h指定加密軟件位置,必須先解壓openssl
make && make install
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -sha256 -in server.csr -signkey server.key -out server.crt
cp server.crt /usr/local/nginx/conf/
cp server.key /usr/local/nginx/conf/
server {
listen 443 ssl http2;
server_name www.huang.com;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server.key;
}
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx
-
-
Postfix
-
郵件服務器
郵件應用協議
SMTP 簡單郵件傳輸協議(發郵件)TCP 25端口,加密時使用TCP 465端口
POP3 第三版郵局協議(收郵件)TCP 110 端口,加密時使用 TCP 995端口
IMAP4 第四版互聯網郵件訪問協議(收郵件)TCP 143端口,加密時使用TCP 993端口
郵件系統角色
MUA (郵件用戶代理) outlook foxmail(客戶端)
MTA (郵件傳輸代理) sendmail qmail postfix(服務端)
MDA (郵件分發代理) maildrop naildrop(郵件存儲位置)
MRA (郵件獲取代理) dovecot (那個軟件獲取郵件)

Postfix配置文件
主目錄:/etc/postfix
主配置文件:main.cf
調優的文件:master.cf
myhostname:郵件服務器主機名
mydomain:郵件域
myorigin:設置允許發信的用戶的郵件域
mydestination:設置允許收信的用戶的郵件域
-
簡單的郵件收發實驗
實驗環境:必須搭建dns服務,hosts文件只能解析A主機
yum -y install bind
修改/etc/named.conf,listen項科研寫當前服務器ip

修改區域文件/etc/named.rfc1912.zones

修改數據文件

將郵件服務器的dns指向dns服務器DNS1=192.168.64.24,之后測試,nslookup 域名
能夠解析郵件服務器域名的dns搭建完成后,再做郵件服務器的修改
郵件服務器postfix默認是安裝的,只需要修改主配置文件/etc/postfix/main.cf
u



#在用戶家目錄下的Maildir下
啟動郵件服務

測試
建兩個用戶

b)安裝telnet連接工具

"
c)查看接收到的郵件
查看收件用戶家目錄下Maildir下的new目錄下
安裝郵件檢索代理,來查看接收的郵件
安裝工具和依賴包yum -y install dovecot dovecot-devel
啟動:service dovecot restart
測試查看郵件

-
企業級郵件服務(新環境)
前提條件:要有一個DNS服務器,以及gcc、數據庫,mailk
yum -y install bind
修改/etc/named.conf

修改區域文件

修改數據文件

在另一台上測試dns是否能解析

dns搭建完成后,再安裝gcc環境yum -y install gcc*

安裝數據庫及mailx, yum -y install mysql mysql-server mailx

啟動數據庫service mysqld start

chkconfig --add mysqld
mysql -u root -p #登入
show databases; #查看數據庫
use mysql; #進入數據庫
show tables; #查看表
接下來,開始搭建。
創建一個單獨的目錄mkdir /var/www/extsuite -p

導入EXTMAIL.iso,郵件網站,掛載復制
將extmail和extman解壓到創建的目錄中
tar -xf extmail-1.2.tar.gz -C /var/www/extsuite/
tar -xf extman-1.1.tar.gz -C /var/www/extsuite/

mv extmail-1.2/ extmail
mv extman-1.1/ extman
去掉版本號
將/var/www/extsuite/extman/docs中模板和數據導入到數據庫中
mysql < extmail.sql


vim /var/www/extsuite/extman/docs/init.sql
將init.sql該一下再導入數據庫中(最后一部分)(先修改init.sql文件),修改登入郵件網站后台密碼mysql < extmail.sql


將虛擬目錄的模板拷貝到郵件服務器的主目錄下,用於創建數據庫虛擬用戶
cp mysql_virtual_alias_maps.cf mysql_virtual_domains_maps.cf mysql_virtual_mailbox_maps.cf /etc/postfix/

創建真實的映射用戶

修改郵件服務的主配置文件(vim /etc/postfix/main.cf)

添加以下內容,指定虛擬用戶的相關配置

virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:600
virtual_gid_maps = static:600
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
重啟服務service postfix restart

發送一個郵件

查看cd家目錄,support是postmaster用戶的別名
1.安裝dovecot相關軟件


安裝收郵件的telnet

接下來配置dovecot能夠去數據庫里讀數據
1)修改/etc/dovecot/conf.d/ 10-mail.conf


修改/etc/dovecot/conf.d/10-auth.conf

修改如何在數據庫里讀取數據的文件(需要拷貝模板)到/etc/dovecot目錄下



允許那些域可以訪問數據庫



連接測試收信service dovecot restart

MAIL+WEB
yum -y install httpd 修改/etc/httpd/conf/httpd.conf 添加以下內容

<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName www.extmail.org
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/extsuite/extmail/html
ServerName mail.extmail.org
scriptalias /extmail/cgi /var/www/extsuite/extmail/cgi
alias /extmail /var/www/extsuite/extmail/html
scriptalias /extman/cgi /var/www/extsuite/extman/cgi
alias /extman /var/www/extsuite/extman/html
suexecusergroup vmail vmail
</VirtualHost>

extmail中更改cgi的屬組屬主,讓vmail有權限執行
cd /var/www/extsuite/
chown -R root.root extman/
chown -R root.root extmail/
cd /var/www/extsuite/extmail/
chown vmail.vmail cgi/ -R

先生成配置文件,再修改配置文件cp webmail.cf.default webmail.cf



extman中更改cgi的屬組屬主,讓vmail有權限執行chown vmail.vmail cgi/ -R

先生成配置文件,再修改配置文件




安裝Unix-Syslog這個軟件
cd
tar -xf Unix-Syslog-1.1.tar.gz
perl Makefile.PL && make && make install
啟動service httpd restart
chkconfig --add httpd
service postfix restart
在瀏覽器上訪問
指向dns

前台頁面

后台頁面

-
-
Linux+JDK+tomcat+Mysql+Nginx
安裝JDK
1. 檢查系統是否自動安裝有java,若有安裝則卸載掉
rpm -q java
rpm -e java
2. 安裝下載的源碼JDK
tar -xf jdk-8u181-linux-x64.tar.gz -C /usr/local
#去掉版本號 mv jdk1.8.0_181 jdk1.8
3. 配置jdk環境變量,用如下命令打開/etc/profile配置文件,
vim /etc/profile
將下面配置拷貝進去(JAVA_HOME路徑按照自己實際解壓路徑配置)
#set java environment
JAVA_HOME=/usr/local/jdk1.8
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
source /etc/profile #重新加載/etc/profile配置文件
4. 測試java命令是否可用
java -version
安裝tomcat
1. tomcat配置很簡單,只要解壓到想要解壓的文件夾就好了
tar -xf apache-tomcat-8.5.32.tar.gz
cp -a apache-tomcat-8.5.32 /usr/local/apache-tomcat
2. 關閉防火牆,或者開放防火牆的8080端口(tomcat默認的使用端口)
3. 啟動tomcat
/usr/local/apache-tomcat/bin/startup.sh #啟動腳本
/usr/local/apache-tomcat/bin/shutdown.sh #關閉腳本
echo $?
4. 啟動成功后,訪問指定主機的8080
網頁默認位置:
/usr/local/apache-tomcat/webapps 相當於/var/www/html
#在webapps目錄下新建網站的目錄,存放網頁
/usr/local/apache-tomcat/webapps/ROOT 相當於 /etc/httpd/conf.d/welcome.conf
#測試頁面的位置
配置文件位置:
/usr/local/apache-tomcat/conf
server.xml #主配置文件
默認: 8005 作為關閉端口
8080 作為監聽端口(Listen)
復制/usr/local/apache-tomcat /usr/local/apache-tomcat-8090
修改startup.sh
export CATALINA_HOME=/usr/local/apache-tomcat-8090
修改server.xml主配置文件:
修改用於關閉的端口:默認為8005
修改用於監聽的端口:默認為8080
啟動tomcat的第二個進程
修改nginx主機的upstream 的服務器列表
安裝Mysql
1、查看當前CentOS系統是否存在mysql
rpm -q mysqld
rpm -e mysqld
2、上傳mysql-5.7.23-1.el6.x86_64.rpm-bundle.tar到Linux上
3、解壓mysql到想要解壓的目錄
tar -xvf mysql-5.7.23-1.el6.x86_64.rpm-bundle.tar -C /usr/local/mysql-5.7.18/
4、安裝mysql的依賴(缺少依賴才安裝,不缺少可跳過這一步)
yum install -y libaio*
yum install -y libnuma*
5、安裝mysql (安裝解壓出來的所有軟件包)
yum -y install *
6、啟動mysql
service mysqld start
7、將mysql加到系統服務中並設置開機啟動
加入到系統服務:chkconfig --add mysqld
自動啟動:chkconfig mysqld on
8、接下來要登錄mysql
先獲取mysql的初始生成的默認密碼
grep 'temporary password' /var/log/mysqld.log
mysql -uroot -ppxqd-7aaFYZx #利用獲取到的密碼登錄
9、登錄后修改默認密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
注:如果密碼太簡單時,報錯時,可以進行如下修改,再修改密碼
set global validate_password_policy=0;
set global validate_password_length=1;
4. Nginx 反向代理:
單獨一台服務器安裝nginx(pcre-devel、zlib-devel)
useradd -r -s /sbin/nologin nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make
make install
修改配置文件:
在server標簽中添加
location / {
root html;
index index.html index.htm index.jsp; #讓nginx識別jsp后綴
}
location ~ \.jsp$ {
proxy_pass http://192.168.88.20:8080; #當訪問的后綴為jsp時,代理到20
}
-
mysql服務
-
數據庫簡介
社區版
企業版
集群版
SQL:結構化查詢語言
去IOEC
I IBM HP 聯想 浪潮 曙光 寶德
O ORACLE 達夢、Alisql
E EMC 華為 宏杉 (聯想、神州數碼屬於OEM)(存儲)
C cisco 華為 華三 銳捷
為什么要有數據庫
1.數據冗余和不一致性
2.大數據訪問困難
3.數據孤立
4.完整性和原子性
5.並發訪問異常
6.安全性問題
常見數據庫
關系型


非關系數據庫

數據庫概述
數據庫:存儲數據的倉庫,是長期存放在計算機內、有組織、可共享的大量數據的集合。數據庫中的數據按照一定數據模型組織、描述和存儲,具有較小的冗余度,較高的獨立性和易擴展性,並為各種用戶共享,即數據庫有永久存儲、有知識和可共享三個基本特點。
數據庫服務器的基本概念
DBMS 數據庫管理系統(能夠操作和管理數據庫的大型軟件)
1.層次模型(Hie`rchical)
層次模型是數據庫系統最早使用的一種模型,它的數據結構是一棵"有向樹"。根結點在最上端,層次最高,子結點在下,逐層排字段。
特征:
有且僅有一個結點沒有父結點,它就是根結點;其他結點有且僅有一個父結點。
最有影響的層次模型的DBS是20世紀60年代末,IBM公司推出的IMS層次模型數據庫系統。
2.網狀模型(Network)
網狀模型以網狀結構表示實體與實體之間的聯系。網中的每一個結點代表一個記錄類型,聯系用鏈接指針來實現。網狀模型可以表示多個從屬關系的聯系,也可以表示數據間的交叉關系,即數據間的橫向關系與縱向關系,它是層次模型的擴展。網狀模型可以方便地表示各種類型的聯系,但結構復雜,實現的算法難以規范化。
特征:
允許結點有多於一個父結點;
可以有一個以上的結點沒有父結點。
3.關系模型(Relation)
關系模型以二維表結構來表示實體與實體之間的聯系,它是以關系數學理論為基礎的。關系模型的數據結構是一個"二維表框架"組成的集合。每個二維表又可稱為關系。在關系模型中,操作的對象和結果都是二維表。關系模型是目前最流行的數據庫模型。支持關系模型的數據庫管理系統稱為關系數據庫管理系統,Access就是一種關系數據庫管理系統。
描述的一致性,不僅用關系描述實體本身,而且也用關系描述實體之間的聯系;
可直接表示多對多的聯系;
關系必須是規范化的關系,即每個屬性是不可分的數據項,不許表中有表;
關系模型是建立在數學概念基礎上的,有較強的理論依據。
在關系模型中基本數據結構就是二維表,不用像層次或網狀那樣的鏈接指針。記錄之間的聯系是通過不同關系中同名屬性來體現的。例如,要查找"劉晉"老師所上的課程,可以先在教師關系中根據姓名找到教師編號"1984030",然后在課程關系中找到"1984030"任課教師編號對應的課程名即可。通過上述查詢過程,同名屬性教師編號起到了連接兩個關系的紐帶作用。由此可見,關系模型中的各個關系模式不應當是孤立的,也不是隨意拼湊的一堆二維表,它必須滿足相應的要求。
RDBMS 關系式數據庫
1.數據以表格的形式出現
2.每行為各種記錄名稱
3.每字段為記錄名稱所對應的數據域
4.許多的行和字段組成一張表單(table)
5.若干的表單組成庫(database)
-
SQL語言最基本的數據類型
字符串類型(char(0-255),varchar(0-65535))
數值類型(int、float)
日期和時間類型(date)
NULL數據類型(任意類型)
約束
域約束:數據類型約束
外鍵約束:引用完整性約束
主鍵約束:某字段能惟一標識此字段所屬的實體,並且不允許為空
一張表中只能有一個主鍵
惟一性約束:每一字段都不允許出現相同值,可以為空
一張表中可以有多個
索引
索引是一個單獨的、物理的數據庫結構,它是某個表中一字段或若干字段值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。表的存儲由兩部分組成,一部分用來存放數據頁面,另一部分存放索引頁面。通常,索引頁面相對於數據頁面來說小得多。數據檢索花費的大部分開銷是磁盤讀寫,沒有索引就需要從磁盤上讀表的每一個數據頁,如果有索引,則只需查找索引頁面就可以了。所以建立合理的索引,就能加速數據的檢索過程。
鎖
數據庫是一個多用戶使用的共享資源。當多個用戶並發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的情況。若對並發操作不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。
加鎖是實現數據庫並發控制的一個非常重要的技術。當事務在對某個數據對象進行操作前,先向系統發出請求,對其加鎖。加鎖后事務就對該數據對象有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此數據對象進行更新操作。
數據庫邏輯關系:
表示層:表(數據)
邏輯層:存儲引擎(提供存儲、創建、更新、查詢數據的實現方法)
物理層:文件

數據庫存儲和查詢:
存儲管理器(實現存儲的功能,通過DDL創建數據表的結構,再通過DML來保存數據)
事務管理器:提供事務功能
文件管理器:保存數據庫數據和文件的對應關系
權限及完整性管理器:設置存儲權限
緩沖管理器:管理緩沖空間
查詢管理器:(實現查詢的功能,接收用戶的查詢請求、理解用戶查詢請求,將查詢請求提交給存儲管理器、實現最終存儲)
DML 解析器:用來操作數據庫中的數據
INSERT
DELETE
SELECT
UPDATE
DDL 解析器:用來建立數據庫、定義數據關系
CREATE
DROP
ALTER
DCL 解析器:用來控制數據庫組建的權限
GRANT
REVOKE
程序跟數據庫的連接方式:
JDBC:(動態SQL):程序設計語言使用函數(mysql_connect())與RDBMS服務器建立連接,並進行交互;通過建立連接向SQL服務器發送查詢語句,並將結果保存至變量中而后進行處理
ODBC:(嵌入式SQL)與動態SQL類似,但其語言必須程序編譯時完全確定下來
mysql 支持的存儲引擎:
MYISAM
默認引擎、插入和查詢速度較快
不支持事務、行級鎖和外鍵約束等功能
注:
事務:一段sql語句的批處理、為了保證數據原子性
鎖:行級鎖(沖突少、速度慢);表級鎖(沖突多、速度快);頁級鎖(折中方案)
INNODB
支持事務、行級鎖和外鍵約束等功能
MEMORY
工作在內存中,通過散字段保存數據,速度快、不能永久保存數據
事務(Transaction)是並發控制的基本單位。
所謂的事務,它是一個操作序字段,這些操作要么都執行,要么都不執行,它是一個不可分割的工作單位。事務是數據庫維護數據一致性的單位,在每個事務結束時,都能保持數據一致性。針對上面的描述可以看出,事務的提出主要是為了解決並發情況下保持數據一致性的問題。
事務具有以下4個基本特征。
Atomic(原子性):事務中包含的操作被看做一個邏輯單元,這個邏輯單元中的操作要么全部成功,要么全部失敗。
Consistency(一致性):只有合法的數據可以被寫入數據庫,否則事務應該將其回滾到最初狀態。
Isolation(隔離性):事務允許多個用戶對同一個數據進行並發訪問,而不破壞數據的正確性和完整性。同時,並行事務的修改必須與其他並行事務的修改相互獨立。
Durability(持久性):事務結束后,事務處理的結果必須能夠得到固化
數據庫工作模式:
單進程多線程的工作模式
守護線程
應用線程(用戶線程)
mysql優化
垂直擴展
線程重用
緩存機制(memcache、redis、mongodb)
E-R模型
實體關系模型
實體:數據對象,即看得見摸得着
聯系:表示一個或多個實體之間的關聯
-
數據庫常用的配置選項
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql
#指定安裝路徑(默認的就是/usr/local/mysql)
-DMYSQL_DATADIR=/data/mysql #mysql的數據文件路徑
-DSYSCONFDIR=/etc #配置文件路徑
-DWITH_INNOBASE_STORAGE_ENGINE=1 #使用INNOBASE存儲引擎
-DWITH_READLINE=1 #支持批量導入mysql數據
-DWITH_SSL=system #mysql支持ssl
-DWITH_ZLIB=system #支持壓縮存儲
-DMYSQL_TCP_PORT=3306 #默認端口3306
-DENABLED_LOCAL_INFILE=1 #啟用加載本地數據
-DMYSQL_USER=mysql #指定mysql運行用戶
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock #默認套接字文件路徑
-DEXTRA_CHARSETS=all #是否支持額外的字符集
-DDEFAULT_CHARSET=utf8 #默認編碼機制
-DWITH_DEBUG=0 #DEBUG功能設置
專用軟件包管理器(二進制)
deb 、rpm等
mysql #MySQL客戶端程序和共享庫
mysql-server #MySQL服務器需要的相關程序
服務:mysqld
端口:3306
主配置文件:/etc/my.cnf
初始化腳本:mysql_install_db
啟動命令:mysqld_safe
數據目錄 :/var/lib/mysql
套接字文件:/var/lib/mysql/mysql.sock
#當意外關閉數據庫時,再開啟時假如開啟不了,找到這個,刪除再啟動
進程文件:/var/run/mysqld/mysqld.pid
-
mysql密碼實驗
mysqladmin -uroot password '123'; #root用戶登入前設置密碼
grant all on *.* to root@'%' identified by '123'; #創建登錄用戶,%:指任意的遠程終端
mysql -u root -p -h 192.168.10.100 #測試用戶遠程登錄
set password=password('111111'); #用戶為自己更改密碼
set password for huang@'%'=password('111'); #root用戶為其他用戶找回密碼
root找回自己的密碼並修改
service mysql stop
vim /etc/my.cnf
添加:
skip-grant-tables #添加到[mysqld]標簽下
service mysql stop
mysql -u root -p #空密碼登入
update mysql.user set password=password('111111') where user='root'; #修改密碼
刪除skip-grant-tables,重啟數據庫驗證新密碼
或者
mysqld_safe --skip-grant-tables &
直接空密碼進入mysql
-
mysql基本命令
mysqladmin -uroot password '123'; #不登入設置密碼
mysql -u 用戶名 -p #登錄
-p 用戶密碼
-h 登陸位置(主機名或ip地址)
-P 端口號(3306改了就不是了)
-S 套接字文件(/var/lib/mysql/mysql.sock)
exit && ctrl+d #退出
show databases; #查看服務器中當前有哪些數據庫
use 數據庫名; #選擇所使用的數據庫
create database 數據庫名; #創建數據庫
drop database 數據庫名; #刪除指定的數據庫
drop table 表名; #刪除指定表
create table 表名 (字段1 類型1,...); #在當前數據庫中創建數據表
show tables; #顯示當前數據庫中有哪些數據表
describe 表名; #顯示當前或指定數據庫中指定數據表的結構(字段)信息
drop table 表名; #刪除當前或指定數據庫中指定的數據表
alter table 舊表名 rename 新表名; #修改數據表的名稱
alter table 表名 modify 字段 類型; #修改字段的類型
alter table 表名 change 舊字段名 新字段名 類型; #修改字段
alter table 表名 add 字段 類型(first/after) #增加字段
alter table 表名 drop 字段 #刪除字段
insert into 表名(字段1,字段2,……) values(字段1的值, 字段2的值,……);
#向數據表中插入新的記錄
update 表名 set 字段名=新數據 where 條件表達式; #修改、更新數據表中的記錄
select 字段名1,字段名2……from 表名 where 條件表達式;
#從數據表中查找符合條件的記錄
select * from 表名; #顯示當前數據庫的表中的記錄
delete from 表名 where 條件表達式; #在數據表中刪除指定的記錄
# between...and... #指定范圍
delete from 表名; #將當前數據庫表中記錄清空
create database web; #創建數據庫
show databases; #查看數據庫
use web; #選擇要使用的數據庫
create table a1 (id int ,name char(30)); #創建a1表,並添加id和name字段以及類型
Mysql>create table a2 (
->id int unsigned not null auto_increment #字段要求為正數、且自增長、主鍵
->name char(30) not null default #字符型長度30字節,默認值為空格
->age int not null default 0 #字段默認值為0
->primary key (id)); #設置id為主鍵
insert into xiao values (1,huang); #指明插入記錄
select * from a2;
insert into xiao values (2,'xiao'); #按順序插入指定字段,不需要指定字段
insert into xiao values (3,'laowang'),(4,'laoshong'); #插入多條數據
將表a2的數據復制到表a1
insert into a1 (id,name) select id,name from a2; #查詢a2值,並寫入到a1
delete from a2 where id=5; #刪除id=5的記錄
delete from a2 where age between 23 and 25; #刪除年齡在23-25之間的
update a2 set age=21 where id=3; #修改表中的數據
Mysql>alter table a2 rename a1; #修改數據表的名稱
Mysql>alter table a1 modify name char(50); #修改數據表的字段類型
Mysql> alter table xiao change name username char(50) not null default '';
# username是字段名,修改數據表的字段類型詳情
Mysql>alter table a1 add age int #添加字段age, 位置默認在末尾
Mysql>alter table a1 add birthday year first; #添加字段到第一列
Mysql>alter table a1 add sex nchar(1) after id; #添加到指定字段后
刪除字段
Mysql>alter table a1 drop birthday;
Mysql用戶授權
授予用戶全部權限
Mysql>select user from mysql.user;
Mysql>grant all on aa.a1 to sans@'%'; #給已存在用戶授權
Mysql>grant all on aa.a1 to abc@'%' identified by '123456'; #創建用戶並授權
取消abc用戶的刪除庫、表、表中數據的權限
Mysql>revoke drop,delete on aa.a1 from abc@'%'; #取消刪除權限(登錄abc測試)
Mysql>show grants for abc@'%'; #查看指定用戶的授權
Mysql>show grants for sans@'%';
Mysql備份和還原
把數據庫aa 備份到/root目錄下
#mysqldump –uroot –p aa > ~/aa.sql
模擬數據庫aa丟失(刪除數據庫aa)
Mysql>drop database aa;
通過aa.sql文件還原(指定導入到哪個庫中)
#mysql –uroot –p test < aa.sql
備份多個數據庫(--databases)
#mysqldump –uroot –p --databases aa test > abc.sql
還原(先模擬丟失)
#mysql –uroot –p < abc.sql
備份有規則的數據庫
Mysql>create database a1; #連續創建三個a開頭的數據庫
#mysqlhotcopy --flushlog –u='root' –p='456' --regexp=^a
還原(先模擬丟失)
Mysql>drop database a1; #順序刪除a開頭的數據庫
#cp –a /mnt/* /var/lib/mysql/ #復制產生的文件到數據庫目錄下
#登錄數據庫查看即可
用戶權限設置
grant 權限1,權限2 on 數據庫.數據表 to 用戶@登錄位置 (identified by '密碼');
revoke 取消的權限1,取消的權限2 on 數據庫.數據表 from 用戶@登錄位置;
show grants for 用戶@登錄位置;
備份和還原設置
mysqldump
備份:
mysqldump -u 用戶名 -p 數據庫名 > /備份路徑/備份文件名(備份整個數據庫)
mysqldump -u 用戶名 -p 數據庫名 表名 > /備份路徑/備份文件名(備份數據表)
--databases 庫1,庫2 (還原:mysql < 備份文件)
--all-databases —備份服務器中的所有數據庫內容
還原:mysql –uroot –p 數據庫 < 備份文件
mysqlhotcopy
備份:mysqlhotcopy --flushlog -u='用戶' -p='密碼' --regexp=正則 備份目錄
還原:cp -rpf 備份目錄 數據目錄(/var/lib/mysql)
補充的備份機制
日志備份
> show global variables like '%log%'
#列出mysql中和日志相關的變量
錯誤日志
服務器啟動和關閉時的信息
服務器運行過程中的錯誤信息
從服務器啟動從服務器進程時產生的信息
log-error 錯誤日志的路徑
一般日志(不啟用)
記錄用戶對數據庫的查詢操作
general-log=ON 啟動一般查詢日志
log=ON 全局日志開關
log-output 日志的記錄類型
慢查詢日志
記錄需要較長時間的查詢操作
log-slow-queries=保存路徑 啟動慢查詢日志,並設置個路徑
二進制日志
所有對數據庫狀態更改的操作(create、drop、update等)
log-bin=位置 啟動二進制日志
> show binary logs 查看當前使用的二進制日志
> show binlog events in '二進制日志(mysql-bin.000001)' 查看二進制日志的內容
還原:(mysqlbinlog)
按時間還原:
mysqlbinlog --start-datetime 'YY-MM-DD HH:MM:SS' --stop-datetime 'YY-MM-DD HH:MM:SS' 二進制日志 | mysql(-uroot -p)
按文件大小還原:
--start-position
--stop-position
事務日志:記錄事務相關的日志信息
中繼日志:記錄從服務器的備份信息
-
二進制日志還原
原理:根據產生的日志文件中的標簽,恢復丟失文件或指定動作
1.安裝:yum -y install mysql mysql-server
2.開啟二進制日志:vim /etc/my.cnf
在[mysql]下添加:log-bin=mysql-bin
3.重啟:service mysqld start
4.查看二進制日志文件:ls /var/lib/mysql/
5.查看二進制日志內容:mysqlbinlog mysql-bin.000003
例:
# at 710(大小)
#180802(年月日) 3:24:01 server id 1 end_log_pos 805 Query thread_id=2 exec_time=1089 error_code=0
SET TIMESTAMP=1533151441/*!*/;
create table a1 (id int,age int)(數據庫中執行過的命令)
/*!*/;
按時間還原
mysqlbinlog --start-datetime '2018-08-02 3:24:01' --stop-datetime '2018-08-02 3:25:35' mysql-bin.000003 | mysql
注:所選時間段一定要完整包含所有動作(可以在原來基礎上稍微增加點時間)
按文件大小還原
mysqlbinlog --start-position 710 --stop-position 1078 mysql-bin.000003 | mysql
-
主從備份
- 安裝:yum -y install mysql mysql-server
- 主從都寫入二進制日志:vim /etc/my.cnf
log-bin=mysql-bin
server-id=100 #mysql服務id,需要不一樣
3.在主服務器上授權,從服務器保存授權的信息
主:
grant replication slave on *.* to aa@192.168.10.101 identified by '111111';
show master status; #特殊的授權權限
從:
change master to master_user='aa', master_password='111111', master_host='192.168.10.100', master_log_file='mysql-bin.000003', master_log_pos=255; #根據主的master status修改,會產生master.info文件
start slave; #開啟從服務器
show slave status\G; #查看是否開啟成功,兩個線程是否yes
- 測試,在主服務器上創建數據庫和表
-
主主備份
注:多主主,需要要注意主鍵沖突,奇偶輪替
- 安裝:yum -y install mysql mysql-server
- 主從都寫入二進制日志:vim /etc/my.cnf
主1:
log-bin=mysql-bin
server-id=100
replicate-do-db=test #規定test數據庫備份,刪除就不受限
binlog-ignore-db=mysql #規定mysql數據庫不備份
binlog-ignore-db=information_schema #規定information_schema不備份
auto-increment-increment=2 #防止主鍵沖突,數據id號從1,3,5,7開始
auto-increment-offset=1
主2:
log-bin=mysql-bin
server-id=101
replicate-do-db=test
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
auto-increment-increment=2
auto-increment-offset=2
- 啟動服務器service mysqld start
- 授權和保持授權信息(互為主從,互相授權和保存授權)
主:grant replication slave on *.* to bb@192.168.10.100 identified by '111111';
從:change master to master_user='bb', master_password='111111', master_host='192.168.10.101', master_log_file='mysql-bin.000004', master_log_pos=260;
-
一主多從
原理:與主從服務一樣操作,注意id
-
多主一從
- 安裝:yum -y install mysql mysql-server
- 主從都寫入二進制日志:vim /etc/my.cnf
log-bin=mysql-bin
server-id=100 #mysql服務id,需要不一樣
- 主服務器授權(主1,主2)
grant replication slave on *.* to asd@'192.168.10.102' identified by '111111';
-
修改從服務器my.cnf添加以下內容
[mysqld_multi]
mysqld=/usr/bin/mysqld_safe
mysqladmin=/usr/bin/mysqladmin
log=/tmp/multi.log
[mysqld15]
port=3306
datadir=/var/lib/mysqla/
pid-file=/var/lib/mysqla/mysqld.pid
socket=/var/lib/mysqla/mysql.sock
user=mysql
server-id=17
[mysqld16]
port=3307
datadir=/var/lib/mysqlb/
pid-file=/var/lib/mysqlb/mysqld.pid
socket=/var/lib/mysqlb/mysql.sock
user=mysql
server-id=17
注意:mysqladmin 圖片上多了一個d
-
從服務器初始化數據庫,生成目錄mysqla,mysqlb
mysql_install_db --datadir=/var/lib/mysqla --user=mysql
mysql_install_db --datadir=/var/lib/mysqlb --user=mysql
- 設置mysqla,mysqlb目錄及以下文件的屬主為mysql(防止出現權限問題)
- 啟動從服務器線程(執行保持授權信息)
mysqld_multi --defaults-file=/etc/my.cnf start 100
mysqld_multi --defaults-file=/etc/my.cnf start 101
- 登錄並保存授權信息
change master to master_user='asd', master_password='111111', master_host='192.168.10.100', master_log_file='mysql-bin.000005', master_log_pos=491;
start slave;
show slave status\G;
- 從服務器測試登入
mysql -P 3306 -S /var/lib/mysqla/mysql.sock
mysql -P 3307 -S /var/lib/mysqla/mysql.sock
-
讀寫分離
數據庫的中間件:
mysql proxy (官方版本) 性能低,需要lua腳本
atlas 性能低,響應時間長
amoeba 陳思儒研發的
- 先搭建一個主從關系的服務器
#關閉從服務器線程,為了做讀寫分離時,測試有明顯的實驗效果(實際生產環境中不能停掉。。)
- 安裝gcc(amoeba需要源碼安裝)
- 上傳amoeba,解壓,改名
- mkdir /amoeba
- 解壓jdk,並改名成jdk或鏈接一個jdk目錄
-
聲明用java寫出來的程序如何調用(/etc/profile)
#set java environment
JAVA_HOME=/amoeba/jdk
CLASSPATH=.:$JAVA_HOME/lib.tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
source /etc/profile #加載
java -version #測試是否成功
- 解壓amoeba,到/usr/local/amoeba
- chmod -R +x /usr/local/amoeba/bin/(最好給予相應權限)
- vim /usr/local/amoeba/conf/amoeba.xml(配置文件,注意標簽)
<server> #server 區域
<property name="port">8066</property> #端口
<property name="ipAddress">192.168.99.17</property> #本機 IP
<property name="readThreadPoolSize">20</property> #默認
<property name="clientSideThreadPoolSize">30</property> #默認
<property name="serverSideThreadPoolSize">30</property> #默認
<property name="netBufferSize">128</property> #默認
<property name="tcpNoDelay">true</property> #默認
<property name="user">huang</property> #登錄 amoeba 的用戶名
<property name="password">123456</property> #登錄 amoeba 的用密碼
</server>
<dbServerList> #服務區域
<dbServer name="server1"> #服務器名
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="port">3306</property> #端口
<property name="ipAddress">192.168.99.15</property> #登錄的數據庫
<property name="schema">test</property> #同步的庫
<property name="user">amb</property> #登陸的數據庫授權用戶名
<property name="password">123456</property> #登陸的數據庫授權用戶的密碼
</factoryConfig>
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
#優化相關,可以不改
</poolConfig>
</dbServer>
復制一個服務區域
<dbServer name="server2"> #服務器名
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="port">3306</property> #端口
<property name="ipAddress">192.168.99.16</property> #登錄的數據庫
<property name="schema">test</property> #同步的庫
<property name="user">amb</property> #登陸的數據庫授權用戶名
<property name="password">123456</property> #登陸的數據庫授權用戶的密碼
</factoryConfig>
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
#優化相關,可以不改
</poolConfig>
</dbServer>
<dbServer name="master" virtual="true"> #池的名字 master,用於寫授權
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<property name="loadbalance">1</property>
<property name="poolNames">server1</property>
</poolConfig>
</dbServer>
<dbServer name="slave" virtual="true"> #池的名字 slave,用於讀授權
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<property name="loadbalance">1</property>
<property name="poolNames">server1,server2</property> #讀取順序
</poolConfig>
</dbServer>
</dbServerList>
<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="defaultPool">master</property> #默認訪問池
<property name="writePool">master</property> #寫入池
<property name="readPool">slave</property> #讀取池
</queryRouter>
- vim /usr/local/amoeba/bin/amoeba
58行修改:-Xss256k
- 授權amoeba能連接到主從服務器進行查詢
grant all on *.* to asd@'192.168.10.102' identified by '111111';
- 啟動amoeba,如果exit提示報錯,查看nohup.out文件
nohup bash -x /usr/local/amoeba/bin/amoeba &
- ps aux | grep amoeba
- 用amoeba或另一台客戶機連接登入測試
mysql -uhuang -p -h 192.168.10.100 -P 8066
#如果測試讀分離,需要關閉從slave,主從創建相同表,用select查看轉換
-
-
redis數據庫
NoSQL(NoSQL = Not Only SQL )
NoSQL是key-value形式存儲,和傳統的關系型數據庫不一樣,不一定遵循傳統數據庫的一些基本要求,比如說遵循SQL標准、ACID屬性、表結構等等。
這類數據庫主要有以下特點:非關系型的、分布式、開源的、水平可擴展的。
處理超大量數據
運行在便宜的服務器集群上
擊碎了性能瓶頸
對數據高並發讀寫
對海量數據的高效率存儲和訪問
對數據的高擴展性和高可用性
Redis
Redis是一個開源的,先進的key-value存儲。它通常被稱為數據結構服務器,因為鍵可以包含string(字符串)、hash(哈希)、list(鏈表)、set(集合)和zset(sorted-set--有序集合)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作。
Redis和Memcached類似,它支持存儲的value類型相對更多,與memcached一樣,為了保證效率,數據都是緩存在內存中,區別是Redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Redis支持語言
ActionScript、C、C++、C#、
Clojur、Common Lisp、Dart、
Erlang、Go、Haskell、Haxe、
Io、Java、Node.js、Lua、
Objective-C、Perl、PHP、
Pure Data、Python、R、Ruby、
Scala、Smalltalk、Tcl
-
Redis安裝
Redis的官方網站是:http://redis.io
步驟一:
下載安裝包:
wget http://download.redis.io/releases/redis-2.8.6.tar.gz
步驟二:
編譯安裝:
tar –xf redis-2.8.6.tar.gz
cd redis-2.8.6
make
make PREFIX=/usr/local/redis install
mkdir /usr/local/redis/etc/
cp ./redis.conf /usr/local/redis/etc/
#指定安裝位置,如果沒有指定安裝位置PREFIX=/usr/local/redis,則make install會把redis安裝到/usr/local/bin/目錄下
-
Redis啟動與關閉
啟動:
- vi /usr/local/redis/etc/redis.conf
修改daemonize yes 后台啟動
- usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
#啟動redis服務
#不加配置文件會提示警告
- /usr/local/redis/bin/redis-cli
#客戶端啟動操作
-h IP #連接指定的redis服務器
-p 6379 #指定redis服務器的端口
-a 密碼 #使用密碼登錄
-n 數據庫號 #指定連接哪個數據庫
--raw #redis支持存儲中文
關閉:
- usr/local/redis/bin/redis-cli shutdown
- pkill -9 redis
Redis配置文件
/usr/local/redis/bin/下的可執行文件的作用
redis-server #服務器端
redis-cli #客戶端
redis-benchmark #調試
redis-check-dump #數據導出
redis-check-aof #數據導入
/usr/local/redis/etc/redis.conf配置文件
daemonize #如果需要后台運行,改成yes
pidfile #配置多個pid的地址,默認在/var/run/redis.pid
bind #綁定ip,設置后只接受來自該ip的請求
port #監聽端口,默認為6379
timeout #設置客戶端連接時的超時時間,單位為秒
loglevel #分為4級,debug、verbose、notice、warning
logfile #配置log文件地址
databases #設置數據庫的個數,默認使用的數據庫為0,最大為16個
save #設置Redis進行數據庫鏡像的頻率(快照)
rdbcompression #在進行鏡像備份時,是否進行壓縮
dbfilename #鏡像備份文件的文件名
dir #數據庫鏡像備份的文件放置位置
slaveof #設置數據庫為其他數據庫的從數據庫
masterauth #主數據庫連接需要的密碼驗證
requirepass #設置登錄時需要使用密碼
maxclients #限制同時連接的客戶數量
maxmemory #設置redis能夠使用的最大內存
appendonly #開啟append only模式
-
Redis的數據類型與命令
redis提供五種數據類型:string,hash,list,set及zset(sorted set)。
string類型及操作
string是最簡單的類型,一個key對應一個value,string類型是二進制安全的。redis的string可以包含任何數據,比如jpg圖片或者序列化的對象
命令
用法
作用
set
set name lamp
設置key對應的值為string類型的value
string類型一個鍵值對應一個value
setnx
setnx name linux
#設置key值,如果 key已經存在,返回0,nx是not exist的意思
setex
setex age 10(秒) 18(key)
設置key值,指定有效期
ttl
ttl age
以秒為單位,返回給定 key 的剩余生存時間當 key 不存在時,返回 -2
當 key 存在但沒有設置剩余生存時間時,返回 -1
否則,返回 key 的剩余生存時間
setrange
setrange name 9 itxdl.com
替換第9個開始的字符串為itxdl.com
mset
mset key1 aa key2 bb
一次設置多個key,成功ok,失敗0
msetnx
msetnx key1 aa key2 bb
一次設置多個key,成功ok,失敗0,不覆蓋
get
get name
獲取key對應的string值,不存在返回nil
getset
getset name aa
設置key的值,並且返回key的舊值
getrange
getrange name 0 7
獲取指定范圍內的字符
mget
mget key1 key2 key3
獲取多個key的值,如果沒有,返回nil
incr
incr key
對key的值做加加操作(遞增)
incrby
incrby key 5
對key的值做指定值得的加操作
decr
decr key
對key的值做加加(遞減)操作,返回新的值
append
append key bb
給指定的key的字符串追加值
strlen
strlen key
獲取key值的長度
del
del key
刪除一個已創建的key
hash類型及操作
Redis hash是一個string類型的field(字段)和value的映射表,它的添加、刪除操作都是0(1)平均;hash特別適合用於存儲對象,相較於將對象的每個字段存成單個string類型,將一個對象存儲在hash類型中會占用更少的內存,並且可以更方便的存取整個對象
命令
用法
作用
hset
hset num1 name aa
為num1表創建一個叫name字段(key),鍵值是liuchuan
hsetnx
hsetnx num name aa
key不存在,則先創建,如果存在則返回0
hmset
hmset num name aa age 18
同時設置hash的多個field
hget
hget num name
獲取hash表里面的某一個字段
hmget
hmget num name age
獲取hash表里面的多個字段
hincrby
hincrby num age 5
指定的hash field加上給定值,數字疊加
hexists
hexists num age
測試field是否存在,1存在,0不存在
hlen
hlen num
返回指定hash的field數量
hdel
hdel num age
刪除指定hash的field
hkeys
hkeys num
返回hash的所有的field
hvals
hvals num
返回hash的所有value
hgetall
hgetall num
同時返回指定hash表中的全部field和value
list類型及操作
list是一個鏈表結構,主要功能是push、pop、獲取一個范圍內的所有值等等,操作中key理解為鏈表的名字。Redis的list類型其實就是一個每個子元素都是string類型的雙向鏈表。我們可以通過push、pop操作從鏈表的頭部或尾部添加刪除元素,這樣list既可以做為棧,又可以作為隊列
命令
用法
作用
lpush
lpush list world
在key對應list的頭部添加字符串元素
rpush
rpush list world
在key對應list的尾部添加字符串元素
linsert
linsert list before aa bb
在key對應的list的aa前或后添加字符串,after之后添加
lset
lset list 0 aa
設置list中指定下標的元素值
lrem
lrem list 1 aa
從key對應list中刪除n個"指定值"的元素n 代表刪除"指定值"元素的數量
n > 0 從頭向尾刪除n個"指定值"元素
n < 0 從尾向頭刪除n個"指定值"元素
n = 0刪除所有值為"指定值"的元素
lpop
lpop list
從list的頭部刪除元素,並返回刪除元素
rpop
rpop list
從list的尾部刪除元素,並返回刪除元素
Set類型及操作
set是集合,他是string類型的無序集合。Set是通過hash table實現的,對集合我們可以取並集、交集、差集。通過這些操作我們可以實現社交網站中的好友推薦和blog的tag功能。集合不允許有重復值
命令
用法
作用
sadd
sadd mset 1 2 3 4
添加一個或多個元素到集合中
smembers
smembers mset
獲取集合里面所有的元素
srem
srem mset 2 3
從集合中刪除指定的一個或多個元素
spop
spop mset
隨機從集合中刪除一個元素,並返回
srandmember
srandmember mset
隨機返回集合中一個元素,但不刪除
scard
scard mset
獲取集合里面的元素個數
sismember
sismember mset 3
確定一個指定的值是否是集合中的元素,返回1是有,返回0是無
sdiff
sdiff mset1 mset2
返回集合1與集合2的差集,前為標准
sinter
sinter mset1 mset2
獲得兩個集合的交集
sinterstore
sinterstore a b c
獲得集合1和集合2的交集,並把結果存入新集合,第一個是新集
sunion
sunion a b
獲得指定集合的並集
sunionstore
sunionstore a b c
獲得指定集合的並集,並把結果保存如新集合
smove
smove a b 2
將指定的值從源集合移動到目標集合,a源
zset類型及操作
zset是set的一個升級版本,它在set的基礎上增加了一個順序屬性,這一屬性在添加修改元素的時候可以指定,每次指定后,zset會自動重新按新的值調整順序。可以理解為有兩列的mysql表,一列存的value,一列存的順序。操作中key理解為zset的名字。
命令
用法
作用
zremrangebyrank
zremrangebyrank a 0 1
刪除有序集合中,下標在指定區間的元素
zcard
zcard zset
返回有序集合元素的個數
zadd
zadd zset 1 a 2 b
向一個指定的有序集合中添加元素,每一個元素會對應的有一個分數,必須是一個表示數字的字符串
zrange
zrange zset 0 -1 withscores
返回有序集合中,指定區間內的成員。其中成員按照score(分數)值從小到大排序。具有相同score值的成員按照字典順序來排列,withscores:返回集合中元素的同時,返回其分數
zrevrange
zrevrange zset 0 -1
返回有序集合中,指定區間的成員。其成員按照score從大到小來排列
zrangebyscore
zrangebyscore zset 2 3
返回有序集合中score在指定區間的值
zrem
zrem zset a
刪除有序集合中指定的值
zincrby
zincrby zset 5 a
給有序集合中指定值的成員的分數(score)值加上增量,如果集合中沒有這個值,則給添加一個分數是增加的值。
zrank
zrank zset a
返回有序集合中指定值的下標
-
Redis常用命令
命令
用法
作用
keys
keys *
按照鍵名查找指定的鍵,支持通配符
exists
exists name
確認一個鍵是否存在
expire
expire age 20
設置一個鍵的過期時間,如果鍵已經過期,將會被自動刪除
select
select 1
選擇一個數據庫。默認連接的數據庫是0,可以支持共16個數據庫。在配置文件中,通過databases 16 關鍵字定義
move
move age 1
將當前數據庫的鍵移動到指定的數據庫中
randomkey
randomkey
從當前數據庫返回一個隨機的鍵。如果當前庫沒有任何鍵,則返回nil
rename
rename name name_new
對鍵名進行重命名
type
type age
返回鍵的類型
quit或ctrl+d
退出redis數據庫
save
保存所有的數據。很少在生產環境直接使用SAVE 命令,因為它會阻塞所有的客戶端的請求,可以使用BGSAVE 命令代替. 如果在BGSAVE命令的保存數據的子進程發生錯誤的時,用 SAVE命令保存最新的數據是最后的手段
dbsize
dbsize
返回當前庫中鍵的數量
info
info
獲取服務器的詳細信息
config get
config get *
獲取redis服務器配置文件中的參數。支持通配符
flushdb
flushdb
刪除當前數據庫中所有的數據
flushall
flushall
刪除所有數據庫中的所有數據
Redis高級應用
安全性
設置客戶端連接后進行任何其他指定前需要使用密碼。
警告:因為redis速度非常快—嗖,所以在一台比較好的服務器下,一個外部的用戶可以在一秒內進行150K次的密碼嘗試,這意味着你要指定非常強大的密碼來防止暴力破解。
密碼三原則:復雜性、易記性、時效性
持久化
Redis是一個支持持久化的內存數據庫,也就是說需要經常將內存中的數據同步到硬盤來保證持久化。
snapshotting(快照)--默認方式
RDB持久化方式能夠在指定的時間間隔能對你的數據進行快照存儲。是默認的持久化方式。這種方式是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名為dump.rdb。這種持久化方式被稱為快照 snapshotting(快照)
# 過了900秒並且有1個key發生了改變就會觸發save動作
# 過了300秒並且有10個key發生了改變就會觸發save動作
# 過了60秒並且至少有10000個key發生了改變也會觸發save動作
append-only file(縮寫aof)
使用AOF 會讓你的Redis更加耐久: 你可以使用不同的持久化策略:每次寫的時候備份、每秒備份、無備份。使用默認的每秒備份策略,Redis的性能依然很好(備份是由后台線程進行處理的,主線程會盡力處理客戶端請求),一旦出現故障,你最多丟失1秒的數據。
appendonly no
#默認不使用AOF持久化(450行)將no改成yes
appendfsync always
#有寫操作,就馬上寫入磁盤。效率最慢,但是最安全
appendfsync everysec
#默認,每秒鍾寫入磁盤一次
appendfsync no
#不進行AOF備份,將數據交給操作系統處理。最快,最不安全
事務處理
Redis對事務的支持還是比較簡單的。Redis只能保證一個client發起的事務中的命令可以連續的執行,而中間不會插入其它的client命令。
當一個client在連接中發出multi命令時,這個鏈接會進入一個事務處理模式,該鏈接后續的命令不會立即執行,而是先儲存在一個隊列中,當執行對應結束命令時,redis才會對隊列當中存儲的命令進行依次順序執行或取消執行。
實驗:
multi #開啟事務
set age 30
set age 40
exec #結束事務
discard #結束事務事務處理輸入,並且清空隊列當中的命令
發布及訂閱消息
發布訂閱(pub/sub)是一種消息通訊模式,主要的目的是解除消息發布者和消息訂閱者之間的耦合,Redis作為一個pub/sub的server,在訂閱者和發布者之間起到了消息路由的功能。
訂閱者可以通過subscribe和psubscribe命令向redis server訂閱自己感興趣的消息類型,redis將信息類型稱為通道。
當發布者通過publish命令向redis server 發送特定類型的信息時,訂閱該信息類型的全部client都會收到此消息。
實驗:開啟三個終端,全部登入redis client
終端1:subscribe tv1 #訂閱消息
終端2:subscribe tv1 tv2 #訂閱消息
終端3:publish tv1 hello #發布消息
-
redis服務器設置密碼
1.修改配置文件
vim /usr/local/redis/etc/redis.conf
修改 requirepass 123456
2.重啟redis
.../bin/redis-cli shutdown
…/bin/redis-server …/etc/redis.conf
3.redis連接
…/bin/redis-cli
or !!!歷史命令會明文保存密碼
Redis主從復制特點:
- master可以擁有多個slave
- 多個slave可以連接同一個master外,還可以連接到其它slave
- 主從復制不會阻塞master,在同步數據時,master可以繼續處理client請求
-
提高系統的伸縮性
Redis主從復制過程:
- Slave與master建立連接,發送sync同步命令
- Master會啟動一個后台進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存。
- 后台完成保存后,就將此文件發送給slave
- Slave將此文件保存到硬盤上
-
不同服務器配置主從
- 在slave服務器上vim /usr/local/redis/etc/redis.conf
slaveof 主服務器IP 主服務器端口
masterauth 主服務器密碼
bind 綁定服務器連接IP,需要注釋了
- 重啟slave服務器
- 測試
-
同一服務器配置主從
- 復制從服務器
cp -r /usr/local/redis/ /usr/local/redis-slave
- 修改從服務器配置文件vim /usr/local/redis-slave/etc/redis.conf
pidfile /usr/local/redis-slave/redis.pid #指定pid文件
port 63791 #指定端口號
dir /usr/local/redis-slave/ #指定數據庫文件存放位置
slaveof 127.0.0.1 6379 #指定主服務器IP和端口
masterauth flzx_3QC #指定主服務器密碼
- 啟動slave服務…/bin/redis-server …/etc/redis.conf
#查看兩個redis端口是否都啟動了
- 連接服務器…/bin/redis-cli
-



