Posted on

rsync 透過 SSH 傳送及備份檔案

rsync 是很常用的檔案傳送工具,以下會介紹用 rsync + SSH 傳送檔案,並以 CentOS 7 作為測試環境。

第一步先在 Server 產生一組 public SSH keys, 該 Client 端可以不用輸入密碼登入



		


現在可以將 public.key 的內容複制起來,可以用 cat 指令:



		


將以上 public.key 內容複製後,登入到 Client 端,並儲到到 ~/.ssh/authorized_keys, 如果 .ssh/ 目錄不存在,需要手動建立並建立正確權限:



		


現在可以在 Client 端用 rsync 備份 Server 端竹的資料,或者備份資料到 Server 端,以下指 rsync 透過 SSH 傳送檔案的指令語法:



		


以上指令會以 “username” 作為登入帳號,並將 Server 端 (xxx.xxx.xxx.xxx) 上面的 /var/www 目錄,全部資料備份到 Client 端的 /home/backup/www 目錄。

Posted on

mdadm软RAID的删除方法和注意事项

删除整个RAID:


mdadm/dev/md0–fail/dev/sdb–remove/dev/sdb
mdadm/dev/md0–fail/dev/sdc–remove/dev/sdc
mdadm/dev/md0–fail/dev/sdc–remove/dev/sdd
mdadm/dev/md0–fail/dev/sde–remove/dev/sde
mdadm/dev/md0–fail/dev/sdf–remove/dev/sdf


mdadm–stop/dev/md0
mdadm–remove/dev/md0


mdadm–misc–zero-superblock/dev/sdb
mdadm–misc–zero-superblock/dev/sdc
mdadm–misc–zero-superblock/dev/sdd
mdadm–misc–zero-superblock/dev/sde
mdadm–misc–zero-superblock/dev/sdf


即:先删除RAID中的所有设备,然后停止该RAID即可

为了防止系统启动时候启动raid
rm-f/etc/mdadm.conf
rm-f/etc/raidtab

检查系统启动文件中是否还有其他mdad启动方式
vi/etc/rc.sysinit+/raid\c

 

 
Posted on

How to remove GPT partition table in Linux

I have an USB stick device which has an HFS volume with GPT partition table. I want to write an iso image to the stick with:

$ sudo dd if=debian-8.2.0-amd64-CD-1.iso of=/dev/sdb bs=8M

Command completed successfully but when I re-insert usb stick, it still tries to use information from GPT partition table.

So, I used gdisk utilitiy’s zap (destroy) GPT data structures option to remove GPT partition like below:

sudo gdisk /dev/sdb
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): x

Expert command (? for help): z
About to wipe out GPT on /dev/sdb. Proceed? (Y/N): Y
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
Blank out MBR? (Y/N): Y

After that I created a new DOS partition through fdisk and write iso image with dd. However, when I try to reinsert USB stick, it still identified with old information (as an hfsplus volume) in kernel:

GPT:Alternate GPT header not at the end of the disk.
GPT:1390003 != 15654847
GPT: Use GNU Parted to correct GPT errors.
sdb: sdb1 sdb2 sdb3
sd 13:0:0:0: [sdb] Attached SCSI removable disk
ISOFS: Unable to identify CD-ROM format.
hfsplus: invalid secondary volume header
hfsplus: unable to find HFS+ superblock
Posted on

使用 rsync 實做重複資料刪除技術 差異備份 版本控制 增量備份

使用 rsync 實做重複資料刪除技術 差異備份 版本控制 增量備份

5662轉錄

前言 原文
很多人使用rsync這個工具軟體進行日常檔案備份的工作。這個用來取代rcp的遠端檔案複製工具使用非 常有效率的演算法進行檔案比對、傳輸與複製,並且支援遠端shell (remote-shell) 和rsync伺服器 (rsync daemon) 的彈性架構,讓整個檔案同步、備份的工作可以簡單的進入排程,達到完全自動。 


而 隨著軟體版本的演進,超過一百個以上的功能選項,對於絕大部分的使用者來說可能還只是單純使用「歸檔」 (-a) 和「同步刪除」 (–delete) 這兩個選項就滿足了日常需求。不過像這樣簡單的設定在重複操作之下只能保有一份備份當時的全備份,卻也同時讓之前的備份直接被覆蓋而無法參考。因此,如果 需要保留多次長週期的備份而使用相同的方法,這似乎意味著需要倍數的磁碟空間,和指定不同的歸檔路徑才可以容納得下多次全備份。 


