文章目录
本文的安装部署完全在虚拟机中进行,是对后续在云端部署的演练。(windows10+ubuntu 20.04.4 )
基本命令行
Django创建超级用户命令
python manage.py createsuperuser
安装虚拟环境及配置路径
- 查看当前ubuntu版本
uname -a
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
- 查看当前ubuntu中自带的python版本
type python python2 python3
bash: type: python: not found
bash: type: python2: not found
python3 is /usr/bin/python3
- 安装python3的
pip
。
sudo apt-get install python3-pip
- 安装虚拟环境
sudo pip install virtualenv
sudo pip install virtualenvwrapper
mkvirtualenv
command not fonud (需要配置环境变量)
mkdir $HOME/.virtualenvs --->在HOME目录下创建文件用来存放虚拟环境
或者在HOME目录下
mkdir .virtualenvs
- 在管理员文件夹andy下用
vi .bashrc
打开文件(否则在其他路径下vi ~/.bashrc
)。文件末尾添加如下三行。(:wq
保存,a
追加写入,G
定位末行,Shift+Insert
粘贴,dd
删除当前行)
export VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3'
source /usr/local/bin/virtualenvwrapper.sh
- 加载.bashrc文件
source ~/.bashrc
到这里虚拟环境配置完成。以下是虚拟环境基本命令
虚拟环境基本命令
- 创建虚拟环境
mkvirtualenv -p python3 blog
- 查看已有的虚拟环境
workon
- 使用已有的虚拟环境
workon virtueName
- 退出已有的虚拟环境
deactivate
- 删除已有的虚拟环境
rmvirtualenv virtueName
Xftp和FileZilla连接本地虚拟机
查看虚拟机本地地址
192.168.80.128
在使用sftp连接时,filezilla与虚拟机之间是通过ssh连接,所以需在虚拟机上安装ssh-server。
中间连不上怀疑是防火墙的问题
查看防火墙是否打开
sudo ufw status
inactive
表示没有打开
[sudo] password for andy:
Status: inactive
Ubuntu上安装ssh-server
指令:
sudo apt-get install openssh-server
安装完成后进行连接,这里的用户名和密码是虚拟机的用户名和密码
连接成功,开始传输文件
这里使用最low的传输方式,直接将项目拖入项目的/home/andy/Documents
目录中,(看别人都是拖进/var/www/
),然后开始部署后端。
好像可以用git直接从gitee上拉取项目,这种方式也便于后面的维护
部署Django
- 运行在指定虚拟环境下(避免日后项目之间相互影响)
workon pvCal
- 进入到项目运行文件夹。
(查看当前所在目录的绝对路径)
pwd
cd ../ //返回上一级目录
cd Document //进行Document目录
- 先试试能不能运行项目
Python manage.py runserver
没有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
连接数据库
最后是连接数据库失败,解决它
下载数据库(这边我没有进入虚拟环境下载,直接下载了)
sudo apt-get install mysql-server
在安装完数据库之后,我们需要用系统生成的用户名和密码登录mysql,这样在后面对数据库操作时,不容易产生错误。
在下面的文件中找到用户名和密码
cat /etc/mysql/debian.cnf
有可能没有打开文件的权限
切换成root用户,设置密码
sudo passwd root
用su
命令进入到root
用户就可以访问了。后续如果登录不了,就用这里的用户和密码登录
比如:
mysql -uxxxxxxx(用户) -pXXXXXXXXXX(密码)
查看数据库状态
systemctl status mysql.service
是死的
mysql服务启动和停止
#停止
sudo service mysql stop
#启动
sudo service mysql start
进入数据库
mysql -u root -p
这里刚开始输入任意密码都可以进入
进入后创建一个root新用户:
CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码';
create user 'root'@'%' identified by '123'; //示例
如果出现下面报错,改成反引号。
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`; //示例 输入反引号
查看当前mysql所有用户:
select user,host from mysql.user;
对于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; //刷新权限
到这里还没结束
别急还差一个配置
开启Mysql远程连接的权限
- 修改mysql(ubuntu指令安装)配置文件
/etc/mysql/mysql.conf.d/mysqld.cnf
这里用的是root用户打开mysqld.cnf
文件才是可更改的。 我是先进入该文件夹内然后打开的文件
- 将其中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 连接,更加安全。 - 修改完配置之后,执行命令
sudo systemctl restart mysql
马上进行重启 - 这里要再提一下vi操作。(不拓展了,就展示我在这里用到的操作)
命令模式:x删除光标所在当前字符
进入编辑模式:按i: 光标和内容 没有变化进入编辑模式
输入模式::wq
,保存退出。完美
一些可能发生的报错
端口占用
这里通过下面命令测试端口是否在使用。
tcp端口测试 确保服务器开启了端口监听,否则开放了端口也连接不到。(所以端口监听和开放是两回事儿)
netstat -tunlp | grep 3306 #查看端口是否被占用
'''
-t (tcp) 仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出在Listen(监听)的服务状态
-p 显示建立相关链接的程序名
'''
远程连接
我在修改完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。
本地连接虚拟机数据库(远程数据库)
-
点击【database】菜单,然后选择【schema transfer wizard…】
-
点击下方的【start wizard】
-
选择源数据库服务器连接和目标数据库服务器连接
-
点击下方的【test connectiton】,测试两个连接是否正常,然后点击【next】
-
勾选要复制的数据库实例,然后点击【start copy】
-
系统显示复制进度,结束后点击【next】
-
点击【finished】,此时跨服务器的数据库实例复制就完成了
ubuntu验证数据库是否导入
- 进入mysql
show databases
select * from table
运行Django
补充一个库
python manage.py runserver
然后报错,还得再下载一个库
pip3 install cryptography -i https://pypi.douban.com/simple
然后成功运行
Django读取迁移的数据库
上面忘记数据库迁移了,不然Django后台读取不到数据
python manage.py makemigrations
python manage.py migrate
python manage.py makemigrations --fake //有已存在的数据表用这个
python manage.py migrate --fake //有已存在的数据表用这个
然后在Django后台访问数据出现报错
django.db.utils.ProgrammingError: (1146, “Table ‘photovoltaiccalculation.photovoltaicCalculation_factory’ doesn’t exist”)
以下是尝试的解决方案
- 先运行Django迁移命令。再把本机mysql数据导入到虚拟机mysql (仍然失败)
- 先找到报错数据表对应的 migrations 文件夹,保留 pycache 和 init.py 文件,其他的都删掉。再去数据库里面,把报错对应的记录也删除。再进行迁移(仍然失败)
- 先不导入本地数据,直接创建使用一个新的没有任何数据的数据表。然后进行迁移。(可行但是只有一些Django基础数据)
下面尝试第三个方法来进行导入了
迁移本地数据到虚拟机ubuntu(sql文件导入方式)
创建数据库命令
CREATE DATABASE IF NOT EXISTS photovoltaiccalculation;
本地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语句。
-
查看一下当前的sql路径
-
然后进入mysql执行如下语句
source /home/andy/Documents/sql_data/photovoltaiccalculation_photovoltaiccalculation_factory.sql
报错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’
继续删除尾部注释,成功执行。
- 验证数据是否导入
- 导入成功,但是有大小写问题
photovoltaicCalculation
是Django项目app名称。factory是Django中models文件自定义的数据库表名。
我发现在ubuntu中执行migrate
迁移的时候,ubuntu是区分大小写写入的,但是我在windows本地的数据库是忽略大写的(直接全部变小写)
后面才发现这才是Django读取后台数据库不存在的原因。如何解决?
- 方法一:在ubuntu中更改项目的app名称全部小写。(不单单只更改文件夹名称,否则报错)
修改app中views.py内关于models的引用
修改app中urls.py内关于app的views.py的引用
修改项目settings.py app名称
其余只要涉及app名或app内py文件的调用都需要修改才行。(都在自己的项目内,不需要改大环境的配置)
- 方法二:在用sql文件导入之前,更改sql语句中的数据表名的大小写。(很简单,略)
问题解决,Django后台读取数据成功
使用uWSGI和Nginx部署Django
uwsgi官方文档
进入虚拟环境
workon pvCal
安装uwsgi
pip install uwsgi
新建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
执行命令:
uwsgi pvsite_uwsgi.ini
启动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
报错 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
常见nginx命令
service nginx stop //停止运行
service nginx start //启动nginx
service nginx reload // 重新加载nginx。配置文件完,常执行此步骤。
service nginx restart //重新开始
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;
}
}
注意 :文件用#
注释而不是//
,注意分号的书写。不然会报错
运行nginx
先运行uwsgi
uwsgi pvsite_uwsgi.ini
再运行nginx
service nginx start
查看nginx运行状态
systemctl status nginx.service
访问静态文件成功
访问接口成功
解决nginx代理的django项目的admin站点没样式的问题。
- 先虚拟环境下收集静态资源(
manage.py
目录下)
python manage.py collectstatic //在项目根目录 运行此命令 生成static相关静态资源文件
可以看到样式文件被收集在static。165个文件被复制。
2. 更改nginx配置
server{
...
location /static {
alias /home/andy/Documents/photovoltaic/photovoltaicsite/static;
}
...
}
- 更改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('\\', '/') # 指定样式收集目录
- 重启nginx+uWSGI,样式重现
Django部署完成
下一步进行Vue项目的部署
——————————————————以下为补充内容————————————————
ubuntu建立新用户并赋予root权限
- 登录root用户
su root
- 创建新用户
sudo useradd -r -m -s /bin/bash andy(用户名)
其中参数的意义如下:
-r:建立系统账号
-m:自动建立用户的登入目录
-s:指定用户登入后所使用的shell
- 手动为用户设置密码
sudo passwd andy(用户名)
- 切换到root用户后 输入root用户密码
su
- 查看sudoers文件
ls -l /etc/sudoers
文件只有r权限,在改动前需要增加w权限,改动后,再去掉w权限。
- 给root用户增加w权限
chmod u+w /etc/sudoers
- 查看sudoers文件
ls -l /etc/sudoers
vim编辑器
打开sudoers文件
vim /etc/sudoers
- 在
root ALL=(ALL) ALL
后面加上:
xxx ALL = (ALL) ALL
,其中xxx表示你的用户名,保存之后退出
vim编辑: o (在当前行下面插入一个新行)
保存退出——Esc 后 :wq! (强制保存退出)
- 恢复sudoers文件原来的读写权限
chmod u-w /etc/sudoers
- 查看sudoers文件
ls -l /etc/sudoers
此时新用户已经拥有root权限
ps:
sudo chmod -R 777 文件目录 eg:/data/XXX
777解除所有锁定
清除Django的migrations
先将mysql中的数据表django_migrations
中自建 表的历史记录删除。再把本地migraions
生成的文件删除。执行如下命令即可。
python manage.py makemigrations
python manage.py migrate --fake-initial