前言
這篇文章的內容在大概2周前就已經完成了,但是因為個人懶惰,所以一直沒有進行總結和更新記錄,大大的罪過啊,今天怎么也要開始重新梳理筆記了,接下來進入正題吧!
之前的博文記錄了安裝博客系統solo的過程,但是美中不足的是當時使用的是http,沒能用上https,后面在學習和實踐過程中,將個人博客地址 改成了https,這里記錄下其中的關鍵點。
本篇文章會包含前作的內容,所以前作你可以不看,將這篇文章作為solo的https的參考文章,僅供參考!
最近好好學習了Docker,所以想把線上環境的所有組件替換為Docker部署,對于Solo這個個人博客系統,至少需要部署3個Docker容器。
- MySQL
- Solo
- Nginx
其順序也是從上到下依次部署最為妥當,Docker部署簡單,對初學者而言難其中一個難點就是網絡通信,我這里就把各個過程做一個記錄。
準備工作
因為部署了3個docker容器,那么他們要互相訪問,就不能(更準確來講"不應該")通過傳統的localhost或者127.0.0.1了。
官方也不再建議使用 --link了,那么使用什么了?
官方推薦的是建立一個docker的網絡,代碼如下所示,其中hicode是我定義的網絡名,大家可以改成自己喜歡的:
docker network create -d bridge hicode
后續每一個容器在建立的時候,都應該加入這個網絡hicode,然后容器和容器之間就可以通過容器名進行訪問了。
MySQL
講真,這個東西是最浪費時間。在Docker化之前,我服務器上用的是MySQL8,當時就折騰了不少時間,雖然最終也部署起來了,但是后面考慮了下還是放棄了8這個版本,原因主要是如下幾點:
- MySql8的資料相對較少,記錄的問題解決方案也比較少,要爬坑很久才能找到解決方案。
- MySQL8的內存占用和CPU占用有點高,特別是內存占用持續高漲。我的云服務器是捋的騰訊羊毛,當時本來是1核2G的配置,我為了延長使用時間,把服務器配置降級成了1核1G了,所以對于MySql8的內存占用,我的小服務器有點扛不住。
- 在可以預期的未來,我們公司包括整個行業還是會在5.X居多,所以8.0就留在后面有機會折騰了吧。
部署MySQL 5.X版本的指令如下所示
docker run --name mysql5.7 -p 3306:3306
--network hicode --privileged=true --restart=always
-v /lcf/docker-data/mysql5.7/data:/var/lib/mysql
-v /lcf/docker-data/mysql5.7/conf:/etc/mysql/conf.d
-e TZ=Asia/Shanghai
-e MYSQL_ROOT_PASSword=yourpwd -d mysql:5.7.26
--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
--lower_case_table_names=1 --default-time_zone='+8:00'
上述命令還是有幾個細節的,如下所示:
- --network hicode是加入之前我們新建的橋接網絡hicode
- --privileged=true 是保證MySQL具有操作外部映射出的文件的權限
- --restart=always是自動啟動,類似Win的自動重啟
- -v /lcf/docker-data/mysql5.7/data:/var/lib/mysql 將mysql的數據映射到磁盤上,避免新建容器后數據丟失。
- -v /lcf/docker-data/mysql5.7/conf:/etc/mysql/conf.d 將mysql的配置放置在外部磁盤,方便修改
- -e TZ=Asia/Shanghai 指定mysql的時區為 東八區,也就是我們中國時間
- -e MYSQL_ROOT_PASSWORD=yourpwd 是需要你自己設置的密碼
對于mysql的配置文件,因為我們映射到了外部,所以mysql沒有自動創建。如果在不映射外部的情況下,去看看mysql的內部配置文件,你會發現mysql官方幫我們定義了3個配置文件
- docker.cnf 專門為docker做的優化
- mysqldump.cnf dump的時候做的優化
- mysql.cnf 需要你自己定義
當然為了方便我們不需要這么麻煩,我們就合二為一創建一個mysql.cnf就夠了,命令如下:
cd /lcf/docker-data/mysql5.7/conf
touch mysql.cnf
然后在mysql.cnf添加如下內容(其實這部你省略也是沒有問題的)
[mysql]
# 以下是docker.cnf的內容
skip-host-cache
skip-name-resolve
# 以下是mysqldump.cnf的內容
quick
quote-names
max_allowed_packet = 16M
# 以下內容如有需要請自己添加
然后重啟mysql就行了
docker restart mysql5.7
=============以下步驟Docker安裝的MySQL應該是不需要的,默認都可以訪問=========如果你需要指定mysql所有ip都訪問
docker exec -it mysql5.7 /bin/bash
mysql -h 127.0.0.1 -u root -p
# 此時要求你輸入MySQL密碼
# 此處特別注意了,需要你替換'yourpwd'為你的密碼
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'yourpwd' WITH GRANT OPTION;
FLUSH PRIVILEGES;
=============以上步驟不需要,默認都可以訪問=========
solo
solo的安裝注意2個細節即可,我們先看命令:
docker run -d --restart=always --name solo
--network hicode
--env RUNTIME_DB="MYSQL"
--env JDBC_USERNAME="root"
--env JDBC_PASSWORD="yourpwd"
--env JDBC_DRIVER="com.mysql.jdbc.Driver"
--env JDBC_URL="jdbc:mysql://mysql5.7:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC"
b3log/solo --listen_port=8080 --server_scheme=https --server_host=www.hicode.club
細節部分請注意了:
- --network=hicode加入hicode這個網絡
- --env JDBC_DRIVER="com.mysql.jdbc.Driver" 因為我使用的是MySQL 5.7所以是這樣的
- --env JDBC_PASSWORD="yourpwd"是安裝myql時候時候指定的密碼
- --server_host=www.hicode.club 需要你自己修改host
- --env JDBC_URL="jdbc:mysql://mysql5.7:3306/ 這個地方我寫的不是localhost也不是127.0.0.1,而是使用的mysql容器的名稱mysql5.7
- --server_scheme=https 如果要通過https訪問,那么此處必須是https
Nginx
證書申請
https相對比http,最核心的一個東西就是證書,證書有免費的也有收費的,我這里介紹下幾個免費獲取的途徑
騰訊云
免費渠道:SSL證書選購 - 騰訊云
請注意選擇域名免費版DV.
然后根據自己的情況進行資料填寫。
接下來就是驗證域名歸屬,只有驗證成功后才會給你頒發證書。
如上所示,認證辦法通常有2類
- 修改DNS記錄:推薦使用,在DNS提供商(騰訊云、阿里云等)的解析中添加一條txt的值。
- 文件驗證:省略
確定申請后,會出現如下圖
那么在添加txt記錄的時候,主機記錄和記錄值分別做上述添加即可。
具體的流程可以參考:
- SSL 證書 域名型(DV)免費證書申請流程 - 操作指南 - 文檔中心 - 騰訊云
- SSL 證書 域名驗證指引 - 操作指南 - 文檔中心 - 騰訊云
阿里云
免費渠道:阿里云通用售賣
FreeSSL
免費渠道:FreeSSL首頁 - FreeSSL.cn一個提供免費HTTPS證書申請的網站
視頻教程:如何使用 FreeSSL 申請免費證書?
關于證書的100問:FreeSSL 申請證書常見問題 100 問 FAQ?
同時這個網站有大量通俗易懂的文章,推薦新手看看。
其他
Certbot
說明 · acmesh-official/acme.sh Wiki · GitHub
證書下載
當驗證了域名歸屬后,對應的機構就會給你頒發證書了,不同的HTTP服務器,需要不同的證書類型,下面是我在騰訊云申請的證書,默認提供了4類。
因為我用的是Nginx,所以記錄如下:
- xxx.key 就是你的私鑰文件,不要泄漏給別人哦。
- xxx.crt 是你的證書文件
配置Nginx
在證書下載下來后,接下來就是配置證書和反向代理了。
首先創建nginx的配置文件nginx.conf
cd /lcf/docker-data/nginx/conf
touch nginx.conf
接下來請把2個證書相關的文件移動到nginx.conf的同級目錄,然后進行如下配置。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
default_type Application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
access_log /var/log/nginx/logs/access.log main;
sendfile on;
#開啟gzip壓縮
gzip on;
gzip_disable "MSIE [1-6].";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_min_length 256k;
gzip_types text/plain application/JAVAscript text/css application/json application/x-JavaScript text/xml application/xml text/javascript;
#后端的服務器
upstream backend {
server solo:8080 max_fails=3 fail_timeout=30s;
}
#個人博客
server {
# 最新寫法,ssl on 的寫法已經不推薦了!
listen 443 ssl;
server_name hicode.club www.hicode.club;
# 證書相關,https新增
ssl_certificate hicode.club_bundle.crt;
ssl_certificate_key hicode.club.key;
ssl_session_timeout 5m;
access_log /var/log/nginx/logs/hicode/access.log main;
location / {
proxy_pass http://backend$request_uri;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header http_x_forwarded_for $remote_addr;
client_max_body_size 10m;
}
}
server {
# http跳轉到https,這樣就只存在http的博客了
listen 80;
server_name hicode.club www.hicode.club;
rewrite ^(.*)$ https://$host$1 permanent;
}
}
上述內容中有2個server
- 第一個是 https的配置,關鍵是其中證書的配置。
- 第二是http跳轉到https的配置。
安裝Nginx
然后執行如下命令啟動nginx的容器
docker run -p 80:80 -p 443:443 -m 200m --restart always
--name nginx --network hicode
-v /lcf/docker-data/nginx/www:/www
-v /lcf/docker-data/nginx/conf/:/etc/nginx/
-v /lcf/docker-data/nginx/logs:/var/log/nginx/logs
-v /lcf/docker-data/nginx/wwwlogs:/wwwlogs
nginx
- 相比于單純的http,多一個443的端口映射。
其他
基本上,按照上面操作,就可以搞定了,docker用好了,很方便,因為一行指令搞定的時候,不需要再折騰環境了。
有朋友擔心資源占用的問題,這里我截圖,給大家看看情況:
好了,差不多寫到這里,有問題,歡迎留言。
最后歸納下同http部署方式的不同:
- 申請證書
- solo指定為https
- nginx多映射一個443端口
如果本文對你有幫助,歡迎評論、點贊、轉發、收藏、關注!本文原創于程序猿猩球,轉載請注明出處~