Ubuntu-18.04.2系統 Nginx+uWSGI+Django 部署生產環境


首先准備環境:

1.使用虛擬機 VMware Workstation Pro (也可以不用),安裝Ubuntu-18.04.2系統

 

開始搭建環境

(因為ubuntu18.4.2集成了python3.6,因此不需下載python3,只需下載pip即可,有的話可以不用下載)

sudo apt install python3-pip

------搭建python環境------

1 sudo apt-get install python3 (如果有python環境可以不裝)
2 sudo apt-get install python3-dev #類庫和頭文件單獨的包
3 sudo apt-get install libxml* #解析xml文件的庫
4 sudo apt-get install net-tools #網絡管理命令如:ifconfig是查看本地ip
5 sudo apt-get install lsof #列出打開文件工具

------安裝 數據庫---------

1 (使用sqlite3數據庫可以不裝)                                                            
2 apt-get install mysql-server 
3 apt-get install mysql-client 
4 apt-get install libmysqlclient-dev

------更新pip版本---------

pip3 install --upgrade pip3

------安裝SSH-------------

sudo apt-get install openssh-server

------安裝vim-------------

sudo apt install vim

------安裝django----------

sudo pip3 install django

-------上傳你的django項目-----------------
可以在Home目錄把項目直接復制到Home目錄里
(這里注意:Home是ubuntu桌面上你能看到的目錄,/home和/opt是用cd命令行進入的根目錄,兩者有很大的區別)
我們直接cd回車進入根目錄,cd /opt進入opt文件夾,mkdir project創建project目錄
再cd回車進入根目錄ls看文件夾,找你的項目目錄mysite,這時看到你的項目目錄准備復制
用cp進行復制(你的命令所處位置在Home/(~/$)指向你的mysite目錄)
----------進行復制------------------------

sudo cp -r mysite /opt/project/

------------------------------------------

上傳之后運行django測試你的項目能不能運行成功
先進入你的項目目錄/opt/project/mysite進行數據遷移
----------數據遷移------------------------

1 sudo python3 manage.py makemigrations
2 sudo python3 manage.py migrate

------------------------------------------

如果想用admin界面,可以用如下指令創建管理員:
----------創建超級用戶--------------------

sudo python3 manage.py createsuperuser

------------------------------------------
輸入打算使用的登錄名:username:michaelshu
輸入email:Email address:
輸入密碼,需要輸入兩次,輸入過程中密碼不顯示:
Password: Password (again):
當兩次密碼都相同的時候,就會提示superuser創建成功。
Superuser created successfully

----------添加靜態文件目錄----------------
#在settings.py中添加默認的靜態目錄(收集使用)
STATIC_ROOT = os.path.join(BASE_DIR,'static')

先運行--noinput表示是不需要交互的,再來收集靜態文件至static目錄中
----------收集靜態文件--------------------

1 sudo python3 manage.py collectstatic --noinput 
2 sudo python3 manage.py collectstatic 

------------------------------------------

----------運行django項目測試--------------

sudo python3 manage.py runserver 127.0.0.1:8000

------------------------------------------
瀏覽器訪問127.0.0.1:8000查看成功與否
成功之后安裝uwsgi

----------安裝 uwsgi----------------------

sudo pip3 install uwsgi
or
sudo pip3 install http://projects.unbit.it/downloads/uwsgi-lts.tar.gz

測試uwsgi,創建test.py文件:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

----------通過uwsgi運行該文件-------------

uwsgi --http :8001 --wsgi-file test.py

--------------------------------------------------
在瀏覽器端輸入127.0.0.1:8001即可看到Hello World

接下來配置Django與uwsgi連接。此處,假定的我的django項目位置為:/opt/project/mysite
----------通過uwsgi運行項目文件-----------

uwsgi --http :8001 --chdir /opt/project/mysite/ --wsgi-file mysite/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

---------------------------------------------------
在瀏覽器端輸入127.0.0.1:8001/admin即可看到你的django項目admin頁面
常用選項:
http : 協議類型和端口號
processes : 開啟的進程數量
workers : 開啟的進程數量,等同於processes(官網的說法是spawn the specified number ofworkers / processes)
chdir : 指定運行目錄(chdir to specified directory before apps loading)
wsgi-file : 載入wsgi-file(load .wsgi file)
stats : 在指定的地址上,開啟狀態服務(enable the stats server on the specified address)
threads : 運行線程。由於GIL的存在,我覺得這個真心沒啥用。(run each worker in prethreaded mode with the specified number of threads)
master : 允許主進程存在(enable master process)
daemonize : 使進程在后台運行,並將日志打到指定的日志文件或者udp服務器(daemonize uWSGI)。實際上最常用的,還是把運行記錄輸出到一個本地文件上。
pidfile : 指定pid文件的位置,記錄主進程的pid號。
vacuum : 當服務器退出的時候自動清理環境,刪除unix socket文件和pid文件(try to remove all of the generated file/sockets)

-------------------小重點-------------------------
接下來,我們要將三者結合起來。首先羅列一下項目的所需要的文件:
mysite/

├── manage.py

├── mysite/

│ ├── __init__.py

│ ├── settings.py

│ ├── urls.py

│ └── wsgi.py

└── my_uwsgi.ini

在我們通過Django創建mysite目時,在子目錄mysite下已經幫我們生成的 wsgi.py文件。所以,我們只需要再創建my_uwsgi.ini配置文件即可,當然,uwsgi支持多種類型的配置文件,如xml,ini等。此處,使用ini類型的配置。
---------------------配置文件內容--------------------------------------------

