1. 程式人生 > >Django學習13-部署(nginx)

Django學習13-部署(nginx)

使用uWSGI和nginx部署Django web應用是主流的用法,參考uWSGI官方的教程:https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html?highlight=.ini#setting-up-django-and-your-web-server-with-uwsgi-and-nginx 塗老師的Django部署:https://code.ziqiangxuetang.com/django/django-nginx-deploy.html

完整的配置:

the web client <-> the web server <-> the socket <-> uwsgi <-> Django

uWSGI

WSGI(Web Server Gateway Interface)web伺服器-閘道器介面,是一個Web伺服器(如nginx)與web應用(如Django、Flask框架寫的程式)通訊的一種規範(通訊協議)。 uwsgi是一種線路協議而不是通訊協議,在此常用於在uWSGI伺服器與其他網路伺服器的資料通訊。uwsgi協議是一個uWSGI伺服器自有的協議,它用於定義傳輸資訊的型別。 uWSGI是一個Web伺服器,它實現了WSGI協議、uwsgi、http等協議,負責響應python 的web請求。

從客戶端請求到web程式響應的過程:

在這裡插入圖片描述

使用uWSGI部署

安裝uWSGI:

[email protected]
:~$ pip3 install uwsgi --upgrade

安裝後可以使用uWSGI啟動專案:uwsgi --http :8001 --chdir /path/to/project --home=/path/to/env --module project.wsgi

  • http :8001 : 使用http協議,埠8001
  • module mysite.wsgi: load the specified wsgi module
  • home=/path/to/env:指定virtualenv 路徑
[email protected]:~$ uwsgi --http :8001 --chdir /home/ulysses/PycharmProjects/django_ulysses --home=/home/ulysses/PycharmProjects/django_ulysses/venv --module django_ulysses.wsgi

這樣專案就運行了: 在這裡插入圖片描述 在瀏覽器輸入網址127.0.0.1:8001可以看到網頁已經形成了。 在這裡插入圖片描述

使用配置檔案

啟動uWSGI用的這條命令太長了,使用.ini配置檔案,直接將其放在專案目錄下,輸入內容 djangi_ulysses.ini

# plugin = python
[uwsgi]
# 指定專案執行的埠號
# the socket (use the full path to be safe
# socket = /path/to/your/project/mysite.sock
http = 127.0.0.1:8080

# Django專案根目錄 (絕對路徑)
chdir = /home/ulysses/PycharmProjects/django_ulysses

# Django wsgi.py檔案的位置
wsgi-file = django_ulysses/wsgi.py

# 最大執行的程序數
processes = 4

# 允許主執行緒存在(true)
master = True


# 當伺服器退出的時候自動清理環境,刪除unix socket檔案和pid檔案
vacuum = True

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

# the virtualenv (full path)
home = /home/ulysses/PycharmProjects/django_ulysses/venv

啟動時直接:uwsgi --ini ***.ini 關閉命令可以用結束程序的方法:sudo killall -9 uwsgi 開啟後檢視網頁: 在這裡插入圖片描述 網頁能成功開啟,但圖片沒有載入。

Nignx

Nginx(engine-x) 是一個高效能的 Web 和反向代理伺服器。 作為web伺服器相比 Apache,Nginx 使用更少的資源,支援更多的併發連線,體現更高的效率,這點使 Nginx 尤其受到虛擬主機提供商的歡迎。能夠支援高達 50,000 個併發連線數的響應。它還可以作為負載均衡伺服器和郵件代理伺服器使用。

nginx安裝和配置

安裝nginx:

[email protected]:~$ sudo apt install python-dev nginx

開啟/etc/nginx/sites-available/default檔案,刪除所有內容後輸入後輸入:

server {
    # 訪問時用的埠
    listen      80;
    # 伺服器名 ,用本機地址
    server_name localhost;
    charset     utf-8;
    # 日誌檔案和錯誤日誌
    access_log      /var/log/nginx/myweb_access.log;
    error_log       /var/log/nginx/myweb_error.log;
 
    client_max_body_size 75M;
 
    # Django media檔案路徑
    location /media  {
        alias /home/ulysses/PycharmProjects/django_ulysses/media;
    }
    # 靜態檔案路徑 
    location /static {
	# 靜態和媒體資料夾中的所有內容將在30天內由瀏覽器快取
	expires 30d;
	# 啟用目錄流量, 預設為off,顯示的檔案時間為GMT時間。改為on後,顯示的檔案時間為檔案的伺服器時間
        alias /home/ulysses/PycharmProjects/django_ulysses/collected_static;
    }
    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  unix:///home//ulysses/PycharmProjects/django_ulysses/django_ulysses.sock;
        include     /etc/nginx/uwsgi_params;
    }
}

修改之前的uwsgi配置檔案,使用socket,並設定檔案的許可權和所有者(在Apache2部署時設定過檔案許可權和所有者)。

socket = /home/ulysses/PycharmProjects/django_ulysses/django_ulysses.sock
# http = 127.0.0.1:8080
# ...
# ... with appropriate permissions - may be needed
chmod-socket    = 666
chown-socket = ulysses:www-data

因為使用的是nginx的default.conf,直接重啟nginx服務即可: sudo service nginx reload或是sudo service nginx restart,使新定義的conf檔案:sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/啟用網站。 執行uWSGI,重啟nginx後,重新開啟80埠(nginx監聽的埠) 在這裡插入圖片描述

現在靜態檔案也已經可以載入,也能上傳檔案。