python3.6+unbuntu+apache2+django+virtualenv 一文搞定服務器部署

基本配置

  • 阿里雲服務器
  • unbuntu
  • virtualenv
  • python3.6
  • apache2
  • Adjango

配置python環境

安裝 python、pip

sudo apt-get updatepython

  1. sudo apt-get install python3.6linux

    • 未找到資源
      • sudo apt-get install software-properties-common python-software-properties
      • sudo add-apt-repository ppa:deadsnakes/ppa
      • sudo apt-get update
      • sudo apt-get install python3.6
    • 下載速度過慢:換源
  2. curl https://bootstrap.pypa.io/ez_setup.py -o - | python3.6 && python3.6 -m easy_install pip
  3. pip install --upgrade pipgit

  4. python --version && pip --version檢驗版本github

安裝 virtualenv

  1. pip install virtualenv
  2. pip install virtualenvwrapper
  3. export WORKON_HOME=$HOME/.virtualenvs
  4. mkdir -p $WORKON_HOME
  5. vim ~/.bashrc,底部加入下面兩行後,source ~/.bashrc
    • export WORKON_HOME=$HOME/.virtualenvs
    • source /usr/local/bin/virtualenvwrapper.sh
  6. 嘗試 lsvirtualenv 看是否安裝成功
    • 若是沒有找到該命令
    • find / -name virtualenvwrapper.sh,結果替換/usr/local/bin/virtualenvwrapper.sh再執行上述操做

~/.bashrc會在每次登錄當前用戶時自動執行,設置虛擬環境保存目錄WORKON_HOMEsql

所以,使用其餘用戶登錄則須要手動執行上述命令來設置環境變量。數據庫

virtualenvs 使用詳見:https://virtualenv.pypa.io/en/latest/apache

配置python虛擬環境

  1. 建立:mkvirtualenv --python=python3.6 your_env_name
  2. django:pip install django
  3. 安裝第三方庫

配置 apache2

安裝 apache2

  1. sudo apt-get install apache2:安裝apache2服務,注意觀察是否存在 perl: warning: Falling back to a fallback locale異常,須要解決django

    perl: warning: Setting locale failed.
    perl: warning: Please check that your locale settings:
     LANGUAGE = (unset),
     LC_ALL = (unset),
     LC_CTYPE = "zh_CN.UTF-8",
     LC_TERMINAL_VERSION = "3.3.1",
     LC_TERMINAL = "iTerm2",
     LANG = "en_US.UTF-8"
        are supported and installed on your system.
    perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
    • vim ~/.bashrc->最底部增長export LC_ALL=en_US.UTF-8en_US.UTF-8需和報錯信息說明的一致。
    • source ~/.bashrc從新加載環境變量
    • 注意,/.bashrc會在每次登錄當前用戶時執行,可是其餘用戶不會執行該文件,即只能在當前用戶下正常使用 apache2。
  2. sudo apt-get install apache2-dev:安裝 apache2 開發工具bootstrap

該環節也可採起從官網下載源碼編譯安裝的方式。

安裝 mod-wsgi 服務

若使用 python3.5 可直接 sudo apt install libapache2-mod-wsgi-py3 ,是以 python3.5編譯好的,不須要如下安裝步驟。

安裝步驟來自官方文檔:https://modwsgi.readthedocs.io/en/develop/user-guides/quick-installation-guide.html#apache-requirements

依賴項:

  1. sudo apt-get install apache2-dev:安裝 apache2 開發工具,若是是以源碼編譯安裝的 apache2,則可省略該步驟。apt-get 安裝的 apache2 不包含開發工具。
  2. sudo apt-get install python3.6-dev:若使用其餘版本的python注意調整該命令

正式安裝:

  1. wget https://codeload.github.com/GrahamDumpleton/mod_wsgi/tar.gz/4.5.24:可訪問官方,根據須要下載目標版本,下載內容爲源碼壓縮包
  2. tar zxvf 4.5.24 && cd mod_wsgi-4.5.24:解壓並進入
  3. 配置參數,可參考官方文檔獲取細節
    • --with-apxs:編譯工具的地址,不設置則會自動在默認位置搜索。可先不設置嘗試編譯安裝,若出錯再根據平臺(unbuntu、debian)查找位置
      • find / -name '*apxs*' -print:檢索當前目錄下是否含 apxs
    • --with-python:指示編譯對應的python版本,注意編譯使用的python版本必須和後面網站執行使用的版本徹底相同,最好在同一路徑!可參考下例
      • 沒有使用虛擬環境或conda的:./configure --with-apxs=/usr/local/apache24/bin/apxs --with-python=/usr/local/python36/bin/python3.6
      • 使用虛擬環境的:./configure --with-python=/home/XXX/.virtualenvs/env_name/bin/python3.6
  4. make && make install:權限不足請登陸 root 用戶或前加 sudo
    • 安裝成功
      • 最後一行打印相似 chmod 644 /usr/lib/apache2/modules/mod_wsgi.so
      • 請複製粘貼執行之 sudo chmod 644 /usr/lib/apache2/modules/mod_wsgi.so
    • 安裝失敗:make clean 後google一下。
  5. 登記 mod_wsgi.soapache2
    • unbuntu
      • sudo vim /atc/apache2/apache.conf
      • 最後一行寫入 LoadModule wsgi_module 剛剛打印出的mod_wsgi.so絕對路徑
    • Other platform
      • 只是 conf 文件位置和名稱不一樣(有的叫 http.conf),請自行google,,仍然是最後一行寫入相同內容
  6. 加載 apache2 ,查看是否存在異常
    • sudo service apache2 restart or sudo service apache2 start
    • 本地端訪問公網ip,應該存在正常的 apache 歡迎頁

