瞬间心情愉悦,头发都少掉了几根!---Django+uwsgi+Nginx项目部署超详细步骤

瞬间心情愉悦,头发都少掉了几根!—Django+uwsgi+Nginx项目部署超详细步骤

先决条件

  1. 可以正常在本地运行的django项目
  2. 一台云服务器(阿里云、华为云等亲测均可)
  3. 域名(没有的话可以使用localhost)

坑:记得关闭防火墙,放行用到的端口。uwsgi和nginx的配置文件路径一定要写对。有问题评论区留言,华为云、阿里云实测可行。

步骤

本地运行测试

本地pychrm运行,没有任何问题,继续。

上传服务器

  1. 打开xmanager连接你的服务器

  2. 在根目录下创建一个文件夹mydata

    [root@iZuf6g4e6vhdv58sz2z1klZ mydata]# mkdir mydata [root@iZuf6g4e6vhdv58sz2z1klZ mydata]# pwd /mydata 
  3. 将项目上传到/mydata下

    [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# ls api  blogleev2  django.log  manage.py  __pycache__  static  uploads  uwsgi.ini [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# pwd /mydata/blogleev2 

环境安装

一台新的服务器都会自带两个版本的python,我们终端输入python是执行的python,输入python才是执行的python3,不过也有的是直接python3,反正就用python3绝对没错。

这里以Centos为例,其实都一样。此方法阿里云和华为云都已经成功部署。

  1. 安装宝塔面板

    宝塔官网找到对应版本的安装命令(这里是centos的,其他的自己去宝塔官网找一下即可):

    yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 

    中间有个确认输入y即可

  2. 宝塔安装完成后进入宝塔面板

    [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# bt ===============宝塔面板命令行================== (1) 重启面板服务           (8) 改面板端口 (2) 停止面板服务           (9) 清除面板缓存 (3) 启动面板服务           (10) 清除登录限制 (4) 重载面板服务           (11) 取消入口限制 (5) 修改面板密码           (12) 取消域名绑定限制 (6) 修改面板用户名         (13) 取消IP访问限制 (7) 强制修改MySQL密码      (14) 查看面板默认信息 (22) 显示面板错误日志      (15) 清理系统垃圾 (23) 关闭BasicAuth认证     (16) 修复面板(检查错误并更新面板文件到最新版) (24) 关闭谷歌认证          (17) 设置日志切割是否压缩 (25) 设置是否保存文件历史副本  (18) 设置是否自动备份面板 (0) 取消 =============================================== 请输入命令编号:14 =============================================== 正在执行(14)... =============================================== ================================================================== BT-Panel default info! ================================================================== 外网面板地址: http://你的公网ip:8888 内网面板地址: http://xxxx *以下仅为初始默认账户密码,若无法登录请执行bt命令重置账户/密码登录 username: xxx password: xxx  If you cannot access the panel, release the following panel port [8888] in the security group 若无法访问面板,请检查防火墙/安全组是否有放行面板[8888]端口 

    这样就得到了你的宝塔面板地址:http://你的公网ip:8888

    现在你是访问不了的,需要去你的服务器控制台打开8888端口放行才可以。(自行百度,很easy

    顺便把需要用到的端口都放行:

    80    Nginx监听端口 8000  django 8080  uwsgi 
  3. 访问宝塔

    这时,可以输入宝塔面板外网地址了,输入用户名和密码登入。

    刚一进去会提示让你安装东西,我们选择左边那个只勾选mysql5.6和nginx1.18即可。点击安装。

    让你注册账号登陆,注册一个登入就行啦。

  4. mysql配置

    安装完成后,

    • 宝塔面板中修改mysql的root密码,改为123(你要改为你的djano的settings.py中的配置的mysql的密码)

    • 去终端中创建一个数据库,名字为你的settings.py中配置的数据库名字

      [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# mysql -uroot -p Enter password:  Welcome to the MySQL monitor.  Commands end with ; or g. Your MySQL connection id is 1139 Server version: 5.6.50-log Source distribution  Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.  Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.  Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.  mysql> create database api; 

      我的settings.py的mysqp配置:

      DATABASES = {     'default': {         'ENGINE': 'django.db.backends.mysql',         'NAME': 'api',   # 创建的数据库名         'USER': 'root',         'PASSWORD': '123',   # 宝塔修改的密码         'HOST': '127.0.0.1',         'PORT': 3306,         'OPTIONS': {'charset': 'utf8mb4'},     } } 
  5. 安装django和uwsgi

    为了防止缺少依赖,先安装一下依赖包后再安装django和uwsgi。实测,不yum安装依赖会在安装uwsgi时报错。

    # 安装依赖 yum install -y python3 python3-pip python3-devel # 安装环境 pip3 insatll django==2.1.11 pip3 insatll uwsgi 

准备django程序

切记三点坑:放行端口、关闭防火墙、启动命令后不要输入本地回环地址(127.0.0.1)

  1. 先用django启动项目,看有fa无问题

    再说一遍:放行端口、关闭防火墙、启动命令后不要输入本地回环地址(127.0.0.1)

    # 关闭安全保护和防火墙 [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# setenforce 0 setenforce: SELinux is disabled [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# systemctl stop firewalld # 启动django [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# pwd /mydata/blogleev2 [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# ls api  blogleev2  django.log  manage.py  __pycache__  static  uploads  uwsgi.ini # 如果你的项目还有其他的包要装,就先装上。  # 数据库迁移 [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# python3 manage.py makemigrations [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# python3 manage.py migrate # 启动 启动命令后不要输入本地回环地址(127.0.0.1) [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# python3 manage.py runserver 0.0.0.0:8000 

    此时,浏览器访问:http://公网IP:8000

    即可看到你的项目,没有任何问题。

    现在就是,你一关闭shell窗口,项目立马停止。就不能访问了,我不能一直开着shell把。那怎么再静默状态下运行djano呢?uwsgi

  2. 用uwsgi启动django

    在你的项目文件根目录下创建uwsgi.ini和uwsgi.pid两个文件,如果不会命令格式可在宝塔面板中操作

    [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# pwd /mydata/blogleev2 [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# vim uwsgi.ini # 输入下面的配置文件,输入完后按esc推出输入模式,再按:后输入wq回车 [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# vim uwsgi.pid # 直接按esc推出输入模式,再按:后输入wq回车,这是一个空白文件 

    配置文件

    [uwsgi] http = :8080  # 这里先使用http测试uwsgi是否正常工作,后边正式部署会改成socket chdir = /mydata/blogleev2     # 项目路径要把持一致,看你自己创建的路径 # uwsgi的文件 wsgi-file = blogleev2/wsgi.py  # django的wsgi文件位置,从上边的chdir下开始找 # 虚拟环境  我们没有用到 # virtualenv = /root/env # 进程个数 processes = 4 # 线程个数 threads = 2 # 关闭的情况下后台运行,制定输出的日志位置 daemonize = /mydata/blogleev2/django.log # 清除临时文件 vacuum = true # python文件发生改变自动重启 py-autoreload = 1 

    启动django

    [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# pwd /mydata/blogleev2 # 用uwsgi启动django [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# uwsgi --ini uwsgi.ini 

    此时,浏览器访问:http://公网IP:8080

    会看到项目启动,但是没有静态文件。这是因为uwsgi找不到你的静态文件路径。

    添加静态文件设置:

    # 先在配置文件中加入: [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# vim blogleev2/settings.py  # 末尾追加,迁移后的文件名static STATIC_ROOT = os.path.join(BASE_DIR, 'static')  # 迁移静态文件 [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# python3 manage.py collectstatic 

    静态文件迁移后,重启uwsgi

    # 停止 [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# uwsgi --stop uwsgi.pid # 启动 [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# uwsgi --stop uwsgi.ini 

    浏览器访问:http://公网IP:8080

    ok,全部可以啦,没毛病。

    我们现在时可以访问了,但是他会暴露端口,而且输入也不方便。并且uwsgi主要是用来启动django的,对静态文件处理能力不足。怎么办?Nginx

  3. 结合nginx转发静态文件

    之前通过宝塔面板安装了Nginx,它安装时多管闲事,把nginx默认的给重命名为:nginx.conf.default,然后自己创建了一个nginx.conf,这个太不好用(经验之谈)我们直接把他干掉,然后把nginx.conf.default重命名为nginx.conf这样原始的配置文件就生效了

    # 文件路径 /www/server/nginx/conf/nginx.conf /www/server/nginx/conf/nginx.conf.default 

    打开配置文件,增加一个server,与原先的server并行。

    # 原先的server可以干掉,你没有域名的话,把server_name改为localhost # 增加的server server    {         listen 80;         server_name www.liboer.top liboer.top;  # 你的域名,国内需要备案后才可访问         location / {           # 跳转到8080           include uwsgi_params;           uwsgi_pass 127.0.0.1:8080;         }         # 静态文件         location /static {           root /mydata/blogleev2;         }     } 

    把uwsgi的http改为socket

    socket = :8080  # 这里先使用http测试uwsgi是否正常工作,后边正式部署会改成socket 

    此时重启nginx和uwsgi

    [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# nginx -s stop [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# uwsgi --stop uwsgi.pid [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# nginx [root@iZuf6g4e6vhdv58sz2z1klZ blogleev2]# uwsgi --ini uwsgi.ini 

    有域名浏览器访问:域名

    or

    无域名配置,浏览器访问:公网ip

    瞬间心情愉悦,头发都少掉了几根!

完美解决!

独学而无友,则孤陋寡闻。

​ —大聪明Smart