【Django部署】Django+uwsgi+nginx

916 阅读4分钟

前言

部署项目时经历了多次失败,结合网上的资料时终于成功了
参考自 :
django 项目部署详细教程 【uwsgi + nginx】
Django + Uwsgi + Nginx 的生产环境部署

1.目录树:

Desktop
	Django_project
		——forumend # 项目根目录
			——forumend  
				——settings.py
				——uwsgi.py
			——manage.py 
			——statics # 静态资源目录
			——media # 项目的媒体文件目录
			——requirements.txt #该项目所需要的包,要提前写好
		——uwsgi.ini
		——uwsgi.log
		——uwsgi.pid
		
虚拟机上的Django项目结构树,如图把项目放到虚拟机桌面上

2.连接虚拟机

使用工具:xshell,xftp
1:虚拟机下载sshd

sudo apt-get update
sudo apt-get install ssh  #下载 sshd
sudo service sshd start   # 开启 sshd
ps -e|grep ssh            # 查看运行状态

2:使用xshell连接虚拟机
首先需要查看虚拟机的ip,命令为ipconfig 最后进行连接,注意用户名和密码是就是虚拟机的用户名和密码

3.下载python3.9

虚拟机需要有python环境以及pip3

sudo apt-get install python3.9   #下载python3.9
sudo apt-get install python3-pip #下载pip3

4.项目部署

虚拟机创建Dajngo_project目录,使用xftp把项目拖进该目录,结构如同上面的目录树. (注意删除.idea和venv)
在Ubuntu中下载libmysqlclient-dev:

sudo apt-get install libmysqlclient-dev  # 安装完这个之后面在安装mysqlclient时不会出错

安装项目所需要的包,项目中有requirements.txt,执行:

pip install -r requirements.txt
"""
注意,一般来讲项目含有redis以及mysql,因此我的requirements.txt一般是以下内容:
	PyJWT~=1.7.1
    Django~=3.2.13
    celery~=5.0.5
    djangorestframework~=3.13.1
    PyMySQL==1.0.2
    django-cors-headers==3.11.0
    django-filter==21.1
    django-redis==4.11.0
    django-timezone-field==4.2.3
    djangorestframework-simplejwt==5.1.0
    mysqlclient==2.1.0
    redis==3.5.3
    uwsgi==2.0.18
"""

这时候可以看看项目是否能跑成功了,在虚拟机项目根目录下执行:

python manage.py runserver

在部署前,对项目的settings文件进行更改:

# settings.py

# 表示关闭Debug功能,并且允许所有主机访问
DEBUG = False
ALLOWED_HOSTS = ['*']

5.使用uwsgi

首先下载uwsgi:

wget https://projects.unbit.it/downloads/uwsgi-2.0.17.1.tar.gz # 下载
tar -zxvf uwsgi-2.0.17.1.tar.gz                                # 解压
cd uwsgi-2.0.17.1                                              # 进入解压出来的文件包
python3 setup.py install                                       # 配合python3指令进行安装

在Django_project目录下,创建文件uwsgi.ini,配置如下:

[uwsgi]
# 使用nginx链接时使用
# socket=127.0.0.1:8000
# 直接做web服务器使用 python manage.py runserver ip:port
http=127.0.0.1:8000
# 项目目录 [pwd查看 直接填,不需要引号]
chdir=/home/pyplsp/Desktop/Django_project/forumend
# 项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=forumend/wsgi.py
# 指定启动的工作进程数
processes=4
# 指定工作进程中的线程数
threads=2
# 进程中,有一个主进程
master=True
# 保存启动之后主进程的pid
pidfile=uwsgi.pid
# 设置uwsgi后台运行, uwsgi.log 保存日志信息
daemonize=uwsgi.log

注意:现在用的是http=127.0.0.1:8000而不是socket=127.0.0.1:8000,假如最后要加上nginx服务的话就要使用socket=127.0.0.1:8000

最后启动uwsgi:

uwsgi --ini uwsgi.ini
其他的uwsgi命令:  

启动: uwsgi --ini 配置文件路径  
    例如: uwsgi --ini uwsgi.ini  
停止: uwsgi --stop uwsgi.pid的路径  
    例如: uwsgi --stop uwsgi.pid  
查看 uwsgi 进程:  
    ps aux | grep uwsgi  

启动后就可以打开网页或者接口了(可以看到我事先写好了test视图)

image.png

6.下载nginx

由于我用的是 Ubuntu20.04,系统会自带apache服务占用80端口,因此需要对apache进行卸载

sudo apt remove apache2              # 删除apache2
sudo update-rc.d -f  apache2 remove  # 将链接到 apache2 的所有运行级别文件夹被删除。

另外把 /var/www/html 下的 index.html 文件删了

下载 nginx:

sudo apt update         
sudo apt install nginx         # 下载nginx
sudo systemctl status nginx    #查看nginx运行状态
sudo ufw allow 'Nginx Full'    # 配置防火墙

一般来讲要关闭防火墙,关于防火墙详见 Ubuntu中Nginx防火墙设置 启动nginx,打开虚拟机ip地址能看见nginx的欢迎界面

7.使用nginx

现在需要结合DJango+uwsgi+nginx 首先对uwsgi.ini的配置文件进行修改 ( 主要在于注释掉 http ,写入 socket )

[uwsgi]
# 使用nginx链接时使用
socket=127.0.0.1:8000
# 直接做web服务器使用 python manage.py runserver ip:port
# http=127.0.0.1:8000
...

在目录 /etc/nginx/conf.d/ 下创建forumend.conf(这个文件的名字随意,最好是与自己的项目文件有关) forumend.conf写下如下配置:

server {
    listen 8888;  # 端口号
        server_name 192.168.126.131; #服务ip,为虚拟机的ip地址 ( 使用ifconfig可以查看 )
        charset utf-8;
        client_max_body_size 75M;
    location /static {
    	# 这个说明了前端访问的静态请求的文件夹
        # 进行了这样配置后,用户访问 192.168.126.131:8000/static/xxx.png
        # 相当于访直接通过 nginx 访问下面的路径下的xxx.png
        alias /home/pyplsp/Desktop/Django_project/forumend/statics;
    }
    location / {
        uwsgi_pass 127.0.0.1:8000;        # 与 uwsgi.ini 的 socket 配置一致
        include /etc/nginx/uwsgi_params;
    }
}

配置完后再次启动nginxuwsgi

systemctl restart nginx # 启动nginx
uwsgi --ini uwsgi.ini   # 启动uwsgi

在浏览器访问 http://192.168.126.131:8888/... 即可.

image.png

8.nginx一些命令

转载自知乎文章 :nginx启动、退出、重启

启动nginx:
	service nginx start
	systemctl start nginx # 如果是基于systemd的版本,例如Ubuntu Linux 16.04LTS及更高版本,则可以使用
停止nginx:
	service nginx stop
	systemctl stop nginx
退出nginx:
	service nginx quit
	systemctl quit nginx
重启nginx:
    service nginx restart
    systemctl restart nginx
重新加载nginx:
	# 修改配置后使用本命令可以使配置生效
    service nginx reload  
    systemctl reload nginx
查看nginx服务状态:
	service nginx status
	systemctl status nginx
测试Nginx配置:
	# 修改配置reload后看服务启动是否正常
	nginx -t
检查Nginx版本:
    service nginx -v
    systemctl -v nginx
显示命令帮助:
    service nginx -h
    systemctl -h nginx

9.项目更新

当更新项目并上传到虚拟机时,注意对项目的settings.py进行更改,比如Mysql,Redis的配置