1. 程式人生 > >Django部署到阿里雲-nginx+uwsgi+mysql

Django部署到阿里雲-nginx+uwsgi+mysql

部署django真的是費了我好大力氣,因為我小白,什麼都不懂 ? 什麼nginx uwsgi都是啥我也不懂 ? 網上好多好多教程, 大多版本都不大一致,導致我各種配置不好,無奈的還重置了兩回系統 ? 一把心酸淚 我也就只是記錄下我是怎麼部署的,其實我還是不懂,萬一有哪個地方可以幫到和我一樣很小白的尼 ?

我不說廢話了,先說我各種版本吧,因為版本不一樣,所以有的東西不要直接照著做。

伺服器:阿里雲 系統:Ubuntu16.04 python3.5 django==2.0.1 mysql5.7.23 nginx uwsgi

對啦,就是我發現一篇部署的部落格寫的很好歐,其實我也是跟著他做的,這篇不像有的,羅嗦,只是到最後有些小問題然後自己解決解決又解決的,

是這篇是這篇。 還有就是我腳著最好還是瞭解瞭解nginx uwsgi啥的吧,這兒有篇我覺得還是比較好理解的,這篇這篇,雖然說我看了也很懵吧,但是原因在我自己吖。

還有關於uwsgi我這兒好像有個坑,大家先看最後面寫的。我也是寫完才意識到的

雲伺服器

我在伺服器這邊也出現了不少問題,所以要先說說伺服器這邊的。 千萬千萬千萬不要忘記配置安全組,比如我們django的8000埠,要開啟,像我吧,總是傻fufu的納悶我為什麼訪問不了。

安裝軟體

django要安裝:

sudo apt-get update
sudo apt-get install pip3
sudo pip3 install django

其實pip3安裝好了之後一般都要先update一下

sudo pip3 install --upgrade pip

mysql要安裝:

sudo apt-get install mysql-server mysql-client

nginx要安裝:

sudo apt-get update
sudo apt-get install nginx

uwsgi要安裝,我是用pip安裝的: 但是我覺著還是不要用pip安裝,可以去網上查查安裝方法。

sudo pip3 install uwsgi 

配置專案

東西都準備好啦,那就把我們自己的django專案傳到我們伺服器裡吧,我本機是Ubuntu系統打了個包直接用scp命令傳過來的,windows的話,xftp軟體拖拉拽也直接就進去了。

我們可以先用python3 manage.py runserver 0.0.0.0:8000自己先跑一下,試試。

如果你也是mysql的話,可能就會有錯了。

mysql資料庫各種錯誤

我是把我本地的sql檔案匯出了,然後又在伺服器上匯入了一下,因為我做的課表嘛,就資料在我本地上了,不想再在伺服器上爬一遍, 那我就寫下咋匯出匯入的吧

出
mysqldump -uroot -p database_name > database_name.sql
入
mysqldump -uroot -p database_name < database_name.sql

大家可以在專案根目錄下執行migrate makemigrations命令。

然後還是會有錯對吧,可能會有說包的問題,還有mysql本身的字元編碼的問題,我之前寫過這兩個問題,大家可以直接去看一下:django連線mysql和一些錯誤 主要就是因為python3不支援MySQLdb包,而需要下載pymysql包,還有就是編碼問題。

DEBUG=False之後 靜態檔案404

再有我們自己在寫django除錯的時候呢,settings裡的DEBUG是true,而部署到伺服器上去之後,要修改成false,同時哪,那個ALLOWED_HOSTS也要修改一下,把自己的ip地址和域名什麼的加進去。

在settings裡面,改成像這個樣子:

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = ['192.168.1.112','www.abc.com']

然後可以再去位址列輸入自己網址試試。 行吧反正我當時是有錯,啥錯,我自己寫的靜態檔案全都是404…… 那就先說靜態檔案404的問題吧。

這個是因為:DEBUG為 True時django會預設幫我們處理靜態檔案,而為False的話有些事兒就要我們自己做了。

錯誤是404,404就是路徑錯誤,路徑錯誤應該考慮路由問題,那仔細想想是不是沒有給靜態檔案設定路由呢,(其實我當時傻fufu的認為,它自己就都知道了,對呀,debug=true的時候知道),那我就在網上四處搜怎樣新增路徑:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.views import static
from django.conf.urls import url

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('classquery.urls')),
    path('teacher/', include('teacherquery.urls')),
    path('course/', include('coursequery.urls')),
    path('room/',include('roomquery.urls')),
    path('eroom/', include('emptyroom.urls')),
    url(r'^static/(?P<path>.*)$', static.serve, {'document_root':settings.STATIC_ROOT}, name='static')
]

