1. 程式人生 > >阿里雲Centos 7部署DJango2.0應用(uwsgi3 +Nginx)

阿里雲Centos 7部署DJango2.0應用(uwsgi3 +Nginx)

目錄

前言

上傳以及伺服器環境部分

uwsgi部分

nginx部分

靜態檔案

阿里雲端口許可權開啟


前言

先概括下訪問流程:

首先客戶端發起請求,這裡會有TCP的握手,三次握手結束之時,客戶端會帶上http資料給伺服器(請求行,請求頭,請求體),伺服器會接收到http協議,Nginx會接收到資料,然後根據裡面的配置進行判斷是否需要轉發,如果是static,直接拿資源返回,如果需要在轉發繼續socket連線後面的應用,這裡就是uwsgi,該程式可以理解為DJango的執行環境,只要都遵循wsgi協議,都能和uwsgi和DJango一樣連線起來,DJango處理並返回

DJango開發環境

Mac OS High sierra 10.13.4
 
mintoudeMacBook-Pro-2:~ mintou$ python3 -m django --version
2.1
mintoudeMacBook-Pro-2:~ mintou$ ipython3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.3.1 -- An enhanced Interactive Python. Type '?' for help.
 
 

這裡一個簡單的DJango應用就不介紹了,詳細的可以看這裡

首先明白一點,阿里雲服務買了之後(怎麼買就不說了),Nginx是已經有了的,而且有自帶的Python2.7,但是我們還是要裝3x以上的Python來玩,畢竟新時代馬上要來了,看看需要安裝什麼先。這裡提到的幾個名詞畫一張圖介紹下

Python3.6詳細安裝教程還有pip3

centos安裝mysql

vim 批量註釋,會用到的

參考文章之一

介紹完了一些安裝和邏輯,開始操作、

 

上傳以及伺服器環境部分

首先開發的電腦上安裝的我們都要在伺服器上安裝 

pip3 freeze > plist.txt
  • 通過ftp軟體將開發好的專案上傳到此伺服器的某個目錄
  • 然後在伺服器上執行
pip3 install -r plist.txt

就拿最簡單的Demo為例,以下是目錄

更改根目錄下的setting.py

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = ['*']

...


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
STATIC_ROOT='/var/www/upload/static/'

STATIC_ROOT在開發環境沒用,生產環境用來指定收集靜態檔案到哪裡,只有這個作用,上面兩個是開發環境測試用的,Nginx裡面的靜態檔案地址也配成STATIC_ROOT一樣的

小結:

1.搭建一個DJango應用,修改配置檔案到生產部署之前的配置

2.pip3 匯出安裝包語句

3.ftp推上去

以下是推上去的目錄

[[email protected] static]# cd /root/Desktop/uploadProject/upload/
[[email protected] upload]# ls -a
.  ..  .DS_Store  manage.py  static  templates  upload  userinfo  uswgi.log  uwsgi.ini  uwsgi.pid

 

uwsgi部分

  • python manage.py runserver:這是一款適合開發階段使用的伺服器,不適合執行在真實的生產環境中
  • 在生產環境中使用WSGI
  • WSGI:Web伺服器閘道器介面,英文為Python Web Server Gateway Interface,縮寫為WSGI,是Python應用程式或框架和Web伺服器之間的一種介面,被廣泛接受
  • WSGI沒有官方的實現, 因為WSGI更像一個協議,只要遵照這些協議,WSGI應用(Application)都可以在任何伺服器(Server)上執行
  • 命令django-admin startproject會生成一個簡單的wsgi.py檔案,確定了settings、application物件
    • application物件:在Python模組中使用application物件與應用伺服器互動
    • settings模組:Django需要匯入settings模組,這裡是應用定義的地方
  • 此處的伺服器是一個軟體,可以監聽網絡卡埠、遵從網路層傳輸協議,收發http協議級別的資料
  • uWSGI實現了WSGI的所有介面,是一個快速、自我修復、開發人員和系統管理員友好的伺服器
  • uWSGI程式碼完全用C編寫
  • 安裝uWSGI
pip3 install uwsgi

cd到專案根目錄,建立一個uwsgi.ini的檔案

[uwsgi]
socket=外網ip:埠(使用nginx連線時,使用socket) 127.0.0.1:8000或者是阿里雲私有ip地址
# http=外網ip:埠(直接做web伺服器,使用http) 沒有nginx的使用,一般不管他
chdir=專案根目錄 (/root/Desktop/uploadProject/upload)
wsgi-file=專案中wsgi.py檔案的目錄,相對於專案根目錄 (upload/wsgi.py)
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uswgi.log
  • 啟動:uwsgi --ini uwsgi.ini
  • 停止:uwsgi --stop uwsgi.pid
  • 重啟:uwsgi --reload uwsgi.pid
  • 如果重複開始,stop的時候會失敗,可以執行如下強制殺死  sudo killall -9 uwsgi

小結:

  1. 在專案根目錄建立uwsgi.ini檔案並設定
  2. 執行命令開啟uwsgi --ini uwsgi.ini讓DJango專案接收傳過來的http引數
  3. 修改了任何配置需要uwsgi --stop uwsgi.pid 如果失敗可以檢視pid並且修改uwsgi.pid,或者強制殺死在啟動

 

nginx部分

  • 使用nginx的作用
    • 負載均衡:多臺伺服器輪流處理請求
    • 反射代理:隱藏真實伺服器
  • 實現構架:客戶端請求nginx,再由nginx請求uwsgi,執行django框架下的python程式碼
  • nginx+uwsgi也可以用於其它框架的python web程式碼,不限於django
  • 阿里雲已經安裝好了,不需要再安裝