部署django項目

up to server

  1. 上傳項目至服務器

  2. (可選) 重置項目:測試時產生的數據庫以及遷移記錄。慎重!

    • rm db.sqlite3
    • rm -rf */migrations/
  3. 遷移

    • 執行:python manage.py migrate
    • 檢查:python manage.py makemigrations
    • 詳細說明官方文檔:https://docs.djangoproject.com/zh-hans/3.0/ref/django-admin/
  4. (可選) 建立管理帳號

    • python manage.py createsuperuser
  5. 測試

    • settings.py:DEBUG=True
    • workon your_env
    • python manage.py runserver ).0.0.0:8000
    • 本地端訪問公網ip,應該能正常運行
  6. django 部署靜態文件

    • 參考自:https://docs.djangoproject.com/zh-hans/3.0/howto/deployment/wsgi/modwsgi/

    • django設置:settings.py

      • STATIC_ROOT:執行 python manage.py collectstatic 後,STATICFILES_FINDERS找到的文件將被拷貝到該目錄下

      • STATIC_URL:用戶以URL:ip:port/path?key=a&key=...訪問時,處於path開頭的 $STATIC_URL部分將按照 apache_site.conf進行替換獲得服務器上的絕對路徑。apache_site.conf的配置在下一環節介紹。這種替換徹底是服務器框架的操做,和django無關。非 apache2 框架也有相似的設置方式。

      • STATICFILES_DIRS:一個目錄列表,若是在STATICFILES_FINDERS中設置 'django.contrib.staticfiles.finders.FileSystemFinder'則被STATICFILES_FINDERS找到。

      • STATICFILES_FINDERS:按規則查找靜態文件

        [
        # STATICFILES_DIRS
            'django.contrib.staticfiles.finders.FileSystemFinder',
        # $(APPs_path)/static
            'django.contrib.staticfiles.finders.AppDirectoriesFinder',
        ]
      • 詳見:https://docs.djangoproject.com/zh-hans/3.0/ref/settings/#std:setting-STATIC_ROOT

    • python manage.py collectstatic

      • STATICFILES_DIRS查找到的文件,複製到 STATIC_ROOT

撰寫 apache2 網站配置文件

# 配置文件保存在 /etc/apache2/sites-available/
# /etc/apache2/sites-available/ 下新建你的網站文件 your-site-name.conf
# 在其中配置如下內容
# 指定 80 端口
<VirtualHost *:80>
    # 指定網站的地址(域名或者 IP 地址)
    # 該地址必須在 ALLOWED_HOSTS 列表中
    ServerName your_ip_addr
    # ServerAlias www.example1.com www.example2.com
    # ServerAdmin 0.0.0.0
    
    
    # Alias URL=schema://ip:port/path?中path的前綴 實際服務器地址
    # 該命令可以要求 apache2 自動對用戶的訪問 URL:path 進行轉義
    # 這裏保證和 django setting 中 一致,
    # 若 STATIC_URL='/static/' STATIC_ROOT='/var/static_root/',則以下
    Alias /static/ /var/static_root/
    # 同時設置目錄權限
    <Directory /var/static_root>
        Require all granted
    </Directory>
    
    # 若是你還有其餘文件夾須要轉義,好比說存儲視頻的文件夾、或者存儲你自定義內容的靜態文件夾,均可以用這種方式來設置
    
    
    # 指定 wsgi.py 腳本位置,ajango 項目中自動建立的 wsgi.py 是和 mod_wsgi 的掛載點
    WSGIScriptAlias / /home/XXX/my_django_site/my_django_site/wsgi.py
    
    # "WSGIDaemonProcess" 是對守護進程的設置,具體參數參見 https://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html
    # 主要設置兩個參數:
    # python-path: 冒號分割的目錄,這裏的內容將被加入到python的檢索範圍內
    # python-home:指明使用的python版本,須要指向包含 /bin/python 的目錄,虛擬環境或直裝python均適用
    WSGIDaemonProcess your_ip_addr python-home=/home/my_usr_name/.virtualenvs/my_env_name python-path=/home/my_usr_name/.virtualenvs/my_env_name/lib/python3.6/site-packages:other_path_you_like
    WSGIProcessGroup your_ip_addr
    # 若是你對這裏的設置感到迷惑,很是推薦去閱讀一下上述連接,官方文檔說的很是詳細
    # 還有其餘功能好比說設置進程數等強大功能。
    
    
    <Directory /home/XXX/my_django_site/my_django_site>
    <Files wsgi.py>
        Require all granted
    </Files>
    </Directory>
    
