使用ACME申請Lets Encrypt證書為網站新增HTTPS支援
目錄內容轉載自我的部落格
1. 搭建Web服務
首先安裝python的flask
庫,可以使用以下程式碼:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
然後編寫最簡單的flask專案,只需建立目錄/home/ubuntu/www/
用於存放程式碼,建立目錄/home/ubuntu/www/log/
用於存放日誌,再建立一個/home/ubuntu/www/main.py
# 匯入Flask類
from flask import Flask
# 例項化Flask
app = Flask(__name__)
# route()方法用於設定路由
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
# host為0.0.0.0表示所有IP均可訪問此Web服務
app.run(host="0.0.0.0", port=5000, debug=False)
最後輸入命令python3 main.py
即可執行此專案
2. 安裝nginx
更新軟體源:sudo apt-get update
安裝nginx:sudo apt-get install nginx
訪問雲主機的ip確認nginx安裝成功
修改nginx配置檔案:sudo vi /etc/nginx/nginx.conf
在http{}
合適位置新增以下程式碼
一定要將http{}
裡面的最後兩個include行註釋掉,修改才會生效
server{ listen 80; server_name web.example.cn; access_log /home/ubuntu/www/log/access.log; error_log /home/ubuntu/www/log/error.log; location /{ proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; proxy_buffering off; proxy_pass http://127.0.0.1:5000; } }
不重啟重新載入最新配置檔案內容:sudo service nginx reload
停止nginx服務:sudo service nginx stop
重啟nginx服務:sudo service nginx restart
另外在域名服務商新增一條名稱為web
的A記錄解析到本雲主機的IP即可訪問http://web.example.cn
,會看到網頁返回Hello, World!
3 安裝ACME自動簽發證書
https證書是Let's Encrypt網站簽發的,每次有限期三個月,手動申請很麻煩,所以使用ACME工具來自動申請和續期
3.1 安裝證書
安裝很簡單,只需要一個命令:curl https://get.acme.sh | sh
此命令實際幫使用者進行以下操作:
- 把
acme.sh
安裝到使用者的home
目錄下,即~/.acme.sh/
- 建立一個
bash
的alias, 方便使用:alias acme.sh=~/.acme.sh/acme.sh
- 自動建立cronjob, 每天 0:00 點自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書
如果~
目錄下無.bashrc
需要手動建立;如果使用者ssh重新登入,.bashrc
檔案不會自動生效,需要進行下一步
終端輸入vim .bash_profile
,然後寫入以下內容:
if [ -s ~/.bashrc ]; then
source ~/.bashrc;
fi
安裝過程不會汙染已有的系統任何功能和檔案, 所有的修改都限制在安裝目錄中: ~/.acme.sh/
3.2 生成證書
首先登入DNSPod,它已被騰訊雲收購,可直接使用騰訊雲賬戶登入。在裡面建立API介面和祕鑰。然後在命令列輸入:
export DP_Id="152345"
export DP_Key="235b55ffd5a4588aabbccee1e2e5a74a"
acme.sh --issue -d example.cn -d *.example.cn --dns dns_dp
等待驗證DNS和建立證書即可(介面和祕鑰資訊會被自動儲存在~/.acme.sh/account.conf
配置檔案,方便自動續期)。這裡生成主域名example.cn
的證書和泛域名*.example.cn
證書
3.3 安裝證書
sudo mkdir /etc/nginx/ssl/
sudo chmod -R 777 ssl
acme.sh --install-cert -d example.cn \
--key-file /etc/nginx/ssl/example.cn.key \
--fullchain-file /etc/nginx/ssl/example.cn.cer \
--reloadcmd "service nginx force-reload"
在終端輸入sudo vim /etc/nginx/ssl/example.cn.ssl.conf
來建立ssl配置的單檔案example.cn.ssl.conf
,檔案內容為:
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate ssl/example.cn.cer;
ssl_certificate_key ssl/example.cn.key;
最後sudo vim /etc/nginx/nginx.conf
在server{}
裡面新增一行:include ssl/example.cn.ssl.conf;
,最終的程式碼如下:
server{
listen 80;
server_name web.example.cn;
access_log /home/ubuntu/www/log/access.log;
error_log /home/ubuntu/www/log/error.log;
include ssl/example.cn.ssl.conf;
location /{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_buffering off;
proxy_pass http://127.0.0.1:5000;
}
}
此時不重啟重新載入最新nginx配置檔案內容sudo service nginx reload
,即可訪問https://web.example.cn
,會看到網頁返回Hello, World!
4. 使用logrotate自動切割日誌檔案
如果某個web服務自己會產生日誌(步驟1中的Python程式,可以使用logging.handlers.RotatingFileHandler
來分割日誌檔案),且沒有自帶的分割日誌檔案的功能,那麼我們可以藉助logrotate
實現分割,這裡我們對nginx的日誌檔案進行分割
建立/etc/logrotate.d/nginx-myweb
檔案,內容如下
/home/ubuntu/www/log/access.log /home/ubuntu/www/log/error.log{
weekly
minsize 10M
rotate 10
missingok
dateext
notifempty
sharedscripts
postrotate
[ -e /usr/local/nginx/logs/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
endscript
}
系統會定時執行logrotate
,一般是每天一次,可以在此檔案/etc/cron.daily/logrotate
檢視
5. 配置nginx切割日誌檔案
在nginx
的配置檔案中,新增以下內容,這種方法只能切割檔案,不能自動刪除過時檔案:
# 可以位於http、server塊
map $time_iso8601 $logdate {
'~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
default 'date-not-found';
}
# 一般位於server塊
access_log /home/ubuntu/www/log/access_www-$logdate.log;
error_log /home/ubuntu/www/log/error_www-$logdate.log;
# 提高日誌效率,不是控制日誌檔案個數
open_log_file_cache max=10;
如果發現只是建立檔案'error_www-$logdate.log'
,且內容包括以下部分:
"/home/ubuntu/www/log/access_www-2020-09-28.log" failed (13: Permission denied) while logging request
這說明nginx的許可權無法建立檔案/home/ubuntu/www/log/access_www-2020-09-28.log
,則需要以下步驟:
# 把使用者新增到當前使用者組
sudo gpasswd -a www-data ubuntu
# 新增許可權
sudo chmod -R a+w /home/ubuntu/frp/log
# 如果還是出錯的話,直接修改/etc/nginx/nginx.conf檔案
# 把user改為ubuntu即可