在本地搭建Django項目後,想部署到雲服務器上,經過多次踩坑,總結如下:
一.首先安裝apache2
sudo apt-get update
sudo apt-get install apache2 #安裝Apache2
sudo apt-get install libapache2-mod-wsgi-py3 #讓Apache2識別Python程序請求,安裝mod-wsgi模塊
二.安裝和配置 Git(這是爲了從遠程文檔庫中推送遠程倉庫到本地,如需上線的 Django 項目)
sudo apt-get instasll git
三.安裝 Python 的 pip 組件管理程序和虛擬機環境程序 virtualenv
sudo apt-get install python3-pip
pip3 install virtualenv
四. 配置遠程的 Django 項目
Linux 操作系統中的 Apache 網頁服務器一般會把網頁放在 /var/www/html 中,(安裝 Apache2後便生成 /var/www 目錄),所以我們也將 Django 項目放在 /var/www 下。首先在 /var/www 下使用 virtualenv 創建虛擬環境並啓用,然後再使用 git clone 命令推送遠程 Django 項目分支到本地
cd /var/www #移動到 /var/www 目錄下
virtualenv VENV #創建虛擬環境 VENV
source VENV/bin/activate #激活虛擬環境 VENV
git clone https://github.com/xxx/peoject.git #克隆遠程倉庫到本地
cd myProject #移動到項目目錄
pip3 install -r requirements.txt #安裝 requirements.txt文件中的庫包
但是阿里雲中git clone速度太慢,所以選擇使用FileZillaClient上傳文件到服務器/var/www/
文件夾下。
五.接下來我們可以使用下列命令來啓動 Django 來訪問看看網站內容是否完整呈現。
進入到/var/www/myProject
python manage.py runserver
六.創建apache2的配置文件(這一步最關鍵):
按照下面的命令在apache2的sites-available文件目錄下,創建一個配置文件,其中項目名稱就填寫你的web項目的名稱,例如blogs.conf。
sudo vim /etc/apache2/sites-available/projectName.conf
<VirtualHost *:80>
#添加 wsgi.py 文件路徑,通過wsgi.py連接apache2和你的Django項目
WSGIScriptAlias / /var/www/projectName/projectName/wsgi.py
#指定虛擬環境路徑
WSGIDaemonProcess mblog python-path=/var/www/projectName:/var/www/VENV/lib/python3.6/site-packages
WSGIProcessGroup projectName
#添加靜態文件路徑
Alias /static/ /var/www/staticfiles/
#上傳文件存放的路徑
Alias /media/ /var/www/projectName/media/
#文件授權
<Directory /var/www/staticfiles>
Require all granted
</Directory>
<Directory /var/www/projectName/media>
Require all granted
</Directory>
#獲取 wsgi.py 中內容
<Directory /var/www/projectName/projectName>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
注意上述文件中,注意複製過去是否有多餘的空格,有多餘的空格經常會引起錯誤,(實在不行可以把註釋什麼的都刪了)
七.修改wsgi.py文件
找到你的Django項目路徑,找到項目的wsgi.py文件並打開,在原有的基礎上增加以下內容,經在Django2.2.4測試,不需要進行修改,其他Django版本未測試。
把之前的wsgi.py文件都註釋掉
#完整代碼
import os
from os.path import join,dirname,abspath
import sys
from django.core.wsgi import get_wsgi_application
PROJECT_DIR = dirname(dirname(abspath(__file__)))
sys.path.insert(0, PROJECT_DIR)
os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
#os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
application = get_wsgi_application()
八.切換到目錄:/etc/apache2/sites-available/ 運行:
sudo service apache2 reload
sudo a2dissite 000-default && sudo a2ensite projectName.conf
sudo service apache2 restart
要是restart出錯,可以通過sudo apache2ctl configtest
測試配置, 如果返回Syntax OK,則表示配置正確;
到此,再在瀏覽器上輸入ip地址就會呈現網頁,但是靜態文件加載不出來
九.修改setting.py文件,讓靜態文件正常加載:
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
STATC_ROOT = '/var/www/staticfiles'
然後運行sudo service apache2 restart
重啓web服務器,讓網站啓動
python manage.py collectstatic
將所有STATICFILES_DIRS中所有文件夾中的文件,以及各app中static中的文件都複製到 STATIC_ROOT 指定的文件夾中,把這些文件放到一起是爲了用apache等部署的時候更方便。
十.設置權限
Linux 對文件權限很敏感,我們還需要修改文件權限讓 Apache2 能夠正確讀取到。
所以我們需要修改Django項目的權限、上傳文件目錄、數據庫文件的權限,假如你的項目放在/var/www/projectName下,可以按照以下命令進行權限修改,一般用chmod 644給目錄和文件授權:
cd /var/www/
sudo chmod -R 644 項目名稱
sudo find 項目名稱 -type d | xargs chmod 755
sudo chgrp www-data 項目名稱
sudo chmod g+w 項目名稱
cd media/ #上傳文件目錄
sudo chgrp -R www-data uploads
sudo chmod -R g+w uploads
#數據庫文件
sudo chgrp www-data 項目名稱/db.sqlite3 # 更改爲你的數據庫名稱
sudo chmod g+w 項目名稱/db.sqlite3
十一.啓動網站&其他事項
sudo service apache2 restart
1.靜態文件不起作用:這是常見問題,檢查在項目配置文件blogs.conf、在Django中settings.py中的設置,檢查靜態文件目錄的權限,以及是否用pythong manage.py collectstatic收集靜態文件。
2.字符集錯誤:在/etc/apache2/envvars中設置字符集編碼類型
3.本機能夠訪問,用IP地址不能訪問:修改settings.py中的ALLOWED_HOSTS=[’*’]測試,再排查故障。
4。如果報 Internal Server Error錯誤,查看/var/log/apache2/error.log日誌文件,重點是上面第5步、第6步的設置。Django自帶的wsgi.py要按照第5步進行修改。
參考鏈接:django Documentation: How to user Django with Apache and mod_wsgi