其 實rsync早已支援「增量備份」的實做方法。透過不同的功能選項可以讓每次同步備份過程中遇到的「差異」用不同方式保留下來,做到增量備份的效果。只是 在技巧上必須撰寫指令稿 (script) 將整個備份流程包裝起來才能達到實用的目的。因此已經有許多配合rsync的「前導程式」 (不用修改軟體而達到修改軟體的目的的工具軟體) 被開發出來,使用整合的操作介面針對每次備份出來的檔案進行版本控制,並提供類似高階儲存設備的「快照備份」 (snapshot) 呈現方式,讓使用者可以任意切換到歷史版本的目錄當中直接找到之前備份的檔案,而且重點是「不需要倍數的磁碟空間就可以容納多次的全備份」,這似乎與「重 複資料刪除技術」 (Data De-duplication) 有異曲同工之妙! 


以 下就針對rsync實做增量備份相關的功能選項做一個簡單的說明,並介紹一個以perl語言所開發的前導程式「rsnapshot」,看看它是如何將週期 性的rsync備份模擬成檔案系統的快照備份,讓使用者可以用最節省的空間的方式保有多次的備份,而且可以直接存取任一版本的全備份。 


rsync 的增量備份
為了方便說明,以下出現的語法是以直接在本機檔案系統下操作為範例。如果需要透過rsync daemon或remote-shell模式應用在遠端檔案系統,則直接代換對應的語法即可。 


基本同步
如果我們需要備份目錄a,最基本的語法會是像這個樣子: 


rsync -a –delete a/ b/


這 會在目的端產生一個目錄b,兩個目錄以下的內容在同步備份之後會一模一樣。-a代表歸檔模式,是-rlptgoD的簡化寫法,意味遞迴地進入來源端目錄a 下所有的目錄,將比對、複製所有的檔案和目錄,不僅保留時間、權限、擁有者、群組等屬性,連符號連結及設備檔案也一併複製。而–delete功能選項的 效果,在重複操作的時候,若目錄a下有檔案或目錄被刪除,會同步反應在目錄b。這裡需要注意到的地方,就是目錄a後面的斜線是必要的,如果沒有這個斜線, 則同步備份之後的結果就是將整個目錄a備份在目錄b之下,變成b/a/的效果。 


增量備份
使用–backup選項在同步備份過程中可以讓目的端的檔案,被覆蓋或刪除之前先進行更名的動作以保留下來。 


rsync -a –delete –backup a/ b/


使 用這個功能選項在預設的情況下,如果目錄a下的檔案file1被更新或刪除,則在下一次同步備份時,在目的端目錄b會將前一次備份的那個版本先更名為 file1~保留下來,然後如果是更新檔案則再儲存新版本的file1,如果是刪除檔案則就不動作。這樣的作法只能保有更新之前的版本,或之前還在的檔 案。在反覆同步備份操作之下,在目的端目錄b對任一檔案而言,頂多只能多留一份過去版本的備份,而形成諸多不同時間點不同檔案的「備份的備份」散落在目錄 b之下。 


所以解決這個問題的方法是另外透過–backup-dir來指定目的端的檔案在被覆蓋或刪除之前,先被複製到特定的路徑之下。這樣的作法相當是實做最簡易的增量備份。 


rsync -a –delete –backup –backup-dir=../c/ a/ b/


如 果目錄a的檔案被更新或刪除,則在下一次同步備份時,在目的端目錄b的前一次備份的那個版本會先複製到目錄c,然後再儲存新的版本到目錄b。 這與傳統增量備份的概念正好相反,傳統增量備份的第一份是全備份,之後的備份只留與前一次備份的差異;而rsync用–backup-dir方式進行增 量備份則是最後一次備份是全備份 (目錄b) ,同時將差異記錄在另外一個目錄裡 (目錄c) 。所以透過每次備份指定不同backup dir的技巧,就可以記錄每次備份當時的差異,這樣不用倍數的儲存空間,就可以保留多次備份當時的狀態。但這裡會有的問題是,在backup dir裡出現的檔案,是之前備份之後被修改或刪除的檔案,在利用上必須跟最後一次同步備份的目錄做比較,才大概可以看得出來檔案是被修改還是被刪除。因此 這個備份方式並不一定適用在任何環境。 


在這裡要注意的是,若使用相對路徑表示法,–backup-dir所指定的路徑就必須是相對於目錄b的路徑。所以前面範例的目錄b與目錄c是在同一層。而且–backup-dir是配合–backup同時使用的功能選項。 


另外一種與–backup-dir類似的功能選項是–compare-dest。這是一個獨立的選項,它讓來源端目錄a與指定的compare dest目錄c先進行比對,然後把是否覆蓋、刪除檔案的動作反應在目錄b。 


rsync -a –delete –compare-dest=../c/ a/ b/


這樣的作法必須是目錄c與目錄a之前曾先同步過,之後目錄a的任何檔案更新可以經由這個方式與目錄c比對後再將更新的檔案複製到目錄b。這個用途比較適合追蹤在前一次同步備份過後,有哪些檔案被更動過,但不包含被刪除。 


所以如果需要兩次完整的備份內容,可以用–copy-dest這個功能選項。 


rsync -a –delete –copy-dest=../c/ a/ b/