# my_uwsgi.ini file
[uwsgi]

# Django-related settings
#socket是用nginx來測試時用的
#socket = :8000
#用uwsgi單獨測試時用
http = :8000

# the base directory (full path)
chdir = /opt/project/mysite

# Django s wsgi file
module = mysite.wsgi

# process-related settings
# master
master = true

# maximum number of worker processes
processes = 4

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

----------------------------------------------------------------------------
這個配置,其實就相當於在上一小節中通過wsgi命令,后面跟一堆參數的方式,給文件化了。
socket 指定項目執行的端口號。
chdir 指定項目的目錄。
module mysite.wsgi,可以這么來理解,對於mysite_uwsgi.ini文件來說,與它的平級的有一個mysite目錄,這個目錄下有一個wsgi.py文件。其它幾個參數,可以參考上一小節中參數的介紹。接下來,切換到mysite項目目錄下,通過uwsgi命令讀取myweb_uwsgi.ini文件啟動項目。
在項目目錄下/opt/project/mysite運行命令啟動uwigs,看是否成功,注意查看uwsgi的啟動信息,如果有錯,就要檢查配置文件的參數是否設置有誤。
---------用ini文件啟動uwsgi---------------

uwsgi --ini my_uwsgi.ini 

------------------------------------------------
(這里容易犯兩個錯誤:1.項目文件沒放對地方,2.http和socket弄混了(socket是搭配nginx用的,用uwsgi單獨測試要用http))
成功之后安裝nginx

--------安裝 Nginx--------------------------

sudo apt-get install nginx

--------nginx命令---------------------------

1 /etc/init.d/nginx start #啟動
2 /etc/init.d/nginx stop #停止
3 /etc/init.d/nginx restart #重啟

------------------------------------------------

再接下來要做的就是修改nginx.conf配置文件。
打開/etc/nginx/nginx.conf文件,添加如下內容。
(cd返回根目錄,cd /etc/nginx進入nginx目錄,ls查看目錄下的nginx.conf文件,sudo vim nginx.conf打開此文件)
------------------小重點------------------------------
一定要把server放在http{}中,不然會報錯,頭疼的錯誤,還要特別注意分號(;)

server {
    listen 8099; 
    server_name 127.0.0.1;
    #也可以加你的本機地址 
    #server_name 127.0.0.1 192.168.1.12;
    charset UTF-8;
    access_log /var/log/nginx/mysite_access.log;
    error_log /var/log/nginx/mysite_error.log;

    client_max_body_size 75M;

    location / { 
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
        uwsgi_read_timeout 2;
    } 
    location /static {
        expires 30d;
        autoindex on; 
        add_header Cache-Control private;
        alias /opt/project/mysite/static/;
    }
}

----------------------------------------------------------

listen 指定的是nginx代理uwsgi對外的端口號。
server_name 網上大多資料都是設置的一個網址(例,www.example.com),我這里如果設置成網址無法訪問,所以,指定的到了本機默認ip。
在進行配置的時候,我有個問題一直想不通。nginx到底是如何uwsgi產生關聯。現在看來大概最主要的就是這兩行配置。
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
include必須指定為uwsgi_params;而uwsgi_pass指的本機IP的端口號與myweb_uwsgi.ini配置中的文件中的必須一致。

現在重新啟動nginx,然后瀏覽器訪問:http://127.0.0.1:8099/
通過這個IP和端口號的指向,請求應該是先到nginx的。如果你在頁面上執行一些請求,就會看到,這些請求最終會轉到uwsgi來處理。

這時運行訪問你的項目應該會報個錯誤:attempt to write a readonly database(嘗試寫入只讀數據庫)
解決很簡單,首先停掉nginx和uwsgi,cd /opt/project/mysite進入mysite目錄查找db.sqlite3數據庫文件
-----------對sqlite3賦予權限----------------

sudo chmod 777 db.sqlite3

--------------------------------------------
順帶着文件夾也給賦權吧,對mysite項目文件和project目錄賦予權限

1 sudo chmod 777 mysite
2 sudo chmod 777 project

如果還有錯那就是504 Gateway Time-out這個錯誤了吧,提醒你一下,"socket"有沒有改過來,

要把my_uwsgi.ini配置文件中的"http"注釋掉,先停掉nginx和uwsgi,使用"socket",接下來cd /opt/project/mysite 進入項目根目錄使用 sudo vim my_uwsgi.ini打開uwsgi文件更改配置

# Django-related settings
#socket是用nginx來測試時用的
socket = :8000
#用uwsgi單獨測試時用
#http = :8000

這時就完美成功了吧,如果還報錯不要急,仔細查看報錯信息,一點點解決,你就會離成功更近了一步,容易犯錯的位置已經重點標紅了,注意使用啊,一起加油吧!!

附錄一點vim的使用方法:

 1     光標:j 下   k 上  H 左 L右
 2     i --當前光標下進入編輯模式  
 3     ESC --退出編輯模式
 4     a --當前光標下一個字符進入編輯模式
 5     A --尾行進入編輯模式
 6     dd --刪除整行
 7     dG --刪除光標所在行到文件最后一行所有內容
 8     dgg --刪除光標所在行到文件第一行所有內容
 9     u --返回上一次修改狀態
10     wq --保存退出
11     q! --放棄打開文件后的所有修改退出

文章引用:http://www.cnblogs.com/fnng/p/5268633.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM