[技術博客]ubuntu+nginx+uwsgi+Django+https的部署


ubuntu+nginx+uwsgi+Django+https部署文檔

配置機器介紹

操作系統:Ubuntu 18.04.2 LTS 64位

python版本:Python 3.6.7

Django版本:Django 2.2

首先使用root用戶登錄服務器。

安裝python3和pip3

apt update
apt install python3
apt install python3-pip

安裝Django

pip3 install django

配置並啟動Django項目

下載項目后,進入項目主目錄,切換到back_end_server分支,進入backend文件夾,執行

pip3 install -r requirements.txt

安裝相關依賴。安裝過程中下載速度過慢時可以更換pip源為國內源(https://blog.csdn.net/chenghuikai/article/details/55258957)。

將settings.example.py文件內容復制到settings.py並修改相關配置:

在settings.py文件中加入域名:

ALLOWED_HOSTS = ['www.example.com']

在數據庫中構建相關的數據表:

python3 manage.py makemigrations
python3 manage.py migrate

啟動Django自帶開發服務器runserver進行臨時開發和測試:

python3 manage.py runserver 0:80

啟動之后便可以對服務器進行訪問。

runserver默認使用http連接,可通過如下方式配置ssl證書使用https連接:

pip3 install django-extensions 
pip3 install django-werkzeug-debugger-runserver 
pip3 install pyOpenSSL

將生成的ssl證書放在服務器上后啟動runserver:

python3 manage.py runserver_plus 0:443 --cert-file /etc/certificate/certificate.crt  --key-file /etc/certificate/key.key

其中--cert-file--key-file后為對應的ssl證書文件路徑。

安裝並配置uWSGI

Django 自帶的runserver是一個用於開發的簡易服務器,它是一個用純Python寫的輕量級的Web服務器,目的是為了讓你能快速的開發出想要的東西,並不適用於實際的生產環境中。

在生產環境中,Django的主要部署平台是WSGI,它是Python的標准web服務器和應用,而uWSGI是實現了WSGI的工具。

安裝uWSGI:

pip3 install uwsgi

遇到如下問題時

    [x86_64-linux-gnu-gcc -pthread] core/dot_h.o
    [x86_64-linux-gnu-gcc -pthread] core/config_py.o
    *** uWSGI compiling embedded plugins ***
    [x86_64-linux-gnu-gcc -pthread] plugins/python/python_plugin.o
    In file included from plugins/python/python_plugin.c:1:0:
    plugins/python/uwsgi_python.h:2:10: fatal error: Python.h: No such file or directory
     #include <Python.h>
              ^~~~~~~~~~
    compilation terminated.

    ----------------------------------------
Command "/usr/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-8zavi4g8/uwsgi/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-g8yr_0sf-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-8zavi4g8/uwsgi/

需要安裝python3-dev包:

apt install build-essential python-dev

在Django項目的同級目錄下新建uwsgi目錄並在其中添加uwsgi.ini文件:

[uwsgi]
# 這個端口需要打開
http-socket = :8001

# 需要生成的sock文件,nginx會通過這個sock文件與django通信
# 注意這個socket文件要放在服務器的根目錄下,不要是某個用戶的文件夾下
# 否則以后會出現訪問權限問題
socket=/www/backend_uwsgi.sock

chdir = /root/GroupWork/backend/
# module=backend.wsgi:application

# Django項目中uwsgi.py的路徑(相對於Django項目根路徑)
wsgi-file = backend/wsgi.py
# wsgi-file = /root/GroupWork/backend/backend/wsgi.py

master = true

# 設置啟動相應的uwsgi進程數和線程數
processes = 10
threads = 2

# 設置日志文件路徑
daemonize = /root/GroupWork/backend/uwsgi/uwsgi.log
pidfile = /root/GroupWork/backend/uwsgi/uwsgi.pid

# env = DJANGO_SETTINGS_MODULE=backend.settings

在根目錄下新建www文件夾:

mkdir /www

啟動uwsgi:

uwsgi --ini uwsgi/uwsgi.ini

關閉所有uwsgi進程:

killall -9 uwsgi

安裝並配置nginx

Nginx是一個異步框架的開源Web服務器,因為並發能力強、占用資源少而被廣泛應用在許多網站項目中。在實際應用中,可以使用Nginx作為反向代理服務器,通過uWSGI連接Nginx和Django,當Nginx接收到一個靜態文件請求時直接從磁盤讀取並返回對應的文件,而接收到一個動態數據請求時,先將請求代理到uWSGI服務器,然后調用Django中相應的視圖函數進行處理。

安裝Nginx:

apt install nginx

/etc/nginx/conf.d/文件夾內添加如下配置文件:

# /etc/nginx/conf.d/django.conf

upstream django {
    server 服務器的外網ip:443;  # 服務器的外網ip,443是https的默認端口
}

server {
  listen 443 ssl;
  server_name 域名;

  ssl on;
  # 證書和秘鑰的絕對路徑
  ssl_certificate /etc/certificate/certificate.crt;
  ssl_certificate_key /etc/certificate/key.key;

  client_max_body_size 5M;
  charset utf-8;

  # nginx日志文件的路徑
  access_log /root/GroupWork/backend/nginx/https.access.log; 
  error_log /root/GroupWork/backend/nginx/https.error.log;

  # 指定django項目中存儲媒體文件的地址
  location /media { 
      alias /root/GroupWork/backend/media;
  }

  # 指定django項目中存儲靜態文件的地址
  location /static {
      alias /root/GroupWork/backend/static;
  }

  location / {
    # 之前配置uwsgi時新建的socket文件
    uwsgi_pass unix:///www/backend_uwsgi.sock; 
    include /etc/nginx/uwsgi_params;
  }
}

修改/etc/nginx/nginx.conf文件,將nginx的使用用戶改變為當前用戶:

user root;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

啟動nginx:

nginx

重啟nginx:

reload -s nginx

強制關閉所有nginx進程:

pkill -9 nginx

啟動服務器

啟動服務器時需先啟動uwsgi,再啟動Nginx:

uwsgi --ini uwsgi/uwsgi.ini
nginx

每次修改django項目后都需要重新啟動uwsgi:

killall -9 uwsgi
uwsgi --ini uwsgi/uwsgi.ini


免責聲明!

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



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