原文地址 https://www.cyberlight.xyz/pa...
搭建CyberLight後有了完整Python建站經歷,在此作下記錄,以便以後查詢,但願能幫到初學python建站的朋友。php
本次筆記的默認條件爲:html
1. 您已在Linux成功部署Flask開發環境,欲部署生產環境。python
2.此時您已自建Flask項目目錄,並安裝了虛擬環境。linux
3.您的域名已解析到服務器ip。【此處服務器是指物理層面的服務器主機,不是用於請求響應的Web服務器】nginx
下面是筆記內容數據庫
環境: CentOS 7, Python 3.6.8flask
1、經過gunicorn運行Flask項目segmentfault
開發環境中,啓動Flask常見圖中的紅色警告,Flask官方並不建議咱們將此服務器用於生產環境。在實際生產環境中,咱們須要一個性能更強的WSGI服務器,這篇筆記選擇了gunicorn。(我的體驗後,gunicorn的確比Flask開發時的服務器有肉眼可見的速度提高)瀏覽器
下面安裝gunicorn安全
進入Linux終端,命令窗口路徑 切換至 項目根目錄,首先激活Python虛擬環境
此時,在命令窗口輸入
繼續輸入如下內容,使用pip安裝gunicorn
激活後,輸入如下命令運行Flask項目
(注意,該命令根據實際狀況變化)該命令中,
-w後的數字表明worker(工做線程)數量(-w 4表明4個worker進程),一般建議worker數量爲 (2 * CPU數量) + 1
-t後的數字表明超時時間,單位 秒
-b後是 ip:端口(0.0.0.0:5000爲在服務器ip下的5000端口運行【此處服務器是指物理層面的服務器主機,不是用於請求響應的Web服務器】)
app:app,: 左邊的app表明Flask運行的主程序(個人Flask主程序爲app.py),: 右邊的app照寫便可。如,您的Flask主程序名爲test.py,則該部分爲test:app
關於worker數量的選擇,在Python環境中,可經過以下代碼查詢CPU數量
import multiprocessing print(multiprocessing.cpu_count())
如,個人筆記本處理器,i7-8750H CPU數量爲
可得,個人筆記本理論能設置 (2 * 12) + 1 = 25 個worker進程。事實上,4~12個worker進程就能夠每秒處理成百上千個請求(這段出自李輝大神的《Flask Web 開發實戰》,推薦~)
啓動gunicorn後,便能經過 http://ip:您設置的端口號 進入您的網站了。然而,因爲是生產環境的配置,咱們每每但願Flask項目能一直運行於後臺,而不會關閉命令窗口後失效。
個人解決方案是,建立一個專屬gunicorn運行的Linux窗口,即使咱們退出Linux命令窗口也不影響
具體步驟爲,
中止前面運行的gunicorn,進入Linux(本文是CentOS)命令窗口,輸入以下命令安裝screen
建立一個名爲name的新窗口(name爲您定義的窗口名【可自由設置】,S必定要大寫)
進入Flask項目根目錄,激活虛擬環境
像以前同樣運行gunicorn,如個人命令爲
以後按CTRL+A+D離開該窗口(只要不關閉服務器,gunicorn會一直在後臺運行)。輸入screen -r name能切換回該命令窗口
screen的更多命令見這篇筆記https://www.cyberlight.xyz/passage/linux-screen
此處經過 新建獨立命令窗口 的方法運行gunicorn,若您須要實現 gunicorn隨服務器開機自啓(經過supervisor管理gunicorn),別急,筆記末尾將指示。
至此,gunicorn 的配置完成。(此處沒有配置80或443端口,將在後面說明)
2、配置Nginx反向代理gunicorn
經過虛擬專用網絡技術可讓遠程服務器代理客戶端,讓咱們以遠程服務器的ip 請求訪問 公司的內網,這種代理稱爲正向代理。Nginx能夠做爲服務器,代理gunicorn服務端監聽來自外部的請求,即是反向代理。咱們將用Nginx配置80或443端口反向代理gunicorn的運行端口
Nginx是成熟的Web服務器,使用Nginx反向代理gunicorn,不只能提高程序的處理能力、靜態文件的處理效率,還能提升服務器的安全係數,避免直接暴露WSGI服務器。
我經過寶塔面板配置的Nginx和網站數據庫,您也能夠直接在終端配置,下面是個人方法
首先按寶塔的官方教程安裝寶塔面板,CentOS輸入以下命令(安裝前須要確保是乾淨的操做系統,沒有安裝過其它環境帶的Apache/Nginx/php/MySQL(已有環境不可安裝))
安裝後,命令窗口會生成登陸地址、帳號、密碼,在瀏覽器打開並登陸便可
進入寶塔面板主頁面,忽略 首次進入時 推薦的安裝提示,選擇左側欄的 軟件商店,而後選擇 運行環境,安裝Nginx
安裝後,點擊Nginx行最右邊的設置按鈕,選擇配置修改(這裏即是Nginx的主配置文件)
在下面增長一段server配置內容
server { listen 80; #監聽的端口號,http默認爲80,請勿修改 server_name www.xxx.com; #這裏是您的域名 location / { proxy_pass http://0.0.0.0:5000; #這是上面我設置的Nginx運行端口5000,您根據本身的配置設置 proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #用Nginx訪問Flask靜態文件 #靜態文件在static的子目錄或更低層的子目錄中 location /static/(.*) { root /www/flask/xxx/; #這裏的路徑是絕對路徑,xxx是指static目錄的上級目錄,通常是網站根目錄 } }
上面的配置中,個人網站絕對路徑是 /www/flask/xxx,static目錄的路徑是/www/flask/xxx/static
設置完成後點擊保存,點擊該窗口(Nginx管理)第一行的 服務,點擊 重載配置
進入網頁,輸入 http://+您的域名 變能經過80端口訪問網站了,至此,若是沒別的需求,網站便能正常運行了
下面記錄設置https的過程
我使用的寶塔免費證書,地址 https://www.bt.cn/admin/safe
進入該網站,選擇SSL管理,點擊申請證書(驗證方式選擇DNS驗證),以後按寶塔的教程驗證便可
驗證成功後下載證書,解壓後進入 證書目錄/Nginx,將兩個文件都傳至服務器
再次打開寶塔面板的Nginx設置,選擇配置修改,和筆記前文同樣,插入一段server配置,以下(若是前面插入過80端口的配置,請將80端口的配置刪除)
server { listen 443 ssl; #監聽的端口號,https默認爲443,請勿修改 server_name www.xxx.com; #這裏是您的域名 #下面是證書配置 ssl_certificate /abc/ssl/xxx.pem; #配置證書位置(該路徑爲服務器存放證書的絕對路徑),文件格式爲.pem,有時是.srt ssl_certificate_key /abc/ssl/xxx.key; #配置祕鑰位置(該路徑爲服務器存放證書的絕對路徑),文件格式爲.key #ssl_client_certificate ca.crt;#雙向認證 #ssl_verify_client on; #雙向認證 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM; #上面是證書配置 location / { proxy_pass http://0.0.0.0:5000; #這是上面我設置的Nginx運行端口5000,您根據本身的配置設置 proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # fix flask redirect生產環境 從https到http跳轉 } #用Nginx訪問Flask靜態文件 #靜態文件在static的子目錄或更低層的子目錄中 location /static/(.*) { root /www/flask/xxx/; #這裏的路徑是絕對路徑,xxx是指static目錄的上級目錄,通常是網站根目錄 } }
按圖中的說明配置證書便可,靜態文件的配置方法和筆記上文提到的同樣
若是須要:當客戶訪問http時,自動跳轉到https。 則再插入一段server配置
server { listen 80; #監聽80端口 server_name www.xxx.com; #這裏是域名 rewrite ^(.*)$ https://$host$1 permanent; #將http請求強制跳轉到https }
一樣,保存後重載Nginx配置。
以上是Flask部署https的所有設置,如今便能經過 https://您的域名 訪問您的網站了
3、配置Nginx訪客日誌
因爲經過Nginx反向代理gunicorn,咱們能夠直接經過Nginx統計訪客,生成訪客日誌,有了日誌,便能用Python數據分析訪客狀況
和筆記前文同樣,進入Nginx的 設置—配置修改 中,在已存在的http{}配置中增長以下內容,增長後的大體結構以下
http { log_format main '$remote_addr - $remote_user [$time_iso8601] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; #訪客日誌的生成路徑,這是相對路徑,它的根目錄是Nginx的安裝目錄 ... #...表明http做用域中原來的內容,沒必要關心,保持不變便可,只須要添加上面的內容 }
Nginx日誌的參數分別表明下面的信息
$remote_addr
客戶端的ip地址(代理服務器,顯示代理服務ip)
$remote_user
用於記錄遠程客戶端的用戶名稱(通常爲「-」)
$time_local
用於記錄訪問時間和時區(這裏採用了一種更通用的時間格式,time_iso8601)
$request
用於記錄請求的url以及請求方法
$status
響應狀態碼,例如:200成功、404頁面找不到等。
$body_bytes_sent
給客戶端發送的文件主體內容字節數
$http_user_agent
用戶所使用的代理(通常爲瀏覽器)
$http_x_forwarded_for
能夠記錄客戶端IP,經過代理服務器來記錄客戶端的ip地址
$http_referer
能夠記錄用戶是從哪一個連接訪問過來的
以下圖所示,能夠直接進入Nginx根目錄,找到日誌所在目錄
以後能夠用python進行數據分析,若是我有較好的方案,也會繼續作相關筆記
感謝您閱讀到這裏,若是您有任何疑問或其餘方法,歡迎到評論區留言哦!
注:
上述筆記實現了 Gunicorn後臺運行,而更多時候咱們須要 Gunicorn 隨服務器開機自啓 或 系統出錯時及時重啓,我在 CentOS下經過Supervisor管理虛擬環境的Gunicorn Flask項目,實現開機自啓等功能 中記錄了本身的實現過程,感謝閱讀!