內(nèi)容轉載自我的博客
1. 搭建Web服務
首先安裝python的flask庫,可以使用以下代碼:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
然后編寫最簡單的flask項目,只需創(chuàng)建目錄/home/ubuntu/www/用于存放代碼,創(chuàng)建目錄/home/ubuntu/www/log/用于存放日志,再創(chuàng)建一個/home/ubuntu/www/main.py文件,內(nèi)容如下:
# 導入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;
}
}
不重啟重新載入最新配置文件內(nèi)容:sudo service nginx reload
停止nginx服務:sudo service nginx stop
重啟nginx服務:sudo service nginx restart
另外在域名服務商添加一條名稱為web的A記錄解析到本云主機的IP即可訪問http://web.example.cn,會看到網(wǎng)頁返回Hello, World!
3 安裝ACME自動簽發(fā)證書
https證書是Let's Encrypt網(wǎng)站簽發(fā)的,每次有限期三個月,手動申請很麻煩,所以使用ACME工具來自動申請和續(xù)期
3.1 安裝證書
安裝很簡單,只需要一個命令:curl https://get.acme.sh | sh
此命令實際幫用戶進行以下操作:
- 把
acme.sh安裝到用戶的home目錄下,即~/.acme.sh/ - 創(chuàng)建一個
bash的alias, 方便使用:alias acme.sh=~/.acme.sh/acme.sh - 自動創(chuàng)建cronjob, 每天 0:00 點自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書
如果~目錄下無.bashrc需要手動創(chuàng)建;如果用戶ssh重新登錄,.bashrc文件不會自動生效,需要進行下一步
終端輸入vim .bash_profile,然后寫入以下內(nèi)容:
if [ -s ~/.bashrc ]; then
source ~/.bashrc;
fi
安裝過程不會污染已有的系統(tǒng)任何功能和文件, 所有的修改都限制在安裝目錄中: ~/.acme.sh/
3.2 生成證書
首先登錄DNSPod,它已被騰訊云收購,可直接使用騰訊云賬戶登錄。在里面創(chuàng)建API接口和秘鑰。然后在命令行輸入:
export DP_Id="152345"
export DP_Key="235b55ffd5a4588aabbccee1e2e5a74a"
acme.sh --issue -d example.cn -d *.example.cn --dns dns_dp
等待驗證DNS和創(chuàng)建證書即可(接口和秘鑰信息會被自動保存在~/.acme.sh/account.conf配置文件,方便自動續(xù)期)。這里生成主域名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來創(chuàng)建ssl配置的單文件example.cn.ssl.conf,文件內(nèi)容為:
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配置文件內(nèi)容sudo service nginx reload,即可訪問https://web.example.cn,會看到網(wǎng)頁返回Hello, World!
4. 使用logrotate自動切割日志文件
如果某個web服務自己會產(chǎn)生日志(步驟1中的Python程序,可以使用logging.handlers.RotatingFileHandler來分割日志文件),且沒有自帶的分割日志文件的功能,那么我們可以借助logrotate實現(xiàn)分割,這里我們對nginx的日志文件進行分割
創(chuàng)建/etc/logrotate.d/nginx-myweb文件,內(nèi)容如下
/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
}
系統(tǒng)會定時運行logrotate,一般是每天一次,可以在此文件/etc/cron.daily/logrotate查看
5. 配置nginx切割日志文件
在nginx的配置文件中,添加以下內(nèi)容,這種方法只能切割文件,不能自動刪除過時文件:
# 可以位于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;
# 提高日志效率,不是控制日志文件個數(shù)
open_log_file_cache max=10;
如果發(fā)現(xiàn)只是創(chuàng)建文件'error_www-$logdate.log',且內(nèi)容包括以下部分:
"/home/ubuntu/www/log/access_www-2020-09-28.log" failed (13: Permission denied) while logging request
這說明nginx的權限無法創(chuàng)建文件/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即可