它 與–compare-dest類似,作法是目錄c與目錄a之前曾先同步過,之後一樣是讓來源端目錄a與指定的copy dest目錄c先進行比對,然後將沒有被更動的檔案直接從目錄c複製到目錄b,有被更動的檔案從目錄a複製到目錄b,被刪除的檔案就不儲存。這樣的好處是 從目錄c或從目錄b來看都是完整的某一次備份,而且應用在不同主機之間的備份可以節省很多網路頻寬,因為原本單純同步複製一個新的目的端就必須重新傳輸所 有檔案一次,而利用這個方式則直接在目的端主機上拿之前的備份來複製,進而提高同步的效率,而且每個目錄都是備份當時的全備份,直接拿來還原也很方便。 


不過這樣的操作就等於備份幾次就需要幾倍的空間,與原來往增量備份方向去想的作法就背道而馳了。 


所以在rsync版本2.5.6之後新增加–link-dest的功能選項,它把–copy-dest當中「沒有更動的檔案直接複製的動作」用檔案的「硬式連結」 (hard link) 來取代。 


rsync -a –delete –link-dest=../c/ a/ b/


所 以同樣的,目錄a與目錄c之前曾同步備份過,之後透過這個方式目錄a會先與目錄c進行比對,沒有被更動過的檔案直接在目錄b利建立硬式連結到目錄c的檔 案,有被更動的檔案則從目錄a複製到目錄b,被刪除的檔案則不儲存。這樣一來同樣從目錄c或從目錄b來看都是完整的某一次全備份,而且因為是檔案的硬式連 結,所以相同版本的檔案只佔據同一份空間。如果反覆備份多次,由於大部分的檔案都是靜態未被更動,那麼所有需要的容量就是最早的全備份與之後每次備份的差 異量的總和而已。 


其實在這個功能選項出現之前,就已經有方法可以做到相同的效果。一樣是用rsync反覆操作基本同步的方法 (-a –delete) ,只是在每次操作之前,先在目的端把之前備份好的目錄進行一次用硬式連結的複製。 


第一次備份:來源端目錄a同步備份到目的端目錄c。 


rsync -a –delete a/ c/


在目的端之前的備份是目錄c,則有兩種方式可以產生用硬式連結複製出來的目錄b: 


cp -al c/ b/


或 


cd c && find . -print | cpio -dpl ../b


第二次備份:來源端目錄a同步備份到目的端目錄b。 


rsync -a –delete a/ b/


這 裡的cp是GNU cp,在Linux環境下是預設的複製工具,可以直接使用。cp -al會以歸檔的方式複製檔案,但所有的檔案以硬式連結來建立。可是在其他平台上若沒有GNU cp,就不會有-al的選項,所以只能選擇用cpio來進行複製。 當完成這個複製動作之後,兩個目錄下檔案其實對應到相同的Inode,檔案本身的連結計數 (link counter) 加一之後為二,檔案對應到的實體區塊只有一份,所以除了目錄結構以外,不佔額外的空間。 接下來之後的備份使用rsync基本的同步方式指定目的端為目錄b。在這裡不用擔心因為是檔案的硬式連結,目錄b和目錄c下同一檔案當再次同步備份時會導 致一起被覆蓋或刪除,因為rsync預設的行為會先將異動的檔案以另外的檔名複製出來進行更新,然後再更名為原來的檔名。所以不管是覆蓋還是刪除,都只是 對原本檔案的連結計數做減一的動作,而在連結計數歸零之前,也就是檔案真正被刪除之前,都不會更動到原本備份的那個版本。 


所 以不管使用哪一個版本的rsync,再搭配一些操作的技巧就可以實做出類似「重複資料刪除技術」的效果。而我們不需要另外撰寫script來實做這個部 分,因為已經有許多現成的工具軟體可以自動化這些操作流程。以下就以rsnapshot這個軟體為例子,說明這是怎麼做到的。 

