Nginx+uWSGI部署django項目

1、python環境安裝

1.首先解決環境依賴的問題html

1.1 打開阿里雲開源鏡像站的官網https://opsx.alibaba.com/mirror前端

1.2 找到centos,點擊幫助,找到對應系統的yum源。vue

  yum源的工做目錄,/etc/yum.repos.d目錄下,只要在這個目錄下名字叫作repo的文件,都會被yum取讀取node

  centos7:wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repopython

1.3 找到epel,點擊幫助,找到對應系統的yum源。mysql

  獲取epel的yum源(第三方軟件倉庫,如nginx,redis等等)linux

  epel(RHEL 7):wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoios

1.4 解決編譯過程環境依賴nginx

  yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -yweb

2.下載python環境源碼安裝包

  wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz

3.解壓縮源代碼包

  解壓xz格式:xz -d

  解壓tar:tar -xvf Python-3.6.7.tar -C /xxx   :-C能夠指定解壓目錄,不寫默認當前目錄

4.編譯

4.1 切到Python-3.6.7目錄下[執行configure腳本文件,指定安裝路徑] ,釋放makefile編譯文件 ,讓gcc工具去編譯的

  [root@wupeiqi Python-3.6.7]#./configure --prefix=/opt/mypy/python36/

4.2 指定make指令,讀取makefile,開始編譯

  make

4.3 執行make install ,開始安裝python3,這一步會生成python3解釋器

  make install

 注:4.2和4.3合併執行make && make install

5.環境變量的配置

5.1 配置path環境變量,讓系統能夠補全python3的命令

  [root@wupeiqi bin]#echo $PATH

  /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

5.2 添加python3的環境變量,注意,要添加到開頭

  /opt/mypy/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

5.3 寫入到全局變量配置文件中,每次開機都加載/etc/profile中

  vim /etc/profile 到最後一行下面,加入以下配置

  PATH="/opt/mypy/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"

5.4 修改完畢/etc/profile 必須 source讀取一下

  source /etc/profile

2、虛擬環境安裝

1.安裝虛擬環境工具

 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv 能夠更換源

2.建立虛擬環境

 第三方軟件默認裝在/opt下,切換到/opt目錄下

 virtualenv  --no-site-packages  --python=python3  虛擬環境的名字

      不安裝多餘的包      指定解釋器的python3

 virtualenv  --no-site-packages  --python=python3  myenv

3.激活虛擬環境

 虛擬環境中安裝的東西和系統無關,只能在虛擬環境中使用

 source myenv/bin/activate激活虛擬環境

4.退出虛擬環境

 deactivate

3、將項目在linux系統上運行

1.將項目經過zip壓縮後發送到linux系統上

2.在linux系統上解壓

  unzip xxx

3.激活虛擬環境source myenv/bin/activate

4.查看項目中是否有requirement.txt文件

 有:安裝項目中的模塊pip3 install  -i https://pypi.douban.com/simple -r requirements.txt

 無:運行程序,逐一安裝

 以Django項目爲例:python manager.py runserver  0.0.0.0:9000

 把你當前解釋器全部的模塊信息,導出到一個文件中
   pip3 freeze > requirement.txt

5.安裝數據庫mariadb 

 yum install mariadb-server mariadb -y

6.啓動mariad,經過yum安裝的軟件,均可以用systemctl管理

 systemctl  start  mariadb

7.導入數據庫

7.1 通常項目在壓縮發送到linux上都會包含數據信息。若是沒有單獨進行數據的導入

7.2 先將生產環境中的庫導出,而後發送到linux

 在終端直接執行:mysqldump  -uroot  -p123  庫名 > C:\data\db.sql , 用戶名密碼以實際開發爲主,不要用root。

7.3 在將數據導入

 方法一,直接在終端執行:mysql -u用戶名 -p密碼 < 要導入的數據庫數據(xx.sql)

 方法二,登陸數據庫後執行:

   本地建立庫:create database db;

   使用已建立的庫:use db;

   設置編碼:set names utf8

   導入:source /opt/database/db.sql;

