如何把本地的Django專案部署到伺服器(親測)

北北南北發表於2018-05-23

如何將本地的Django專案部署到雲伺服器

專案程式碼見GitHub
部落格網址

開發環境

  • 開發語言: Python
  • 後臺框架:Django
  • 前端框架:bootstrap
  • web伺服器:nginx
  • wsgi伺服器:uwsgi

檢視本地專案Django和Python版本:

(可以直接安裝Django最新版本就可以了,Python版本不能低於3.4)
Django2.0.4
Python3.6.5

首先python3的安裝

[參考連結]
linux安裝python3
從零開始配置阿里雲伺服器centos7.4

  1. 首先在官網下載安裝包 python-3.6.5
    (直接使用wget命令下載,速度也賊快,下載完成後發現在根目錄下多了一個Python-3.6.5.tgz的壓縮包)

  2. 安裝相關包yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make

  3. 伺服器自帶的python2安裝在usr/bin/目錄中,可以通過which python命令來檢視python的安裝目錄。
    然後進入該目錄,用我們熟悉的python -v來檢視python版本。(其實直接在根目錄下用python -v也是可以的,但which這個命令是真的可不錯)

  4. 利用tar xf Python-3.6.5.tgz命令解壓

  5. 解壓完成後,(進入解壓後的目錄),編輯安裝命令。

    ./configure –prefix=/usr/local/python3/ # 安裝目錄為/usr/local/python3(可以自定義安裝目錄)
    make && make install # 編譯並安裝

    • 提示bug: ./configure: No such file or directory
    • 是因為沒有進入解壓後的目錄,configure是安裝檔案裡面的配置工具。
  6. 設定軟連線
    一條命令解決,再也不用配環境變數了。linux的軟連結相當於windows裡的快捷方式,快捷方式刪了就刪了,原來檔案還是存在的。軟連線後面也有大用。

    ln -s /usr/local/python3/bin/python3 /usr/bin/python3.6

即在/usr/bin裡面建立一個快捷方式python3.6,該快捷方式指向python3的安裝路徑。
輸入python3.6 -v測試,成功

  • 可以通過以下命令檢視所有的軟連線:

    cd usr/bin/
    ls -l


