nginx+uwsgi部署Django項目到Ubuntu服務器全過程,以及那些坑!!!


前言:自己在windows上用PyCharm編寫的Django項目,編寫完后在windows上運行一點問題都沒有,但是部署到服務器上時卻Bug百出。百度,CSDN,sf,各種搜索尋求解決方案 在歷時3天后終於讓它在服務器上與在windows的運行效果一樣了。看了各種博客后得出的一個結論是:過期教程害死人!!!所以在寫博客的時候一定要寫上自己的開發環境(尤 其是各種軟件的版本)
 
我的環境:
                nginx 1.10.3
                uwsgi 2.0.18
                Django 2.0
                python 3.6
                部署服務器:阿里雲輕量應用服務器 Ubuntu16.04
     注:Django1.8前后版本有很大差別;python2與python3有很大差別;Ubuntu系統與Centos系統命令行有些差別。
 
前提條件:Django項目能在windows上正常運行,有一個Ubuntu服務器(我的是雲服務器)。
 
步驟:  1,在windows下遷移自己python虛擬環境的包
            2,把自己的項目以及備份的包發送到Ubuntu服務器上
            3,Ubuntu上Python環境的安裝
            4,安裝配置uwsgi
            5,安裝配置nginx
            6,靜態文件404問題
            7,圖片能加載,但是CSS樣式丟失問題
            8,可能出現的錯誤,以及解決方法和注意事項
 
1,在windows下遷移自己python虛擬環境的包
說明:這一步主要是可以一次性把你在windows下的python包安裝到ubuntu上。
激活環境:如果你開發時使用了virtualenv虛擬環境(推薦使用),首先用命令行進入到虛擬環境下的 Scripts目錄下,輸入:activate;如果沒有用虛擬環境則不需要激活。
備份python包:在命令行輸入:pip freeze >myPackage.txt        # 這個操作會在你的python環境下生成一個myPackage.txt文件,里面記錄了你這個環境的所有python包名和版本號。
 
2,把自己的項目以及備份的包發送到Ubuntu服務器上
說明:如果是用的xShell和xFTP會更方便,這里不使用。
遷移項目:把myPackage.txt從python環境目錄下移到項目的根目錄下。
在cmd下輸入:scp -r <D://MyProject>  root@39.108.123.114:/usr/MyProject/            # <D://MyProject>是項目的根目錄;root是服務器的用戶名;39.108.123.114是你服務器的公網IP;/usr/MyProject/ 是ubuntu服務器上的文件位置;
會提示輸入你的Ubuntu登錄密碼,密碼正確后就會開始發送。
 
3,Ubuntu上Python環境的安裝
說明:Ubuntu16.04上會自帶Python2.7和Python3.5,千萬不要把Python2.7刪了,因為Ubuntu系統還會用到Python2.7。
安裝Python3.6:   wget http://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz     # 下載Python3.6壓縮包
                             tar -xvzf Python-3.6.4.tgz     # 解壓
                             cd Python-3.6.4     # 進入到解壓后的文件
                             ./configure --with-ssl    # 執行配置文件
                             make      
                             sudo make install    # 安裝
                             python3      # 檢驗python版本。
 
使用virtualenv(強烈推薦):pip virtualenv    # 安裝
                                          virtualenv  -p python3 MyEnv   # 創建虛擬環境,並指定python版本
激活虛擬環境: cd MyEnv/bin 
                         source activate   # 激活環境(注:以下步驟都是在這個虛擬環境下進行的
                         deactivate    # 退出環境
遷移包:先進入到myPackage.txt所在的目錄,然后輸入:pip instatll -r myPackage.txt     # 安裝myPackage.txt中記錄的所有包。
到這里你的Python環境就算安裝好了!
驗證:進入到項目的根目錄下,輸入:python manage.py runserver 0.0.0.0:80  # 運行你的項目。如果是阿里雲服務器,一定要檢查80端口是否處於開放狀態。
          在你windows的瀏覽器中輸入你服務器的公網IP就可以訪問到你的項目了。
 