8.對項目配置進行修改,如數據庫信息,ALLOW_HOSTS相關的修改

9.解決完畢問題以後,啓動python項目,注意防火牆

  解決防火牆:iptables -F

10.python manager.py runserver  0.0.0.0:9000 能夠運行

4、Nginx的安裝使用

nginx是個web服務器,經常使用做靜態文件服務器,反向代理服務器,郵件代理服務器,負載均衡服務器

1.安裝淘寶nginx,編代碼編譯安裝,先解決模塊依賴

  yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y

2.獲取淘寶nginx的源代碼

     wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz

3.解壓源代碼包

  tar  -zxvf  tengine-2.3.2.tar.gz

4.進入源代碼目錄開始編譯   

4.1 指定安裝路徑

   ./configure --prefix=/opt/s21/tngx

4.2 編譯且安裝

  make && make install

5.安裝後生成4個目錄,目錄的含義   

  conf:存放配置文件 , 指定了這個軟件各類功能的一個文件而已
  html:存放前端頁面
  logs:nginx的運行日誌
  sbin:nginx的可執行命令目錄

6.進入sbin目錄,啓動nginx

  ./nginx :啓動nginx
  ./nginx -s stop :中止nginx
  ./nginx -t :檢查nginx.conf的語法是否正確,最好每次更改配置文件後都執行一下,看看有無語法錯誤。
  ./nginx -s reload :不重啓nginx,從新加載nginx配置,每次更改配置文件後都執行一次。

7.Nginx的配置

7.1 找到nginx.conf,學習語法

  vim nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    #日誌格式化
    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  logs/access.log  main;                                               
    
    
    ....
        #nginx支持多虛擬主機,只須要寫入多個server關鍵字便可
    #虛擬主機1
    
     server {
        #基於端口的虛擬主機區分 
        listen       80;
        #基於域名的虛擬主機區分
        server_name  www.hello.com;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;
            
        #這裏是nginx的url匹配,如同django的url規則同樣
        #當我請求 www.hello.com 的時候,就進入以下location匹配
        #這個是最低級的匹配,只是訪問進行靜態頁面。全部請求都會走到這裏
        location / {
            #root關鍵字定義虛擬主機的根目錄, 這裏是能夠修改的,要訪問的文件的根目錄,hello下的index.html。
            root   /opt/hello/;
            #必須保證首頁文件存在
            index  index.html;
            }
        }

        #虛擬主機2 
     server {
        listen       80;
        server_name  www.world.com;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;    
        #這裏是nginx的url匹配,如同django的url規則同樣
        #當我請求www.world.com 的時候,就進入以下location匹配
        #全部請求都會走到這裏,world下的index.html
        location / {
            root   /opt/world/;
            #index參數是定義首頁文件的名字的
            index  index.html;
        }
    
    }
    
}
View Code

8.幾種location

# 第一種
location / {
        #root關鍵字定義虛擬主機的根目錄,會自動跳轉到 hello下的index.html,訪問的是靜態文件
        root   /opt/hello/;
        #index參數是定義首頁文件的名字
        index  index.html;
    }

# 第二種
location / {
    #實現反向代理的功能參數
        #訪問域名後,自動跳轉到http://192.168.182.131地址
    proxy_pass http://192.168.182.131;                                                         
 }
View Code

9.nginx的錯誤頁面 404美化

server {
        listen 80;
        server_name www.hello.com;   
        #經過這個參數定義便可,
        # 當訪問www.hello.com出現錯誤時,跳轉到指定error下的error.html,能夠對錯誤頁面進行美化。此代碼寫在哪一個server下,就被哪一個地址使用。    
        error_page  404              /404.html;
        location / {
                root   /opt/error;
                index error.html;
        }

}  
View Code

10.Nginx負載均衡   

