django项目部署(linux)
1.安装uwsgi
uwsgi在windows系统上安装会失败,一般都用于linux系统
pip install uwsgi
- 这个uwsgi非常重要,不然后面搞什么都弄不清楚,他就跟平时开发时用的python manage.py runserver一个概念,开启服务,其实在服务器上就runserver运行,通过ip地址同样可以访问django编写的网站或接口,只不过性能较弱而已,但是runserver占用的系统资源要远大于uwsgi!
2. uwsgi配置文件
在django主目录下创建uwsgi配置文件,为了不与uwsgi启动命令混淆,配置文件我取名为drf.ini;为了django项目目录与主目录(有settings.py那个)不混淆,我项目目录取名为django-drf,主目录取名为test_drf,以下为配置文件
#添加配置选择
[uwsgi]
# 127.0.0.1/0.0.0.0/云服务器的内网ip都可以
# http和socket二选一,直接启动用http
#http = :8000
#配置和nginx连接用socket,注意这个端口号9000不是后端启动端口,而是socket的端口
socket= 127.0.0.1:9000
#配置项目路径,项目的所在目录
chdir=/root/project/django-drf
#配置wsgi接口模块文件路径,也就是wsgi.py这个文件所在的目录名
wsgi-file=test_drf/wsgi.py
#配置启动的进程数
processes=2
#配置每个进程的线程数
threads=2
#配置启动管理主进程
master=True
#配置存放主进程的进程号文件
pidfile=drf.pid
#配置dump日志记录
daemonize=drf.log
# python路径(虚拟环境一定要指定虚拟环境路径,不然会找默认解释器)
pythonpath = /root/venv/djangoenv/lib/python3.8/site-packages
3. uwsgi操作
操作drf.ini配置文件要指定文件路径,当前目录下操作直接用以下
- 注意:如果是虚拟环境一定要在激活虚拟环境下执行
- 启动服务
uwsgi --ini drf.ini
- ps -ef | grep uwsgi查看一手,这个就是配置文件中的一个主进程master=True,开启2个进程processes=2,有点像nginx的一个master带2个worker
root 10092 1 0 00:11 ? 00:00:04 /root/venv/djangoenv/bin/uwsgi --ini drf.ini
root 10116 10092 0 00:13 ? 00:00:00 /root/venv/djangoenv/bin/uwsgi --ini drf.ini
root 10117 10092 0 00:13 ? 00:00:00 /root/venv/djangoenv/bin/uwsgi --ini drf.ini
root 11575 11481 0 21:40 pts/0 00:00:00 grep --color=auto uwsgi
- netstat -nltp 查看一手,其中有如下结果,监听的是9000端口号,其实这个时候你配置为socket套接字的话,服务是开启了,要想访问要借助于nginx
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 10092/uwsgi
- 重启服务
uwsgi --reload drf.pid
- 停止服务
uwsgi --stop drf.pid
4. nginx配置
老规矩,nginx.conf不动他,在conf.d下面新建一个drf.conf的文件,丢以下进去
server {
listen 8000;
server_name loacalhost; #域名或者Ip
charset utf-8;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9000; #端口要和uwsgi里配置的一样
}
}
此时应该就可以了,如果报错有可能是端口号占用kill -9杀了就行,没有报错访问不到可能是云服务器防火墙没有开你nginx监听的端口号,到控制台打开即可,我知道阿里云默认给你开启的好像是22 80 443 这几个常用的.
5. 其实单独部署django项目linux系统比windows系统IIS服务器简单,只不过一直以来习惯了windows系统,linux系统可能操作上不熟悉导致失误报错找不到头.我的习惯都是以最简单的方式先实现基本功能,因此总结以下思路就是:
- uwsgi代替runserver后台启动django项目 -> uwsgi启动的django项目通过socket转发到nginx -> 再通过nginx代理转发出去(可以看做是优化后的runserver的全过程)