Django部署到阿里雲-nginx+uwsgi+mysql
部署django真的是費了我好大力氣,因為我小白,什麼都不懂 ? 什麼nginx uwsgi都是啥我也不懂 ? 網上好多好多教程, 大多版本都不大一致,導致我各種配置不好,無奈的還重置了兩回系統 ? 一把心酸淚 我也就只是記錄下我是怎麼部署的,其實我還是不懂,萬一有哪個地方可以幫到和我一樣很小白的尼 ?
我不說廢話了,先說我各種版本吧,因為版本不一樣,所以有的東西不要直接照著做。
伺服器:阿里雲 系統:Ubuntu16.04 python3.5 django==2.0.1 mysql5.7.23 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的下載,可能我這兒是個坑。