自己個人博客系統從搭建運行至今已然過去一月,整個搭建過程可以說是踩坑無數。因此將整個搭建過程以及踩過的坑寫到此處,希望可以給搭建個人博客系統的朋友提供一些幫助。整個過程教程包括服務器選購、域名申請與備案、安裝 solo、nginx 進行反向代理以及 ssl 證書的申請與使用,好了廢話說少馬上開始。
1.博客系統的搭建流程
為了讓大家更好的了解整個博客系統搭建的邏輯,因此我將其搭建流程做成一個流程圖,希望能給大家以直觀的感受;大家在看流程圖要注意有些環節是可選。
2.服務器選購
首先要有自己的服務器,如果有可以直接跳過這一步。如果沒有的話,可以有好多服務器提供商可選:國內的有阿里雲、騰訊雲、華為雲、百度雲等,國外的有 AWS、vultr 等,具體選型可以根據自己的業務需求來定。我們這里以阿里雲服務器的購買為例:
2.1 阿里雲學生主機
針對在校學生阿里雲提供了學生優惠,可以通過雲翼計划來購買可以節省一大筆費用。具體的購買流程可以參考官方教程:阿里雲學生機購買指南說明。對於系統的選擇個人推薦 centos
。
2.2 普通雲主機
普通阿里雲主機的購買可能涉及到選配置的問題,但是一般來說入門級的服務器就足夠使用,當然如有特殊需要另當他論。此處附上 ECS 雲服務器的購買地址當然對於系統的選擇個人推薦 centos
。
3.域名購買與備案(可選)
3.1 域名購買
如果條件允許盡量買個域名,因為通過 ip 訪問一方面不方便,另一方面可能會被封禁而且不能進行 SEO 優化,而且現在非熱門域名(熱門域名包括。com、.cn、.net 等)也並不是很貴如我自己購買的。top 域名三年才 43 塊錢。具體購買方式跟購買服務器類似,一般雲服務器提供商順帶都提供域名購買服務。這里我們提供一個阿里雲的域名購買地址:阿里雲域名購買
3.2 域名服務器備案
如果域名或者服務器是國外的一般不需要備案,但是如果說是國內的按照當前國內政策所有域名現在都需備案。一般來說我們可以通過域名購買的服務商域名備案系統來進行備案,當然也可以通過工業與信息化部的 ICP/IP 地址/域名信息備案管理系統來進行備案,這里建議通過前者,因為官方的備案系統進度是很慢的遠遠沒有第三方的備案系統進度快。這里我們以阿里雲的域名備案系統為例,詳細說明域名備案的流程:
第一步:進入域名備案系統
第二步:填寫信息和驗信資料
第三步:等待阿里雲初審
這一步大約會耗時一天左右,如果你第二步資料填寫均符合要求,那么第二天阿里雲客服會給你打來電話,告訴你信息已經通過,將會提交至工信部。如果說資料不符合要求,那么客服會給你打電話並發郵件告訴你資料的不規范之處,更改完成之后重新提交,再次進行阿里雲初審。這個過程一般耗時兩到三天。
第四步:管局審核
這一步是最耗時間的,首先在初審過了之后會有一個工信部短信驗證,也就是確定備案手機號是否可以使用。通過之后信息會正式提供給管局。從提供管局信息到得到反饋一般是 7 到 20 天不等(這個就看當地管局心情了),如果管局信息通過不出意外,你會收到一個備案號和密碼。此時域名備案便完成了。
3.3 域名服務器解析
這一步是所有過程中最輕松的,登陸域名服務商的的域名管理平台,將域名的解析地址指向所購買服務器的 ip,大約兩分鍾之后設置便會生效。
當然我們可以通過 ping
命令來看解析是否生效:
4.solo 安裝
到這一步算是正式進入正題,根據官網提供的安裝方式有兩種分為本地使用、Docker 部署。
4.1 本地試用
下載最新的 Solo 包解壓,進入解壓目錄執行以下命令:
- Windows:
java -cp "WEB-INF/lib/*;WEB-INF/classes" org.b3log.solo.Starter
- Linux:
java -cp "WEB-INF/lib/*:WEB-INF/classes" org.b3log.solo.Starter
注意:官方是不太推薦通過 war 包發布或者源碼構建部署,因為這樣的部署方式不利於后續新版本發布時的升級和更新。
4.2 Docker 部署
第一步 獲取最新鏡像:
docker pull b3log/solo
運行結果:
第二步 安裝 MySQL
我們既可以直接在服務器上直接安裝也可以通過 docker 方式在 docker 容器中安裝
方式一:docker 安裝
# 安裝mysql:5.6,直接docker run 他會自動去官方鏡想下載
# MYSQL_ROOT_PASSWORD=[的數據庫密碼,此處寫的是123456
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
# docker安裝的mysql默認允許遠程連接,可以使用Navicat等軟件連接數據庫
# 進入容器mysql
docker exec -it mysql bash
# 進入數據庫 p后面跟你的密碼
mysql -uroot -p123456
# 創建數據庫(數據庫名:solo;字符集utf8mb4;排序規則utf8mb4_general_ci)
create database solo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
# 出現Query OK, 1 row affected (0.00 sec)表示成功
#退出數據庫
exit
#退出容器
exit
運行結果如下:
方式二:物理機上直接安裝
由於配置稍顯繁瑣,可以參考下邊這篇博客:
Centos 安裝 mysql(YUM 源方式)
第三步 安裝 solo
運行如下命令:
docker run --detach --name solo --network=host \
--env RUNTIME_DB="MYSQL" \
--env JDBC_USERNAME="root" \
--env JDBC_PASSWORD="123456" \
--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
b3log/solo --listen_port=8080 --server_scheme=http --server_host=www.vcjmhg.top
--detach:
這個選項告訴 Docker 在啟動后將程序與控制台分離,使其進入“后台”運行。--name solo:
solo
是容器的名字,也可以改成自己喜歡的名字如 mysolo,這個無所謂RUNTIME_DB="MYSQL"
: 指明我們此處使用的數據庫為MYSQL
,如果使用,H2 Database
,將MYSQL
改成org.h2.Driver
即可JDBC_USERNAME="root":
指明MYSQL
數據連接時使用的用戶名,默認都是 rootJDBC_PASSWORD="123456"
: 指明 MySQL 數據庫連接時用戶密碼,使用時注意將123456
替換成自己在上一步所設置的密碼env JDBC_DRIVER="com.mysql.cj.jdbc.Driver"
:數據庫連接驅動包,如果使用,H2 Database
,將om.mysql.cj.jdbc.Driver
改成H2
即可--server_host=www.vcjmhg.top
: 個人域名,如果沒有可設置為自己的服務器 ip--env JDBC_URL=...
:--listen_port=8080
:指明 solo 監聽的端口此處使用的是8080
,如果不想配置 nginx 此處可以換成 80
命令運行結果:
命令執行完成之后沒有報錯的話,通過 docker ps
查看當前當前容器列表中是否有名字叫 solo
的容器,如果有證明啟動成功了,此時可以通過 個人域名/ip+:8080
來進行訪問,類似 http://192.168.217.132:8080
,如果不想配置 nginx 可以將 8080
換成 80
,可以直接通過域名/ip 來直接進行訪問,類似 vcjmhg 的博客--https://vcjmhg.top。不出意外會出現如下界面(如果出現不能訪問的情況考慮是否是防火牆配置有問題,查看是否開發 8080 或者 80 端口):
由於后邊我們需要配置 nginx
進行反向代理以及配置 ssl
證書來實現 https
方式訪問,因此在看到 solo
啟動正常之后,此處創建的 solo
鏡像需要刪除,等配置完 nginx
之后重新在創建一個。
刪除 solo 容器直接執行下邊命令
docker kill --name solo
docker rm --name solo
命令執行結果如下:
5.安裝 nginx(可選)
安裝之前為了后續配置 nginx 方便,我們需要在本地創建幾個文件,用來掛載 nginx 的配置文件
# 切換到服務器根目錄
cd /
# 創建主目錄
mkdir dockerData
# 創建文件
mkdir dockerData/nginx dockerData/nginx/conf dockerData/nginx/logs dockerData/nginx/www dockerData/nginx/ssl
上邊的文件目錄名稱可以任意,此處我使用 dockerDate
dockerData/nginx
用於存放docker
下nginx
自定義文件dockerData/nginx/conf
存放nginx
配置文件dockerData/nginx/log
存放nginx
日志文件dockerData/nginx/www
:存放nginx
訪問的資源文件dockerData/nginx/ssl
存放ssl
證書
命令執行結果如下:
啟動 nginx
docker run --name nginx -p 80:80 -d nginx
命令執行結果如下:
如果沒有備案,80 端口可能是禁止訪問的,因此可以可以將上邊的 80:80 換成 8080:80。命令執行完成之后,沒有報錯的話可以通過 docker ps 來看 nginx 是否正常運行,在運行的情況下訪問的域名加上端口號查看是否正常安裝,如果使用的 80 端口默認可以省略。出現如下界面表示安裝成功。
導出配置文件:
docker cp nginx:/etc/nginx/nginx.conf /dockerData/nginx/conf/nginx.conf #導出配置文件nginx.conf
docker cp nginx:/etc/nginx/conf.d /dockerData/nginx/conf/conf.d #導出conf.d
cd /dockerData/nginx/
ls conf/ #查看配置文件是否導出成功
docker stop nginx #刪除剛才創建的nginx容器
docker rm nginx
命令執行結果:
重新創建一個 nginx
容器,掛載剛才本地導出的配置文件,便於后續更改 nginx
的配置信息
docker run -d -p 80:80 --name nginx \
-v /dockerData/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /dockerData/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /dockerData/nginx/www:/usr/share/nginx/html \
-v /dockerData/nginx/logs:/var/log/nginx nginx
-v /dockerData/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
: 掛載配置文件nginx.conf
-v /dockerData/nginx/conf/conf.d:/etc/nginx/conf.d
: 掛載配置文件default.conf
-v /dockerData/nginx/www:/usr/share/nginx/html
: 掛載項目文件-v /dockerData/nginx/logs:/var/log/nginx
: 掛載配置文件
命令執行結果如下:
注意: 我自己在搭建過程中發現執行 docker ps
命令后發現 nginx 並沒有被啟動,使用命令 docker logs nginx
發現掛載文件時權限不足,果斷在創建 nginx 容器是加上 --privileged=true
參數(如果沒有出現該問題可不加上述參數)。
即執行如下命令
docker run -d -p 80:80 --name nginx --privileged true \
-v /dockerData/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \·
-v /dockerData/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /dockerData/nginx/www:/usr/share/nginx/html \
-v /dockerData/nginx/logs:/var/log/nginx nginx
執行 docker ps -a
此時容器運行正常
容器創建完成之后重新訪問在瀏覽器訪問可能會出現如下界面:
此時你可以在 www
目錄下創建一個 html
文件,也可以先不用管,等后續配置完成之后自然會消失。
6. 配置 ssl 證書(可選)
從 http 升級到 https 只需要在 nginx 中配置一個證書即可,一般性的 ssl 證書是可以免費申請的
6.1 證書選購
阿里雲或者騰訊雲都提供證書申請服務,這里以阿里雲的證書申請為例:
第一步: 進入阿里雲的證書購買地址 https://www.aliyun.com/product/cas
第二步: 進入購買頁面,選擇 免費型DV SSL
第三步: 支付
第四步: 進入控制台,進行證書下載
6.2 配置 nginx 配置文件
下載之后會得到一個名字類似於 2793667_www.vcjmhg.top_nginx.zip
的文件,將其上傳到服務器 /dockerData/nginx/ssl
目錄中,解壓后(通過 unzip 命令)會得到如下兩個文件
大家可以參考我的配置文件進行配置,配置自己的 default.conf 文件。
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate /ssl/2793667_www.vcjmhg.top.pem; # ssl 證書目錄
ssl_certificate_key /ssl/2793667_www.vcjmhg.top.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
#root /usr/share/nginx/html;
# index index.html index.htm;
# 官方博客上此處用的是域名,但配置時發現不好使,所以我用的是服務器ip
proxy_pass http://39.105.61.192:8080;
}
#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;
}
}
server{
listen 80;
server_name www.vcjmhg.top;
rewrite ^(.*) https://$host$1 permanent;
}
注意:上邊的配置文件只是參考,要根據自己的服務器做出相應更改。
由於我們現在用的 nginx
容器並未監聽 443
端口,所以需要刪除現在的容器,重新啟動一個新的 nginx
容器
#先刪除原來的nginx容器
docker stop nginx;
docker rm nginx;
#創建新的nginx容器
docker run -d -p 80:80 -p 443:443 --name nginxs \
-v /dockerData/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /dockerData/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /dockerData/nginx/ssl:/ssl/ \
-v /dockerData/nginx/www:/usr/share/nginx/html \
-v /dockerData/nginx/logs:/var/log/nginx nginx
#創建新的solo容器並映射到8080端口,用上邊的nginx進行反向代理
docker run --detach --name solo --network=host \
--env RUNTIME_DB="MYSQL" \
--env JDBC_USERNAME="root" \
--env JDBC_PASSWORD="123456" \
--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
--env JDBC_URL="jdbc:mysql://192.168.217.132:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
b3log/solo --listen_port=8080 --server_scheme=https --server_host=www.vcjmhg.top --server_port=
--server_scheme=http
換成--server_scheme=https
即可--server_port
:最終訪問端口,使用瀏覽器默認的80
或者443
的話值留空即可- 如果出現權限不足問題,啟動時加上
-privileged true
參數即可
重啟 nginx,docker restart nginx
,然后用瀏覽器訪問 https://域名
類似於 https://www.vcjmhg.top,登陸 github
賬戶后出現如下界面
后記
首先官方已經給了一些安裝的教程,一位叫 墨殤
的博主也已經給了特別詳細的安裝教程(地址,點這里),但是我自己在配置過程中出現了好多問題,因此我在這里寫下來這篇博客,希望能給他人提供一些幫助。當然可能個人水平有限,中間難免會出現一些錯誤,如若發現懇請指出,不勝賜教。如果按照本教程在配置過程中遇到什么問題,歡迎在博客下邊留言,我若看到的話一定第一時間回復,謝謝!