由於自己搞了個vps,也搭建了vpn,日常科學上網與看看視訊還是沒什麼壓力的。想著也不能白白浪費每個月500G的流量,於是想起自己現在的hexo部落格。目前還沒有自己的私有域名與伺服器,用的還是傳統的github.io通用域名。作為it界的一員,既然有條件能變得更好就不應該不去做。於是花一天時間折騰出來的自己的專屬部落格系統。
下面我會將自己搭建過程中遇到的問題與步驟羅列出來,希望能夠幫助有同樣需求的你。
前提條件
首先我的搭建是基於以下條件之上的
- 本地hexo部落格已完成(github.io可以訪問)
- 有自己的vps
- 伺服器系統Centos 6 x86_64
- 有自己的域名
- 域名已進行解析
這裡就不介紹hexo部落格本地構建,想了解的推薦閱讀Hexo的安裝與配置
我們將要解決的主要問題是:
- SSH連線伺服器
- 下載git與建立git伺服器
- 下載nginx與配置nginx環境
- 本地hexo與伺服器關聯
SSH連線伺服器
SSH非常強大,在我日常工作中時刻相遇。相信你也是,可能你不曾注意到它而已。日常從伺服器拉取與上傳程式碼都是通過SSH進行通訊的。雖然將生成的id_rsa.pub公鑰交給伺服器後就再沒怎麼接觸過它,但並不能否認它的存在。
由於SSH可以幫助我們給伺服器構建一個安全與穩定的通訊,所以我這裡也使用SSH來連線伺服器。
在連線伺服器之前,你需知道自己伺服器的IP地址,相信都能夠拿到。
# 以root使用者連線伺服器
# 將12.12.12.12換成自己伺服器IP
# 如果你已經有自己的域名且已經進行了解析,則可以直接使用域名代替
ssh root@12.12.12.12
複製程式碼
相信這一步大部分人都會報下面一段錯
ssh: connect to host 12.12.12.12 port 22: Connection refused
複製程式碼
這是由於你的ssh預設連線埠22與你的伺服器埠不一致導致的。該問題有兩種解決方法,其一是改變ssh的預設埠;其二是指定連線埠。第一中不推薦,因為我都堅持能不動預設的的就不出修改預設的。所以我們使用第二中方法,在上面的連線命令列後再加上埠
ssh root@12.12.12.12 -p 埠
複製程式碼
接下來剩下的就是輸入密碼了,這樣我們就連線上伺服器了,現在可以在自己的電腦上遠端操作伺服器了。
插曲
如果你客戶端上沒有ssh公鑰,可以根據Hexo的安裝與配置來進行配置。
找到公鑰,公鑰位置:~/.ssh/id_rsa.pub,後續會用到。
git伺服器
連線上服務之後,首先檢視是否安裝了git,沒有的使用yum進行按照即可
yum install git
複製程式碼
裸庫
在開始搭建git伺服器之前,我們需要將現有的倉庫匯出為裸倉庫。意思就是一個不包含當前工作目錄的倉庫。主要是使用git的--bare。在操作之前我們先回到客戶端,再執行如下命令:
git clone --bare my_project blog.git
複製程式碼
my_project如果為遠端倉庫就使用遠端倉庫的ssh連結, blog.git可以隨便命名但必須以.git結尾。
現在我們已經有了倉庫的裸庫了,接下來需要將客戶端的裸庫copy到伺服器上,本質也是通過ssh進行通訊。
假設你的伺服器上已經有/opt/git/目錄,可以通過如下命令copy到伺服器
scp -r blog.git user@Ip:/opt/git
複製程式碼
user為連線使用者,例如root。如果又遇到埠問題,替換成下面的命令
scp -P 埠 -r blog.git user@IP:/opt/git
複製程式碼
注意大寫P
如果通過ssh連線的使用者對blog.git擁有可讀許可權,那麼他就可以通過如下命令克隆你的倉庫
git clone user@IP:/opt/git/blog.git
複製程式碼
當然如擁有可寫許可權,他也可以進行推送。所以如果後續你發現操作不了倉庫時,很大可能是該使用者沒有讀或寫許可權。
為了防止這一點,我們接下來建立git使用者
git使用者與認證
回到伺服器,對使用者進行認證。使用者認證使用authorized_keys進行,首先,建立一個作業系統使用者git,併為它建立.ssh目錄。
sudo adduser git
su git
cd
mkdir .ssh && chomd 700 .ssh
touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
複製程式碼
為了防止許可權問題,終極解決方法,可以將git新增到sudo使用者組
# 切換到root使用者
su root
sudo vi /etc/sudoers
複製程式碼
開啟檔案,使用:/root進行搜尋,在root下新增git使用者
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
git ALL=(ALL) ALL
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
複製程式碼
回到認證,我們為系統使用者git的authorized_keys檔案新增操作使用者的ssh公鑰,就是上面我們客戶端生成的公鑰。假設你已經將id_rsa.pub儲存到臨時檔案/tmp/id_rsa.pub中。執行如下命令,將公鑰加入到authorized_keys檔案的末尾
cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
複製程式碼
設定完之後,返回客戶端,執行如下命令,測試是否可以連線上伺服器
ssh -v git@IP -p 埠
複製程式碼
通過git伺服器、使用者認證與操作許可權,我們就可以實現對倉庫的人員新增與倉庫分支等的操作許可權限制。該功能就也市面上的程式碼託管平臺類似。感興趣的可以去研究。
現在我們已經完成一大半了,剩下的就是伺服器指向域名與程式碼上傳伺服器。
Nginx配置
nginx相信或多或少都有一點接觸吧,主要是服務端與前端。最近學習了前端,所以自己對nginx也不是那麼陌生。我們公司前端主要是用nginx來進行本地代理,方便本地測試。
話不多說,現在進行nginx配置
安裝
如果你使用下面命令就安裝成功,那麼你是幸運的
yum install nginx
複製程式碼
如果一切順利,請跳過安裝這部分,如果提示沒有找到nginx,請接下看。
由於我是使用Centos 6,nginx位於第三方的yum源中,而nginx不在Centos 6官方yum中,解決方法安裝epel(Extra Packages for Enterprise Linux)
yum install epel-release
複製程式碼
然後再檢視是否在源列表中,這非常重要,因為它可能不在源列表中。
yum repolist
複製程式碼
只有顯示了epel,接下來你執行nginx的安裝命令才不會失敗。
yum install nginx
複製程式碼
如果不存在,你執行上述命令nginx還是找不到。如果沒有意思到這一點,就是無頭緒為什麼一直報nginx找不到。如果不在,我們接著走。
開啟檔案epel.repo,將其中的enable=0改為enable=1
vi /etc/yum.repos.d/epel.repo
複製程式碼
然後執行下面命令檢視epel是否存在
yum repolist 2>&1 | grep epel
epel Extra Packages for Enterprise Linux 6 - x86_64 12,517
複製程式碼
如果展示了epel,代表已經存在。這時你再執行安裝nginx的命令就可以成功了。
安裝完之後,我們再將其啟動
service nginx start
# 設定開機啟動
chkconfig nginx on
複製程式碼
進行到這裡,你可以將伺服器的ip複製到瀏覽器,如果你看到nginx的welcome介面,說明nginx已經安裝成功。
配置
接下來我們要配置nginx,讓其指向我們的blog地址。開啟nginx的配置檔案
vi /etc/nginx/conf.d/default.conf
複製程式碼
安裝如下說明替換自己的資訊
#
# The default server
#
server {
listen 80;
# listen [::]:80 default_server;
server_name rousetime.com; # 替換成自己的域名
root /usr/share/nginx/html/blog; # 部落格所在目錄
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
root /usr/share/nginx/html/blog; # 部落格所在目錄
index index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
root /usr/share/nginx/html/blog; # 部落格所在目錄
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html/blog; # 部落格所在目錄
}
}
複製程式碼
/usr/share/nginx/html/blog是我伺服器上存放部落格的目錄,你可以改成自己的目錄。這樣nginx就配置完成。
本地與伺服器同步
現在就剩最後一步了,將本地hexo檔案上傳到伺服器,同時每次通過git更新程式碼後都會同步到伺服器。
之前我們已經建立了git伺服器與git裸庫,為了之後的上傳程式碼關聯操作,我們藉助git的服務鉤子post-receive。它可以在倉庫收到push程式碼後,進行一些相關操作,例如通知與更新等。
我們在blog.git/hooks中新建post-receive檔案 (這裡我已將blog.git轉移到git使用者下/home/git)
su git
vi ~/blog.git/hooks/post-receive
複製程式碼
向其中新增如下程式碼,指明git的工作樹路徑與倉庫路徑
#! /bin/sh
git --work-tree=/usr/share/nginx/html/blog --git-dir=/home/git/blog.git checkout -f
複製程式碼
儲存後退出,再給其賦予可執行許可權
chmod +x ~/blog.git/hooks/post-receive
複製程式碼
hexo程式碼同步
返回客戶端,開啟hexo的_config.xml檔案,找到deploy,在之前的設定後面再新增我們的伺服器倉庫地址
deploy:
- type: git
repository: xxx # 之前的github倉庫地址
branch: master
- type: git
# repository: git@rousetime.com:/~/blog.git # 預設埠生效使用
# repository: ssh://git@rousetime.com:埠/~/blog.git # 預設埠不生效使用,設定埠
branch: master
複製程式碼
現在可以將hexo相關配置中的github.io域名都換成你自己的
最後我們再提交一遍hexo程式碼
hexo clean
hexo g
heox d
複製程式碼
操作完之後,你會發現git將程式碼push到之前的github倉庫與我們的搭建的伺服器倉庫。
部署完畢,我們就可以在瀏覽器中輸入域名進行訪問。例如:這是我的blog地址歡迎訪問。
這就是我折騰了一天搭建的過程,希望對你有所幫助。如有任何問題可以隨時@我。