Linux下Nginx+uwsgi部署Django项目
前言
Hey,大家好呀,我是码农,星期八!
通常情况下,要求不是太苛刻的,不是鸡蛋里挑骨头的需求,为了快和方便!
使用Python
的web
框架Django
是一个不错的选择!
但是默认情况下,直接跑性能是很差的!需要借助其他方式,提高性能!
一般在Linux系统下,采用的方式为Nginx+uwsgi+Django
。
项目
项目已经放在了gitee上!
备份的sql文件也在上面,导入即可!
gitee地址:https://gitee.com/stark3000/luffy_crm
环境依赖
# 采用miniconda创建python环境
# conda版本为:4.8.3
# 创建的python虚拟环境版本为:python 3.6.6
# 依赖包
PyMySQL==0.9.2
Django==2.1.5
注意事项
Django在部署时,一定要修改settings.py
里的俩个参数。
还有Mysql配置!
Nginx Django静态文件配置
前奏
在开发情况下,我们所用到的静态文件!
是可以放在每个app
的static
文件夹下!
项目
app01
static
app02
static
app03
static
但是在部署时,可不能这么玩,因为通常在只让Ngxin
指定一个静态资源目录!
如果在指向每个app
下的static
,那就太累了,而且不确定性太多!
所以,需要有一个什么办法,能将所用到的静态资源,自动的收录到一个静态目录,然后Nginx
直接指向它就行
配置settings.py
,添加以下参数!
配置
STATIC_URL = '/static/'
# 必须的
STATIC_ROOT = os.path.join(BASE_DIR, "static")
# 不是必须的,不写就行
# STATICFILES_DIRS = (
# os.path.join(BASE_DIR, 'static'),
# )
截图
别忘了在项目根目录下创建一个static
文件夹!
迁移静态文件
还好Django提供有自动迁移命令,会将用到的静态文件自动迁移到<项目>/static
下!
命令
python manage.py collectstatic
执行结果
<项目>/static图
小总结
开发的时候开启debug调试模式,每个应用app的静态文件放在各自的app目录下!
部署的时候关闭debug调试模式,使用Nginx
访问静态文件,但是需要提前迁移静态文件!
服务端拉取项目,并且测试运行
拉取项目
git clone https://gitee.com/stark3000/luffy_crm.git
测试运行
python manage.py runserver 0.0.0.0:8000
访问
http://42.192.79.238:8000/login/ # 登录
账号:日天,密码:123
登录后自动跳转http://42.192.79.238:8080/index/
截图
出现这个表示成功,目前只是没静态文件,问题不大,因为DEBUF=False
!
注意事项
我采用的是使用conda创建虚拟环境,,并且安装的依赖包。
如何将项目安装依赖包,如何运行,这里不作详细举例!
使用uwsgi
安装
pip install uwsgi
查看uwsgi版本
uwsgi --version
图片
测试uwsgi是否成功
新建一个uwsgi_test.py
文件,并且内容如下
def application(env,start_response):
start_response('200 OK',[('Content-Type','text/html')])
return [b"hello,uwsgi"]
执行命令
uwsgi --http :8001 --wsgi-file uwsgi_test.py
执行结果
游览器访问http://42.192.79.238:8001/
返回这个表示ok,代表uwsgi
问题不大!
uwsgi+Django
测试uwsgi
成功之后。
那就需要想如何先把uwsgi+Django
组合拳打好。
首先,在需要部署的Django项目目录下,就是和manage.py
的那个目录。
新建一个uwsgi_config
文件夹,用于存放uwsgi
相关配置和运行日志。
然后cd uwsgi_config
uwsgi.ini
然后在uwsgi_config
文件夹下创建一个uwsgi.ini
文件,内容如下!
[uwsgi]
# 指定IP端口,ip为内网ip,如果是云服务器,是云服务器内网ip
# http可以直接访问,socket是让Nginx指定的
http = 172.17.0.3:8080
# 项目目录,和manage.py同级的目录
chdir = /root/web_project/luffy_crm
# 启动主进程,来管理其他进程
# 其它的uwsgi进程都是这个master进程的子进程
# 如果kill这个master进程,相当于重启所有的uwsgi进程
master = true
# 加载一个WSGI模块,这里加载wsgi.py这个模块
# 通常是在<django项目>/<和项目同名文件夹>/wsgi.py
# 但是如果chdir指定了项目绝对路径,只需要写<和项目同名文件夹>/wsgi.py
module = luffy_crm.wsgi
# 启动多少个进程,和核心数一样就行
processes = 1
# 每个进程最大的请求数
max_requests = 1000
# 运行的日志,通常放在 uwsgi_config 下
daemonize = /root/web_project/luffy_crm/uwsgi_config/run.log
## 自动移除unix Socket和pid文件当服务停止的时候
vacuum = true
# 如果使用的是虚拟环境, 需要指定 pythonpath
# 如果是激活的是虚拟环境,使用命令:pip show django|grep -i location 即可得到
pythonpath = /root/miniconda/envs/luffy_crm/lib/python3.6/site-packages
# 指定pid文件,用于重启和停止,通常放在 uwsgi_config 下
pidfile = /root/web_project/luffy_crm/uwsgi_config/uwsgi.pid
# 启用线程
enable-threads = true
#设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,
# 等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,
# 如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)
reload-mercy = 8
参数注意事项
http 或 socket参数
第三行参数的可以是socket
,也可以是http
。
如果只是测试uwsgi+django
是否成功,可以先设置成http
。
如果是Nginx+uwsgi+Django
,尽可能将第三行参数改成socket
,好像性能更高!
上述是http
,在Nginx+uwsgi
时,会修改成socket
,不在叙述!
ip注意事项
如果是阿里云或者腾讯云等云服务器。
第三行参数ip设置是不能设置成127.0.0.1
的,127.0.0.1
应该替换成云服务器的内网ip。
不建议设置成0.0.0.0
,可能会有风险。
pythonpath 参数
现在在部署时,一般采用的是虚拟环境进行环境隔离。
这时候uwsgi.ini
是需要指定pythonpath
的。
要不然使用的是系统默认的python解释器,会有各种各样的问题。
如果需要获取当前激活的虚拟环境pythonpath
命令
pip show django|grep -i location
结果
Location就是pythonpath
的值。
uwsgi启动项目
经过上述配置,如果不是玄学的话,是可以启动的。
uwsgi
通过uwsgi.ini
启动Django
项目命令:
uwsgi --ini uwsgi.ini
执行结果
出现这表示成功!
查看日志
ini
文件是配置了日志的,注意看!
这样,表示成功!
验证
打开游览器,输入http://42.192.79.238:8080/index/
ok,没有问题!
uwsgi启动,重启,停止
# 启动
uwsgi --ini uwsgi.ini
# 重启
uwsgi --reload uwsgi.pid
# 停止
uwsgi --stop uwsgi.pid
# 停止 kill方式,硬核停,然后再启动
sudo pkill -f uwsgi -9
小总结
其实还是可以发现,还是没有静态文件!
这其实很正常,uwsgi并没有处理静态文件的能力,即使能是实现,能力也不是太好!
通过上述方式,成功的启动了将uwsgi+Django
组合拳打好!
下一步就要开始Nginx+uwsgi+Django
!
Nginx+uwsgi+Django
安装Nginx
安装不做叙述,我是用的是phpstudy集成环境安装的Nginx。
使用的是Nginx1.9
版本!
配置uwsgi_params
创建一个uwsgi_params
文件,还是放在uwsgi_config
文件夹下,内容如下!
固定内容,不用管它!
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
截图
配置Nginx
记得在这时,需要将uwsgi.ini
的http
改为socket
,重启uwsgi
,然后再继续配置Nginx
。
server {
# 监听
listen 8005;
# 写项目名就行
server_name luffy_crm;
location / {
# 这里的ip和port和uwsgi.ini一样,注意内网IP是云服务器的内网ip
uwsgi_pass 172.17.0.3:8080;
# 加载 uwsgi_param,
include /root/web_project/luffy_crm/uwsgi_config/uwsgi_params;
}
# 配置静态文件目录
# 需要迁移静态文件,上述已经写过
location /static {
alias /root/web_project/luffy_crm/static;
}
}
完整配置
worker_processes auto;
# user一定要是root,要不然静态资源会失败
user root;
error_log logs/error.log;
events {
use epoll;
worker_connections 1024;
multi_accept on;
}
http {
server {
# 监听
listen 8005;
# 写项目名就行
server_name luffy_crm;
location / {
# 这里的ip和port和uwsgi.ini一样,注意内网IP是云服务器的内网ip
uwsgi_pass 172.17.0.3:8080;
include /root/web_project/luffy_crm/uwsgi_config/uwsgi_params;
}
# 配置静态文件目录
# 需要迁移静态文件,上述已经写过
location /static {
alias /root/web_project/luffy_crm/static;
}
}
lua_package_path "/www/common/waf_lua/?.lua;;";
include mime.types;
gzip on;
gzip_buffers 16 8k;
gzip_comp_level 2;
gzip_min_length 8k;
gzip_types text/plain application/javascript text/css;
keepalive_timeout 65;
client_body_buffer_size 8m;
client_header_buffer_size 32k;
client_max_body_size 50m;
include /usr/local/phpstudy/vhost/sys/nginx/*.conf;
include /usr/local/phpstudy/vhost/nginx/*.conf;
}
注意事项
配置注意事项!
- 第三行参数一定要是user root,要不然会引起403。
- server要放在http中!
配置完成
如果上述不出意外,并且开启了Nginx,最终结果如下!
总结
Django在Linux下部署,通常采用Nginx+uwsgi+Django
。
上述项目已经放在了gitee上,导出的sql文件也在。
其实这个过程并不是太难,但是还是有些繁琐的,但是相对来说还不是太难,细心点还是可以的!
值得注意的是,uwsgi.ini
在和Nginx
使用时,需要将http
改为socket
!
其他的话,问题不大!
越努力,越幸运。
如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。
我是码农星期八,如果觉得还不错,记得动手点赞一下哈。
感谢你的观看。