10.1 準備好2臺資源服務器,本應該提供同樣的數據,進行負載均衡,實驗目的,看到不一樣的頁面,因此準備不一樣的頁面數據
  192.168.182.131 資源服務器1 ,返回hello的頁面
  192.168.182.132 資源服務器2 ,返回world的頁面

10.2 準備負載均衡服務器,配置以下
  在nginx配置文件中,添加以下配置,定義負載均衡池,寫入後端項目地址

# 默認輪詢方式
upstream myproject  {
    server 192.168.182.131;
    server 192.168.182.132; 
}

#權重方式
upstream myproject  {
    server 192.168.182.131    weight=4;
    server 192.168.182.132 weight=1; 
}

#ip哈希方式,根據用戶的來源ip計算出哈希值,永遠只指派給一個服務器去解析
#ip哈希不得與權重共同使用 
upstream myproject  {
    server 192.168.182.131    ;
    server 192.168.182.132 ; 
    ip_hash;
}

#虛擬主機配置以下
server {
    listen 80;
    server_name www.hello.com;
    #charset koi8-r;
    #access_log logs/host.access.log main;
    #access_log "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G" main;
    location / {
        # root /opt/xxx/;
        # index index.html index.htm;
        #請求轉發給負載均衡池
        proxy_pass http://myproject;
    }
}    
View Code

5、uWSGI

1.以往的python manage.py runserver 調用wsgiref去啓動django,性能很低,單進程web,使用uWSGI啓動django,能夠支持併發,多進程,以及日誌設置,多種功能。

2.安裝uWSGI

  pip3 install -i https://pypi.douban.com/simple  uwsgi

3.nginx的配置,反向代理uWSGI

3.1 修改nginx.conf以下

server {
        listen       80;
        server_name  www.hello.com;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        #access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;
        location / {
        #轉發請求的方式配置在這裏
        include    uwsgi_params;
        uwsgi_pass 0.0.0.0:8888;
        }
} 
View Code

4.使用uWSGI的命令,參數形式啓動項目

  uwsgi --http :8888  --module myproject.wsgi    

   --http 指定是http協議,去啓動項目
   --module 指定django目錄下的wsgi文件

5.uWSGI支持的熱加載命令

  uwsgi --http:8888  --module myproject.wsgi  --py-autoreload=1

6.uWSGI以配置文件的形式啓動 ,就是把你的啓動參數,寫入到一個文件中,而後,執行這個文件便可  

 配置文件名字能夠叫作 uwsgi.ini ,內容以下,這個文件是手動生成的
 touch uwsgi.ini ,寫入以下內容

[uwsgi]
# Django-related settings

# the base directory (full path)填入項目的絕對路徑 ,項目的第一層路徑
chdir = /opt/s21/Aida_crm

# Django's wsgi file指定第二層項目下的wsgi文件
module = Aida_crm.wsgi

# the virtualenv (full path)找到虛擬環境的絕對路徑
home = /opt/s21/s21uwsgi

# process-related settings
# master
master = true

# 以cpu核數來填寫,uwsgi的工做進程數
processes = 2

# the socket (use the full path to be safe)
這是以uwsgi_socket協議啓動的項目,沒法再去經過瀏覽器訪問,必須經過nginx以uwsgi協議去反向代理
socket = 0.0.0.0:8888

#也可使用http協議去啓動(僅用做調試使用)
#http = 0.0.0.0:9000

# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true

#後臺運行參數,將uwsgi運行在後臺,而且將django日誌輸出到uwsgi.log中
daemonize = uwsgi.log
View Code

7.指定配置文件啓動django

  uwsgi  --ini  uwsgi.ini 

8.收集crm的全部靜態文件,讓nginx去解析

  對django的settings.py配置修改以下

  添加以下參數
  STATIC_ROOT='/opt/mystatic'

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

  在項目第一層目錄下執行收集命令,執行命令,收集django的全部靜態文件,系統會自動建立'/opt/mystatic'  這個文件夾

  python manage.py collectstatic

