使用Nginx部署Django

来源:https://www.cnblogs.com/wuu02/archive/2020/03/03/12403956.html
-Advertisement-
Play Games

"參考文章鏈接" 我的環境 conda 4.7.10、python 3.6.7、Django 3.0.3 安裝uWSGI 這裡如果出現了問題,可以考慮如下解決辦法: "參考鏈接" 最後重新運行安裝命令 測試uWSGI是否正常工作 新建一個test.py文件: 若之後要刪除則運行 輸入如下內容: 運行 ...


參考文章

參使用uWSGI和nginx來設置Django和你的web伺服器
python3 + Django + uwsgi + nginx 配置部署筆記
不輕鬆,伺服器部署nginx+uwsgi+djangorestfremework+react
http升級為https全過程(通過nginx安裝SSL證書)
Nginx操作 | Nginx配置SSL證書

我的環境

Ubuntu16.04、conda 4.7.10、python 3.6.7、Django 3.0.3

安裝uWSGI

pip install uwsgi
這裡如果出現了問題,可以考慮如下解決辦法:參考鏈接

apt-get install python3-dev
apt-get install gcc-4.7 ##卸載你的gcc版本,安裝為4.7:
rm /usr/bin/gcc
ln -s /usr/bin/gcc-4.7 /usr/bin/gcc

最後重新運行安裝命令pip install uwsgi

測試uWSGI是否正常工作

  • 新建一個test.py文件:touch test.py 若之後要刪除則運行rm 文件名
    輸入如下內容:
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
    #return ["Hello World"] # python2
  • 運行uWSGI:uwsgi --http :8080 --wsgi-file test.py
    可能會報錯:
    uwsgi: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
    解決方法:參考鏈接
find / -name libpcre.so.* ##找到所有的系統中libpcre
ln -s /root/anaconda3/lib/libpcre.so.1 /lib ##創建libpcre.so.1軟鏈到/lib下
which uwsgi ##測試一下是否好用了

這裡有個坑,如果你的伺服器是雲伺服器,例如我的是阿裡雲,一定要註意設置運行的埠要和雲伺服器控制台的安全組埠對應,否則可能無法正確地用http訪問埠。
安全組配置示例

  • 瀏覽器鍵入http://example.com:8000出現Hello World說明運行成功。
    表示以下路徑正常:the web client <-> uWSGI <-> Python
    ps.Ubuntu殺死指定進程的命令:kill -9 $(lsof -i tcp:8080 -t)

從簡單的test.py到Django項目

  • 新建一個Django項目並確保其能正確運行:如何新建參考這裡
    ps.雲伺服器上記得要把Django項目的settings.py中的ALLOWED_HOSTS = ['']改為ALLOWED_HOSTS = ['*'],方便其他地址正常訪問。
  • 改用uWSGI來運行:uwsgi --http :8000 --module mysite.wsgi
    如果能正常運行說明以下路徑正常:the web client <-> uWSGI <-> Django
    通常我們不會讓瀏覽器直接與uWSGI通信,那是web伺服器的工作。

安裝Nginx

sudo apt-get install nginx
sudo /etc/init.d/nginx start ##啟動nginx服務

通過瀏覽器訪問80埠,你應該會從Nginx獲得一個消息:”Welcome to nginx!”。
這說明以下路徑正常:the web client <-> the web server

配置Nginx靜態路徑

  • 在Django目錄下新建名為uwsgi_params的文件,文件內容從這裡複製
  • 在Django目錄下新建名為mysite_nginx.conf的文件,內容為:
# mysite_nginx.conf

# the upstream component nginx needs to connect to
upstream django {
    #server 0.0.0.0:8081; # for a web port socket (we'll use this first)
}

# configuration of the server
server {
    # the port your site will be served on
    listen      8080;
    # the domain name it will serve for
    server_name xx.xx.xx.xx # 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/mysite/media;  # your Django project's media files - amend as required
    }

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

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /home/mysite/uwsgi_params; # the uwsgi_params file you installed
    }
}
  • 將上述文件鏈接到/etc/nginx/sites-enabled中以便Nginx識別
    sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/
  • 修改Django的settings.py文件,添加下述語句:
    STATIC_ROOT = os.path.join(BASE_DIR, "static/")
  • 運行如下命令:
    python manage.py collectstatic這樣Django就會收集靜態文件,放到指定目錄(static目錄)內
  • 重啟Nginx
    sudo /etc/init.d/nginx restart
  • 測試
    將測試圖片test.jpg放入media文件夾中,訪問xx.xx.xx.xx:8080/media/test.jpg如果能訪問,說明nginx提供了正確的文件服務

配置Nginx動態請求

讓Nginx對test.py應用說句”hello world”吧。
uwsgi --socket :8081 --wsgi-file test.py

  • socket :8081:使用uWSGI協議,埠為8081,同時,已經配置了Nginx在那個埠與uWSGI通信,而對外使用8000埠。訪問:xx.xx.xx.xx:8080/
    出現“hello world”說明以下路徑正常:the web client <-> the web server <-> the socket <-> uWSGI <-> Python

使用Unix socket而不是埠