rsnapshot
rsnapshot 是一個自由軟體 (free software) ,可以從官方網站 (http://www.rsnapshot.org/) 下載,或從作業系統的軟體管理工具當中找到既有的port或package來進行安裝。它是一個以perl語言開發的工具軟體,一個遠端檔案系統的快照工 具 (remote filesystem snapshot utility) 。在架構上,可以用來備份本機或遠端的檔案系統,它在本機端是藉由rsync進行檔案複製,或透過ssh建立安全的rsync遠端shell與遠端主機進 行檔案傳輸,或直接與遠端主機的rsync伺服器連線。它是用「拉」的方式進行同步備份,也就是說,安裝rsnapshot的主機就是發動備份的主機,也 是儲存備份資料的主機。rsnapshot透過排程 (crontab) 週期地啟動同步備份,而所有需要備份檔案的遠端主機都安裝rsync或啟動rsync伺服器來等待週期的同步備份。當同步備份發生時,rsnapshot 根據設定將遠端主機需要備份的目錄「拉回」到本機特定的目錄架構裡。而這個目錄架構就是模擬高階儲存設備所提供的「快照備份」 (snapshot) 的目錄結構。依照不同的備份週期產生不同時間間隔的目錄,而在每個目錄下的檔案都是備份當時的全備份。透過檔案的「硬式連結」,在每次同步備份時,未曾更 動的檔案直接使用之前備份的版本進行硬式連結到最新的備份目錄下,也因此整體備份空間的需求就相當是一次全備份與異動檔案的不同版本所佔用的空間。 


在配置上,需要設定rsnapshot.conf這個檔案,和建立週期備份的排程 (crontab) 。 


設 定rsnapshot.conf非常簡單,使用預設的設定檔rsnapshot.conf.default直接拿來修改就可以了。在這個檔案裡面的每一個 段落都有完整的說明可以參考。其中需要注意的地方是,由於rsnapshot可以在不同平台上運作,為了實做「硬式連結」來節省相同檔案的使用空間,所以 必須根據所在的平台選擇最適當的外部工具。如果使用的rsync版本支援–link-dest的功能選項,則可以直接設定link_dest為1代表支 援。如果不支援則就會使用GNU cp的-al的複製方式來建立硬式連結,因此可以指定GNU cp的所在路徑。但如果作業環境裡沒有GNU cp工具而無法指定,則程式內部會額外模擬這個動作。 


另外要注意的就是備份時間間隔的表示法,這是與建立週期備份排程密切相關的設定。根據需要來決定多久備份一次,換句話說就是單位時間可以保留幾次備份。如果每四小時備份一次,意味著一天可以保留六次每四小時的備份;如果每天備份一次,代表著一週可以保留七次每天的備份。 


在rsnapshot.conf.default裡關於備份時間間隔的預設值如下: 


interval        hourly  6
interval        daily   7
interval        weekly  4
#interval       monthly 3


在系統設定相對應的crontab: 


0 */4 * * *         /usr/bin/rsnapshot hourly
50 23 * * *         /usr/bin/rsnapshot daily
40 23 * * 6         /usr/bin/rsnapshot weekly
#30 23 1 * *        /usr/bin/rsnapshot monthly


如 果根據預設值配合相對應的排程,那麼每四小時就會進行一次週期名稱為hourly的備份,它會在snapshot_root所定義的路徑下產生 hourly.0到hourly.5的六個目錄,目錄裡面就存放著備份的內容。hourly.0是最新的備份,每四小時啟動備份時,最舊的備份 hourly.5會先被刪除,然後依序將4,3,2,1的目錄尾數更名為5,4,3,2,再依照硬式連結產生的方式,如果是使用cp -al的模式,則將hourly.0複製出hourly.1後,直接用rsync基本同步的方式備份到hourly.0,如果是使用rsync –link-dest的模式,則在hourly.0更名為hourly.1後,rsync指定hourly.1為link dest然後備份到hourly.0。 


其 他不是排在最前面的週期名稱不需要實際使用rsync進行備份,因為可以直接保留前一個週期名稱的最舊的那個備份。譬如,週期名稱為daily的排程在每 晚23:50進行,因為設定保留七份,所以最舊的一份也就是daily.6在備份開始的時候先被刪除,然後依序將5,4,3,2,1,0的目錄尾數更名為 6,5,4,3,2,1,最後再把hourly.5更名為daily.0就完成了備份。所以排程上刻意比hourly提前十分鐘,搶在hourly.5被 刪除之前先更名為daily.0。而同樣的,weekly.0也是從daily.6更名得來。 


如果使用預設值進行hourly,daily,weekly的備份排程,那麼總共可以保有17份的備份。使用rsnapshot du的命令來可以觀察集中在snapshot_root的這些備份空間使用的情形。 


# rsnapshot du
15G     /backup/.snapshots/hourly.0/
16M     /backup/.snapshots/hourly.1/
21M     /backup/.snapshots/hourly.2/
23M     /backup/.snapshots/hourly.3/
19M     /backup/.snapshots/hourly.4/
19M     /backup/.snapshots/hourly.5/
22M     /backup/.snapshots/daily.0/
38M     /backup/.snapshots/daily.1/
31M     /backup/.snapshots/daily.2/
28M     /backup/.snapshots/daily.3/
53M     /backup/.snapshots/daily.4/
30M     /backup/.snapshots/daily.5/
38M     /backup/.snapshots/daily.6/
50M     /backup/.snapshots/weekly.0/
50M     /backup/.snapshots/weekly.1/
42M     /backup/.snapshots/weekly.2/
38M     /backup/.snapshots/weekly.3/
16G     total


這 裡顯示的是一個真實環境一個月下來保留17份備份所需要的空間。一次全備份大約需要容量15G,如果使用傳統備份方式保留相同數量的備份需要大約 255G。而rsnapshot實做硬式連結增量備份全部17份備份只用到大約16G的容量。而且每個週期名稱目錄下的所有檔案就是備份當時的備份內容, 所以要找回某一次備份取得所有檔案在時間上大約的一致性變得非常容易,因為這非常接近使用檔案系統或儲存設備所提供快照備份的功能,差別只是rsync執 行一回合從頭到尾畢竟還是會有「時間差」,開始備份到結束的時間點會有段距離,相對於真正的快照備份技術等於是「慢速快門」,所以這樣的作法適合用來備份 一般的檔案,卻不適合用來備份檔案之間時間相依性非常高而且不斷在變動的資料庫或其他環境。 


結語
其 實真正的「重複資料刪除技術」並不是像前述這樣的應用,主要是配合在一個既有的備份環境,譬如是一個D2D或D2D2T的架構當中做為備份軟體暫時緩衝用 的磁碟空間 (staging disk) 所使用的技術。透過儲存設備可以識別出重複出現的不定長度資料區塊而選擇不儲存的演算法,讓備份的image file在累積多次備份之後可以維持很高的「壓縮率」。又由於多次備份的image file都是儲存在磁碟上,所以還原的速度會比磁帶還來得快速。而rsync使用硬式連結減少重複檔案所需要的儲存空間,也可以找到特定時間版本備份的檔 案直接取回使用,在儲存原理上與重複資料刪除技術非常類似,在操作上與高階儲存設備提供的快照備份技術的應用方式非常接近。而為了解決rsync「慢速快 門」的問題,其實如果能夠在來源端的檔案系統使用真正的快照備份技術,讓rsync直接備份快照版本的檔案來取得時間點上的一致性,這樣不僅僅可以備份一 般檔案,還可以備份不斷在變動的信件檔或資料庫一直在開啟中的資料檔,進而擴大使用rsync的應用範圍。 




參考資料
http://www.mikerubel.org/computers/rsync_snapshots/ Easy Automated Snapshot-Style Backups with Linux and Rsync

Posted on

[CentOS 7] 整合 Apache、MySQL、PHP 7 組成 LAMP Server


加入 MySQL 套件庫
sudo rpm -Uvh https://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

EPEL 套件庫。
sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

還有 Webtatic 套件庫
(謎之音:攻城獅的爛個性又發作了,在 LEMP 沒搞定,到了實作 LAMP 還是硬要試試看。)
sudo rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

更新套件庫的快取資料,這邊同時會把預設的 MariaDB 換下來。
yum -y update

 

安裝主要套件

老規矩,用 yum 指令安裝。
sudo yum -y install httpd mysql-server php70w php70w-mysql

安裝過程要花一些時間。

同樣為了偉大的真勇者們留下 Source Code 傳送門。

 

開始設定

 

Apache

允許防火牆讓 HTTP、HTTPS 封包通過。
sudo firewall-cmd –permanent –zone=public –add-service=http
sudo firewall-cmd –permanent –zone=public –add-service=https
sudo firewall-cmd –reload

啟動 httpd,並讓它在開機後自動啟動。
sudo systemctl start httpd
sudo systemctl enable httpd

MySQL

啟動 MySQL Server,並讓它在開機後自動啟動。
sudo systemctl start mysqld
sudo systemctl enable mysqld

如果在登入 MySQL 的時候,出現下列的錯誤訊息。

  • ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: NO)
  • Error: Access denied for user ‘root’@’localhost’ (using password: NO)

