本文服務器上的django項目和虛擬環境的路徑將創建在 /home路徑下,項目名爲"BlogProject",虛擬環境名爲"py3.6env"。html
對於Django部署而言,nginx和uWSGI是不錯的選擇,但它們並不是惟一的選擇,也不是「官方」選擇。對於它們兩個,都有不錯的替代品,所以鼓勵你去詳細研究一下。python
nginx (發音爲 engine-x) 是一個免費開源而且高性能的HTTP服務器和反向代理,仍是一個IMAP/POP3代理服務器。mysql
web服務器軟件:能夠向瀏覽器等web客戶端提供文件 (HTML, 圖像, CSS等等)。經常使用的軟件有Apache,Nginx,IIS(在windows系統使用)。nginx
一個web服務器面對的是外部世界。它能直接從文件系統提供文件 (HTML, 圖像, CSS等等)。然而,它沒法「直接」與Django應用通訊;它須要藉助一些工具的幫助,這些東西會運行運用,接收來自web客戶端(例如瀏覽器)的請求,而後返回響應。git
一個Web服務器網關接口(Web Server Gateway Interface) - WSGI - 就是幹這活的。 WSGI 是一種Python標準。它是一個Web服務器(如nginx,uWSGI等服務器)與web應用(如用Flask,Django框架寫的程序)通訊的一種規範。web
uWSGI是一種WSGI實現。本文咱們將設置uWSGI,讓它建立一個socket,而且經過WSGI協議提供響應到web服務器。sql
OS:centos7.6數據庫
python版本:python3.6.5django
django版本:Django2.0windows
uwsgi版本:使用本文發佈時最新的2.0.18
nginx版本:使用本文發佈時官網最新的1.15.11
1.不要刪除自帶的python2.7,不然會出問題,由於centos許多軟件須要依賴系統自帶python
2.安裝依賴工具 (安裝這些模塊都是爲了成功編譯安裝python3,防止出現各類異常)
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel mysql-devel gcc gcc-devel python-devel
3.下載
wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
4.解壓
tar -zxvf Python-3.6.5.tgz
5.移動至規範的放軟件的目錄下
mv Python-3.6.5 /usr/local
6.安裝
cd /usr/local/Python-3.6.5/ ./configure make make install
./configure命令沒有指定安裝路徑,則默認安裝在/usr/local/bin。
安裝完成以後,網上不少教程都說要創建軟連接 添加變量 才能在終端中直接使用python3,可是我這裏不用創建軟連接,可直接在終端中直接使用python3.
pip3也不用創建軟連接,可直接在終端中直接使用pip3
7.驗證版本號
python3 -V
1.安裝虛擬環境virtualenv,建議你們都安裝一個virtualenv,方便不一樣版本項目管理。
系統已經幫咱們安裝好virtualenv,可不用安裝直接使用
2.建立虛擬環境virtualenv
在/home路徑下,建立虛擬環境,這裏的路徑你們能夠本身選擇,我習慣建在/home路徑下。也能夠在根目錄下創建兩個文件夾env和BlogProject(項目路徑 ),主要用於存放env和網站文件的
virtualenv py3.6env
3.進入虛擬環境
source /home/py3.6env/bin/activate
紅色方框出現(py3.6env),說明是成功進入虛擬環境。
1.系統上安裝uwsgi
pip3 install uwsgi
2.虛擬環境上安裝uwsgi
進入虛擬環境,執行安裝命令
pip3 install uwsgi
注意:uwsgi要安裝兩次,先在系統裏安裝一次,而後進入對應的虛擬環境安裝一次。
安裝完成後查詢uwsgi安裝狀況,如圖所示,則安裝成功。
一樣這裏也不用創建軟連接,能夠直接在終端使用uwsgi。
3.驗證
在/home/路徑下創建test.py,輸入如下內容:
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello Django"]
執行命令
uwsgi --http :8001 --wsgi-file test.py
瀏覽器訪問,網頁能顯示 Hello Django 那麼就沒問題。((記得關閉系統防火牆或者在服務器安全組開放8001端口))
1.備份本地數據庫。
使用sqlite數據庫的話,直接打包數據庫文件(db.sqlite3)上傳到服務器便可。
使用Mysql數據庫,要先在本地Mysql裏備份導出數據,而後在服務器上安裝Mysql數據庫軟件。
mysqldump -u 用戶名 - p 數據庫名 > data.sql #備份導出數據
ps:服務器上安裝Mysql數據庫軟件,請參考:CentOS7 安裝並配置MySQL8.0
2.在本地項目目錄下用下面的命令把當前的環境依賴包導出到requirements.txt文件。
pip3 freeze > requirements.txt
3.把項目源碼(包括數據庫文件,環境依賴包文件)壓縮打包,上傳到服務器對應的目錄裏(這裏在git bash裏使用scp命令上傳數據到服務器),解壓。
scp BlogProject.zip root@「服務器IP地址」:/home/BlogProject.zip #傳輸到home路徑下
4.進入剛纔步驟三建立的虛擬環境,而後進入項目路徑安裝requirements.txt裏的依賴包。
pip3 install -r requirements.txt
5.導入數據庫到服務器。(若是用的是Mysql的話)
默認使用的是SQLite數據庫,就不用作此操做。數據庫原來是SQLite的,想換成Mysql,請查看文章:Django中把SQLite數據庫轉換爲Mysql數據庫的配置方法
若是是Mysql數據庫的,則在命令行裏輸入:
#把上傳到服務器的data.sql,在服務器裏用下面命令導入 mysql -u 用戶名 -p 你的密碼 use 數據庫名; #這裏的數據庫名要項目中的settings.py文件的數據庫名一致 source /home/data.sql #導入數據庫文件
6.運行一下項目,若是能正常啓動,在瀏覽器裏訪問服務器地址(域名),就能查看到項目,則進行下一步,不能正常運行往上檢查
python3 manage.py runserver 0.0.0.0:80
ps:若是在雲服務器上沒有爲80端口設定安全組,則不能在瀏覽器訪問。
咱們網站項目路徑是 /home/BlogProject,在/home路徑下新建文件夾BlogProject_uwsgi,專門存在uwsgi配置文件,日誌文件,進程文件,另外也能夠直接在項目根目錄下建立BlogProject_uwsgi.ini文件,這裏我選擇新建文件夾。
在/home/BlogProject_uwsgi路徑下新建BlogProject_uwsgi.ini文件
#BlogProject_uwsgi.ini [uwsgi] # 經過uwsgi訪問django須要配置成http # 經過nginx請求uwsgi來訪問django 須要配置成socket # web項目根目錄 chdir = /home/BlogProject #虛擬環境的目錄 home = /home/py3.6env # module指定項目自帶的的wsgi配置文件位置 module = BlogProject.wsgi # 容許存在主進程 master = true # 開啓進程數量 processes = 4 #每一個進程的最大請求時間 harakiri = 60 #每一個進程的最大請求數 max-requests = 5000 # 8001是內部端口,是django的端口號 socket = 127.0.0.1:8001 #用戶id uid = 1000 #組id gid = 2000 #存放進程文件的目錄 pidfile = /home/BlogProject_uwsgi/master.pid #存放日誌文件的目錄 daemonize = /home/BlogProject_uwsgi/BlogProject.log # 服務器退出時自動清理環境 vacuum = true
BlogProject_uwsgi.ini裏面參數的設定可參考官方文檔https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/uwsgi/。
進入home目錄,執行下面命令
cd /home/
wget http://nginx.org/download/nginx-1.13.7.tar.gz
下載完成後,執行解壓命令:
tar -zxvf nginx-1.15.11.tar.gz
移動至規範的放軟件的目錄下
mv nginx-1.15.11 /usr/local
安裝,進入解壓後的nginx-1.15.11文件夾,依次執行如下命令:
cd /usr/local/nginx-1.15.11/ ./configure make make install
nginx通常默認安裝好的路徑爲/usr/local/nginx
在/usr/local/nginx/conf/中先備份一下nginx.conf文件,以防意外。
cp nginx.conf nginx.conf.bak
而後打開nginx.conf,把原來的內容刪除,直接加入如下內容:
events{ worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; server { listen 80; #80是對外的端口號 server_name 47.112.128.209:80; #nginx代理uwsgi對外的ip,改成本身的域名,沒域名修改成服務器ip地址 charset utf-8; location /static/ { alias /home/BlogProject/static/; #靜態資源路徑 } location /media/ { alias /home/BlogProject/media/; # #媒體資源路徑 } location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8001; #端口要和uwsgi裏配置的同樣 } } }
要留意備註的地方,要和UWSGI配置文件BlogProject_uwsgi.ini,還有項目路徑對應上。
進入/usr/local/nginx/sbin/目錄
執行./nginx -t命令先檢查配置文件是否有錯:
若是出現上圖紅色方框的內容,則表明沒有錯,就執行如下命令,啓動nginx:
./nginx
或者執行:
/usr/local/nginx/sbin/nginx #啓動nginx
終端沒有任何提示就證實nginx啓動成功。可使用你的服務器地址查看,成功以後就會看到一個nginx歡迎頁面。
留意:必定要注意Uwsgi和Nginx配置文件裏的項目路徑和靜態資源路徑,填寫正確了才能成功訪問。否則會出現502錯誤。還有就是,修改Django文件和其它配置文件以後,必定要重啓Uwsgi和Nginx,否則不生效。
以後,在settings.py裏設置:(若是以前在本地項目設置過,可不用再設置)
a、關閉DEBUG模式。
DEBUG = False
b、ALLOWED_HOSTS設置爲* 表示任何IP均可以訪問網站。
ALLOWED_HOSTS = ['*']
1.啓動uwsgi
uwsgi --ini /home/BlogProject_uwsgi/BlogProject_uwsgi.ini
執行完命令,以下圖所示
查看uwsgi是否啓動
ps -aux | grep uwsgi
以下圖所示,表示uwsgi啓動成功。
以上步驟都沒有出錯的話。
進入/usr/local/nginx/sbin/目錄
執行:
./nginx -s reload
或者執行:
/usr/local/nginx/sbin/nginx -s reload
重啓nginx 。
執行命令,查詢nginx是否啓動
ps -aux | grep nginx
以下圖所示,表示nginx啓動成功。
而後在瀏覽器裏訪問你的項目地址! (記得關閉系統防火牆或者在服務器安全組開放80端口)
訪問以前創建的文件夾BlogProject_uwsgi,能夠看到自動生成了日誌文件(BlogProject.log)和進程文件(master.pid)。
咱們能夠利用進程文件(master.pid)進行uwsgi的重啓,中止。
uwsgi --stop /home/BlogProject_uwsgi/master.pid #關閉uwsgi進程 uwsgi --reload /home/BlogProject_uwsgi/master.pid #從新加載uwsgi進程
除了利用進程文件(master.pid)進行uwsgi的開啓,重啓,中止,uwsgi還有如下方法進行操做。
Uwsgi和Nginx重啓方法:
ps -aux | grep uwsgi ##查看Uwsgi進程,是否啓動 killall -9 uwsgi #用kill方法把uwsgi進程殺死,而後啓動uwsgi uwsgi --ini /home/BlogProject_uwsgi/BlogProject_uwsgi.ini #啓動uwsgi ps -aux | grep nginx ##查看nginx進程,是否啓動 killall -9 nginx #用kill方法把nginx進程殺死 /usr/local/nginx/sbin/nginx #啓動ngnix /usr/local/nginx/sbin/nginx -s reload #Nginx平滑重啓方法
方法一:
一、在settings.py尾部:
STATIC_ROOT = os.path.join(BASE_DIR, 'BlogProject_collected')#指定樣式收集目錄
#或者
STATIC_ROOT = '/home/BlogProject/BlogProject_collected' #指定樣式收集目錄
二、收集CSS樣式,在終端輸入:
python manage.py collectstatic
運行這個命令以後,就會自動把後臺CSS樣式收集到/BlogProject_collected/目錄下,如圖所示。刷新頁面就能恢復樣式!
方法二:
在Python安裝目錄下(若是使用虛擬環境,則在虛擬環境目錄下)找到\Lib\site-packages\django\contrib\admin\templates目錄,把裏面的admin目錄複製到指定目錄便可。
注意:以上兩種方法在收集或複製前必定先在settings裏配置並指定STATIC_ROOT路徑,STATIC_ROOT路徑能夠本身定。指定的時候必定要在settings.py和nginx裏指定新的路徑。否則沒法生效。
緣由:上傳文件的目錄及其子目錄沒有寫的權限。
解決方法:運行如下代碼,給media目錄及其子目錄設定rwx權限。
chmod -R 777 media #-R表示遞歸設置權限
運行如下代碼, 給BlogProject_debug.log設定rw權限。
chmod 666 BlogProject_debug.log