• ubuntu 20.04.4+uWSGI+Nginx安装部署Django+Vue的web前后端全过程记录(1)



    本文的安装部署完全在虚拟机中进行,是对后续在云端部署的演练。(windows10+ubuntu 20.04.4 )

    基本命令行

    Django创建超级用户命令

    python manage.py createsuperuser
    
    • 1

    安装虚拟环境及配置路径

    1. 查看当前ubuntu版本
    uname -a
    
    • 1

    Linux andy-virtual-machine 5.15.0-52-generic #58~20.04.1-Ubuntu SMP Thu Oct 13 13:09:46 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

    1. 查看当前ubuntu中自带的python版本
    type python python2 python3
    
    • 1

    bash: type: python: not found
    bash: type: python2: not found
    python3 is /usr/bin/python3

    1. 安装python3的pip
    sudo apt-get install python3-pip
    
    • 1
    1. 安装虚拟环境
    sudo pip install virtualenv
    sudo pip install virtualenvwrapper
    
    • 1
    • 2
    1. mkvirtualenvcommand not fonud (需要配置环境变量)
    mkdir $HOME/.virtualenvs        --->HOME目录下创建文件用来存放虚拟环境
    
    • 1

    或者在HOME目录下

    mkdir .virtualenvs 
    
    • 1
    1. 在管理员文件夹andy下用 vi .bashrc 打开文件(否则在其他路径下vi ~/.bashrc)。文件末尾添加如下三行。(:wq保存,a追加写入,G定位末行,Shift+Insert粘贴,dd删除当前行)
    export VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3'
    source /usr/local/bin/virtualenvwrapper.sh
    
    • 1
    • 2

    在这里插入图片描述

    1. 加载.bashrc文件
      source ~/.bashrc
      到这里虚拟环境配置完成。以下是虚拟环境基本命令

    虚拟环境基本命令

    1. 创建虚拟环境
     mkvirtualenv -p python3 blog
    
    • 1
    1. 查看已有的虚拟环境
    workon
    
    • 1
    1. 使用已有的虚拟环境
    workon virtueName
    
    • 1
    1. 退出已有的虚拟环境
    deactivate
    
    • 1
    1. 删除已有的虚拟环境
    rmvirtualenv  virtueName
    
    • 1

    在这里插入图片描述

    Xftp和FileZilla连接本地虚拟机

    查看虚拟机本地地址

    192.168.80.128
    
    • 1

    在这里插入图片描述

    在使用sftp连接时,filezilla与虚拟机之间是通过ssh连接,所以需在虚拟机上安装ssh-server。

    中间连不上怀疑是防火墙的问题
    查看防火墙是否打开

    sudo ufw status
    
    • 1

    inactive 表示没有打开

    [sudo] password for andy:
    Status: inactive

    Ubuntu上安装ssh-server指令:

      sudo apt-get install openssh-server 
    
    • 1

    在这里插入图片描述

    安装完成后进行连接,这里的用户名和密码是虚拟机的用户名和密码
    在这里插入图片描述

    连接成功,开始传输文件

    这里使用最low的传输方式,直接将项目拖入项目的/home/andy/Documents目录中,(看别人都是拖进/var/www/),然后开始部署后端。
    好像可以用git直接从gitee上拉取项目,这种方式也便于后面的维护
    在这里插入图片描述

    部署Django

    1. 运行在指定虚拟环境下(避免日后项目之间相互影响)
    workon pvCal
    
    • 1
    1. 进入到项目运行文件夹。

    (查看当前所在目录的绝对路径)

    pwd 
    
    • 1
    cd ../          //返回上一级目录
    cd Document     //进行Document目录
    
    • 1
    • 2
    1. 先试试能不能运行项目
    Python manage.py runserver
    
    • 1

    在这里插入图片描述
    没有Django包,那就下载
    以下直接列出项目其他需要的库(这里通过Python manage.py runserver来尝试缺失哪些包,但应该可以更快的方法,将需要的包写入个req.txt文件,然后pip install -r req.txt应该也行)

    pip install django
    pip install pymysql
    pip install djangorestframework
    pip install django-cors-headers
    
    • 1
    • 2
    • 3
    • 4

    连接数据库

    最后是连接数据库失败,解决它
    在这里插入图片描述
    下载数据库(这边我没有进入虚拟环境下载,直接下载了)

    sudo apt-get install mysql-server
    
    • 1

    在安装完数据库之后,我们需要用系统生成的用户名和密码登录mysql,这样在后面对数据库操作时,不容易产生错误。
    在下面的文件中找到用户名和密码

    cat /etc/mysql/debian.cnf
    
    • 1
    有可能没有打开文件的权限

    切换成root用户,设置密码

    sudo passwd root
    
    • 1

    su命令进入到root用户就可以访问了。后续如果登录不了,就用这里的用户和密码登录
    比如:

    mysql -uxxxxxxx(用户) -pXXXXXXXXXX(密码)
    
    • 1

    在这里插入图片描述
    查看数据库状态

    systemctl status mysql.service
    
    • 1

    是死的
    在这里插入图片描述
    mysql服务启动和停止

    #停止
    sudo service mysql stop
    #启动
    sudo service mysql start
    
    • 1
    • 2
    • 3
    • 4

    进入数据库

    mysql -u root -p  
    
    • 1

    这里刚开始输入任意密码都可以进入
    在这里插入图片描述
    进入后创建一个root新用户:

    CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码';    
    create user 'root'@'%' identified by '123';   //示例
    
    • 1
    • 2

    如果出现下面报错,改成反引号。

    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘E USER failed for ‘root’@’%’
    create user ‘andy’@‘%’ identified by ‘admin123’’ at line 1

    create user `andy'@`%` identified by `admin123`;   //示例 输入反引号
    
    • 1

    查看当前mysql所有用户:

    select user,host from mysql.user;
    
    • 1

    在这里插入图片描述
    对于host的解释如下

    %允许来自任何ip的连接
    localhost允许本机的连接

    由于我们要通过本地的workbench将本地的数据导入到云服务器中,所以需要对这个root用户设置可以远程传输数据的权限。使用如下命令:

    grant all on *.* to 'andy'@'%' with grant option;   //授权
    //  mysql>GRANT ALL PRIVILEGES ON *.* TO 'andy'@'%' IDENTIFIED BY 'admin123' with grant option;
    flush privileges;   //刷新权限
    
    • 1
    • 2
    • 3
    到这里还没结束

    别急还差一个配置
    在这里插入图片描述

    开启Mysql远程连接的权限
    1. 修改mysql(ubuntu指令安装)配置文件/etc/mysql/mysql.conf.d/mysqld.cnf
      这里用的是root用户打开mysqld.cnf文件才是可更改的。 我是先进入该文件夹内然后打开的文件
      在这里插入图片描述
    2. 将其中bind-address = 127.0.0.1改为bind-address = 0.0.0.0
      默认情况下, bind - address 的值为 127.0.0.1 ,所以只能监听本地连接。我们需要将这个值改为远程连接 ip 可访问,可使用通配符 ip 地址 *::0.0.0.0 ,当然也可以是单独的固定 ip,这样就仅允许指定 ip 连接,更加安全。
    3. 修改完配置之后,执行命令sudo systemctl restart mysql马上进行重启
    4. 这里要再提一下vi操作。(不拓展了,就展示我在这里用到的操作)

    命令模式:x删除光标所在当前字符
    进入编辑模式:按i: 光标和内容 没有变化进入编辑模式
    输入模式::wq,保存退出。完美

    在这里插入图片描述

    一些可能发生的报错
    端口占用

    这里通过下面命令测试端口是否在使用。
    tcp端口测试 确保服务器开启了端口监听,否则开放了端口也连接不到。(所以端口监听和开放是两回事儿)

     netstat -tunlp | grep 3306		#查看端口是否被占用
     '''
      -t (tcp) 仅显示tcp相关选项
     -u (udp)仅显示udp相关选项
     -n 拒绝显示别名,能显示数字的全部转化为数字
     -l 仅列出在Listen(监听)的服务状态
     -p 显示建立相关链接的程序名
     '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    远程连接

    我在修改完mysqld.cnf配置之后,仍然链接不到虚拟机的Mysql,然后启动虚拟机中的mysql服务也会出错而启动不了,也会出现如下错误。

    ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’

    网上说需要给某个文件添加软链接啥的,但是我文件路径中的文件都是不存在的。

    隔了一天之后,我才想:在mysql配置中我只改过这个bind-address地址,会不会是它出问题了。然后我就把它改回去了,重新启动mysql。运行成功!之后再改成0.0.0.0,重新启动。然后就成功在本地远程连接到了虚拟机的数据库!!!!
    在这里插入图片描述
    连接成功后,我们下一步将在workbench中对数据库进行复制迁移(从本地复制到虚拟机中)
    在这里插入图片描述

    迁移本地数据库到虚拟机(workbench操作:点点点)

    目前知道两种
    本地未连接虚拟机数据库(远程数据库):在本地workch导出sql文件,然后用Xftp发送到虚拟机中导入,在ubuntu中导入sql。

    本地连接虚拟机数据库(远程数据库)
    1. 点击【database】菜单,然后选择【schema transfer wizard…】
      在这里插入图片描述

    2. 点击下方的【start wizard】
      在这里插入图片描述

    3. 选择源数据库服务器连接和目标数据库服务器连接
      在这里插入图片描述

    4. 点击下方的【test connectiton】,测试两个连接是否正常,然后点击【next】

    5. 勾选要复制的数据库实例,然后点击【start copy】
      在这里插入图片描述

    6. 系统显示复制进度,结束后点击【next】

    7. 点击【finished】,此时跨服务器的数据库实例复制就完成了

    ubuntu验证数据库是否导入
    1. 进入mysql
    2. show databases
    3. select * from table
      在这里插入图片描述

    运行Django

    补充一个库
    python manage.py runserver
    
    • 1

    然后报错,还得再下载一个库
    在这里插入图片描述

     pip3 install cryptography -i https://pypi.douban.com/simple
    
    • 1

    然后成功运行

    Django读取迁移的数据库

    上面忘记数据库迁移了,不然Django后台读取不到数据

    python manage.py makemigrations
    python manage.py migrate
    python manage.py makemigrations  --fake  //有已存在的数据表用这个
    python manage.py migrate  --fake		//有已存在的数据表用这个
    
    • 1
    • 2
    • 3
    • 4

    然后在Django后台访问数据出现报错

    django.db.utils.ProgrammingError: (1146, “Table ‘photovoltaiccalculation.photovoltaicCalculation_factory’ doesn’t exist”)

    以下是尝试的解决方案

    1. 先运行Django迁移命令。再把本机mysql数据导入到虚拟机mysql (仍然失败)
    2. 先找到报错数据表对应的 migrations 文件夹,保留 pycacheinit.py 文件,其他的都删掉。再去数据库里面,把报错对应的记录也删除。再进行迁移(仍然失败)
    3. 先不导入本地数据,直接创建使用一个新的没有任何数据的数据表。然后进行迁移。(可行但是只有一些Django基础数据)

    下面尝试第三个方法来进行导入了

    迁移本地数据到虚拟机ubuntu(sql文件导入方式)

    创建数据库命令

     CREATE DATABASE IF NOT EXISTS photovoltaiccalculation;
    
    • 1
    本地workbench导出sql操作

    点击data expoert
    在这里插入图片描述
    导出选项

    dump stored procedure and functions: 导出存储过程和功能
    dump even: 导出事件
    dump trigger: 导出trigger
    如果没有特殊需求,也可以都不选

    选择你要用文件夹还是文件接收数据 (1) 文件夹就是数据库的每张表单独一个sql文件 (2) 文件就是整一个数据库就一个sql文件

    在这里插入图片描述
    开始导出,然后用xftp上传至虚拟机(或者直接拖进去,下了tools的话)

    在虚拟机中mysql导入sql

    先看一下导入到虚拟机的sql文件,其实就是一堆包含注释和sql语法的sql语句。

    1. 查看一下当前的sql路径
      在这里插入图片描述

    2. 然后进入mysql执行如下语句

    source /home/andy/Documents/sql_data/photovoltaiccalculation_photovoltaiccalculation_factory.sql
    
    • 1

    报错1

    root@andy-virtual-machine:/# source /home/andy/Documents/sql_data/photovoltaiccalculation_photovoltaiccalculation_factory.sql
    bash: /home/andy/Documents/sql_data/photovoltaiccalculation_photovoltaiccalculation_factory.sql: line 1: syntax error near unexpected tokena (' 'ash: /home/andy/Documents/sql_data/photovoltaiccalculation_photovoltaiccalculation_factory.sql: line 1: – MySQL dump 10.13 Distrib 8.0.29, for Win64 (x86_64)

    删掉sql语句头部注释,发生报错2

    ERROR 1231 (42000): Variable ‘time_zone’ can’t be set to the value of ‘NULL’
    ERROR 1231 (42000): Variable ‘sql_mode’ can’t be set to the value of ‘NULL’
    ERROR 1231 (42000): Variable ‘foreign_key_checks’ can’t be set to the value of ‘NULL’
    ERROR 1231 (42000): Variable ‘unique_checks’ can’t be set to the value of ‘NULL’
    ERROR 1231 (42000): Variable ‘character_set_client’ can’t be set to the value of ‘NULL’
    Query OK, 0 rows affected (0.00 sec)
    ERROR 1231 (42000): Variable ‘collation_connection’ can’t be set to the value of ‘NULL’
    ERROR 1231 (42000): Variable ‘sql_notes’ can’t be set to the value of ‘NULL’

    继续删除尾部注释,成功执行。

    1. 验证数据是否导入
      在这里插入图片描述
    2. 导入成功,但是有大小写问题
      photovoltaicCalculation是Django项目app名称。factory是Django中models文件自定义的数据库表名。
      我发现在ubuntu中执行migrate迁移的时候,ubuntu是区分大小写写入的,但是我在windows本地的数据库是忽略大写的(直接全部变小写)
      在这里插入图片描述

    在这里插入图片描述

    后面才发现这才是Django读取后台数据库不存在的原因。如何解决?

    1. 方法一:在ubuntu中更改项目的app名称全部小写。(不单单只更改文件夹名称,否则报错)
      在这里插入图片描述

    修改app中views.py内关于models的引用
    修改app中urls.py内关于app的views.py的引用
    修改项目settings.py app名称
    其余只要涉及app名或app内py文件的调用都需要修改才行。(都在自己的项目内,不需要改大环境的配置)

    1. 方法二:在用sql文件导入之前,更改sql语句中的数据表名的大小写。(很简单,略)

    问题解决,Django后台读取数据成功
    在这里插入图片描述

    使用uWSGI和Nginx部署Django

    uwsgi官方文档
    进入虚拟环境

    workon pvCal
    
    • 1
    安装uwsgi
    pip install uwsgi
    
    • 1

    在这里插入图片描述
    新建pvsite_uwsgi.ini文件配置

    [uwsgi]
    #chdir=/home/andy/Documents/photovoltaic/photovoltaicsite   # 指定运行目录:项目根目录的绝对路径
    # 指定sock的文件路径,可以用端口或sock文件(Nginx监听的端口)
    socket = 127.0.0.1:9090
    # stats子系统允许您将uWSGI的内部统计数据导出为JSON, 在指定的地址上,开启状态服务
    #stats = 127.0.0.1:9999
    #载入wsgi-file
    wsgi-file = photovoltaicsite/wsgi.py
    
    #允许主进程存在(enable master process)
    master=true
    #设置最大工作进程数:将会生成4个进程, 每个进程有2个线程
    processes=4
    threads = 2
    #某个权限
    chmod-socket = 666  
    #退出时清除环境  
    vacuum=true  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    执行命令:

    uwsgi pvsite_uwsgi.ini
    
    • 1
    启动uwsgi出现!!! no internal routing support, rebuild with pcre support !!!
    pip uninstall uwsgi
    sudo apt-get install libpcre3 libpcre3-dev
    pip install uwsgi --no-cache-dir
    
    • 1
    • 2
    • 3
    报错 chdir() to /home/andy/Documents/photovoltaicsite 路径不存在

    chdir() to /home/andy/Documents/photovoltaicsite # 项目根目录的绝对路径
    chdir(): No such file or directory [core/uwsgi.c line 2625]
    chdir(): No such file or directory [core/uwsgi.c line 1649]
    在这里插入图片描述

    运行成功
    请添加图片描述

    安装nginx
    sudo apt-get install nginx
    
    • 1

    常见nginx命令

    service nginx stop //停止运行
    service nginx start  //启动nginx
    service nginx reload  // 重新加载nginx。配置文件完,常执行此步骤。
    service nginx restart   //重新开始
    
    • 1
    • 2
    • 3
    • 4
    xftp 连接ubuntu的root用户

    有一些文件夹(etc等)只能用root访问(读取修改复制)

    选择root用户需要进行下面的配置:
    编辑 vi /etc/ssh/sshd_config文件
    PermitRootLogin Prohibit-password 这句话原本就是用#注释的
    在其下新添加:PermitRootLogin yes
    然后用 service sshd restart重启ssh服务

    配置nginx.conf

    将下面一段修改粘贴在/etc/nginx目录下的nginx.conf文件的http末尾。其他不更改。

    	server {
    	listen   9001;     #配置访问时的端口号
    	server_name  192.168.80.128;
    	charset     utf-8;
    	client_max_body_size  75M;
    	
    	location /upload {        #配置媒体资源文件
    		expires 30d;
    		autoindex  on;
    		add_header Cache-Control private;
    		alias /home/andy/Documents/photovoltaic/photovoltaicsite/upload;
    		}
    	location /static {      #配置静态资源文件
    		expires 30d;
    		autoindex on;
    		add_header Cache-Control private;
    		alias /home/andy/Documents/photovoltaic/photovoltaiccalculation;
    	}
    	location / {          #配置uWSGI服务器
    		include /etc/nginx/uwsgi_params;
    		uwsgi_pass 127.0.0.1:9090;
    		uwsgi_read_timeout 2;
    	}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    注意 :文件用#注释而不是//,注意分号的书写。不然会报错

    运行nginx

    先运行uwsgi

    uwsgi pvsite_uwsgi.ini
    
    • 1

    再运行nginx

    service nginx start
    
    • 1

    查看nginx运行状态

    systemctl status nginx.service
    
    • 1

    在这里插入图片描述
    访问静态文件成功
    在这里插入图片描述
    访问接口成功

    在这里插入图片描述

    解决nginx代理的django项目的admin站点没样式的问题。

    在这里插入图片描述

    1. 先虚拟环境下收集静态资源(manage.py目录下)
    python manage.py collectstatic  //在项目根目录 运行此命令 生成static相关静态资源文件
    
    • 1

    在这里插入图片描述
    可以看到样式文件被收集在static。165个文件被复制。
    在这里插入图片描述
    2. 更改nginx配置

    server{
    ...
    location /static {
    		alias /home/andy/Documents/photovoltaic/photovoltaicsite/static;
    }
    ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 更改setting配置

    下面是配置静态资源文件到指定项目目录的,不然 默认static会在Django的安装目录下

    STATIC_URL = '/static/'  # nginx 会通过static为开头访问指定静态资源文件
    MEDIA_URL = '/upload/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'upload').replace('\\', '/')
    STATIC_ROOT = os.path.join(BASE_DIR, 'static').replace('\\', '/')  # 指定样式收集目录
    
    • 1
    • 2
    • 3
    • 4
    1. 重启nginx+uWSGI,样式重现
      在这里插入图片描述
    Django部署完成

    下一步进行Vue项目的部署

    ——————————————————以下为补充内容————————————————

    ubuntu建立新用户并赋予root权限

    1. 登录root用户
    su root
    
    • 1
    1. 创建新用户
    sudo useradd -r -m -s /bin/bash andy(用户名)
    
    • 1

    其中参数的意义如下:
    -r:建立系统账号
    -m:自动建立用户的登入目录
    -s:指定用户登入后所使用的shell

    1. 手动为用户设置密码
    sudo passwd andy(用户名)
    
    • 1
    1. 切换到root用户后 输入root用户密码
    su
    
    • 1
    1. 查看sudoers文件
    ls -l /etc/sudoers 
    
    • 1

    在这里插入图片描述
    文件只有r权限,在改动前需要增加w权限,改动后,再去掉w权限。

    1. 给root用户增加w权限
    chmod u+w /etc/sudoers
    
    • 1
    1. 查看sudoers文件
    ls -l /etc/sudoers
    
    • 1
    1. vim编辑器打开sudoers文件
    vim /etc/sudoers
    
    • 1
    1. root ALL=(ALL) ALL 后面加上:
      xxx ALL = (ALL) ALL,其中xxx表示你的用户名,保存之后退出
    vim编辑: o (在当前行下面插入一个新行)
    保存退出——Esc 后  :wq! (强制保存退出)
    
    • 1
    • 2
    1. 恢复sudoers文件原来的读写权限
    chmod u-w /etc/sudoers 
    
    • 1
    1. 查看sudoers文件
    ls -l /etc/sudoers
    
    • 1

    此时新用户已经拥有root权限
    ps:

    sudo chmod -R 777 文件目录   eg:/data/XXX
     777解除所有锁定
    
    • 1
    • 2

    清除Django的migrations

    先将mysql中的数据表django_migrations中自建 表的历史记录删除。再把本地migraions生成的文件删除。执行如下命令即可。

     python manage.py makemigrations
     python manage.py migrate --fake-initial
    
    • 1
    • 2
  • 相关阅读:
    PHP生成pdf格式准考证带照片完整示范
    centos常见的命令
    [MySQL]存储引擎、索引、SQL优化
    玩转快速排序(C语言版)
    修改el-tab标签页的label默认样式(插槽)
    代码随想录Day_55打卡
    GIS 制图:交互式地图的类型和应用
    Linux 6.6 初步支持AMD 新一代 Zen 5 处理器
    面试题-7
    (三)什么是Vite——Vite 主体流程(运行npm run dev后发生了什么?)
  • 原文地址:https://blog.csdn.net/qq_44976531/article/details/127615409