如何將本地的Django項目部署到云服務器

如何將本地的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是安裝文件里面的配置工具。
  1. 設置軟連接
    一條命令解決,再也不用配環境變量了。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連接的就是剛安裝的版本

參考鏈接:百度經驗-怎么修改軟連接

  • 也可以將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項目了。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容