4,安裝配置uwsgi
說明:uwsgi是一個服務器,用於部署你的Django項目。即:與Django項目進行通信。
安裝:pip install uwsgi      # 會安裝在你的虛擬python環境中。
驗證是否安裝成功:在你項目的同級目錄下新建一個uwsgi_test.py文件,內容如下(內容是官網提供的):
1 def application(env, start_response):
2         start_response('200 OK',[('Content-Type', 'text/html')])
3         #return ['Hello world'] # Python2
4         return [b'Hello world'] # Python3
保存退出后,輸入:uwsgi --http :80 --wsgi-file uwsgi_test.py    # 在windows中的瀏覽器輸入你服務器的公網IP,如果出現“Hello world”則表示運行成功。
用uwsgi部署你的Django項目:更改項目中的settings文件:
DEBUG = False   # 關閉調試模式。
ALLOWED_HOSTS = ['*']     # 允許所有主機訪問。
在你的項目根目錄下(與manage.py同級)新建一個uwsgi.ini文件,內容如下:
[uwsgi]
#如果單獨使用uwsgi來部署Django項目時,就用這一行。 http
=0.0.0.0:80
#如果使用nginx+uwsgi來部署Django項目時,就用這行。其中,8001端口用來跟nginx通信。也要在阿里雲防火牆中添加8001端口。 # socket
=0.0.0.0:8001
#你項目的完整路徑。 chdir=/usr/DjangoProject/MyProject/
#給socket文件賦權限,這里不用管。 # chmod
-socket=664
#啟用主線程。 master
=true processes=4 threads=2
#指定日志文件(會自動創建)。這個很重要,如果uwsgi出現錯誤,可以通過日志文件來查錯。 logto=uwsgi.log
#指定進程號文件(會自動創建)。這個也很重要,如果要重啟和關閉uwsgi,則需要這個文件,里面記錄了進程號。 pidfile
=uwsgi.pid
#指定wsgi文件。在與settings.py同級目錄中會有一個wsgi.py文件。 module
=MyProject.wsgi:application

 

保存退出后,輸入:uwsgi --ini uwsgi.ini    # 啟動uwsgi,並指定配置文件。
驗證:在windows的瀏覽器中輸入服務器公網IP就可以訪問到你的項目了。如果不能,一定要查看日志文件uwsgi.log中的錯誤信息,文章結尾會有幾個簡單操作。
 
5,安裝配置nginx
說明:nginx是一個反向代理服務器,用來接收瀏覽器的請求。如果是靜態文件則由nginx處理;如果是動態請求則交給uwsgi處理。
安裝:sudo apt-get nginx
驗證是否安裝成功:輸入:server nginx start    # 在Windows瀏覽器中可以看到nginx的歡迎界面。
配置:找到nginx.conf文件,一般會在/etc/nginx/下。如果沒有,使用whereis nginx命令查看nginx的位置。
    備份nginx.conf文件:cp nginx.conf nginx.conf.bar
    刪除nginx.conf文件,並重新建一個nginx.conf文件,內容如下:
    
   