看最下面那個路徑: url(r'^static/(?P<path>.*)$', static.serve, {'document_root':settings.STATIC_ROOT}, name='static') 對對對就是這個,大家在輸入的時候要注意上面匯入包不然會因為找不到XX而啟動失敗歐。 上面有一個STATIC_ROOT,我在做這個的時候,其實是先做的收集靜態檔案。

還是在settings中,在靜態檔案的配置中:

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_ROOT = os.path.join('home/pidan/kbquery/static_collect')
STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static")
]

這一行: STATIC_ROOT = os.path.join('home/pidan/kbquery/static_collect') 這個的大概意思,我理解的大概意思吖,就是把所有的靜態檔案收集一下,放到統一的一個檔案裡面,要注意的是這個裡面的路徑要是絕對路徑,(網上是這麼說的,我也就乖乖聽了,但是我剛剛發現了一個奇怪的事兒,倒也對部署造成什麼影響)。 這個改好之後,要在專案目錄下執行命令收集靜態檔案:

python3 manage.py collectstatic

執行成功之後,加上上面的路由的配置,靜態檔案404的錯誤就可以解決啦 ? ? ?

小小總結下這步做了啥 : 修改settings檔案 DEBUG ALLOWED_HOSTS STATIC_ROOT 收集靜態檔案 在urls裡為靜態檔案新增路由

現在我們的django專案用runserver跑著是沒有問題了,我們繼續部署。

配置nginx檔案:

修改下面路徑下的defalut檔案

cd /etc/nginx/sites-available
sudo vim default
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    
    root /var/www/html;
	# Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name 192.168.1.112;
    
    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        # try_files $uri $uri/ =404;
        include  uwsgi_params;
            uwsgi_pass  127.0.0.1:8000;
    }

    location /static {
        alias /home/pidan/kbquery/static;
    }
    location /media { 
		alias /home/pidan/kbquery/media;
	}

上面是修改好了的, 下面這個是我們要修改的地方,那個ip地址換成自己的公網ip 路徑換成自己的static和media路徑,要是沒有的話,就不要寫那一項了。

server_name 192.168.1.112;
    
    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        # try_files $uri $uri/ =404;
        include  uwsgi_params;
            uwsgi_pass  127.0.0.1:8000;
    }

    location /static {
        alias /home/pidan/kbquery/static;
    }
    location /media { 
		alias /home/pidan/kbquery/media;
	}

一定要仔細修改哦,有空格的不要丟,不要寫錯地方,可以在改之前先備份一份,以防萬一。 修改好重啟服務: sudo service nginx restart 唉,路還是比較坎坷的,我也是改了幾回才重啟成功的,所以吖,一定要仔細認真的改哦。

配置uwsgi

配置好這個就可以成功啦,所以加油吖

在我們的專案根目錄下,也就是有manage.py檔案的目錄下,新建一個uwsgi.ini檔案和一個run.log檔案,然後編輯uwsgi.ini檔案如下:

[uwsgi]
chdir = /home/pidan/kbquery #專案根目錄
# 你的入口wsgi模組,專案名換成自己的
module = kbquery.wsgi:application 
socket = 127.0.0.1:8000 #通訊埠 不用修改
master = true 
daemonize = /home/pidan/kbquery/run.log #路徑對應修改
disable-logging = true # 只記錄錯誤日誌的意思

最後! 我們在我們的專案根目錄下,就是剛剛這個目錄下輸入:

uwsgi --ini uwsgi.ini

啟動uwsgi ,大家就可以去位址列輸入自己ip地址了,看看是不是成功了吖。

最後

最後還是要提一下,我的uwsgi是在pip下安裝的,我在沒有啟動uwsgi之前會有502的錯誤,所以需要在專案根目錄啟動一下。

還有就是我現在的uwsgi在我更改了程式碼之後,不知道如何重啟uwsgi,網上的方法對我不奏效,為了讓我修改的程式碼生效,我就得重啟uwsgi啊!我只能取重啟伺服器,然後再手動開uwsgi,我剛剛看到了一個東西,現在覺得可能是因為我用pip安裝的uwsgi,才這個樣子的。

也就是說大家如果照著我這麼做,uwsgi肯定會和我一個情況,也可以去網上看一下uwsgi的下載,可能我這兒是個坑。