請依照下列的步驟處理。

停止 MySQL 服務。
sudo systemctl stop mysqld

加入自訂環境變數,暫時不檢查權限。
sudo systemctl set-environment MYSQLD_OPTS=”–skip-grant-tables”

啟動 MySQL 服務。
sudo systemctl start mysqld

免密碼直接登入 MySQL。
mysql -u root

更新 root 的新密碼,這邊是用 P@ssw0rd,別忘了修改成自訂密碼。
UPDATE mysql.user SET authentication_string = PASSWORD(‘P@ssw0rd‘) WHERE User = ‘root’ AND Host = ‘localhost’;

重新載入權限。
flush privileges;

退出 MySQL。
quit

停止 MySQL 服務。
sudo systemctl stop mysqld

取消自訂環境變數。
sudo systemctl unset-environment MYSQLD_OPTS

啟動 MySQL 服務。
sudo systemctl start mysqld

這樣子就可以正常登入了。
mysql -u root -p

這邊請直接依照 建置 Nginx、MariaDB、PHP 7 的 LEMP Server 的 MariaDB 設定說明,將這些安全性設定值依需求做調整。
mysql_secure_installation

 

PHP

為 Apache 加入 PHP 的支援,步驟實在超簡單,就是「什麼都不用做」,只要在裝好 PHP 之後,重新啟動 Apache 就可以了。
sudo systemctl restart httpd

實際測試

我們直接連上 Apache 來看一下,看到這個畫面就代表 OK 了。