9.配置nginx,找到crm的這些靜態資源

  location / {
    include uwsgi_params;
    uwsgi_pass 0.0.0.0:8888;
     }

  #添加一個location,針對nginx的url進行匹配處理
  #當請求時 www.oldchouhuo.com/static/..... 這樣的url的時候,nginx進行別名修改,去/opt/mystatic底下去尋找資源文件 

  location /static {
    alias /opt/mystatic;
   }

6、先後端分離項目部署

前言:先後端分離項目流程,經過訪問nginx,會跳轉到vue訪問前端頁面,而後前端向後端發請求,獲取到後端數據。用戶既不接觸vue前端服務器的ip,也接觸不到後端服務器ip。

1.前端項目的部署

1.1 將前端項目傳到服務器 

  經過lrzsz,或者xftp傳輸到linux服務器上,並進行解壓縮

1.2 前端vue

  要在服務器上,編譯打包vue項目,必須得有node環境

1.3 下載node.js

  到網站https://nodejs.org/download/release/找到對應的項目使用版本進行下載,下載node二進制包就不用進行編譯了。

  wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz

  解壓縮  tar  -zxvf  node-v8.6.0-linux-x64.tar.gz

1.4 配置環境

  將node命令,添加至linux環境變量,修改/etc/profile,寫入下面代碼 

  PATH=$PATH:/opt/node-v8.6.0-linux-x64/bin

 1.5 讀取文件,生效PATH

  source  /etc/profile

1.6 測試是否完成

  [root@MiWiFi-R4-srv node-v8.6.0-linux-x64]# node -v

  v8.6.0

1.7 node環境配置好後,安裝模塊

 使用npm,npm 是 Node 的模塊管理器。npm install 命令用來安裝模塊到node_modules目錄。

進入vue項目源碼目錄 cd myvue$ npm install <packageName>

安裝vue項目模塊,npm install默認去裝package.json的模塊內容,若是出現模塊安裝失敗,手動再裝
注意,本地寫的vue代碼,接口文件請求url,極可能鏈接的服務器地址有問題,注意Axios.POST提交的地址,必定得發送給django應用(若是用了nginx,就發送給nginx的入口端口)
演示時,將vue項目和django項目放在了一臺服務器,經過nginx反向代理功能(8888端口),轉發vue請求給django(9999) 準備編譯打包vue項目,替換配置文件全部地址,改成服務器地址
sed -i 's/127.0.0.1:8000/192.168.31.176:8888/g' /opt/myvue/src/restful/api.js

確保vue的route模式是history
路徑:opt/myvue/src/router/index.js
  export default new Router({
      linkActiveClass:'is-active',
      mode: 'history', //改爲history模式
      ......
    })

1.8 開始編譯vue代碼,生成dist靜態網頁文件夾

  npm run build

1.9 檢查dist文件夾

  [root@MiWiFi-R4-srv myvue]#ls dist

  index.html static

vue代碼到此結束。。。配置nginx,讓nginx找到vue的index.html文件

2.0 nginx配置

server {
    #用戶訪問域名或者ip,默認是nginx的80端口

        listen       80;
        server_name  192.168.31.176;
    #url匹配  /   也就是請求地址是192.168.31.176端口80時,進入此location,返回vue的dist下index.html首頁
        location / {
              root     /opt/myvue/dist;
              index   index.html;
        }
    }
View Code

注:到此訪問192.168.31.176就能夠訪問index.html頁面,若是沒法訪問則是防火牆問題,iptables -F解決防火牆。便可訪問

2.後端項目部署

nginx的配置

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  192.168.31.176;
        location / {
              root   /opt/myvue/dist;
              index  index.html;

    #這一條參數確保vue頁面刷新時候,不會出現404頁面
      try_files $uri $uri/ /index.html;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
           root   html;
        }
    }
  server {
        listen       8000;
        server_name  192.168.31.176;
        location / {
              include  uwsgi_params;
               uwsgi_pass 0.0.0.0:9999;
        }
     }
}  
View Code
相關文章
相關標籤/搜索