前言
部署项目时经历了多次失败,结合网上的资料时终于成功了
参考自 :
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视图)
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;
}
}
配置完后再次启动nginx与uwsgi
systemctl restart nginx # 启动nginx
uwsgi --ini uwsgi.ini # 启动uwsgi
在浏览器访问 http://192.168.126.131:8888/... 即可.
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的配置