接著,建立一個 PHP 測試檔。
sudo vi /var/www/html/info.php

呼叫內建函數。
<?php phpinfo(); ?>

就可以看到 PHP 模組啟動成功。

MySQL 的支援模組也啟動成功了。

 

Posted on

[CentOS 7] 整合 Nginx、MariaDB、PHP 7 組成 LEMP Server

加入 EPEL 套件庫
sudo yum -y install epel-release

Remi 套件庫
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

以及 Nginx 套件庫
sudo vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

別忘了更新一下所有套件庫的快取資料。
sudo yum -y update

 

安裝主要套件

安裝的步驟也很簡單,全部交給 yum 指令來搞定就行了。
sudo yum -y install nginx php70-php-fpm mariadb-server

因為安裝的套件略多,這邊要稍等一下下 …

對,就是這麼簡單!
如果各位勇者有興趣自己編譯的話,原始碼在這裡請自便… XD。

 

開始設定及實測

 

Nginx

先允許防火牆讓 HTTP、HTTPS 封包通過。
sudo firewall-cmd –permanent –zone=public –add-service=http
sudo firewall-cmd –permanent –zone=public –add-service=https
sudo firewall-cmd –reload

直接啟動服務,並讓它在開機後自動啟動。
sudo systemctl restart nginx
sudo systemctl enable nginx

再修改預設主站台設定檔。
sudo vi /etc/nginx/conf.d/default.conf

改成下列內容,啟用 PHP 的支援。
server {
    listen       80;
    server_name  localhost;


    charset utf-8;
    access_log  /var/log/nginx/access.log  main;


    root   /usr/share/nginx/html;
    index  index.php index.html index.htm;


    location / {
        try_files $uri $uri/ =404;
    }


    error_page  404              /404.html;


    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }


    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

另外,因為 SELinux 會限制 Nginx 寫入動作,所以還要打開主目錄的存取權限。
sudo chcon -R -t httpd_sys_rw_content_t /usr/share/nginx/html

最後,讓新的設定值生效。
sudo systemctl reload nginx

在瀏覽器上就可以看到 Nginx 正常啟動了。

 

PHP-FPM

Nginx 跟 Apache 不同,必須配合 PHP-FPM 來啟用 PHP 的支援。

首先修改一下 PHP 的主設定檔。
sudo vi /etc/opt/remi/php70/php.ini

找到 ;cgi.fix_pathinfo=1,將 1 改成 0,並把註解拿掉。
cgi.fix_pathinfo=0

修改這個參數是因為有資安漏洞,請參閱 风雪之隅 – Nginx + PHP CGI的一个可能的安全漏洞

簡單的說,
就是因為 PHP 在解析路徑的時候,有機會被拿來執行那些偽裝成普通檔案的惡意程式碼。

接著,修改 PHP-FPM 的主設定檔。
sudo vi /etc/opt/remi/php70/php-fpm.d/www.conf

配合 Nginx 修改下列設定值。
user = nginx
group = nginx
listen.owner = nobody
listen.group = nobody

啟動 PHP-FPM,並讓它在開機後自動啟動。
sudo systemctl restart php70-php-fpm
sudo systemctl enable php70-php-fpm

測試的方法也很簡單,只要在預設站台的根目錄 /usr/share/nginx/html 下面,建立一個 PHP 檔案。
sudo vi /usr/share/nginx/html/info.php

就加入這一行指令即可。
<?php phpinfo(); ?>

不必重新啟動 Nginx 或是 PHP-FPM,直接打開瀏覽器,在網址列除了輸入 IP 之外,再加上 php 檔案名稱,例如 http://192.168.88.155/info.php,看到這個畫面就代表成功了。

 

MariaDB

啟動 MariaDB Server,並讓它在開機後自動啟動。
sudo systemctl restart mariadb
sudo systemctl enable mariadb

進行一些安全性的調整。
mysql_secure_installation

MariaDB 的 root 帳號,預設沒有密碼。

設定 root 帳號的新密碼,必須輸入兩次。

移除匿名帳號。

拒絕 root 帳號從遠端登入,這邊為了管理方便,所以選擇繼續允許。

刪除測試資料庫。

重新載入使用者權限。

完成之後,試著連線到 MariaDB Server,用 root 帳號的新密碼登入測試一下。
mysql -u root -p

此外,為了讓 PHP 可以連接 MariaDB,要再額外安裝 PHP 的模組。
sudo yum -y install php70-php-mysqlnd

裝好之後,重新啟動 PHP-FPM。
sudo systemctl restart php70-php-fpm

回到瀏覽器,重新載入剛剛的 PHP 測試頁,就會看到 MariaDB 的支援模組了。
(我們沒看錯,MySQL 跟 MariaDB 用同一個模組。)

Posted on

在 CentOS 7 中安装 Nextcloud

