CentOS下經過Gunicorn+Nginx部署Python Flask網站,並配置https和Nginx訪客日誌

原文地址 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虛擬環境

此時,在命令窗口輸入

  • . venv/bin/activate

繼續輸入如下內容,使用pip安裝gunicorn

  • pip3 install gunicorn

激活後,輸入如下命令運行Flask項目

  • gunicorn -w 4 -t 30 -b 0.0.0.0:5000 app:app

(注意,該命令根據實際狀況變化)該命令中,

-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

  • yum install screen

建立一個名爲name的新窗口(name爲您定義的窗口名【可自由設置】,S必定要大寫)

  • screen -S name

進入Flask項目根目錄,激活虛擬環境

  • . venv/bin/activate

像以前同樣運行gunicorn,如個人命令爲

  • gunicorn -w 4 -t 30 -b 0.0.0.0:5000 app:app

以後按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項目,實現開機自啓等功能 中記錄了本身的實現過程,感謝閱讀!

相關文章
相關標籤/搜索