Django之nginx+wsgi后台部署(最新版)


0-部署准備

1.要使用安全組打開騰訊雲的80端口

騰訊雲的80端口不能訪問​www.jianshu.com圖標

以實際項目部署為例
項目名稱api_learn;
Python版本:python 3.6.6;
虛擬環境名字:djangoEnv;
端口:80;
服務器托管:騰訊雲;
服務器版本:ubuntu 16.04;

2.SCP上傳項目

scp -r "本地文件目錄地址" ubunt@公網IP地址:/"目標地址"

例子

scp -r /Users/lhj/Downloads/api_learn ubuntu@IP:/home/ubuntu

3.本地項目上傳之后的配置

1.目錄結構問題

我的Django項目中只有一個主要的app名為Inquire,該app有自己的靜態文件夾static。在正常的Django項目中,不同的app也應該有各自的static文件夾,但是在之后的nginx配置過程中,我們需要提供項目的一個靜態目錄地址,這就需要把Django項目所有app的static文件整合到一個文件夾中。此時setting.py文件中關於靜態目錄的設置如下:

STATIC_URL = '/static/'
# 添加app的靜態文件地址,絕對地址和相對地址都可以
STATICFILES_DIRS = [
    "/home/ubuntu/api_learn/static"
]
# 統一的靜態文件地址
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

配置好后,我們在服務器終端命令行中的/home/ubuntu/HelloWorld目錄下執行以下語句完成整合:

python manage.py collectstatic

2.1 數據庫配置

2.1.1 數據庫安裝和配置

青空琉璃:ubuntu18.04下遠程連接MySQL數據庫​zhuanlan.zhihu.com圖標

2.2.2 數據庫表新建

青空琉璃:MySQL使用命令行創建數據庫​zhuanlan.zhihu.com圖標

對應數據庫,django項目的setting.py文件

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '數據庫名稱',
        'USER': '使用者',
        'PASSWORD': '數據庫密碼',
        'HOST': '127.0.0.1',
    }
}
# 我們需要一個第三方庫用來與MySQL交互,Python3已經不再使用mysqldb,所以我們下載pymysql:
pip install pymysql
#同時在Django項目中的__init__.py中引用:
import pymysql 
pymysql.install_as_MySQLdb()

用Mysql建好項目的數據庫,然后進入HelloWord目錄,用django應用數據模型:

(python使用虛擬環境)

python manage.py makemigrations
python manage.py migrate

建立后台超級用戶:

python manage.py createsuperuser

3. 公網訪問配置

DEBUG = False 
ALLOWED_HOSTS = ['*']

測試

注意到以上兩點后,我們可以進行測試了,在項目目錄

python manage.py runserver 0.0.0.0:8000

由於在命令行的界面,所以我們可以先將命令放到后台運行

python manage.py runserver 0.0.0.0:8000 &

那么我們也可以將前台運行的轉到后台去

# ctrl+z暫停任務
# jobs 查看暫停任務
# bg %[序號] 將任務放到后台繼續執行
# fg %[序號] 將任務放到前台繼續執行

1-環境安裝

簡單介紹一下:uWSGI是一個Web服務器,而uwsgi是一種線路協議而不是通信協議,在此常用於在uWSGI服務器與其他網絡服務器的數據通信。由於uWSGI是C語言應用程序,所以需要一個C編譯器(gcc或clang)和Python開發頭文件,所以輸入以下語句:

sudo apt-get install build-essential python-dev

build-essential提供編譯程序必須軟件包的列表信息。python-dev就可以讓我們安裝一個源外的,內含需要編譯的調用python api的c/c++文件的python類庫。然后輸入以下指令安裝uwsgi:

sudo pip install uwsgi # 安裝

安裝后進行簡單的測試,在本地寫好如下的測試代碼命名為 test.py,把文件傳到雲主機任意目錄下:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["success!"]

  該目錄下輸入以下命令:

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

訪問8000端口

curl 127.0.0.1:8000 
# 成功返回success

配置uWSGI, 在項目路徑下創建uwsgi.ini 文件, 配置如下:

[uwsgi]
#使用nginx連接時使用
#socket=127.0.0.1:8080
#直接做web服務器使用
http=127.0.0.1:8080
#項目目錄
chdir=/home/ubuntu/test
#項目中wsgi.py文件的目錄,相對於項目目錄
wsgi-file=test/wsgi.py
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uswgi.log

在uwsgi.ini文件所在目錄下, 啟動uwsgi 命令:

uwsgi --ini uwsgi.ini

檢查是否運行成功

curl 127.0.0.1:8000
# 成功返回首頁界面

至此, uwsgi配置完成.

安裝 nginx

1.安裝並運行

sudo apt-get install nginx
service nginx start

查看是否啟動成功:

curl 127.0.0.1

nginx安裝成功.

配置nginx

現在就可以在項目根目錄下面創建項目名_nginx.conf的文件,然后編寫下面文件。

# configuration of the server
server {
    # the port your site will be served on
    listen      80;
    # the domain name it will serve for
    server_name 127.0.0.1; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
        alias /home/ubuntu/api_learn/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /home/ubuntu/api_learn/static; # your Django project's static files - amend as required
    }

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

此時將uwsgi.ini 文件里的http=127.0.0.1:8080注釋掉, 啟用上一行的socket=127.0.0.1:8080.

然后把這個配置文件鏈接到sites-enabled目錄下:

sudo ln -s /etc/nginx/sites-available/HelloWorld /etc/nginx/sites-enabled/

檢查一下配置文件的語法是否有問題,提示ok就可以

sudo service nginx configtest

重啟服務:

service nginx restart

測試

curl 127.0.0.1
# 返回項目首頁

至此, nginx 與 wsgi連接完成.

5. 遇到問題

我們可以查看端口號占用情況並殺掉進程

netstat -apn|grep 8000
kill -9 <pid>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM