使用Nginx+uWSGI部署Django项目

随笔2个月前发布 想念过去
34 0 0

项目背景

Django:3.0.3

python:3.9

服务器:阿里云 2核(vCPU) 2 GiB1 Mbps

              操作系统:Alibaba Cloud Linux 3.2104 LTS 64位

准备工作

我们需要知道网页的运行方式,如下图所示,转载自Django部署服务器_django部署到服务器-CSDN博客

这篇博客相对详细地介绍了Nginx uWSGU Django的概念辨析,我们不做详细介绍,有需要可以自行阅读,只需知道:

Django是一个开源的Web应用框架,使用Python语言编写,主要用于搭建Web项目;

Nginx是一个反向代理Web服务器;

uWSGI是一个web服务器;

这两个是连接客户端和项目的桥梁。

也就是,网页客户端发送http请求后,需要经过Nginx和uWSGI转发翻译,然后Django项目处理好结果,再通过Nginx和uWSGI转发给客户端。

使用Nginx+uWSGI部署Django项目

(其实看了也没看懂,但是不影响后续的部署)

服务器正式部署

官方文档:如何使用Nginx+uWSGI部署Django项目_云服务器 ECS(ECS)-阿里云帮助中心

前四个步骤都是在单独部署各个技术栈的环境并测试,还没有把项目拉进来,第五个步骤才是在集成项目。

(我跟着官方教程做的时候遇到一些问题,所以在原教程的基础上进行补充)

一.安装核对Python版本




which python3 


ll /usr/bin/python*

回显信息(官方的图,我是3.9,图中3.6的部分就是3.9):

使用Nginx+uWSGI部署Django项目

注意:这里的python版本一定要和本地项目的版本一致,我刚开始懒得卸载自带的3.6,导致环境配置的时候一直有问题。

此时要安装指定python版本,并修改软链接指向:详细参考Ubuntu安装指定Python版本详解,理论上各版本通用_ubuntu安装python-CSDN博客

然后将本地环境的依赖打包requirements.txt:

本地生成requirements.txt

pip freeze > requirements.txt

服务器安装requirements.txt中的包: 

pip install -r requirements.txt

安装指定版本mysql:https://juejin.cn/post/7137212755253133348

注意:这两条命令的箭头千万不要搞反,不然就可能把建立的数据库覆盖掉

首先得在服务器的mysql中建立一个数据库,也就是下面命令的数据库名

从mysql导出.sql文件:

mysqldump -u 用户名 -p 数据库名 > 文件名.sql

导入.sql文件到服务器的mysql中:

mysql -u root -p 数据库名 < 文件名.sql

二.部署Nginx环

1.执行以下命令,安装Nginx:

sudo yum -y install nginx

2.执行以下命令,启动并查看Nginx服务状态:




sudo systemctl start nginx


systemctl status nginx

如果回显信息中出现Active: active (running),表示Nginx服务已启动。

三.部署及测试uWSGI环境

1.执行以下命令,安装uWSGI:

sudo pip3 install uwsgi

显示Successfully installed uswgi就可以了

2.执行以下命令,创建测试目录。

sudo mkdir /home/myblog

本示例以创建/home/myblog目录为例,您可以根据需求自定义文件路径。

3.执行以下命令,创建并编辑测试程序文件test.py:




cd /home/myblog


sudo vim test.py

4.输入i进入编辑模式,将以下内容复制到文件中。




def application(env,start_response):


        start_response('200 ok',[('Content-Type','text/html')])


        return [b"Hello World"]

Esc键,输入:wq保存并退出文件。

5.执行以下命令,测试运行访问:

sudo /usr/local/bin/uwsgi --http :8001 --wsgi-file test.py

使用Nginx+uWSGI部署Django项目

6.在本地电脑浏览器的地址栏输入http://<ECS实例的公网IP地址>:8001,访问测试文件。

如出现如下页面,表示uWSGI环境搭建成功。

使用Nginx+uWSGI部署Django项目

四.部署及测试Django环境

1.执行以下命令,安装Django:

sudo pip3 install Django

使用Nginx+uWSGI部署Django项目

2.执行以下命令,创建项目。

本示例以创建项目文件uwsgi_project为例,您可以根据需求自定义文件夹。

sudo /usr/local/bin/django-admin.py startproject uwsgi_project

