阿里雲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推上去

以下是推上去的目錄

[root@izj6cgebrvv84gtntwiyagz static]# cd /root/Desktop/uploadProject/upload/
[root@izj6cgebrvv84gtntwiyagz 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來匹配了

[root@izj6cgebrvv84gtntwiyagz nginx]# cd /var/www/upload/
[root@izj6cgebrvv84gtntwiyagz upload]# ls -a
.  ..  static
[root@izj6cgebrvv84gtntwiyagz upload]# cd static/
[root@izj6cgebrvv84gtntwiyagz static]# ls 
admin  bundlepic  js  weexJS
[root@izj6cgebrvv84gtntwiyagz 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教程

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章