基於Nginx和uwsgi搭建Django部署上線環境

襪子都是洞發表於2018-11-23

環境:阿里雲 ECS CentOS 7.2 64位
安裝:

  • python3
  • python虛擬環境
  • django
  • uwsgi
  • nginx

安裝Python3

不動現有的Python2環境安裝Python3
下載Python3

wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz

解壓Python3

tar -zxvf Python-3.6.1.tgz

進入目錄

cd Python-3.6.1

安裝到指定目錄(本次指定路徑/usr/local/python3
新建資料夾

mkdir -p /usr/local/python3

配置安裝路徑

./configure --prefix=/usr/local/python3

編譯

make

安裝

make install

環境配置,讓python3命令即輸即用
建立python3的軟鏈

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

並將/usr/local/python3/bin加入PATH:

vim ~/.bash_profile

配置環境變數
修改完畢,執行命令,讓修改生效:

source ~/.bash_profile

檢查Python3是否安裝成功:

python3 -V

安裝Python3虛擬環境

為啥要安裝虛擬環境:

在一個 Python 環境下開發時間越久、安裝依賴越多,就越容易出現依賴包衝突的問題。為了解決這個問題,開發者們開發出了 virtualenv,可以搭建虛擬且獨立的 Python 環境。這樣就可以使每個專案環境與其他專案獨立開來,保持環境的乾淨,解決包衝突問題。

安裝 virtualenv,執行命令即可:

pip3 install virtualenv

建立專案的虛擬環境:

virtualenv venv(虛擬環境名稱)

執行後,在本地會生成一個與虛擬環境同名的資料夾,包含 Python 可執行檔案和 pip 庫的拷貝,可用於安裝其他包。預設情況下,虛擬環境中不會包含也無法使用系統環境的global site-packages。比如系統環境裡安裝了 requests 模組,在虛擬環境裡import requests會提示ImportError。如果想使用系統環境的第三方軟體包,可以在建立虛擬環境時使用引數–system-site-packages

可以自己指定虛擬環境所使用的 Python 版本,前提系統中已經安裝了該版本:

virtualenv -p /usr/bin/python2.7 venv

使用虛擬環境
進入虛擬環境目錄,啟動虛擬環境。

source venv/bin/activate

看到(venv)表示已經進入虛擬環境。
虛擬環境標識

退出虛擬環境:

deactivate

如果專案開發完成後想刪除虛擬環境,直接刪除虛擬環境目錄即可。

安裝Django

在虛擬環境中執行命令即可:

pip install django

本次重點介紹Django如何上線部署,Django相關知識不做具體介紹。
新建Django專案:

django-admin startproject 專案名

安裝uwsgi

在虛擬環境中執行命令即可:

pip install uwsgi

現在重點來啦,上面那麼多都只是基本的環境配置。下面的是知識點,部分也是難點,筆者在這個地方被困了很久,所以一定要弄得時候寫個博文記錄下來。

配置uwsgi

當前目錄下建立test.py檔案

def application(env, start_response):
    start_response(`200 OK`, [(`Content-Type`,`text/html`)])
    return "Hello World" #國際慣例,helloworld

執行程式碼:

uwsgi --http :9111 --wsgi-file test.py

報錯:

-bash: uwsgi: command not found

遇到這個情況怎麼辦?肯定不能放棄,幹就行啦。
通過pip安裝的元件,執行命令檔案在python源目錄下的bin目錄中,所以解決方案:
執行命令:

ln -s /your-python-dir/bin/* /usr/bin/*

*代表你你需要新增的執行命令uwsgi,故障排除,然後繼續執行:

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

成功後提示:

*** Starting uWSGI 2.0.17.1 (64bit) on [Fri Nov 23 12:12:30 2018] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-28) on 22 November 2018 09:21:34
os: Linux-3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017
nodename: iZhp31ku43vn2fbp1dk355Z
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /home/ruanfumin
detected binary path: /usr/local/python3/bin/uwsgi
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 1880
your memory page size is 4096 bytes
detected max file descriptor number: 65535
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on 0:8000 fd 4
spawned uWSGI http 1 (pid: 11058)
uwsgi socket 0 bound to TCP address 127.0.0.1:34451 (port auto-assigned) fd 3
Python version: 3.6.1 (default, Nov 22 2018, 17:05:27)  [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0xaa2120
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72920 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint=``) ready in 0 seconds on interpreter 0xaa2120 pid: 11057 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 11057, cores: 1)

訪問一下IP地址,本機就是127.0.0.1:8000,伺服器就是伺服器ip:8000
瀏覽器看到:
Hello World
終端會提示:

[pid: 11057|app: 0|req: 1/1] 183.206.12.47 () {42 vars in 829 bytes} [Fri Nov 23 12:13:17 2018] GET / => generated 11 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 44 bytes (1 switches on core 0)

表明uwsgi配置ok,我們繼續

直接使用Django跑一下專案,看能不能執行成功,由於Django是在阿里雲伺服器上,所以專案設定檔案settings.py需要修改一下。

ALLOWED_HOSTS = [`*`]

醬紫就可以訪問了。我們跑一下試試:

python manage.py runserver 0:8000

Django成功執行

使用Uwsgi 跑 django專案

在專案(新建的測試專案testproject)路徑下,執行:

uwsgi --http 0:8000 --module testproject.wsgi

解釋:
--http 0:8000攜帶這個參數列明可以http訪問,埠號是8000。
--module testproject.wsgi指定Django專案的wsgi檔案。
參考Django官方文件:

uwsgi --chdir=/path/to/your/project 
    --module=mysite.wsgi:application 
    --env DJANGO_SETTINGS_MODULE=mysite.settings 
    --master --pidfile=/tmp/project-master.pid 
    --socket=127.0.0.1:49152       # can also be a file
    --processes=5                  # number of worker processes
    --uid=1000 --gid=2000          # if root, uwsgi can drop privileges
    --harakiri=20                  # respawn processes taking more than 20 seconds
    --max-requests=5000            # respawn processes after serving 5000 requests
    --vacuum                       # clear environment on exit
    --home=/path/to/virtual/env    # optional path to a virtualenv
    --daemonize=/var/log/uwsgi/yourproject.log      # background the process

再次訪問:http://39.104.91.28:8000/
發現還是成功辣,真好。
終端顯示圖

在專案目錄下新建uwsgi.ini檔案,可以參考官方文件

[uwsgi]
#chidr用於指定自己的網站根目錄(自行更改)
chdir =  /var/www/testproject
#module指定網站中APP的檔案(自行更改)
module = testproject.wsgi
#home用於指定python的虛擬環境,即我們最初建立的虛擬環境位置(自行更改)
home = /var/www/venv
#master不用更改
master = true
#socket用於指定埠號,可以不更改
socket = :8000
#以下兩個可以不用更改
chmod-socket = 666

檔案裡我們指定socket,讓Nginx伺服器通過這個socket處理uwsgi。

Nginx安裝:
這個不細說了,直接yum命令就好:

yum install nginx

Nginx配置修改

進入Nginx配置目錄,在/etc/nginx/下:
Nginx配置目錄
我們修改nginx.conf檔案:

upstream django_test { #加上_test,因為和原來的衝突了,這裡備註下
    # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    server 127.0.0.1:8000; # for a web port socket (we`ll use this first) 類似uwsgi埠
}

    server {
        listen       80;
        server_name  ruanfumin;


        location / {
            include uwsgi_params;
            uwsgi_pass django_test;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
        location /static {
        alias /var/www/first/static; # 載入你的靜態檔案
    }

    }

修改完,儲存,重啟Nginx伺服器,然後再到Django專案目錄下啟動uwsgi服務:

uwsgi --ini uwsgi.ini

瀏覽器輸入url訪問:39.104.91.28:80
當然這次是80埠訪問了,因為Nginx我們設定的嘛,你可以隨意修改。
80埠訪問成功圖

注:


相關文章