nginx目錄

cd /usr/sbin/nginx 安裝目錄

vim /etc/nginx/nginx.conf  配置檔案所在目錄
  • 檢視版本:sudo sbin/nginx -v
  • 啟動:sudo sbin/nginx
  • 停止:sudo sbin/nginx -s stop
  • 重啟:sudo sbin/nginx -s reload

那麼nginx是uwsgi之前最先收到資料的,咱們開啟nginx配置檔案修改路由,指向uwsgi程式


# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    以上不用我們管  下面一個個的server就是配置的

    server {
        listen      ip地址:80 default_server;
        #listen       [::]:80 default_server;
        server_name  _;
       # root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        #include /etc/nginx/default.d/*.conf;

        # 預設轉發到 DJango
        location / {
            include uwsgi_params;
            # 這裡配置的和專案下面的uwsgi.ini裡面socket一樣才能接收
            uwsgi_pass ip地址:8002;
        }
        # 在伺服器配置的靜態檔案目錄
        location /static {
            alias /var/www/upload/static/;
        }
        # 這個是例外,給我的iOS客戶端配置的bundlejs/ActivityPage.js來使用 不轉發到DJango        
        location /bundlejs {
            alias /usr/share/nginx/html/bundlejs/;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
以下是阿里雲nginx預設的配置
#
#     server {
#         listen       8001;
#         #listen       [::]:80 default_server;
#         server_name  upload;
#         #root         /usr/share/nginx/html;
#
#         # Load configuration files for the default server block.
#         include /etc/nginx/default.d/*.conf;
#
#         location / {
#              include uwsgi_params;
#              uwsgi_pass 127.0.0.1:8002;
#         }
#
#         #error_page 404 /404.html;
#          #   location = /40x.html {
#         #}
#
#         #error_page 500 502 503 504 /50x.html;
#         #   location = /50x.html {
#        #}
# 	 }                                                                                                                              37,0-1        37%

這是配置檔案,我們需要改的就是server,如果不改預設埠80那一坨,也可以直接另起一個監聽另一個埠比如8000.

在server下新增新的location項,指向uwsgi的ip與埠
location / {
    include uwsgi_params;將所有的引數轉到uwsgi下
    uwsgi_pass uwsgi的ip與埠;
}

我們試著改了預設的server,讓使用者輸入ip之後直接指向我們配置的頁面即可。如果listen對了,預設是會匹配location裡面的的正則,匹配到了就路由到指定ip+埠,static是配置不走DJango的,如127.0.1.1/static/xxxx.png,這樣的url直接拿伺服器上的資源,不走Django,直接返回,配置好了nginx,指向uwsgi,再指向DJango服務,一套就配置好了。

小結:

  1. 阿里雲自帶,熟悉安裝目錄和配置檔案目錄
  2. 配置nginx listen location以及static 這裡的static配置的路徑是後續靜態檔案存放路徑
  3. 配置location之後切換到專案根目錄重新配置uwsgi.ini  修改uwsgi.ini檔案,啟動socket,禁用http
  4. 重啟nginx、uwsgi(上面有介紹如何重啟)

 

靜態檔案

本地開啟的DJango應用,我們執行

python3 manage.py runserver 

之後,我們是可以根據img標籤裡面的src=/static/xxx.png獲取靜態資源,那麼我們在伺服器上啟用了nginx之後,靜態資源就由nginx來攔擊處理了,如上配置的static正則,指定了一個路徑,該路徑就是我們伺服器上自己配置的靜態資源路徑。

  • 所有的靜態檔案都會由nginx處理,不會將請求轉到uwsgi
  • 配置nginx的靜態項,開啟conf/nginx.conf檔案,找到server,新增新location
location /static {
    alias /var/www/upload/static/;
}

一開始這些目錄是沒有的,需要自己建立

  • 在伺服器上建立目錄結構“/var/www/upload/”
  • 修改目錄許可權
sudo chmod 777 /var/www/upload
  • 建立static目錄,注意順序是先分配許可權,再建立目錄
mkdir static

這裡就可以再看下專案根目錄下的setting.py了

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]
STATIC_ROOT='/var/www/upload/static/'

上面兩個是開發環境下的,最後一個配置是採集DJango的靜態檔案的。不想出錯的話直接配置好三個即可,上面兩個是針對專案目錄來的,下面的STATIC_ROOT是採集用的,就是伺服器上的一個地址,和nginx查詢的static配置檔案匹配。

執行

python3 manage.py collectstatic

就會把DJango專案中的STATIC_URL對應的目錄下的資源採集到STATIC_ROOT目錄,讓nginx查詢匹配。採集資源如下,和專案是一一對應的,只是由nginx來匹配了

[[email protected] nginx]# cd /var/www/upload/
[[email protected] upload]# ls -a
.  ..  static
[[email protected] upload]# cd static/
[[email protected] static]# ls 
admin  bundlepic  js  weexJS
[[email protected] static]# 

小結

  1. 新建伺服器靜態資源目錄和許可權配置
  2. nginx配置檔案static配置路徑
  3. 專案setting.py下配置路徑,採集路徑和nginx統一目錄下
  4. 執行採集,靜態資源轉移
  5. 重啟nginx、uwsgi

 

阿里雲端口許可權開啟

進入安全組配置,開啟指定埠許可權

 

至此,輸入你的阿里雲ip地址,就可以訪問到DJango寫的匹配到urls.py下的第一個views.py對應的html模板頁面,邏輯搞明白了,後面就是寫模組了,後面改了什麼就重啟nginx或者uwsgi

 

DJango 2.1教程