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
执行以下命令,打开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页面。