</VirtualHost>

修改文件目錄權限

Apache 默認運行網站的用戶是 www-data,而咱們在上述設置中使用並非 www-data 因此須要修改項目文件、目錄的權限,使得 Apache 可以對所須要的文件進行 RWX。

  1. 對 linux 權限的含義、權限的查詢、權限的修改有一個基本的瞭解
    • 明白 rwx,明白目錄須要x(執行)權限才能進入
    • 權限查詢 ls -al
    • 權限修改命令
      • chmod: change modify
      • chgrp: change group
      • chown: change owner
  2. 正式開始修改(慎重!請對本身的操做負責)
# 請在理解下列命令的基礎上修改、調整、執行

# 目錄必須有 x 權限才能進入,所以須要可讀可執行
# 通常文件須要可讀的權限

sudo chmod -R 644 my_project
sudo find my_project -type d | xargs chmod 755


# 若存在上傳目錄,則須要可寫的權限
sudo chgrp www-data my_project/upload
sudo chmod g+w my_project/upload




# sqlite3 會生成一個db.sqlite3文件,因此須要修改這個文件的權限,加上寫的權限
sudo chgrp www-data my_project
sudo chmod g+w my_project
sudo chgrp www-data my_project/db.sqlite3 
sudo chmod g+w my_project/db.sqlite3

# 設置的 python-path python-home 或許也須要權限,根據你的設置,可先不設置,後面根據報錯來調整

部署過程當中出現的問題80%都與權限有關,每一個平臺、每一個環境都有所不一樣,須要在理解權限的基礎上根據後面的調試環境自行修正。

運行網站與調試

調試

vim django_site/django_site/settings.py:DEBUG = False

vim /var/log/apache2 查看日誌

vim 快捷指令:

  • 從新加載 esc :e enter
  • 跳轉到尾部 shift+g

運行

# 配置文件設置在 /etc/apache2/sites-available/ 目錄下,這裏只寫名字,可在任何目錄下執行
sudo a2ensite my_site.conf
sudo service apache2 reload
sudo service apache2 restart


err:
Invalid command 'WSGIScriptAlias', perhaps misspelled or defined by a module not included in the server configuration

WSGIScriptAlias有問題的緣由一般是 mod-wsgi 安裝有問題
檢查 export LC_ALL=en_US.UTF-8
注意~/.bashrc 只針對當前用戶有效


err:
[Thu Feb 13 15:17:10.020824 2020] [wsgi:error] [pid 25702:tid 140038272866048] [remote 1.194.132.43:44]     from django.core.wsgi import get_wsgi_application
[Thu Feb 13 15:17:10.020840 2020] [wsgi:error] [pid 25702:tid 140038272866048] [remote 1.194.132.43:44] ImportError: No module named 'django'

首先檢查 conf 文件中的python-path 是否配置正確,若是正確,則檢查其下的權限是否正確,即路徑目錄均rx,全部文件均r


err:
因爲apache2 默認 掛載點是 '/' 所以在代碼中寫的相對路徑將以該點從新計算,可能形成錯誤。

其餘

服務器重置完後,以前配置的ssh祕鑰失效,本地端沒法訪問服務器

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:ONuB9t+zfCAiryLoQ7eYnVE2FnG4IoH/hP4MMYGgOMY.
Please contact your system administrator.
Add correct host key in /Users/XXX/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/XXX/.ssh/known_hosts:2
ECDSA host key for X.X.X.X has changed and you have requested strict checking.
Host key verification failed.

緣由:目標主機的公鑰已經改變,爲了防護中間人攻擊,須要終止連接。具體動機可百度。

解決方案:

  1. 在服務器和本地端從新配置公私鑰

  2. 本地:sudo chmod 600 私鑰文件地址

    Permissions 0644 for '/Users/XXX/.ssh/XXX.pem' are too open
  3. ssh-keygen -R 目標訪問ip地址(這個操做會刪除.ssh/known_hosts中記錄的近期公鑰
    https://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html)

  4. 重啓服務器

  5. 本地端訪問服務器

sudo: unable to resolve host +亂碼

sudo: unable to resolve host iZ2ze73nro8igc5iw6qmkgZ
緣由:http://code.sike.wang/code/show-5188.html
解決方案:在 etc/hosts 第一行 localhost 後添加這串亂碼,這是阿里雲建立給的默認主機名

共享協議

本文由 ArrogantL 整理並在 CC BY-NC-SA 3.0 協議下發布。有任何問題請郵件聯繫 arrogant262@gmail.com

請各位遵循 Markdown: License 及其它參考文獻的共享協議來使用、修改和發佈。

相關文章
相關標籤/搜索