步骤 1 – 在 CentOS 7 中安装 Nginx 和 PHP7-FPM

在开始安装 Nginx 和 php7-fpm 之前,我们还学要先添加 EPEL 包的仓库源。使用如下命令:

现在开始从 EPEL 仓库来安装 Nginx:

然后我们还需要为 php7-fpm 添加另外一个仓库。互联网中有很个远程仓库提供了 PHP 7 系列包,我在这里使用的是 webtatic。

添加 PHP7-FPM webtatic 仓库:

然后就是安装 PHP7-FPM 以及 Nextcloud 需要的一些包。

最后,从服务器终端里查看 PHP 的版本号,以便验证 PHP 是否正确安装。

如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud

步骤 2 – 配置 PHP7-FPM

在这一个步骤中,我们将配置 php-fpm 与 Nginx 协同运行。Php7-fpm 将使用 nginx 用户来运行,并监听 9000 端口。

使用 vim 编辑默认的 php7-fpm 配置文件。

在第 8 行和第 10行,usergroup 赋值为 nginx

在第 22 行,确保 php-fpm 运行在指定端口。

取消第 366-370 行的注释,启用 php-fpm 的系统环境变量。

保存文件并退出 vim 编辑器。

下一步,就是在 /var/lib/ 目录下创建一个新的文件夹 session,并将其拥有者变更为 nginx 用户。

然后启动 php-fpm 和 Nginx,并且将它们设置为随开机启动的服务。

如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud

PHP7-FPM 配置完成

步骤 3 – 安装和配置 MariaDB

我这里使用 MariaDB 作为 Nextcloud 的数据库。可以直接使用 yum 命令从 CentOS 默认远程仓库中安装 mariadb-server 包。

启动 MariaDB,并将其添加到随系统启动的服务中去。

现在开始配置 MariaDB 的 root 用户密码。

键入 Y ,然后设置 MariaDB 的 root 密码。

这样就设置好了密码,现在登录到 mysql shell 并为 Nextcloud 创建一个新的数据库和用户。这里我创建名为 nextcloud_db 的数据库以及名为 nextclouduser 的用户,用户密码为 nextclouduser@。当然了,要给你自己的系统选用一个更安全的密码。

输入 MariaDB 的 root 密码,即可登录 mysql shell。

输入以下 mysql 查询语句来创建新的数据库和用户。

如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud

nextcloud_db 数据库和 nextclouduser 数据库用户创建完成

步骤 4 – 为 Nextcloud 生成一个自签名 SSL 证书

在教程中,我会让客户端以 https 连接来运行 Nextcloud。你可以使用诸如 let’s encrypt 等免费 SSL 证书,或者是自己创建自签名 (self signed) SSL 证书。这里我使用 OpenSSL 来创建自己的自签名 SSL 证书。

为 SSL 文件创建新目录:

如下,使用 openssl 生成一个新的 SSL 证书。

最后使用 chmod 命令将所有证书文件的权限设置为 600

如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud

步骤 5 – 下载和安装 Nextcloud

我直接使用 wget 命令下载 Nextcloud 到服务器上,因此需要先行安装 wget。此外,还需要安装 unzip 来进行解压。使用 yum 命令来安装这两个程序。

先进入 /tmp 目录,然后使用 wget 从官网下载最新的 Nextcloud 10。

解压 Nextcloud,并将其移动到 /usr/share/nginx/html/ 目录。

下一步,转到 Nginx 的 web 根目录为 Nextcloud 创建一个 data 文件夹。

变更 nextcloud 目录的拥有者为 nginx 用户和组。

步骤 6 – 在 Nginx 中为 Nextcloud 配置虚拟主机

在步骤 5 我们已经下载好了 Nextcloud 源码,并配置好了让它运行于 Nginx 服务器中,但我们还需要为它配置一个虚拟主机。在 Nginx 的 conf.d 目录下创建一个新的虚拟主机配置文件 nextcloud.conf

将以下内容粘贴到虚拟主机配置文件中:

保存文件并退出 vim。

下载测试以下该 Nginx 配置文件是否有错误,没有的话就可以重启服务了。

如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud

步骤 7 – 为 Nextcloud 配置 SELinux 和 FirewallD 规则

本教程中,我们将以强制模式运行 SELinux,因此需要一个 SELinux 管理工具来为 Nextcloud 配置 SELinux。

使用以下命令安装 SELinux 管理工具。

然后以 root 用户来运行以下命令,以便让 Nextcloud 运行于 SELinux 环境之下。如果你是用的其他名称的目录,记得将 nextcloud 替换掉。

接下来,我们要启用 firewalld 服务,同时为 Nextcloud 开启 http 和 https 端口。

启动 firewalld 并设置随系统启动。

现在使用 firewall-cmd 命令来开启 http 和 https 端口,然后重新加载防火墙。

如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud

至此,服务器配置完成。

