Django是一個開源的Web應用框架,使用Python語言編寫,主要用于搭建Web項目。本教程介紹如何在Linux服務器中使用Nginx+uWSGI部署Django項目。
準備工作
創建部署Django項目的ECS實例,ECS實例必須滿足以下條件:
實例已分配公網IP地址或綁定彈性公網IP(EIP)。具體操作,請參見綁定和解綁彈性公網IP。
操作系統必須為Alibaba Cloud Linux 3.2104、Alibaba Cloud Linux 2.1903、CentOS 7.x、Ubuntu 22.04、Ubuntu 20.04、Ubuntu 18.04。
重要本教程以Alibaba Cloud Linux 3.2104和Ubuntu 20.04 64位操作系統為例。如果您購買的ECS服務器使用了其他版本的操作系統,操作可能與本教程略有差異。
軟件包或程序安裝具體版本以您使用的實際版本為準。
ECS實例安全組的入方向添加安全組規則并放行22、80、8001和8002端口。具體操作,請參見添加安全組規則。
步驟一:安裝或核對Python版本
遠程連接Linux實例。
具體操作,請參見通過密碼或密鑰認證登錄Linux實例。
運行以下命令,查看具體Python安裝信息。
本示例ECS實例中默認已經安裝Python 3,如果您的ECS實例中未安裝Python 3,請自行安裝。
Alibaba Cloud Linux 3.2104/Alibaba Cloud Linux 2.1903/CentOS 7.x
which python3 ll /usr/bin/python*
回顯信息類似如下所示。
[ecs-user@iZbp17st8t8txp6po87**** ~]$ which python3 /usr/bin/python3 [ecs-user@iZbp17st8t8txp6po87**** ~]$ ll /usr/bin/python* lrwxrwxrwx 1 root root 7 Feb 8 10:30 /usr/bin/python -> python2 lrwxrwxrwx 1 root root 9 Feb 8 10:30 /usr/bin/python2 -> python2.7 -rwxr-xr-x 1 root root 7144 Jun 28 2022 /usr/bin/python2.7 lrwxrwxrwx 1 root root 9 Feb 8 10:25 /usr/bin/python3 -> python3.6 -rwxr-xr-x 2 root root 11328 Nov 17 2020 /usr/bin/python3.6 lrwxrwxrwx 1 root root 17 Feb 8 10:25 /usr/bin/python3.6-config -> python3.6m-config -rwxr-xr-x 2 root root 11328 Nov 17 2020 /usr/bin/python3.6m -rwxr-xr-x 1 root root 173 Nov 17 2020 /usr/bin/python3.6m-config -rwxr-xr-x 1 root root 3403 Nov 17 2020 /usr/bin/python3.6m-x86_64-config lrwxrwxrwx 1 root root 16 Feb 8 10:25 /usr/bin/python3-config -> python3.6-config
Ubuntu 20.04
which python3 ll /usr/bin/python*
回顯信息類似如下所示。
ecs-user@iZjyfbxivbj****:~$ which python3 /usr/bin/python3 ecs-user@iZjyfbxivbj****:~$ ll /usr/bin/python* -rwxr-xr-x 1 root root 3662032 Jul 1 2022 /usr/bin/python2.7* lrwxrwxrwx 1 root root 9 Feb 8 14:05 /usr/bin/python3 -> python3.8* -rwxr-xr-x 1 root root 5494584 Nov 14 20:59 /usr/bin/python3.8* lrwxrwxrwx 1 root root 33 Nov 14 20:59 /usr/bin/python3.8-config -> x86_64-linux-gnu-python3.8-config* lrwxrwxrwx 1 root root 16 Mar 13 2020 /usr/bin/python3-config -> python3.8-config*
步驟二:部署Nginx環境
執行以下命令,安裝Nginx。
Alibaba Cloud Linux 3.2104/Alibaba Cloud Linux 2.1903/CentOS 7.x
sudo yum -y install nginx
Ubuntu 22.04/Ubuntu 20.04/Ubuntu 18.04
sudo apt update sudo apt -y install nginx
執行以下命令,啟動并查看Nginx服務狀態。
sudo systemctl start nginx systemctl status nginx
如果回顯信息中出現
Active: active (running)
,表示Nginx服務已啟動。
步驟三:部署及測試uWSGI環境
執行以下命令,安裝uWSGI。
sudo pip3 install uwsgi
如果回顯信息如下所示,表示uWSGI已安裝成功。
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead. Collecting uwsgi Downloading http://mirrors.cloud.aliyuncs.com/pypi/packages/b3/8e/b4fb9f793745afd6afcc0d2443d5626132e5d3540de98f28a8b8f5c753f9/uwsgi-2.0.21.tar.gz (808kB) 100% |████████████████████████████████| 808kB 72.9MB/s Installing collected packages: uwsgi Running setup.py install for uwsgi ... done Successfully installed uwsgi-2.0.22
如果在安裝中出現如下圖所示的報錯信息,請您執行以下命令后,重新安裝uWSGI。
Alibaba Cloud Linux 3.2104/Alibaba Cloud Linux 2.1903/CentOS 7.x
sudo yum -y install python3-devel.x86_64
Ubuntu 22.04/Ubuntu 20.04
sudo apt -y install python3-devel.x86_64
執行以下命令,創建測試目錄。
本示例以創建
/home/myblog
目錄為例,您可以根據需求自定義文件路徑。sudo mkdir /home/myblog
執行以下命令,創建并編輯測試程序文件
test.py
。cd /home/myblog sudo vim test.py
輸入
i
進入編輯模式,將以下內容復制到文件中。def application(env,start_response): start_response('200 ok',[('Content-Type','text/html')]) return [b"Hello World"]
按
Esc
鍵,輸入:wq
保存并退出文件。執行以下命令,測試運行訪問。
Alibaba Cloud Linux 3.2104/Alibaba Cloud Linux 2.1903/CentOS 7.x
sudo /usr/local/bin/uwsgi --http :8001 --wsgi-file test.py
回顯信息如下圖所示。
Ubuntu 22.04/Ubuntu 20.04
sudo uwsgi --http :8001 --wsgi-file test.py
回顯信息如下圖所示。
在本地電腦瀏覽器的地址欄輸入
http://<ECS實例的公網IP地址>:8001
,訪問測試文件。如出現如下頁面,表示uWSGI環境搭建成功。
步驟四:部署及測試Django環境
執行以下命令,安裝Django。
sudo pip3 install Django
執行以下命令,創建項目。
本示例以創建項目文件
uwsgi_project
為例,您可以根據需求自定義文件夾。Alibaba Cloud Linux 3.2104/Alibaba Cloud Linux 2.1903/CentOS 7.x
sudo /usr/local/bin/django-admin.py startproject uwsgi_project
Ubuntu 22.04/Ubuntu 20.04
sudo /usr/local/bin/django-admin startproject uwsgi_project
執行以下命令,編輯
settings.py
文件。sudo vim /home/myblog/uwsgi_project/uwsgi_project/settings.py
輸入
i
進入編輯模式,將ALLOWED_HOSTS = [ ]
修改為ALLOWED_HOSTS = ["*"]
。修改完成后,按Esc
鍵,輸入:wq
保存并退出文件。說明["*"]表示允許任何IP地址訪問,否則訪問會被拒絕,具體以您實際環境為準。
執行以下命令,啟動Django環境。
cd /home/myblog/uwsgi_project sudo python3 manage.py runserver 0.0.0.0:8002
如果出現以下類似報錯:
django.core.exceptions.ImproperlyConfigured: SQLite 3.9.0 or later is required (found 3.7.17).
您可以將
settings.py
文件中的DATABASES
注釋掉,重新啟動Django環境即可。修改settings.py
文件的具體操作,請參見編輯settings.py文件。在本地電腦瀏覽器的地址欄輸入
http://<ECS實例的公網IP地址>:8002
,即可訪問相關Django頁面。
步驟五:配置Nginx、uWSGI、Django
執行以下命令,修改Django配置文件
settings.py
。sudo vim /home/myblog/uwsgi_project/uwsgi_project/settings.py
按
i
鍵,進入編輯模式。將
DEBUG = True
修改為DEBUG = False
。在
settings.py
文件開頭添加如下參數。import os
在
settings.py
文件末尾添加如下參數。STATIC_ROOT = os.path.join(BASE_DIR, "static/")
按
Esc
鍵,輸入:wq
保存并退出文件。執行如下命令,收集所有靜態文件。
sudo python3 manage.py collectstatic
執行以下命令,打開Nginx配置文件。
Alibaba Cloud Linux 3.2104/Alibaba Cloud Linux 2.1903/CentOS 7.x
sudo vim /etc/nginx/nginx.conf
Ubuntu 22.04/Ubuntu 20.04
sudo vim /etc/nginx/sites-enabled/default
按
i
鍵進入編輯模式,在server
中修改或添加以下參數。編輯完成后,按Esc
鍵,輸入:wq
保存并退出文件。upstream django { server 127.0.0.1:8001; #具體端口必須與您uWSGI配置文件中定義的端口一致 } server { listen 80; #設置的nginx訪問端口 server_name test; charset utf-8; location /static { autoindex on; alias /home/myblog/uwsgi_project/static; #具體目錄以您現場具體部署的目錄為準 } location / { uwsgi_pass 127.0.0.1:8001; include uwsgi_params; #具體目錄以您現場具體部署的目錄為準 include /etc/nginx/uwsgi_params; #具體目錄以您現場具體部署的目錄為準 uwsgi_param UWSGI_SCRIPT iCourse.wsgi; #具體目錄以您現場具體部署的目錄為準 uwsgi_param UWSGI_CHDIR /iCourse; #具體目錄以您現場具體部署的目錄為準 index index.html index.htm; client_max_body_size 35m; index index.html index.htm; } }
執行以下命令,新建uWSGI配置文件
uwsgi_config.ini
。sudo vim uwsgi_config.ini
按
i
鍵進入編輯模式,在文件中添加以下參數。編輯完成后,按Esc
鍵,輸入:wq
保存并退出文件。[uwsgi] socket = 127.0.0.1:8001 chdir = /home/myblog/uwsgi_project/ wsgi-file = uwsgi_project/wsgi.py processes = 4 threads = 2 vacuum = true buffer-size = 65536
上述參數配置說明如下所示:
socket:此處的8001端口需要和nginx配置文件中定義的uwsgi_pass端口一致。
chdir:指定項目目錄,本示例中為
/home/myblog/uwsgi_project
,根據項目修改。wsgi-file:指定
Django's wsgi file
文件,根據項目修改。processes:最大工作進程。
threads:每個工作進程processes啟動后開啟的線程個數。
vacuum:環境退出時自動清理。
buffer-size:設置用于uwsgi包解析的內部緩存區大小為64k,默認是4k。
其他參數配置請根據項目自定義添加。
啟動程序。
執行以下命令,重啟Nginx服務。
sudo systemctl restart nginx
執行以下命令,重啟uWSGI服務。
執行以下命令,停止已啟動的uWSGI程序。
ps aux |grep uwsgi sudo kill -9 13187 #13187指通過上述命令獲取的pid,具體pid以您現場實時獲取的為準
執行以下命令,啟動uWSGI服務。
Alibaba Cloud Linux 3.2104/Alibaba Cloud Linux 2.1903/CentOS 7.x
uwsgi --ini uwsgi_config.ini
Ubuntu 22.04/Ubuntu 20.04
sudo uwsgi --ini uwsgi_config.ini
在本地電腦瀏覽器的地址欄輸入
http://<ECS實例的公網IP地址>
,即可訪問相關Django頁面。