events { worker_connections 1024; # 不用管 } http{ server { listen 80; #這個端口用來監聽瀏覽器的請求。 server_name 0.0.0.0; # 不用管,如果有域名可以填上域名。 charset UTF-8;
#日志文件。如果nginx出現問題,都可以通過日志文件來查錯。 access_log
/var/log/nginx/MyProject_access.log; error_log /var/log/nginx/MyProject_error.log; client_max_body_size 75M; location / { include uwsgi_params; # 使用uwsgi服務器。 uwsgi_pass 0.0.0.0:8001; # 把瀏覽器發來的請求轉發到8001端口,而uwsgi也正在監聽8001端口,所以就實現了nginx與uwsgi的通信。 uwsgi_read_timeout 30; #鏈接超時時間 } location /static/{ # 處理靜態文件,處理鏈接是以/static/開頭的請求。即:如果是靜態文件,就不用發給uwsgi了,nginx自己處理。 alias /usr/DjangoProject/MyProject/static/; # 項目靜態文件的絕對路徑。即:告訴nginx應該去哪里找靜態文件。后面會介紹。 } } }

 

驗證是否配置成功:
保存並退出,進入到項目根目錄下:修改uwsgi.ini文件,把http=0.0.0.0:80注釋掉,使用socket=0.0.0.0:8001   # 用來監聽8001端口,與上面nginx對接。
保存並退出,輸入: uwsgi -d --ini uwsgi.ini    # 啟動uwsgi服務器。-d表示在后台運行。這樣就不會占用當前窗口了。
                                server nginx start      # 啟動nginx服務器。
在瀏覽器中輸入服務器公網IP就可以訪問了。如果出現錯誤,后面會介紹。
 
6,靜態文件404問題
說明:由於靜態文件(圖片, css,  js)是由nginx來處理,所以就不會把請求通過uwsgi發送到我們的Django項目。於是我們還要告訴我們的項目應該到哪里去找這些            靜態文件。
在settings.py文件中添加這一行:STATIC_ROOT = os.path.join(BASE_DIR, 'static')    # DASE_DIR為項目的絕對路徑(已經獲取到了)。
在urls.py文件中添加:
from django.conf.urls.static import static
from ShenDengBlog import settings
urlpatterns += static('/static/', document_root=settings.STATIC_ROOT)   # 這一行不要放在urlpatterns里面了。這一句就是告訴我們的項目,以/static/開頭                                                                                                                            的靜態文件路徑都會轉到項目根目錄下的static文件夾中去找。
保存並退出,在項目根目錄中,輸入:python manage.py collectstatic   # 收集靜態文件,把所有app下static文件中的內容都復制到項目根目錄中的static文件                                                                                                                        夾中,包括admin中的靜態文件。
重啟uwsgi。如果出現錯誤,文章結尾會有解決方法。
再次在windows瀏覽器中訪問你的公網IP,應該就可以加載靜態文件了。
 
7,圖片能加載,但是CSS樣式丟失問題
說明:在訪問網頁時,發現圖片能加載,而CSS樣式全部丟失;但是在瀏覽器中F12->網絡(network)發現css文件已經發送過來了(狀態碼為200或304)。
解決:只需要把模板文件第一行的<!DOCTYPE html>改成<!DOCTYPE>,或者直接刪掉就好了。
原因:在segmentfault上找到了解釋。因為<!DOCTYPE html>會讓瀏覽器用標准模式來解析你的這個文檔,而不加的話就會用兼容模式。這是鏈接
 
8,可能出現的錯誤,以及解決方法和注意事項
說明:在重啟uwsgi或nginx時有時候會出現重啟報錯,或者是不報錯也不成功的情況。
注意事項1:如果修改了uwsgi配置文件,或者修改了項目中的文件,一定要重啟uwsgi,不然修改無效或者會出現一些奇怪的Bug。
注意事項2:在使用uwsgi和nginx時,不管出現什么問題,都先去日志文件中查看錯誤記錄,最有可能導致錯誤的原因是“端口占用”;如果解決不了再去百度。
 
開啟uwsgi:uwsgi --ini uwsgi.ini   # uwsgi還支持其他文件格式,比如xml和json。建議使用ini文件。
重啟uwsgi:uwsgi --reload uwsgi.pid   # uwsgi.pid是在uwsgi.ini中指定的。
關閉uwsgi:uwsgi --stop uwsgi.pid  # 同上。
 
開啟nginx:server nginx start
重啟nginx:server nginx restart
關閉nginx:server nginx stop
測試nginx:nginx -t   # 如果是nginx的問題,可以通過測試發現原因。
 
啟動或重啟uwsgi失敗:在重啟或開啟uwsgi時,有時候會出現各種各樣的錯誤,很有可能是你上一個uwsgi進程占用端口搞的鬼,所以萬能的辦法就是先殺死所有uwsgi進程,然后再開啟。
殺死uwsgi進程:sudo killall -9 uwsgi   # 通過程序名強制殺死所有uwsgi進程。
再開啟uwsgi:uwsgi -d --ini uwsgi.ini
 
訪問網頁時報502錯誤:因為uwsgi服務器沒有開啟。502是網關錯誤。既然有返回錯誤代碼,就表示nginx服務器沒有問題,所以是nginx無法與uwsgi通信,那                                        就是uwsgi的問題了;
 
 
 
我也是剛剛接觸Django和用nginx+uwsgi來部署Django,如有表述錯誤的地方,歡迎留言指正!
 
 
 
 

 


免責聲明!

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



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