步骤 8 – Nextcloud 安装

打开你的 Web 浏览器,输入你为 Nextcloud 设置的域名,我这里设置为 cloud.nextcloud.co,然后会重定向到安全性更好的 https 连接。

设置你的管理员用户名和密码,然后输入数据验证信息,点击 ‘完成安装 (Finish Setup)‘。

如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud

Nextcloud 管理面板大致如下:

如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud

Nextcloud 用户设置:

如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud

管理设置:

如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud

至此,我们在 CentOS 7 服务器上通过使用 Nginx、PHP7-FPM、MariaDB 完成了 Nextcloud 的安装。

参考链接
Posted on

WordPress on Centos 7 + Nginx + PHP 7 + Mariadb

1.Update the epel-release and install the REPO for remi-php 7
sudo yum -y install epel-release
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum install yum-utils
yum-config-manager --enable remi-php72
2.add nginx REPO
sudo nano /etc/yum.repos.d/nginx.repo
add code in /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
3.install nginx , mariadb , php
sudo yum -y update
sudo yum -y install nginx mariadb-server git libpng12
yum -y install php-devel php-mysql php-opcache php-gd php-common php-xmlrpc php-mcrypt php-zip php-cli php-xml php-mbstring php-curl php-fpm 
4.Open firewall port for service
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --permanent --zone=public --add-service=ftp
sudo firewall-cmd --reload
5.Setup nginx & PHP
sudo systemctl restart nginx
sudo systemctl enable nginx
sudo vi /etc/nginx/conf.d/lab.conf
sudo vi /etc/opt/remi/php71/php.ini
   cgi.fix_pathinfo=0
sudo vi /etc /php-fpm.d/www.conf
   user = nginx
   group = nginx
   listen.owner = nobody
   listen.group = nobody
sudo systemctl restart php-fpm
sudo systemctl enable php-fpm
6.copy the wordpress rouce code to /usr/share/nginx/wordpress/
chown -R nginx:nginx /usr/share/nginx/wordpress/
sudo systemctl restart nginx
7.setup the database
sudo systemctl restart mariadb
sudo systemctl enable mariadb 
mysql_secure_installation
8.Create Database for wordpress mysql –u root –p
create database wordpress;
grant all on wordpress.* to 'wordpress'@'localhost' identified by 'password';
flush privileges;
exit
Posted on

[Centos]用rsync+ssh+crontab做主機自動同步備份

製作不需詢問密碼就可以登入的ssh用戶

接下來我們要讓client透過ssh登入server時不再詢問密碼,這樣當我們用rsync透過ssh將資料同步備份到client時,就能全自動進行,不會卡在詢問密碼那裡

首先在client端製作公鑰和私鑰

$ ssh-keygen -t rsa

這中間會問你鑰匙要放在哪個目錄,還有passphrase,按三次Enter採用預設值

Generating public/private rsa key pair.
Enter file in which to save the key (/home/davidpai/.ssh/id_rsa):
Created directory ‘/home/davidpai/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/davidpai/.ssh/id_rsa.
Your public key has been saved in /home/davidpai/.ssh/id_rsa.pub.

最後鑰匙會產生在家目錄的.ssh目錄下,id_rsa.pub是公鑰,id_rsa就是私鑰,把公鑰傳到server上,然後到server上,將公鑰加入authorized_keys
authorised_keys放在家目錄的.ssh目錄下,如果還沒有這個目錄,手動把它建立起來

$ mkdir .ssh

第一次還沒有authorized_keys,直接用cat把id_rsa.pub的內容加進去

$ cat id_rsa.pub >> authorized_keys

以後要加其他的公鑰,也是用cat附加到該檔案後面就可以

回到client端,試試看是否不需要詢問密碼就能登入

$ ssh xxx@xxx.xxx.xxx

3. rsync同步備份

再來我們就可以用rsync來同步備份server端的資料

在client端輸入以下指令

$ rsync -av –delete -e ssh xxx@xxx.xxx.xxx:/var/www /home/backup

這樣就是把遠端server主機上的/var/www目錄全部資料同步備份到client端的/home/backup目錄裡,之後server端有任何異動,只會同步備份異動的部份,這就是所謂的差異備份。

那個-e參數後面要空一個寫ssh,表示傳輸過程我們要使用ssh通道加密。

那個–delete參數的意思是說,server端檔案如果刪除,client端也會刪除,如果不加這個參數,client端檔案就會留著不刪除,這個參數加不加可以自己斟酌。

4. 設定cron讓備份自動執行

最後我們想要讓server端的資料可以定時自動同步備份到client端,這就輪到crontab上場了
在client端把上述指令寫到crontab裡

$ crontab -e
2 4 * * * rsync -av –delete -e ssh xxx@xxx.xxx.xxx:/var/www /home/backup

這樣就是在每天凌晨04:02自動同步備份遠端server的/var/www目錄到/home/backup