目前我們使用了簡單的TCP socket,換成Unix socket所用的開銷更小。

  • 編輯mysite_nginx.conf文件
    將第一句的server 0.0.0.0:8081; #web socket改為server unix:///path/to/your/mysite/mysite.sock;這裡的/path/to/your/.....改成你自己的路徑,mysite.sock是系統自動生成的,不用理會它。
  • 重啟Nginx:sudo /etc/init.d/nginx restart
  • 再次運行uWSGI:uwsgi --socket mysite.sock --wsgi-file test.py
  • 在瀏覽器訪問:xx.xx.xx.xx:8000/
    這裡可能會出現502 Bad Gateway,原因是Nginx沒有進入該目錄的許可權,故無法訪問socket文件,其中一個解決方法是改變運行Nginx的用戶身份,把/etc/nginx/nginx.conf 第一行的user www-data; 中的www-data 改成許可權足夠高的用戶,重啟Nginx。我直接改成root了,可以正常運行。

使用uWSGI和Nginx運行Django應用

  • 輸入以下命令運行Django應用
    uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664

通過配置文件啟動uWSGI

到這一步時,如果關閉雲伺服器的ssh遠程連接,網站又會出現502 Bad Gateway了。這是因為當你關閉這個ssh進程時,uWSGI進程也被終止了,所以我們需要ini配置文件啟動。

  • 在項目目錄下新建mysite_uwsgi.ini文件,內容如下:
# mysite_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /home/mysite
# Django's wsgi file
module          = mysite.wsgi
# the virtualenv (full path)
home            = /root/anaconda3/envs/chineseocr

# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 10
# the socket (use the full path to be safe
socket          = /home/mysite/mysite.sock
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true
  • 然後使用這個文件運行uWSGI,再次測試Django項目是否運行正常
    uwsgi --ini mysite_uwsgi.ini # the --ini option is used to specify a file

Nginx靜態資源位置

訪問網址80埠預設指向/usr/share/nginx/html目錄下的index.html
mysite_nginx.conf文件中,我們在server{}下添加root /home/mysite/wwwroot/build;可以改變主頁的預設位置。

Nginx添加SSL證書

  • 首先在阿裡雲申請證書:http升級為https全過程(通過nginx安裝SSL證書)
  • 檢查Nginx有沒有安裝SSL模塊:
    進入Nginx安裝目錄,我的是/etc/,輸入nginx -V查看已經安裝的模塊,SSL的模塊名是--with-http_ssl_module
  • 在/etc/nginx/sites-enabled目錄里添加一個文件,文件名任意,我的是xxx.top,輸入下麵兩個server:
server {
    listen 443 ssl;   #SSL協議訪問埠號為443。此處如未添加ssl,可能會造成Nginx無法啟動。
    server_name localhost;  #將localhost修改為您證書綁定的功能變數名稱,例如:www.example.com。
    root html;
    index index.html index.htm;
    ssl_certificate cert/domain name.pem;   #將domain name.pem替換成您證書的文件名。
    ssl_certificate_key cert/domain name.key;   #將domain name.key替換成您證書的密鑰文件名。
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;  #使用此加密套件。
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   #使用該協議進行配置。
    ssl_prefer_server_ciphers on;   
    location / {
        root html;   #站點目錄。
        index index.html index.htm;   
    }
} 
server {
    listen 80;
    server_name localhost;   #將localhost修改為您證書綁定的功能變數名稱,例如:www.example.com。
    rewrite ^(.*)$ https://$host$1 permanent;   #將所有http請求通過rewrite重定向到https。
    location / {
        index index.html index.htm;
    }
}
  • 重新啟動伺服器
    sudo /etc/init.d/nginx restart
  • 一些輔助命令
    檢查config有無語法錯誤:nginx -t -c /etc/nginx/nginx.conf
    查看伺服器無法啟動的原因:systemctl status nginx.service
  • 註意要在雲伺服器安全組(防火牆)開放HTTPS的443埠,不然無法訪問

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、一般的遍曆數組的方法: ~~~ var array = [1,2,3,4,5,6,7]; for (var i = 0; i { console.log(v); }); array.forEach(function(v){ console.log(v); }); ~~~ 四、 用for in不僅 ...
  • 1、vue-cli 4.0 中打包後,頁面空白,路徑錯誤。 https://blog.csdn.net/qq_40999917/article/details/102954245 2、vue2修改瀏覽器顯示title。 https://segmentfault.com/a/1190000020208 ...
  • 今天遇到一個很狗血的問題,ie8以下瀏覽器jquery控制台會報錯,原因是jquery2.0以上的版本不支持addEventListener屬性或方法。更換了jquery的版本後問題解決了,happy! ...
  • 近日,微軟發佈了.NET Core 2.0,但是開發人員中間仍然存在一些疑惑,就是.NET Core、.NET Standard、Xamarin和.NET Framework有什麼不同。 .NET Framework用於構建桌面應用程式和運行在互聯網信息伺服器(IIS)上的ASP.NET應用程式。它 ...
  • 選擇題 題目1(單選): 下列選項中定義變數哪一項是正確的(D ) 選項: A.byte b=128; B.long c=3.14L; C.float f=3.14; D.double e=4.88; 題目2(單選): 關於變數的定義,下列寫法正確的是( A ) 選項: A. byte b = 10 ...
  • 選題題 題目1(單選): 下麵有關Java語言跨平臺性說法正確的是(D ) 選項 : A.Java的源代碼是跨平臺的。 B.JDK是跨平臺的。 C.JVM是跨平臺的。 D.跨平臺中的平臺指的是操作系統,Java語言的跨平臺性是指Java程式可以在不同的操作系統上運行,前提是相應的操作系統安裝了對應的 ...
  • 開發環境: Windows操作系統開發工具:Myeclipse+Jdk+Tomcat7+MYSQL資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=138 ...
  • 開發環境: Windows操作系統開發工具:Myeclipse/eclipse+Jdk+Tomcat+MYSQL資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=137 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...