1. 程式人生 > >Linux生產環境下部署Django+Nginx+uwsgi

Linux生產環境下部署Django+Nginx+uwsgi

    本文是在上一篇 Linux作業系統下部署Jenkins環境,資料遷移(備機部署)以及主從節點的配置 ”基礎上進行延伸,Jenkins+Django+Nginx+uWSGI才是一套解決方案。

    之所採用Django+Nginx+uwsgi的解決方案,是由於python manage.py runserver 0:8081形式啟動Django,只適用於環境測試。當退出終端,甚至退出執行python manage.py runserver,就會發現無法對Django進行訪問。為了解決這個問題,在企業中都會使用Django+Nginx+uwsgi 的解決方案。


目錄

   環境準備

    環境部署

         Python3.6部署

          Mysql部署

          Django部署

          Nginx服務部署


   環境準備

Num Software  Version
1 Python 3.6
2 Django 1.11.9
3 mysqlclient 1.3.13
4 Mysql 5.7
5 Uwsgi 2.0.17

    環境部署

    說明:本文部署的服務絕大多數,均採用原始碼編譯安裝的方式進行。且所使用軟體版本,均是編者在自身生產環境下采用的,軟體版本視個人情況而言。


         Python3.6部署

[-> ~# opt] wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
[-> ~# opt] yum install gcc make openssl-devel pcre-devel zlib-devel sqlite-devel python-devel -y
[-> ~# opt] cd Python-3.6.0
[-> ~# Python-3.6.0] ./configure --prefix=/usr/local make && make install     # 如果沒有安裝gcc make 等包,在編譯安裝時會出錯

     如果編譯安裝後沒有pip的使用者,可以自行到官網進行下載 https://pypi.org/project/pip/。但其實一般來說,原始碼編譯安裝後都會有pip,只是在使用pip的時候,系統預設呼叫的是 "/usr/bin" 路徑下。而我們編譯安裝的是在 "/usr/local/bin/"路徑下。所以,我們可以做個連結到"/usr/bin" (ln -s /usr/local/bin/pip /usr/bin/pip)來解決。

      如果實在是沒有的使用者,在下載後,解壓後進入到pip檔案內使用如下命令進行安裝:

[-> ~# opt] tar -xvf pip-18.0.tar
[-> ~# opt] cd pip-18.0
[-> ~# pip-18.0] python setup.py install

          Mysql部署

[-> ~# opt] wget  http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
[-> ~# opt] yum localinstall mysql57-community-release-el7-8.noarch.rpm -y
[-> ~# opt] systemctl start mysqld
[-> ~# opt] systemctl enable mysqld
[-> ~# opt] grep password /var/log/mysqld.log      # 檢視資料庫初始化密碼
[-> ~# opt] ss -antulp | grep :3306         # 檢視資料庫是否已啟動

       Mysql 資料庫命令列的基本操作可以網上自行學習,這裡就不過多闡述。


          Django部署

       Django的部署,在編者以往的文章 “ 使用Python、Django、Bootstrap編寫Web頁面,以及利用ansible-cmdb、ansible等模組,在web介面獲取批量伺服器配置資訊,以及實現批量管理伺服器 ”有較為詳細的安裝部署步驟,不懂的讀者可以前去查閱。

       在虛擬環境下安裝所需要的模組:

(dj_env)[-> ~# dj_env] pip install django==1.11.9
(dj_env)[-> ~# dj_env] pip install mysqlclient==1.3.13
(dj_env)[-> ~# dj_env] pip install uwsgi==2.0.17
(dj_env)[-> ~# dj_env] pip list         # 檢視列表是否安裝成功,成功如下圖

Package     Version
----------- -------
Django      1.11.9 
mysqlclient 1.3.13 
pip         18.0   
pytz        2018.5 
setuptools  28.8.0 
uWSGI       2.0.17

     新增uwsgi檔案:建議建立在django app 同級目錄下

(dj_env)[-> ~# dj_app] vim uwsgi.ini
    # 內容如下:
    [uwsgi]
    chdir = /opt/dj_app/dj_app     # 指定工作目錄
    socket = 127.0.0.1:8081        # 通過套接字的方式進行訪問,埠可因個人實際情況進行修改,                
                                   # 如果不想直接寫入,可以生成stock檔案,然後進行制定
    #socket = ./uwsgi.sock         # 如果這裡使用uwsgi.sock檔案,則在nginx.conf檔案內的uwsgi_pass檔案就必須是soc檔案的絕對路徑
    module=oms.wsgi:application
    chmod-socket = 664
    static-map=/static=./static    # 靜態檔案路徑
    master = true                  # 主程序
    vacuum = true                  # 重啟或退出時清理檔案
    workers = 2                    # 子程序數
    uid = scon                     # 指定啟動的使用者
    gid = scon
    pidfile = ./uwsgi8081.pid      # 建立pid程序檔案,主要用於啟動、停止該程序
    daemonize = ./uwsgi8081.log    # 啟動的日誌檔案


# 在使用uwsgi --ini uwsgi.ini命令前,建議先使用命令pkill uwsgi,然後使用lsof -i 8081,看下有沒有服務佔用此埠。如果有則kill掉

(dj_env)[-> ~# dj_app] uwsgi --ini uwsgi.ini    # 類似初始化,生成相關檔案,從ini檔案中獲取配置

          Nginx服務部署

[-> ~# opt] wget http://nginx.org/download/nginx-1.11.2.tar.gz
[-> ~# opt] tar -xvf nginx-1.11.2.tar.gz
[-> ~# opt] cd nginx-1.11.2
[-> ~# nginx-1.11.2] ./configure --prefix=/usr/local/nginx    
[-> ~# nginx-1.11.2] make && make install

            啟動Nginx服務

[-> ~# opt] ln -s /usr/local/nginx/sbin/nginx   /sbin/nginx
[-> ~# opt] nginx           # 啟動服務
[-> ~# opt] lsof -i 80      # 檢視哪個服務佔用80埠,然後kill掉

            修改Nginx配置檔案:

[-> ~# opt] vim //usr/local/nginx/conf/nginx.conf
    # 修改為如下:80埠對映多埠
        server {
            listen 80;
            server_name localhost;

        location  / {
           # proxy_pass 127.0.0.1:8081;
            proxy_set_header Host             $host;
            proxy_set_header X-Real-IP        $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            #uwsgi_pass  unix:uwsgi.sock的絕對路徑;
            uwsgi_pass 129.0.0.1:8081;
            include uwsgi_params;
           }
        }
                        ... ...
        server {
            listen 80;
            server_name www.a.com;

        location  / {
            proxy_pass 127.0.0.1:8080;
            proxy_set_header Host             $host;
            proxy_set_header X-Real-IP        $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
           }
        }
        
[-> ~# opt] ngins -t             # 如果出現ok,說明配置檔案修改無誤,如果有報錯,則需要解決
[-> ~# opt] nginx -s reload      # 重新載入nginx配置檔案

        到這裡,Django+Nginx+uwsgi 就已經部署完成了,此時我們使用如下命令:

(dj_env)[-> ~# dj_app] uwsgi --ini uwsgi.ini
(dj_env)[-> ~# dj_app] ss -antulp      # 檢視8081埠是否已經由uwsgi啟動,如果是則成功。

        最後,訪問 “ http://127.0.0.1:8081 ”,就可以看到Django頁面的 “  It   Work”。

         本文旨在提供參考,如有錯誤,歡迎大家指正。幫助編者不斷的改進!