3.执行以下命令,编辑settings.py文件。

sudo vim /home/myblog/uwsgi_project/uwsgi_project/settings.py

输入i进入编辑模式,将ALLOWED_HOSTS = [ ]修改为ALLOWED_HOSTS = ["*"]。修改完成后,按Esc键,输入:wq保存并退出文件。

说明 [“*”]表示允许任何IP地址访问进来,否则访问会被拒绝,具体以您实际环境为准。

使用Nginx+uWSGI部署Django项目

5.执行以下命令,启动Django环境。




cd /home/myblog/uwsgi_project


sudo python3 manage.py runserver 0.0.0.0:8002

6.在本地电脑浏览器的地址栏输入http://<ECS实例的公网IP地址>:8002,即可访问相关Django页面。

使用Nginx+uWSGI部署Django项目

五.配置Nginx、uWSGI、Django

背景是我们已经把Django项目在本地调通了,直接传进服务器中,需要按照第四步那样改一下配置文件,接下来需要依次修改Nginx和uSWGI配置,目的是在Nginx和uSWGI配置文件中写入Django项目、Nginx和uSWGI的位置或者版本信息,让这个流程可以运转起来。

1.Nginx配置

执行以下命令,打开Nginx配置文件:

sudo vim /etc/nginx/nginx.conf

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;


        }


    }

使用Nginx+uWSGI部署Django项目

我的项目结构:




/home/ExamOnline/


    |-- ExamOnline/


        |-- __init__.py


        |-- settings.py


        |-- urls.py


        |-- wsgi.py

我的nginx配置文件:




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/ExamOnline/static; # 指定静态文件目录


    }


 


    location / {


        uwsgi_pass 127.0.0.1:8001; # 将请求转发到 uWSGI 服务器


        include uwsgi_params; # 包含 uwsgi 参数配置


        include /etc/nginx/uwsgi_params; # 包含额外的 uwsgi 参数配置


        uwsgi_param UWSGI_SCRIPT ExamOnline.wsgi; # 指定 WSGI 模块


        uwsgi_param UWSGI_CHDIR /home/ExamOnline; # 指定工作目录


        index index.html index.htm; # 指定默认文件


        client_max_body_size 135m; # 设置客户端请求体的最大尺寸


    }


}

2.uWSGI配置

执行以下命令,新建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 = 127.0.0.1:8001


chdir = /home/ExamOnline/


wsgi-file = ExamOnline/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+uWSGI部署Django项目

其他参数配置请根据项目自定义添加。

3.启动程序

a.执行以下命令,重启Nginx服务:

sudo systemctl restart nginx

b.执行以下命令,重启uWSGI服务:

①这里需要注意,在上一次关闭uSWGI服务后,内存中还有残留的线程,需要杀死它才可以打开心得进程,要通过以下命令来查看那个线程正在执行这个程序:

ps aux |grep uwsgi

使用Nginx+uWSGI部署Django项目




sudo kill -9 13187 #13187指通过上述命令获取的pid,具体pid以您现场实时获取的为准


sudo kill -9 13188

注意不用杀死13190,也就是grep –clolor=auto uwsgi的进程。

②执行以下命令,启动uWSGI服务:

uwsgi --ini uwsgi_config.ini

六.本地打开

在本地电脑浏览器的地址栏输入http://<ECS实例的公网IP地址>,即可访问相关Django页面(此时页面应该是项目写的,下图是空项目):

使用Nginx+uWSGI部署Django项目

完结撒花!!!

注意:有时候报错是防火墙的问题,例如

[root@iZ2zebb87fppgc3m7eme6zZ ~]# curl -I http://127.0.0.1:8075 curl: (7) Failed to connect to 127.0.0.1 port 8075: Connection refused

此时检查防火墙:

sudo firewall-cmd –list-all

查看是否有此端口,若没有使用以下命令添加端口(3306端口):




[root@iZ2zebb87fppgc3m7eme6zZ ExamOnline]# sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent


Warning: ALREADY_ENABLED: 3306:tcp


success

重新加载防火墙以应用更改:

sudo firewall-cmd --reload

重新检查防火墙规则,确认3306端口已经添加:

sudo firewall-cmd --list-all

还有可能是实例的安全设置出方向没有设置。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...