Django2.2 + uwsgi + Nginx+python3 的生产环境部署

Nginx搭建Django

使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了。比如静态文件处理,安全,效率等等,本篇文章总结归纳了一下基于uwsgi+Nginx下django项目生产环境的部署

环境

ubuntu 16.04
python3.5+
nginx1.10
django2.2

一,在本地安装搭建Django项目

> python3 manage.py runserver
> 确认启动正常

二,安装uwsgi

1.安装uwsgi
sudo pip3 install uwsgi --upgrade

2.安装完成后使用命令测试
先进入项目目录,启动命令
uwsgi --http :8080 --chdir /home/yc/web/  --module web.wsgi
# --home 指定virtualenv 路径,如果没有可以去掉。web.wsgi 指的是 web/wsgi.py 文件

3.访问测试,启动成功后
127.0.0.1:8080

三,配置uwsgi文件启动项目

第一步:创建一个uwsgi.ini文件

第二步:在django项目同级目录创建script目录,用于存放配置脚本等等
/home/yc/web/
    script/  web/ db.sqlite3 manage.py uwsgi.ini

第三步:编辑uwsgi.ini文件内容如下: 目录参考个人目录进行修改
# uwsig使用配置文件启动
[uwsgi]
# 项目目录
chdir=/home/yc/web/
# 指定项目的application
module=web.wsgi:application
# 指定sock的文件路径       
socket=/home/yc/web/script/uwsgi.sock
# 进程个数       
workers=5
pidfile=/home/yc/web/script/uwsgi.pid
# 指定IP端口       
http=127.0.0.1:8080
# 指定静态文件
#static-map=/static=/home/yc/web/static
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 启用主进程
master=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/home/yc/web/script/uwsgi.log
第四步:执行命令,启动项目测试
uwsgi --ini uwsgi.ini
在浏览器访问127.0.0.1:800

四,安装nginx

1.安装nginx
sudo apt-get install python-dev nginx

2.安装完成后,可以使用localhost测试访问

3.创建项目的配置文件,或者直接修改原nginx配置文件都可以
vim /etc/nginx/sites-available/webtest.conf
server {
    listen      80;
    server_name www.pyabc.com;
    charset     utf-8;
 
    client_max_body_size 75M;

    location / {
        uwsgi_pass  unix:///home/yc/web/script/uwsgi.sock;
        include     /etc/nginx/uwsgi_params;
    }
    
    #location /media  {
    #    alias /path/to/project/media;
    #}
 
    #location /static {
    #    alias /path/to/project/static;
    #}
 
}
4,创建完配置文件后创建软连接
sudo ln -s /etc/nginx/sites-available/webtest.conf /etc/nginx/sites-enabled/webtest.conf

5.执行配置文件
sudo a2ensite myproject.conf

6.启动nginx,重新加载配置文件
nginx -s reload

重启后如果访问成功则ok

出现的几个问题

1,我在nginx中给项目配置了一个域名
 server_name www.pyabc.com;
 那么对应的在host文件中需要有这个域名配置
 /etc/hosts
 127.0.0.1 www.pyabc.com

2.注意在nginx的配置中uwsgi_pass这一项
uwsgi_pass  unix:///home/yc/web/script/uwsgi.sock;
它需要找到你在启动uwsgi后的sock文件,并且要注意权限


3.在使用uwsgi --ini uwsgi.ini启动后会创建 .sock文件
那么在后面更新代码时不需要把 script目录下的文件都删除
只需要重启即可
uwsgi --reload xxx.pid
经验分享 程序员 微信小程序 职场和发展