可以看到python,python2,連線的都是python2.7,而python3.6連線的就是剛安裝的版本 參考連結:[百度經驗-怎麼修改軟連線](https://jingyan.baidu.com/article/6b97984dd6dbb01ca2b0bf0a.html)
  • 也可以將python3.6直接改為python。
  • 備份原連線為:python -> python2
  • 使用ln -s /usr/local/python3/bin/python3 /usr/bin/python,建立失敗,發現python已經存在。
  • 刪除原連線 rm /python2
  • 再次建立成功。

安裝各種軟體

  1. 安裝資料庫
    安裝sqlite,mysql
yum install mysql mysql-devel
yum install sqlite-devel
  1. 安裝pip

yum -y install python-pip

報錯

[root@VM_0_12_centos bin]# yum -y install python-pip
File “/usr/bin/yum”, line 30
except KeyboardInterrupt, e:
^
SyntaxError: invalid syntax

先安裝get-pip

wget –no-check-certificate https://bootstrap.pypa.io/get-pip.py

安裝成功。再用python命令安裝pip

python get-pip.py

安裝成功,pip版本為:
Successfully installed pip-10.0.1 wheel-0.31.0

但此時未配置軟連線的情況下,需要使用python -m pip來使用python3的pip。

  1. 安裝Django

pip install django

安裝失敗:
This version of Django requires Python 3.4, but you’re trying to
install it on Python 2.7.

This may be because you are using a version of pip that doesn't
understand the python_requires classifier. Make sure you
have pip >= 9.0 and setuptools >= 24.2, then try again:

    $ python -m pip install --upgrade pip setuptools
    $ python -m pip install django

This will install the latest version of Django which works on your
version of Python. If you can't upgrade your pip (or Python), request
an older version of Django:

    $ python -m pip install "django<2"

2.0.5版本需要python3.4以上版本

這裡因為使用的是python2的pip,為了解決這個問題可以修改軟連線,也可以直接使用python -m pip install django來指定pip為python3的。
我這裡使用了第二種方法。

  1. 安裝mysqlclient(聯結器)

python -m pip install mysqlclient

報錯:
OSError: mysql_config not found

加入環境變數:
PATH=”$PATH”:/usr/local/mysql/bin

重新安裝,成功。
版本:mysqlclient-1.3.12

  1. 安裝uwsgi

    python -m pip install uwsgi


Successfully installed uwsgi-2.0.17
  1. 安裝nginx

線上專案部署

在伺服器上建立簡單Django專案hello,結合uwsgi+Django+nginx。

測試uwsgi

測試uwsgi -version

顯示環境變數未配置好 -bash: uwsgi: command not found

建立軟連線:(好用的一匹,順便把其他的都配了)

ln -s /usr/local/python3/bin/django-admin.py /usr/bin/django-admin.py
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
ln -s /usr/local/python3/bin/gunicorn /usr/bin/gunicorn

檢視軟連線:

cd /usr/bin
ls -l

建立好軟連線後,檢視uwsgi是否安裝成功:

uwsgi –version

成功,顯示:

[root@VM_0_12_centos projects]# uwsgi –version
2.0.17

繼續測試,建立test.py:

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3

使用uwsgi執行test.py:

uwsgi –http :8000 –wsgi-file test.py

訪問http://127.0.0.1:8000/

訪問失敗:

localhost拒絕了我們的請求。
有毒,這些教程是真的有毒。在本地瀏覽器訪問雲伺服器的時候一定要用IP地址或者域名。

訪問http://www.zosurn.xyz:8000
訪問成功,但出現的是seafile登入頁面,說明該埠被佔用了,可以釋放8000埠,也可以換其他的埠。

修改埠為8002:

uwsgi –http :8002 –wsgi-file test.py
成功訪問到hello world。

建立Django專案hello
在/home/projects/目錄下,使用Django建立一個簡單hello專案後,配置setting.py中的allowed_host設定為:

ALLOWED_HOSTS = [‘.zosurn.xyz’, ‘localhost’, ‘127.0.0.1’]

將uwsgi與Django連線:

參考連結

uwsgi –http :8008 –chdir /home/projects/hello –wsgi-file hello/wsgi.py –master –processes 4 –threads 2 –stats 127.0.0.1:9192

訪問http://www.zosurn.xyz:8008成功,出現Django歡迎頁面。

引數太多,可以將其寫入ini檔案中
在hello專案的目錄下建立uwsgi.ini檔案,寫入如下內容(採用字典格式):

# hello_uwsgi.ini file
[uwsgi]

# Django-related settings

http = :8008

# the base directory (full path)
chdir           = /home/projects/hello

# Django s wsgi file
module          = hello.wsgi

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

然後使用如下命令啟動uwsgi:

uwsgi –ini uwsgi.ini

再次測試,訪問http://www.zosurn.xyz:8008成功。

測試nginx:

檢視nginx是否安裝成功,檢視nginx的版本:

[root@VM_0_12_centos hello]# nginx -v
nginx version: nginx/1.12.2

在/home/projects目錄下新建一個test目錄,在裡面新增一個簡單的html檔案。然後在nginx.conf中簡單配置:

events{}
http{
    server{
        server_name www.zosurn.xyz;
        root /home/projects/test;
        index index.html;
    }
}

啟動該nginx:(啟動之前,要將/usr/local/nginx/mime.types檔案複製到該nginx.conf所在目錄,並且必須使用絕對路徑

nginx -c /home/projects/test/nginx.conf

如果埠被佔用,則先釋放該埠,則使用lsof -i :8082檢視佔用埠程式的pid,並使用kill -9 [pid]關閉相應的程式。

在瀏覽器中訪問自己的域名http://www.zosurn.xyz,訪問成功。

將nginx和uwsgi以及Django結合

在hello專案的目錄下建立nginx.conf

vim nginx.conf

新增如下內容:

events{}
http{
    server{
        listen 8082;    # 如果不加的話,會預設為80,這裡也可以不改
        server_name www.zosurn.xyz;
        root /home/projects/hello;
        index index.html;

        location /{
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8008; # 需要和ini檔案中的埠保持一致,這樣才能實現兩者的通訊。
            uwsgi_read_timeout 2;
        }
    }
}

啟動nginx:

nginx -c /home/projects/hello/nginx.conf

啟動uwsgi:

uwsgi –ini /home/projects/hello/uwsgi.ini

使用域名訪問,成功訪問到該hello專案的Django歡迎頁面。

部署本地專案到伺服器

clone本地專案程式碼到伺服器/通過ftp複製專案到伺服器

在我的專案目錄/home/projects裡建立一個blog目錄,並在裡面建立一個conf目錄,用來存放配置檔案,這樣分離開來,方便更新維護專案程式碼。

  • home/
    • projects/
      • blog/
        • conf/
          • nginx.conf
          • uwsgi.ini
          • uwsgi.log
        • mysite/ # 你的Django專案目錄,假設為mysite
          • blog/
          • mysite/
            • urls.py
            • settings.py
          • static/
          • template/
          • manage.py

修改專案程式碼

修改settings.py:

DEBUG = False   # Django是否載入靜態資源
ALLOWED_HOSTS = ['localhost','127.0.0.1','.zosurn.xyz'] # 允許訪問的主機地址

STATIC_ROOT = os.path.join(BASE_DIR, "static/") # 收集Django的靜態檔案到同一個static中

建立uwsgi.ini和uwsgi.log

uwsgi.ini不變,依舊為:

# myblog uwsgi.ini file
[uwsgi]

socket = 127.0.0.1:8002
# http = :8002 如果不通過nginx可以直接用http,但要通過web伺服器就必須要用socket

# the base directory (full path)
chdir           = /home/projects/blog/mysite

# Django s wsgi file
module          = mysite.wsgi

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# clear environment on exit
vacuum          = true

建立nginx.conf


# worker_rlmit_nofile 65500; # 提升nginx的程式檔案開啟數

events{}

http{
    include       mime.types;
    server{

        listen 80;
        server_name www.zosurn.xyz;
        index index.html ;
        root  /home/projects/blog/mysite;

            location /static {
                alias /home/projects/blog/mysite/static; # your Django project's static files - amend as required
            }

            # Finally, send all non-media requests to the Django server.
            location / {
                include     /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
                uwsgi_pass 127.0.0.1:8002;
            }
        }
}

建立資料庫、收集靜態檔案

python manage.py migrate
python manage.py collectstatic

啟動服務

  • 啟動nginx

    nginx -c /home/projects/blog/conf/nginx.conf

  • 後臺啟動uwsgi

    uwsgi /home/projects/blog/conf/uwsgi.ini -d /home/projects/blog/conf/uwsgi.log

如此就可以通過域名訪問自己的Django專案了。

相關文章