vps攜手hexo的部落格搭建之旅

idisfkj發表於2019-01-19

由於自己搞了個vps,也搭建了vpn,日常科學上網與看看視訊還是沒什麼壓力的。想著也不能白白浪費每個月500G的流量,於是想起自己現在的hexo部落格。目前還沒有自己的私有域名與伺服器,用的還是傳統的github.io通用域名。作為it界的一員,既然有條件能變得更好就不應該不去做。於是花一天時間折騰出來的自己的專屬部落格系統。

下面我會將自己搭建過程中遇到的問題與步驟羅列出來,希望能夠幫助有同樣需求的你。

前提條件

首先我的搭建是基於以下條件之上的

  1. 本地hexo部落格已完成(github.io可以訪問)
  2. 有自己的vps
  3. 伺服器系統Centos 6 x86_64
  4. 有自己的域名
  5. 域名已進行解析

這裡就不介紹hexo部落格本地構建,想了解的推薦閱讀Hexo的安裝與配置

我們將要解決的主要問題是:

  1. SSH連線伺服器
  2. 下載git與建立git伺服器
  3. 下載nginx與配置nginx環境
  4. 本地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
複製程式碼

vps攜手hexo的部落格搭建之旅

只有顯示了epel,接下來你執行nginx的安裝命令才不會失敗。

yum install nginx
複製程式碼

如果不存在,你執行上述命令nginx還是找不到。如果沒有意思到這一點,就是無頭緒為什麼一直報nginx找不到。如果不在,我們接著走。

開啟檔案epel.repo,將其中的enable=0改為enable=1

vi /etc/yum.repos.d/epel.repo
複製程式碼

vps攜手hexo的部落格搭建之旅

然後執行下面命令檢視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地址歡迎訪問。

這就是我折騰了一天搭建的過程,希望對你有所幫助。如有任何問題可以隨時@我。

資料

SSH連線伺服器

伺服器上的 Git

hexo部署

EPEL

EPEL未啟用解決方案

Shadowsocks Python版一鍵安裝指令碼

vps攜手hexo的部落格搭建之旅

相關文章